summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-09-24 20:41:52 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-09-26 19:37:12 +0000
commit89804c14ee99721d252e30468342384fbc8926b2 (patch)
treea543fb27fe9333b4a204aabba4ef984a2cb09f57
parentf626fd5f897796451685c06ce5f397a90aeaa8e6 (diff)
implement prototype for more stable calc cell style names
This should ensure that as long as the style does not change the cell style name is the same after an import export cycle. Each ScPatternAttr stores a unique ID and we store the ID to name mapping during import. During export if we find a ScPatternAttr that has a key that is also stored in the map we write back the style name from the map. To avoid name collisions we block the style names from the import for the export. The missing piece to make this completely awesome is now to make sure that styles are sorted by name during export. That way we can reduce the diff between import and export even more. Change-Id: Ie4fe2aa00f07efec27ea129e314ac0b6b7e0d8c0 Reviewed-on: https://gerrit.libreoffice.org/29255 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r--include/xmloff/xmlaustp.hxx3
-rw-r--r--sc/inc/attarray.hxx6
-rw-r--r--sc/inc/docpool.hxx2
-rw-r--r--sc/inc/docuno.hxx2
-rw-r--r--sc/inc/patattr.hxx4
-rw-r--r--sc/inc/sheetdata.hxx5
-rw-r--r--sc/inc/unonames.hxx1
-rw-r--r--sc/inc/unowids.hxx3
-rw-r--r--sc/source/core/data/attarray.cxx2
-rw-r--r--sc/source/core/data/docpool.cxx9
-rw-r--r--sc/source/core/data/document.cxx8
-rw-r--r--sc/source/core/data/patattr.cxx22
-rw-r--r--sc/source/filter/xml/xmlexprt.cxx29
-rw-r--r--sc/source/filter/xml/xmlimprt.cxx8
-rw-r--r--sc/source/ui/docshell/docsh.cxx11
-rw-r--r--sc/source/ui/inc/docsh.hxx2
-rw-r--r--sc/source/ui/unoobj/cellsuno.cxx10
-rw-r--r--sc/source/ui/unoobj/docuno.cxx7
-rw-r--r--xmloff/source/style/impastpl.cxx11
-rw-r--r--xmloff/source/style/impastpl.hxx2
-rw-r--r--xmloff/source/style/xmlaustp.cxx6
21 files changed, 143 insertions, 10 deletions
diff --git a/include/xmloff/xmlaustp.hxx b/include/xmloff/xmlaustp.hxx
index 95b58b029ad4..a07cdbf32de2 100644
--- a/include/xmloff/xmlaustp.hxx
+++ b/include/xmloff/xmlaustp.hxx
@@ -87,6 +87,9 @@ public:
/// Register a name that must not be used as a generated name.
void RegisterName( sal_Int32 nFamily, const OUString& rName );
+ /// Register a name that may only be used through AddNamed
+ void RegisterDefinedName(sal_Int32 nFamily, const OUString& rName);
+
/// retrieve the registered names (names + families)
void GetRegisteredNames(
css::uno::Sequence<sal_Int32>& aFamilies,
diff --git a/sc/inc/attarray.hxx b/sc/inc/attarray.hxx
index c24f658954dd..f22bc3444478 100644
--- a/sc/inc/attarray.hxx
+++ b/sc/inc/attarray.hxx
@@ -65,7 +65,11 @@ struct ScMergePatternState
const ScPatternAttr* pOld1; ///< existing objects, temporary
const ScPatternAttr* pOld2;
- ScMergePatternState() : pItemSet(nullptr), pOld1(nullptr), pOld2(nullptr) {}
+ bool mbValidPatternId;
+ sal_uInt64 mnPatternId;
+
+ ScMergePatternState() : pItemSet(nullptr), pOld1(nullptr), pOld2(nullptr),
+ mbValidPatternId(true), mnPatternId(0) {}
};
struct ScAttrEntry
diff --git a/sc/inc/docpool.hxx b/sc/inc/docpool.hxx
index d3381ab8fdf7..8632ed430e9b 100644
--- a/sc/inc/docpool.hxx
+++ b/sc/inc/docpool.hxx
@@ -43,6 +43,8 @@ class SC_DLLPUBLIC ScDocumentPool: public SfxItemPool
static sal_uInt16* pVersionMap11;
static sal_uInt16* pVersionMap12;
+ sal_uInt64 mnCurrentMaxKey;
+
public:
ScDocumentPool();
protected:
diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx
index 8e32685b8f2f..1487b0b2aa99 100644
--- a/sc/inc/docuno.hxx
+++ b/sc/inc/docuno.hxx
@@ -66,6 +66,7 @@ class ScTableSheetObj;
class ScRangeList;
class ScPrintUIOptions;
class ScSheetSaveData;
+struct ScFormatSaveData;
class SC_DLLPUBLIC ScModelObj : public SfxBaseModel,
public vcl::ITiledRenderable,
@@ -132,6 +133,7 @@ public:
void BeforeXMLLoading();
void AfterXMLLoading();
ScSheetSaveData* GetSheetSaveData();
+ ScFormatSaveData* GetFormatSaveData();
void RepaintRange( const ScRange& rRange );
void RepaintRange( const ScRangeList& rRange );
diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx
index 244b9add84ff..f6a042e92517 100644
--- a/sc/inc/patattr.hxx
+++ b/sc/inc/patattr.hxx
@@ -52,6 +52,7 @@ class SC_DLLPUBLIC ScPatternAttr: public SfxSetItem
{
OUString* pName;
ScStyleSheet* pStyle;
+ sal_uInt64 mnKey;
public:
ScPatternAttr(SfxItemSet* pItemSet, const OUString& rStyleName);
ScPatternAttr(SfxItemSet* pItemSet);
@@ -132,6 +133,9 @@ public:
long GetRotateVal( const SfxItemSet* pCondSet ) const;
sal_uInt8 GetRotateDir( const SfxItemSet* pCondSet ) const;
+
+ void SetKey(sal_uInt64 nKey);
+ sal_uInt64 GetKey() const;
};
#endif
diff --git a/sc/inc/sheetdata.hxx b/sc/inc/sheetdata.hxx
index e57e486922f0..107d2b5e2e9c 100644
--- a/sc/inc/sheetdata.hxx
+++ b/sc/inc/sheetdata.hxx
@@ -172,6 +172,11 @@ public:
void SetInSupportedSave( bool bSet );
};
+struct ScFormatSaveData
+{
+ std::map<sal_uInt64, OUString> maIDToName;
+};
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/unonames.hxx b/sc/inc/unonames.hxx
index 415399e1caef..e7ff39cbf595 100644
--- a/sc/inc/unonames.hxx
+++ b/sc/inc/unonames.hxx
@@ -103,6 +103,7 @@
#define SC_UNONAME_CELLVJUS_METHOD "VertJustifyMethod"
#define SC_UNONAME_CELLORI "Orientation"
#define SC_UNONAME_NUMFMT "NumberFormat"
+#define SC_UNONAME_FORMATID "FormatID"
#define SC_UNONAME_SHADOW "ShadowFormat"
#define SC_UNONAME_TBLBORD "TableBorder"
#define SC_UNONAME_TBLBORD2 "TableBorder2"
diff --git a/sc/inc/unowids.hxx b/sc/inc/unowids.hxx
index bd94159f760f..e099dd2c27fb 100644
--- a/sc/inc/unowids.hxx
+++ b/sc/inc/unowids.hxx
@@ -72,7 +72,8 @@
#define SC_WID_UNO_NAMES ( SC_WID_UNO_START + 42 )
#define SC_WID_UNO_TBLBORD2 ( SC_WID_UNO_START + 43 )
#define SC_WID_UNO_CONDFORMAT ( SC_WID_UNO_START + 44 )
-#define SC_WID_UNO_END ( SC_WID_UNO_START + 44 )
+#define SC_WID_UNO_FORMATID ( SC_WID_UNO_START + 45 )
+#define SC_WID_UNO_END ( SC_WID_UNO_START + 45 )
inline bool IsScUnoWid( sal_uInt16 nWid )
{
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index a2aadccb6a7f..0f51713fae9f 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -925,6 +925,7 @@ void ScAttrArray::MergePatternArea( SCROW nStartRow, SCROW nEndRow,
const SfxItemSet& rThisSet = pPattern->GetItemSet();
if (rState.pItemSet)
{
+ rState.mbValidPatternId = false;
if (bDeep)
lcl_MergeDeep( *rState.pItemSet, rThisSet );
else
@@ -935,6 +936,7 @@ void ScAttrArray::MergePatternArea( SCROW nStartRow, SCROW nEndRow,
// first pattern - copied from parent
rState.pItemSet = new SfxItemSet( *rThisSet.GetPool(), rThisSet.GetRanges() );
rState.pItemSet->Set( rThisSet, bDeep );
+ rState.mnPatternId = pPattern->GetKey();
}
rState.pOld2 = rState.pOld1;
diff --git a/sc/source/core/data/docpool.cxx b/sc/source/core/data/docpool.cxx
index e8f07f0e7111..94d177cac43e 100644
--- a/sc/source/core/data/docpool.cxx
+++ b/sc/source/core/data/docpool.cxx
@@ -190,7 +190,8 @@ ScDocumentPool::ScDocumentPool()
: SfxItemPool ( OUString("ScDocumentPool"),
ATTR_STARTINDEX, ATTR_ENDINDEX,
- aItemInfos, nullptr, false/*bLoadRefCounts*/ )
+ aItemInfos, nullptr, false/*bLoadRefCounts*/ ),
+ mnCurrentMaxKey(0)
{
// latin font from GetDefaultFonts is not used, DEFAULTFONT_LATIN_SPREADSHEET instead
vcl::Font aStdFont = OutputDevice::GetDefaultFont( DefaultFontType::LATIN_SPREADSHEET, LANGUAGE_ENGLISH_US,
@@ -609,6 +610,12 @@ const SfxPoolItem& ScDocumentPool::Put( const SfxPoolItem& rItem, sal_uInt16 nWh
// Else Put must always happen, because it could be another Pool
const SfxPoolItem& rNew = SfxItemPool::Put( rItem, nWhich );
+ sal_uLong nRef = rNew.GetRefCount();
+ if (nRef == 1)
+ {
+ ++mnCurrentMaxKey;
+ const_cast<ScPatternAttr&>(static_cast<const ScPatternAttr&>(rNew)).SetKey(mnCurrentMaxKey);
+ }
CheckRef( rNew );
return rNew;
}
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 96269cb622ae..9462a54e9bbf 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -4988,7 +4988,13 @@ ScPatternAttr* ScDocument::CreateSelectionPattern( const ScMarkData& rMark, bool
OSL_ENSURE( aState.pItemSet, "SelectionPattern Null" );
if (aState.pItemSet)
- return new ScPatternAttr( aState.pItemSet );
+ {
+ ScPatternAttr* pPattern = new ScPatternAttr( aState.pItemSet );
+ if (aState.mbValidPatternId)
+ pPattern->SetKey(aState.mnPatternId);
+
+ return pPattern;
+ }
else
return new ScPatternAttr( GetPool() ); // empty
}
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index dd618e8c7d30..57e66f692a9a 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -68,27 +68,31 @@ using sc::TwipsToHMM;
ScPatternAttr::ScPatternAttr( SfxItemSet* pItemSet, const OUString& rStyleName )
: SfxSetItem ( ATTR_PATTERN, pItemSet ),
pName ( new OUString( rStyleName ) ),
- pStyle ( nullptr )
+ pStyle ( nullptr ),
+ mnKey(0)
{
}
ScPatternAttr::ScPatternAttr( SfxItemSet* pItemSet )
: SfxSetItem ( ATTR_PATTERN, pItemSet ),
pName ( nullptr ),
- pStyle ( nullptr )
+ pStyle ( nullptr ),
+ mnKey(0)
{
}
ScPatternAttr::ScPatternAttr( SfxItemPool* pItemPool )
: SfxSetItem ( ATTR_PATTERN, new SfxItemSet( *pItemPool, ATTR_PATTERN_START, ATTR_PATTERN_END ) ),
pName ( nullptr ),
- pStyle ( nullptr )
+ pStyle ( nullptr ),
+ mnKey(0)
{
}
ScPatternAttr::ScPatternAttr( const ScPatternAttr& rPatternAttr )
: SfxSetItem ( rPatternAttr ),
- pStyle ( rPatternAttr.pStyle )
+ pStyle ( rPatternAttr.pStyle ),
+ mnKey(rPatternAttr.mnKey)
{
if (rPatternAttr.pName)
pName = new OUString(*rPatternAttr.pName);
@@ -1411,4 +1415,14 @@ sal_uInt8 ScPatternAttr::GetRotateDir( const SfxItemSet* pCondSet ) const
return nRet;
}
+void ScPatternAttr::SetKey(sal_uInt64 nKey)
+{
+ mnKey = nKey;
+}
+
+sal_uInt64 ScPatternAttr::GetKey() const
+{
+ return mnKey;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index 437df5d4ecda..8a0931c42db3 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -1908,6 +1908,17 @@ void ScXMLExport::ExportContent_()
void ScXMLExport::ExportStyles_( bool bUsed )
{
+ Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetModel(), uno::UNO_QUERY );
+ if (xSpreadDoc.is())
+ {
+ ScFormatSaveData* pFormatData = ScModelObj::getImplementation(xSpreadDoc)->GetFormatSaveData();
+ auto aAutoStylePool = GetAutoStylePool();
+ for (const auto& rFormatInfo : pFormatData->maIDToName)
+ {
+ aAutoStylePool->RegisterDefinedName(XML_STYLE_FAMILY_TABLE_CELL, rFormatInfo.second);
+ }
+ }
+
if (!pSharedData)
{
SCTAB nTableCount(0);
@@ -1965,6 +1976,10 @@ void ScXMLExport::AddStyleFromCells(const uno::Reference<beans::XPropertySet>& x
const uno::Reference<sheet::XSpreadsheet>& xTable,
sal_Int32 nTable, const OUString* pOldName)
{
+ css::uno::Any aAny = xProperties->getPropertyValue("FormatID");
+ sal_uInt64 nKey = 0;
+ aAny >>= nKey;
+
//! pass xCellRanges instead
uno::Reference<sheet::XSheetCellRanges> xCellRanges( xProperties, uno::UNO_QUERY );
@@ -2048,8 +2063,20 @@ void ScXMLExport::AddStyleFromCells(const uno::Reference<beans::XPropertySet>& x
else
{
OUString sName;
+ bool bAdded = false;
+ if (nKey)
+ {
+ Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetModel(), uno::UNO_QUERY );
+ ScFormatSaveData* pFormatData = ScModelObj::getImplementation(xSpreadDoc)->GetFormatSaveData();
+ auto itr = pFormatData->maIDToName.find(nKey);
+ if (itr != pFormatData->maIDToName.end())
+ {
+ sName = itr->second;
+ bAdded = GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, aPropStates);
+ }
+ }
bool bIsAutoStyle(true);
- if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, aPropStates))
+ if (bAdded || GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, aPropStates))
{
OUString* pTemp(new OUString(sName));
if (!pCellStyles->AddStyleName(pTemp, nIndex))
diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx
index 55c49b33a513..018b56ed93cc 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -2835,6 +2835,14 @@ void ScXMLImport::SetStyleToRanges()
sal_Int32 nNumberFormat(pStyle->GetNumberFormat());
SetType(xProperties, nNumberFormat, nPrevCellType, sPrevCurrency);
+ css::uno::Any aAny = xProperties->getPropertyValue("FormatID");
+ sal_uInt64 nKey = 0;
+ if ((aAny >>= nKey) && nKey)
+ {
+ ScFormatSaveData* pFormatSaveData = ScModelObj::getImplementation(GetModel())->GetFormatSaveData();
+ pFormatSaveData->maIDToName.insert(std::pair<sal_uInt64, OUString>(nKey, sPrevStyleName));
+ }
+
// store first cell of first range for each style, once per sheet
uno::Sequence<table::CellRangeAddress> aAddresses(xSheetCellRanges->getRangeAddresses());
pStyle->ApplyCondFormat(aAddresses);
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index a1b32f0f3c06..ca0b2a0bfe03 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -2686,6 +2686,7 @@ ScDocShell::ScDocShell( const ScDocShell& rShell ) :
pPaintLockData ( nullptr ),
pSolverSaveData ( nullptr ),
pSheetSaveData ( nullptr ),
+ mpFormatSaveData( nullptr ),
pModificator ( nullptr )
#if ENABLE_TELEPATHY
, mpCollaboration( new ScCollaboration( this ) )
@@ -2731,6 +2732,7 @@ ScDocShell::ScDocShell( const SfxModelFlags i_nSfxCreationFlags ) :
pPaintLockData ( nullptr ),
pSolverSaveData ( nullptr ),
pSheetSaveData ( nullptr ),
+ mpFormatSaveData( nullptr ),
pModificator ( nullptr )
#if ENABLE_TELEPATHY
, mpCollaboration( new ScCollaboration( this ) )
@@ -2782,6 +2784,7 @@ ScDocShell::~ScDocShell()
delete pSolverSaveData;
delete pSheetSaveData;
+ delete mpFormatSaveData;
delete pOldAutoDBRange;
if (pModificator)
@@ -2962,6 +2965,14 @@ ScSheetSaveData* ScDocShell::GetSheetSaveData()
return pSheetSaveData;
}
+ScFormatSaveData* ScDocShell::GetFormatSaveData()
+{
+ if (!mpFormatSaveData)
+ mpFormatSaveData = new ScFormatSaveData;
+
+ return mpFormatSaveData;
+}
+
namespace {
void removeKeysIfExists(Reference<ui::XAcceleratorConfiguration>& xScAccel, const vector<const awt::KeyEvent*>& rKeys)
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index 15faf2b53d6f..e7503b062e09 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -107,6 +107,7 @@ class SC_DLLPUBLIC ScDocShell final: public SfxObjectShell, public SfxListener
ScPaintLockData* pPaintLockData;
ScOptSolverSave* pSolverSaveData;
ScSheetSaveData* pSheetSaveData;
+ ScFormatSaveData* mpFormatSaveData;
ScDocShellModificator* pModificator; // #109979#; is used to load XML (created in BeforeXMLLoading and destroyed in AfterXMLLoading)
#if ENABLE_TELEPATHY
@@ -408,6 +409,7 @@ public:
const ScOptSolverSave* GetSolverSaveData() const { return pSolverSaveData; } // may be null
void SetSolverSaveData( const ScOptSolverSave& rData );
ScSheetSaveData* GetSheetSaveData();
+ ScFormatSaveData* GetFormatSaveData();
static void ResetKeyBindings( ScOptionsUtil::KeyBindingType eType );
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 509c04ac33e2..39f82fefb391 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -254,6 +254,7 @@ static const SfxItemPropertySet* lcl_GetCellsPropertySet()
{OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
{OUString(SC_UNONAME_WRITING), ATTR_WRITINGDIR, cppu::UnoType<sal_Int16>::get(), 0, 0 },
{OUString(SC_UNONAME_HYPERLINK), ATTR_HYPERLINK, cppu::UnoType<OUString>::get(), 0, 0 },
+ {OUString(SC_UNONAME_FORMATID), SC_WID_UNO_FORMATID, cppu::UnoType<sal_uInt64>::get(), 0, 0 },
{ OUString(), 0, css::uno::Type(), 0, 0 }
};
static SfxItemPropertySet aCellsPropertySet( aCellsPropertyMap_Impl );
@@ -364,6 +365,7 @@ static const SfxItemPropertySet* lcl_GetRangePropertySet()
{OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, cppu::UnoType<sal_Int32>::get(), 0, 0 },
{OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
{OUString(SC_UNONAME_WRITING), ATTR_WRITINGDIR, cppu::UnoType<sal_Int16>::get(), 0, 0 },
+ {OUString(SC_UNONAME_FORMATID), SC_WID_UNO_FORMATID, cppu::UnoType<sal_uInt64>::get(), 0, 0 },
{ OUString(), 0, css::uno::Type(), 0, 0 }
};
static SfxItemPropertySet aRangePropertySet( aRangePropertyMap_Impl );
@@ -478,6 +480,7 @@ static const SfxItemPropertySet* lcl_GetCellPropertySet()
{OUString(SC_UNONAME_WRITING), ATTR_WRITINGDIR, cppu::UnoType<sal_Int16>::get(), 0, 0 },
{OUString(UNO_NAME_EDIT_CHAR_ESCAPEMENT), EE_CHAR_ESCAPEMENT, cppu::UnoType<sal_Int32>::get(), 0, 0 },
{OUString(SC_UNONAME_HYPERLINK), ATTR_HYPERLINK, cppu::UnoType<OUString>::get(), 0, 0 },
+ {OUString(SC_UNONAME_FORMATID), SC_WID_UNO_FORMATID, cppu::UnoType<sal_uInt64>::get(), 0, 0 },
{ OUString(), 0, css::uno::Type(), 0, 0 }
};
static SfxItemPropertySet aCellPropertySet( aCellPropertyMap_Impl );
@@ -2619,6 +2622,13 @@ void ScCellRangesBase::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pE
aRanges.Format(sRet, ScRefFlags::RANGE_ABS_3D, &pDocShell->GetDocument());
rAny <<= sRet;
}
+ break;
+ case SC_WID_UNO_FORMATID:
+ {
+ const ScPatternAttr* pPattern = GetCurrentAttrsFlat();
+ rAny <<= pPattern->GetKey();
+ }
+ break;
}
}
}
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index a5ba53739fdb..43151abaae3e 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -458,6 +458,13 @@ ScSheetSaveData* ScModelObj::GetSheetSaveData()
return nullptr;
}
+ScFormatSaveData* ScModelObj::GetFormatSaveData()
+{
+ if (pDocShell)
+ return pDocShell->GetFormatSaveData();
+ return nullptr;
+}
+
void ScModelObj::RepaintRange( const ScRange& rRange )
{
if (pDocShell)
diff --git a/xmloff/source/style/impastpl.cxx b/xmloff/source/style/impastpl.cxx
index f35b09862a76..7a4cbce8233f 100644
--- a/xmloff/source/style/impastpl.cxx
+++ b/xmloff/source/style/impastpl.cxx
@@ -244,7 +244,7 @@ XMLAutoStylePoolProperties::XMLAutoStylePoolProperties( XMLAutoStyleFamily& rFam
sBuffer.append( OUString::number( rFamilyData.mnName ) );
msName = sBuffer.makeStringAndClear();
}
- while (rFamilyData.maNameSet.find(msName) != rFamilyData.maNameSet.end());
+ while (rFamilyData.maNameSet.find(msName) != rFamilyData.maNameSet.end() || rFamilyData.maReservedNameSet.find(msName) != rFamilyData.maReservedNameSet.end());
}
#if OSL_DEBUG_LEVEL > 0
@@ -455,6 +455,15 @@ void SvXMLAutoStylePoolP_Impl::RegisterName( sal_Int32 nFamily, const OUString&
(*iter)->maNameSet.insert(rName);
}
+// Adds a name to list
+void SvXMLAutoStylePoolP_Impl::RegisterDefinedName( sal_Int32 nFamily, const OUString& rName )
+{
+ std::unique_ptr<XMLAutoStyleFamily> pTemp(new XMLAutoStyleFamily(nFamily));
+ auto const iter = m_FamilySet.find(pTemp);
+ assert(iter != m_FamilySet.end()); // family must be known
+ (*iter)->maReservedNameSet.insert(rName);
+}
+
// Retrieve the list of registered names
diff --git a/xmloff/source/style/impastpl.hxx b/xmloff/source/style/impastpl.hxx
index c70c4da4d78f..45ea50995ffc 100644
--- a/xmloff/source/style/impastpl.hxx
+++ b/xmloff/source/style/impastpl.hxx
@@ -111,6 +111,7 @@ struct XMLAutoStyleFamily
ParentSetType m_ParentSet;
std::set<OUString> maNameSet;
+ std::set<OUString> maReservedNameSet;
sal_uInt32 mnCount;
sal_uInt32 mnName;
OUString maStrPrefix;
@@ -155,6 +156,7 @@ public:
void SetFamilyPropSetMapper( sal_Int32 nFamily,
const rtl::Reference < SvXMLExportPropertyMapper > & rMapper );
void RegisterName( sal_Int32 nFamily, const OUString& rName );
+ void RegisterDefinedName( sal_Int32 nFamily, const OUString& rName );
void GetRegisteredNames(
css::uno::Sequence<sal_Int32>& aFamilies,
css::uno::Sequence<OUString>& aNames );
diff --git a/xmloff/source/style/xmlaustp.cxx b/xmloff/source/style/xmlaustp.cxx
index 493d46913733..adb678d2d358 100644
--- a/xmloff/source/style/xmlaustp.cxx
+++ b/xmloff/source/style/xmlaustp.cxx
@@ -309,6 +309,12 @@ void SvXMLAutoStylePoolP::RegisterName( sal_Int32 nFamily,
pImpl->RegisterName( nFamily, rName );
}
+void SvXMLAutoStylePoolP::RegisterDefinedName( sal_Int32 nFamily,
+ const OUString& rName )
+{
+ pImpl->RegisterDefinedName( nFamily, rName );
+}
+
void SvXMLAutoStylePoolP::GetRegisteredNames(
uno::Sequence<sal_Int32>& rFamilies,
uno::Sequence<OUString>& rNames )