[Libreoffice-commits] core.git: include/xmloff sc/inc sc/source xmloff/source

Markus Mohrhard markus.mohrhard at googlemail.com
Mon Sep 26 19:42:05 UTC 2016


 include/xmloff/xmlaustp.hxx       |    3 +++
 sc/inc/attarray.hxx               |    6 +++++-
 sc/inc/docpool.hxx                |    2 ++
 sc/inc/docuno.hxx                 |    2 ++
 sc/inc/patattr.hxx                |    4 ++++
 sc/inc/sheetdata.hxx              |    5 +++++
 sc/inc/unonames.hxx               |    1 +
 sc/inc/unowids.hxx                |    3 ++-
 sc/source/core/data/attarray.cxx  |    2 ++
 sc/source/core/data/docpool.cxx   |    9 ++++++++-
 sc/source/core/data/document.cxx  |    8 +++++++-
 sc/source/core/data/patattr.cxx   |   22 ++++++++++++++++++----
 sc/source/filter/xml/xmlexprt.cxx |   29 ++++++++++++++++++++++++++++-
 sc/source/filter/xml/xmlimprt.cxx |    8 ++++++++
 sc/source/ui/docshell/docsh.cxx   |   11 +++++++++++
 sc/source/ui/inc/docsh.hxx        |    2 ++
 sc/source/ui/unoobj/cellsuno.cxx  |   10 ++++++++++
 sc/source/ui/unoobj/docuno.cxx    |    7 +++++++
 xmloff/source/style/impastpl.cxx  |   11 ++++++++++-
 xmloff/source/style/impastpl.hxx  |    2 ++
 xmloff/source/style/xmlaustp.cxx  |    6 ++++++
 21 files changed, 143 insertions(+), 10 deletions(-)

New commits:
commit 89804c14ee99721d252e30468342384fbc8926b2
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sat Sep 24 20:41:52 2016 +0200

    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 at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/include/xmloff/xmlaustp.hxx b/include/xmloff/xmlaustp.hxx
index 95b58b0..a07cdbf 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 c24f658..f22bc34 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 d3381ab..8632ed4 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 8e32685..1487b0b 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 244b9ad..f6a042e 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 e57e486..107d2b5 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 415399e..e7ff39c 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 bd94159..e099dd2 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 a2aadcc..0f51713 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 e8f07f0..94d177c 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 96269cb..9462a54 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 dd618e8..57e66f6 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 437df5d..8a0931c 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 55c49b3..018b56e 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 a1b32f0..ca0b2a0 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 15faf2b..e7503b0 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 509c04a..39f82fe 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 a5ba537..43151ab 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 f35b098..7a4cbce 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 c70c4da..45ea509 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 493d469..adb678d 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 )


More information about the Libreoffice-commits mailing list