summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorArmin Le Grand (allotropia) <armin.le.grand.extern@allotropia.de>2023-12-23 15:52:06 +0100
committerArmin Le Grand <Armin.Le.Grand@me.com>2023-12-28 19:38:15 +0100
commit2e1f9da8a6359c8909e087a92239aefd4851b116 (patch)
treeae639bbc69342e51571fe688da79f54c8d4a23a6 /sc
parent6af35d077e9b5f5723f90f1589c5d801e79ccd4d (diff)
Decouple ScPatternAttr from SfxItemPool
ScPatternAttr is traditionally derived from SfxPoolItem (or better: SfxSetItem) and held in the ScDocumentPool as Item. This is only because of 'using' the 'poolable' functionality of the Item/ItemSet/ItemPool mechanism. Lots of hacks were added to sc and Item/ItemSet/ ItemPool to make that 'work' which shows already that this relationship is not optimal. It uses DirectPutItemInPool/DirectRemoveItemFromPool to do so, also with massive overhead to do that (and with not much success). The RefCnt in the SfxPoolItem that is used for this never worked reliably, so the SfxItemPool was (ab)used as garbage collector (all Items added and never removed get deleted at last for good when the Pool goes down). For this reasons and to be able to further get ItemSets modernized I changed this. I did two big changes here: (1) No longer derive ScPatternAttr from SfxItemSet/ SfxSetItem, no longer hold as SfxPoolItem (2) Add tooling to reliably control the lifetime of ScPatternAttr instances and ther uniqueness/ reusage for memory reasons It is now a regular non-derived class. The SfxItemSet formally derived from SfxSetItem is now a member. The RefCnt is now also a member (so independent from size/data type of SfxPoolItem). All in all it's pretty much the same size as before. To support handling it I created a CellAttributeHelper that is at/owned by ScDocument and takes over tooling to handle the ScPatternAttr. It supports to guarantee the uniqueness of incarnated ScPatternAttr instances for a ScDocument by providing helpers like registerAndCheck and doUnregister. It hosts the default CellAttribute/ ScPatternAttr. That default handling was anyways not using the standard default-handling of Items/Pools. I adapted whole SC to use that mainly by replacing calls to DirectPutItemInPool with registerAndCheck and DirectRemoveItemFromPool with doUnregister, BUT: This was not sufficient, the RefCnt kept to be broken. For that reason I decided to also do (2) in this change: I added a CellAttributeHolder that owns/regulates the lifetime of a single ScPatternAttr. Originally it also contained the CellAttributeHolder, but after some thoughts I decided that this is not needed - if there is no ScPatternAttr set, no CellAttributeHolder is needed for safe cleanup at destruction of the helper. So I moved/added the CellAttributeHolder to ScPatternAttr where it belongs more naturally anyways. The big plus is that CellAttributeHolder is just one ptr, so not bigger than having a simple ScPatternAttr*. That way, e.g. ScAttrEntry in ScAttrArray did not 'grow' at all. In principle all places where a ScPatternAttr* is used can now be replaced by using a CellAttributeHolder, except for construction. It is capable to be initialized with either ScPatternAttr instances from the heap (it creates a copy that then gets RefCounted) or allocated (it supports ownership change at construction time). Note that ScAttrEntry started to get more a C++ class in that change, it has a constructor. I did not change the SCROW member, but that should also be done. Also made registerAndCheck/doUnregister private in CellAttributeHelper and exclusively used by CellAttributeHolder. That way the RefCnt works, and a lot of code gets much simpler (check ScItemPoolCache, it's now straightforward) and safer and ~ScPatternAttr() uses now a hard assert(!isRegistered()); which shows that RefCnt works now (the 1st time?). There can be done more (see ToDo section below) but I myself will concentrate on getting ItemSets forward. This decoupling makes both involved mechanisms more safe, less complex and more stable. It also opens up possibilities to further optimize ScPatternAttr in SC without further hacking Item/ItemSet/ItemPool stuff. NOTE: ScPatternAttr *should* be renamed to 'CellAttribute' which describes what it is. The experiencd devs may know what it does, but it is a hindrance for understanding for attacting new devs. I already used now names like CellAttributeHelper/CellAttributeHolder etc., but abstained from renaming ScPatternAttr, see ToDo list below. SfxItemSet discussion: ScPatternAttr still contains a SfxItemSet, or better, a SfxSetItem. For that reason it still depends on access to an SfxItemPool (so there is acces in CellAttributeHelper). This is in principle not needed - no Item (in the range [ATTR_PATTERN_START .. ATTR_PATTERN_END]) needs that. In principle ScPatternAttr could now do it's own handling of those needed Items, however this might be done (linear array, hash-by-WhichID, ...). The Items get translated to and from this to the rest of the office anyways. Note that *merging* of SfxItemSets is *still* needed what means to have WhichID slots in SfxItemState::DONTCARE, see note in ScPatternAttr::ScPatternAttr about that. And there is also the Surrogates stuff which would have to be checked. The other extreme is to use SfxItemSet *more*, e.g. directly derive from SfxItemSet what would make stuff easier, maybe even get back to using the 'regular' Items like all office, I doubt that that would be much slower, so why...? Also possible is to remove that range of Items exclusively used by ScPatternAttr from ScDocumentPool *completely* and create an own Pool for them, owned by CellAttributeHelper. That Pool might even be static global, so all SC Docs could share all those Items - maybe even the ScPatternAttr themselves (except the default per document). That would remove the dependency of ScPatternAttr from a Pool completely. ToDo-List: - rename ScPatternAttr to CellAttribute or similar - use SfxItemSetFixed with range [ATTR_PATTERN_START .. ATTR_PATTERN_END] instead of regular SfxItemSet (if the copy-construtor works now...?) - maybe create own/separate Pool for exclusive Items - make ScAttrEntry more a C++ class by moving SCROW to the private section, add get/set methods and adapt SC Had to add some more usages of CellAttributeHolder to the SC Sort mechanism, there were situations where the sorted ScPatternAttr were replaced in the Table, but the 'sorted' ones were just ScPatternAttr*, thus deleting the valid ones in the Table already. Using CellAttributeHolder makes this safe, too. Added a small, one-entry cache to CellAttributeHelper to buffer the last found buffered ScPattrnAttr. It has a HitRate of ca. 5-6% and brings the UnitTest testSheetCellRangeProperties from 0m48,710s to 0m37,556s. Not too massive, but erery bit counts :-) Also shows that after that change optimizations in the now split functionality is possible and easy. Change-Id: I268a7b2a943ce5ddfe3c75b5e648c0f6b0cedb85 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161244 Tested-by: Jenkins Reviewed-by: Armin Le Grand <Armin.Le.Grand@me.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/attarray.hxx54
-rw-r--r--sc/inc/column.hxx26
-rw-r--r--sc/inc/docpool.hxx6
-rw-r--r--sc/inc/document.hxx16
-rw-r--r--sc/inc/global.hxx2
-rw-r--r--sc/inc/patattr.hxx132
-rw-r--r--sc/inc/poolcach.hxx28
-rw-r--r--sc/inc/scitems.hxx80
-rw-r--r--sc/inc/table.hxx4
-rw-r--r--sc/qa/unit/subsequent_export_test.cxx2
-rw-r--r--sc/qa/unit/subsequent_export_test4.cxx4
-rw-r--r--sc/qa/unit/subsequent_filters_test2.cxx4
-rw-r--r--sc/qa/unit/ucalc.cxx28
-rw-r--r--sc/qa/unit/ucalc_DocumentThemes.cxx2
-rw-r--r--sc/qa/unit/ucalc_copypaste.cxx10
-rw-r--r--sc/qa/unit/ucalc_formula.cxx3
-rw-r--r--sc/source/core/data/attarray.cxx422
-rw-r--r--sc/source/core/data/column.cxx71
-rw-r--r--sc/source/core/data/column2.cxx21
-rw-r--r--sc/source/core/data/column3.cxx6
-rw-r--r--sc/source/core/data/column4.cxx18
-rw-r--r--sc/source/core/data/dociter.cxx8
-rw-r--r--sc/source/core/data/docpool.cxx69
-rw-r--r--sc/source/core/data/documen2.cxx18
-rw-r--r--sc/source/core/data/documen4.cxx3
-rw-r--r--sc/source/core/data/document.cxx57
-rw-r--r--sc/source/core/data/document10.cxx4
-rw-r--r--sc/source/core/data/drwlayer.cxx2
-rw-r--r--sc/source/core/data/fillinfo.cxx4
-rw-r--r--sc/source/core/data/global.cxx18
-rw-r--r--sc/source/core/data/patattr.cxx340
-rw-r--r--sc/source/core/data/poolcach.cxx85
-rw-r--r--sc/source/core/data/stlpool.cxx3
-rw-r--r--sc/source/core/data/table2.cxx39
-rw-r--r--sc/source/core/data/table3.cxx48
-rw-r--r--sc/source/core/data/table4.cxx6
-rw-r--r--sc/source/core/data/validat.cxx2
-rw-r--r--sc/source/core/tool/ddelink.cxx4
-rw-r--r--sc/source/core/tool/editutil.cxx3
-rw-r--r--sc/source/core/tool/interpr1.cxx2
-rw-r--r--sc/source/filter/dif/difimp.cxx2
-rw-r--r--sc/source/filter/excel/xehelper.cxx8
-rw-r--r--sc/source/filter/excel/xestyle.cxx5
-rw-r--r--sc/source/filter/excel/xicontent.cxx2
-rw-r--r--sc/source/filter/excel/xistyle.cxx10
-rw-r--r--sc/source/filter/inc/xistyle.hxx2
-rw-r--r--sc/source/filter/lotus/lotattr.cxx4
-rw-r--r--sc/source/filter/lotus/op.cxx2
-rw-r--r--sc/source/filter/oox/sheetdatabuffer.cxx7
-rw-r--r--sc/source/filter/oox/stylesbuffer.cxx14
-rw-r--r--sc/source/filter/orcus/interface.cxx8
-rw-r--r--sc/source/filter/qpro/qprostyle.cxx2
-rw-r--r--sc/source/filter/rtf/eeimpars.cxx7
-rw-r--r--sc/source/filter/xml/xmlcelli.cxx2
-rw-r--r--sc/source/filter/xml/xmlimprt.cxx4
-rw-r--r--sc/source/ui/Accessibility/AccessibleText.cxx24
-rw-r--r--sc/source/ui/app/inputhdl.cxx4
-rw-r--r--sc/source/ui/app/scmod.cxx3
-rw-r--r--sc/source/ui/cctrl/dpcontrol.cxx2
-rw-r--r--sc/source/ui/docshell/arealink.cxx2
-rw-r--r--sc/source/ui/docshell/dbdocimp.cxx2
-rw-r--r--sc/source/ui/docshell/docfunc.cxx6
-rw-r--r--sc/source/ui/docshell/docsh.cxx2
-rw-r--r--sc/source/ui/docshell/docsh2.cxx2
-rw-r--r--sc/source/ui/docshell/docsh3.cxx6
-rw-r--r--sc/source/ui/docshell/docsh5.cxx4
-rw-r--r--sc/source/ui/docshell/docsh6.cxx4
-rw-r--r--sc/source/ui/docshell/docsh8.cxx2
-rw-r--r--sc/source/ui/docshell/impex.cxx2
-rw-r--r--sc/source/ui/inc/undoblk.hxx7
-rw-r--r--sc/source/ui/inc/undocell.hxx8
-rw-r--r--sc/source/ui/pagedlg/scuitphfedit.cxx10
-rw-r--r--sc/source/ui/undo/undoblk.cxx4
-rw-r--r--sc/source/ui/undo/undoblk3.cxx34
-rw-r--r--sc/source/ui/undo/undocell.cxx27
-rw-r--r--sc/source/ui/undo/undostyl.cxx2
-rw-r--r--sc/source/ui/unoobj/cellsuno.cxx14
-rw-r--r--sc/source/ui/unoobj/docuno.cxx3
-rw-r--r--sc/source/ui/unoobj/funcuno.cxx2
-rw-r--r--sc/source/ui/unoobj/styleuno.cxx4
-rw-r--r--sc/source/ui/unoobj/textuno.cxx29
-rw-r--r--sc/source/ui/vba/vbarange.cxx3
-rw-r--r--sc/source/ui/view/dbfunc3.cxx2
-rw-r--r--sc/source/ui/view/formatsh.cxx8
-rw-r--r--sc/source/ui/view/gridwin4.cxx5
-rw-r--r--sc/source/ui/view/output2.cxx8
-rw-r--r--sc/source/ui/view/preview.cxx3
-rw-r--r--sc/source/ui/view/printfun.cxx7
-rw-r--r--sc/source/ui/view/spelleng.cxx14
-rw-r--r--sc/source/ui/view/tabvwsha.cxx8
-rw-r--r--sc/source/ui/view/viewfun2.cxx4
-rw-r--r--sc/source/ui/view/viewfunc.cxx19
92 files changed, 1074 insertions, 949 deletions
diff --git a/sc/inc/attarray.hxx b/sc/inc/attarray.hxx
index a7e1c08a9f49..c1f9195e6445 100644
--- a/sc/inc/attarray.hxx
+++ b/sc/inc/attarray.hxx
@@ -67,24 +67,38 @@ struct ScLineFlags
struct ScMergePatternState
{
std::optional<SfxItemSet> pItemSet;
- const ScPatternAttr* pOld1; ///< existing objects, temporary
- const ScPatternAttr* pOld2;
+ CellAttributeHolder aOld1; ///< existing objects, temporary
+ CellAttributeHolder aOld2;
bool mbValidPatternId;
sal_uInt64 mnPatternId;
- ScMergePatternState() : pOld1(nullptr), pOld2(nullptr),
+ ScMergePatternState() : aOld1(), aOld2(),
mbValidPatternId(true), mnPatternId(0) {}
};
// we store an array of these where the pattern applies to all rows up till nEndRow
-struct ScAttrEntry
+class ScAttrEntry
{
+ CellAttributeHolder aPattern;
+
+public:
+ ScAttrEntry()
+ : aPattern()
+ , nEndRow(0)
+ {}
+
SCROW nEndRow;
- const ScPatternAttr* pPattern;
+
+ const CellAttributeHolder& getCellAttributeHolder() const { return aPattern; }
+ void setCellAttributeHolder(const CellAttributeHolder& rNew) { aPattern = rNew; }
+
+ const ScPatternAttr* getScPatternAttr() const { return aPattern.getScPatternAttr(); }
+ void setScPatternAttr(const ScPatternAttr* pNew, bool bPassingOwnership = false) { aPattern.setScPatternAttr(pNew, bPassingOwnership); }
+
bool operator==( const ScAttrEntry& other ) const
{
- return nEndRow == other.nEndRow && SfxPoolItem::areSame(pPattern, other.pPattern);
+ return nEndRow == other.nEndRow && CellAttributeHolder::areSame(&aPattern, &other.aPattern);
}
};
@@ -125,7 +139,7 @@ public:
#if DEBUG_SC_TESTATTRARRAY
void TestData() const;
#endif
- void Reset( const ScPatternAttr* pPattern);
+ void Reset(const CellAttributeHolder& rPattern);
bool Concat(SCSIZE nPos);
const ScPatternAttr* GetPattern( SCROW nRow ) const;
@@ -144,18 +158,12 @@ public:
void ApplyBlockFrame(const SvxBoxItem& rLineOuter, const SvxBoxInfoItem* pLineInner,
SCROW nStartRow, SCROW nEndRow, bool bLeft, SCCOL nDistRight);
- void SetPattern( SCROW nRow, const ScPatternAttr* pPattern, bool bPutToPool = false )
- { SetPatternAreaImpl(nRow, nRow, pPattern, bPutToPool, nullptr, /*bPassingOwnership*/false); }
- const ScPatternAttr* SetPattern( SCROW nRow, std::unique_ptr<ScPatternAttr> pPattern, bool bPutToPool = false )
- { return SetPatternAreaImpl(nRow, nRow, pPattern.release(), bPutToPool, nullptr, /*bPassingOwnership*/true); }
- void SetPatternArea( SCROW nStartRow, SCROW nEndRow, std::unique_ptr<ScPatternAttr> pPattern,
- bool bPutToPool = false, ScEditDataArray* pDataArray = nullptr)
- { SetPatternAreaImpl(nStartRow, nEndRow, pPattern.release(), bPutToPool, pDataArray, /*bPassingOwnership*/true); }
- void SetPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr* pPattern,
- bool bPutToPool = false, ScEditDataArray* pDataArray = nullptr)
- { SetPatternAreaImpl(nStartRow, nEndRow, pPattern, bPutToPool, pDataArray, /*bPassingOwnership*/false); }
+ void SetPattern( SCROW nRow, const CellAttributeHolder& rPattern )
+ { SetPatternAreaImpl(nRow, nRow, rPattern, nullptr); }
+ void SetPatternArea( SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rPattern, ScEditDataArray* pDataArray = nullptr)
+ { SetPatternAreaImpl(nStartRow, nEndRow, rPattern, pDataArray); }
void ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, const ScStyleSheet& rStyle );
- void ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCache* pCache,
+ void ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCache& rCache,
ScEditDataArray* pDataArray = nullptr, bool* const pIsChanged = nullptr );
void SetAttrEntries(std::vector<ScAttrEntry> && vNewData);
void ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
@@ -196,8 +204,7 @@ public:
void FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, ScFlatBoolRowSegments& rUsedRows, bool bReset );
bool IsStyleSheetUsed( const ScStyleSheet& rStyle ) const;
- void SetPatternAreaSafe( SCROW nStartRow, SCROW nEndRow,
- const ScPatternAttr* pWantedPattern, bool bDefault );
+ void SetPatternAreaSafe( SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rWantedPattern );
void CopyAreaSafe( SCROW nStartRow, SCROW nEndRow, tools::Long nDy, ScAttrArray& rAttrArray );
bool IsEmpty() const;
@@ -227,9 +234,8 @@ public:
SCSIZE Count( SCROW nRow1, SCROW nRow2 ) const;
private:
- const ScPatternAttr* SetPatternAreaImpl( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr* pPattern,
- bool bPutToPool = false, ScEditDataArray* pDataArray = nullptr,
- bool bPassingPatternOwnership = false );
+ const ScPatternAttr* SetPatternAreaImpl(
+ SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rPattern, ScEditDataArray* pDataArray = nullptr);
};
// Iterator for attributes
@@ -287,7 +293,7 @@ inline const ScPatternAttr* ScAttrIterator::Next( SCROW& rTop, SCROW& rBottom )
{
rTop = nRow;
rBottom = std::min( pArray->mvData[nPos].nEndRow, nEndRow );
- pRet = pArray->mvData[nPos].pPattern;
+ pRet = pArray->mvData[nPos].getScPatternAttr();
nRow = rBottom + 1;
++nPos;
}
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 914199be25b5..87273f0f83ba 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -100,7 +100,8 @@ struct ScInterpreterContext;
struct ScNeededSizeOptions
{
- const ScPatternAttr* pPattern;
+ CellAttributeHolder aPattern;
+
bool bFormula;
bool bSkipMerged;
bool bGetFont;
@@ -144,7 +145,7 @@ public:
const ScPatternAttr* GetPattern( SCROW nRow ) const;
const ScPatternAttr* GetMostUsedPattern( SCROW nStartRow, SCROW nEndRow ) const;
- SCROW ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark, ScEditDataArray* pDataArray, bool* const pIsChanged,
+ SCROW ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark, ScEditDataArray* pDataArray, bool* const pIsChanged,
SCCOL nCol );
void ApplyPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr& rPatAttr,
ScEditDataArray* pDataArray = nullptr,
@@ -541,9 +542,9 @@ public:
void ApplyAttr( SCROW nRow, const SfxPoolItem& rAttr );
void ApplyPattern( SCROW nRow, const ScPatternAttr& rPatAttr );
- const ScPatternAttr* SetPattern( SCROW nRow, std::unique_ptr<ScPatternAttr> );
- void SetPattern( SCROW nRow, const ScPatternAttr& );
- void SetPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr& );
+ void SetPattern( SCROW nRow, const CellAttributeHolder& rHolder );
+ void SetPattern( SCROW nRow, const ScPatternAttr& rPattern );
+ void SetPatternArea( SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& );
void ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
const ScPatternAttr& rPattern, SvNumFormatType nNewType );
@@ -575,7 +576,7 @@ public:
void RemoveProtected( SCROW nStartRow, SCROW nEndRow );
- SCROW ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark, ScEditDataArray* pDataArray, bool* const pIsChanged );
+ SCROW ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark, ScEditDataArray* pDataArray, bool* const pIsChanged );
void DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast );
void ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark );
@@ -1031,20 +1032,19 @@ inline void ScColumn::ClearItems( SCROW nStartRow, SCROW nEndRow, const sal_uInt
pAttrArray->ClearItems( nStartRow, nEndRow, pWhich );
}
-inline const ScPatternAttr* ScColumn::SetPattern( SCROW nRow, std::unique_ptr<ScPatternAttr> pPatAttr )
+inline void ScColumn::SetPattern( SCROW nRow, const CellAttributeHolder& rHolder )
{
- return pAttrArray->SetPattern( nRow, std::move(pPatAttr), true/*bPutToPool*/ );
+ return pAttrArray->SetPattern( nRow, rHolder );
}
-inline void ScColumn::SetPattern( SCROW nRow, const ScPatternAttr& rPatAttr )
+inline void ScColumn::SetPattern( SCROW nRow, const ScPatternAttr& rPattern )
{
- pAttrArray->SetPattern( nRow, &rPatAttr, true/*bPutToPool*/ );
+ pAttrArray->SetPattern( nRow, CellAttributeHolder(&rPattern) );
}
-inline void ScColumn::SetPatternArea( SCROW nStartRow, SCROW nEndRow,
- const ScPatternAttr& rPatAttr )
+inline void ScColumn::SetPatternArea( SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rHolder )
{
- pAttrArray->SetPatternArea( nStartRow, nEndRow, &rPatAttr, true/*bPutToPool*/ );
+ pAttrArray->SetPatternArea( nStartRow, nEndRow, rHolder );
}
inline void ScColumnData::SetAttrEntries(std::vector<ScAttrEntry> && vNewData)
diff --git a/sc/inc/docpool.hxx b/sc/inc/docpool.hxx
index c73d034f2fb2..614e3d4229b8 100644
--- a/sc/inc/docpool.hxx
+++ b/sc/inc/docpool.hxx
@@ -29,7 +29,6 @@ class ScDocument;
class SC_DLLPUBLIC ScDocumentPool final : public SfxItemPool
{
std::vector<SfxPoolItem*> mvPoolDefaults;
- sal_uInt64 mnCurrentMaxKey;
public:
ScDocumentPool();
@@ -40,15 +39,10 @@ public:
virtual rtl::Reference<SfxItemPool> Clone() const override;
virtual MapUnit GetMetric( sal_uInt16 nWhich ) const override;
- void StyleDeleted( const ScStyleSheet* pStyle ); // delete templates(?) in organizer
- void CellStyleCreated( std::u16string_view rName, const ScDocument& rDoc );
virtual bool GetPresentation( const SfxPoolItem& rItem,
MapUnit ePresentationMetric,
OUString& rText,
const IntlWrapper& rIntl ) const override;
-private:
- virtual void newItem_Callback(const SfxPoolItem& rItem) const override;
- virtual bool newItem_UseDirect(const SfxPoolItem& rItem) const override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 11b65e9262c0..d94b0ef4fb53 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -356,6 +356,14 @@ public:
};
private:
+ // needs to be shared to allow the bIsClip/bIsUndo mechanism to
+ // do the right thing (SCDOCMODE_CLIP, SCDOCMODE_UNDO)
+ mutable std::shared_ptr<CellAttributeHelper> mpCellAttributeHelper;
+
+public:
+ SC_DLLPUBLIC CellAttributeHelper& getCellAttributeHelper() const;
+
+private:
rtl::Reference<ScPoolHelper> mxPoolHelper;
std::shared_ptr<svl::SharedStringPool> mpCellStringPool;
@@ -1939,8 +1947,8 @@ public:
SCTAB nTab, ScMF nFlags );
SC_DLLPUBLIC void SetPattern( const ScAddress&, const ScPatternAttr& rAttr );
- SC_DLLPUBLIC const ScPatternAttr* SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, std::unique_ptr<ScPatternAttr> pAttr );
- SC_DLLPUBLIC const ScPatternAttr* SetPattern( const ScAddress& rPos, std::unique_ptr<ScPatternAttr> pAttr );
+ SC_DLLPUBLIC void SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const CellAttributeHolder& rHolder );
+ SC_DLLPUBLIC void SetPattern( const ScAddress& rPos, const CellAttributeHolder& rHolder );
SC_DLLPUBLIC void SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr );
void AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
@@ -2090,7 +2098,6 @@ public:
void StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab );
void ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab );
- SC_DLLPUBLIC ScPatternAttr* GetDefPattern() const;
SC_DLLPUBLIC ScDocumentPool* GetPool();
SC_DLLPUBLIC ScStyleSheetPool* GetStyleSheetPool() const;
void GetUnprotectedCells( ScRangeList& rRange, SCTAB nTab ) const;
@@ -2142,9 +2149,6 @@ public:
SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero = true ) const;
SC_DLLPUBLIC ScRange GetRange( SCTAB nTab, const tools::Rectangle& rMMRect, bool bHiddenAsZero = true ) const;
- void UpdStlShtPtrsFrmNms();
- void StylesToNames();
-
SC_DLLPUBLIC void CopyStdStylesFrom( const ScDocument& rSrcDoc );
static sal_uInt16 GetSrcVersion() { return nSrcVer; }
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index fe7b8bb407b2..1539858434bc 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -603,7 +603,7 @@ public:
static void InitAddIns();
SC_DLLPUBLIC static void Clear(); // at the end of the program
- static void InitTextHeight(const SfxItemPool* pPool);
+ static void InitTextHeight(SfxItemPool& rPool);
static SvxBrushItem* GetEmptyBrushItem() { return xEmptyBrushItem.get(); }
static SvxBrushItem* GetButtonBrushItem();
diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx
index d6536551f965..361ed40cd25b 100644
--- a/sc/inc/patattr.hxx
+++ b/sc/inc/patattr.hxx
@@ -21,13 +21,14 @@
#include <optional>
-#include <svl/setitem.hxx>
#include <svl/itemset.hxx>
#include <svl/languageoptions.hxx>
#include <tools/degree.hxx>
#include <editeng/svxenum.hxx>
#include "scdllapi.h"
#include "fonthelper.hxx"
+#include "scitems.hxx"
+#include <unordered_set>
namespace vcl { class Font; }
namespace model { class ComplexColor; }
@@ -50,43 +51,106 @@ enum class ScAutoFontColorMode
IgnoreAll ///< like DISPLAY, but ignore stored font and background colors
};
-class SC_DLLPUBLIC ScPatternAttr final : public SfxSetItem
+class ScPatternAttr;
+
+class SC_DLLPUBLIC CellAttributeHelper final
{
- std::optional<OUString> pName;
- mutable std::optional<bool> mxVisible;
- ScStyleSheet* pStyle;
- sal_uInt64 mnPAKey;
+ friend class CellAttributeHolder;
+
+ SfxItemPool& mrSfxItemPool;
+ mutable ScPatternAttr* mpDefaultCellAttribute;
+ mutable std::unordered_set<const ScPatternAttr*> maRegisteredCellAttributes;
+ mutable const ScPatternAttr* mpLastHit;
+ mutable sal_uInt64 mnCurrentMaxKey;
+
+ // only to be used from CellAttributeHolder, so private
+ const ScPatternAttr* registerAndCheck(const ScPatternAttr& rCandidate, bool bPassingOwnership) const;
+ void doUnregister(const ScPatternAttr& rCandidate);
+
public:
- ScPatternAttr(SfxItemSet&& pItemSet, const OUString& rStyleName);
- ScPatternAttr(SfxItemSet&& pItemSet);
- ScPatternAttr(SfxItemPool* pItemPool);
- ScPatternAttr(const ScPatternAttr& rPatternAttr);
+ explicit CellAttributeHelper(SfxItemPool& rSfxItemPool);
+ ~CellAttributeHelper();
+
+ const ScPatternAttr& getDefaultCellAttribute() const;
+ SfxItemPool& GetPool() const { return mrSfxItemPool; }
- virtual ScPatternAttr* Clone( SfxItemPool *pPool = nullptr ) const override;
+ void CellStyleDeleted(const ScStyleSheet& rStyle);
+ void CellStyleCreated(ScDocument& rDoc, std::u16string_view rName);
+ void UpdateAllStyleSheets(ScDocument& rDoc);
+ void AllStylesToNames();
+};
- virtual bool operator==(const SfxPoolItem& rCmp) const override;
+class SC_DLLPUBLIC CellAttributeHolder final
+{
+ const ScPatternAttr* mpScPatternAttr;
- const SfxPoolItem& GetItem( sal_uInt16 nWhichP ) const
- { return GetItemSet().Get(nWhichP); }
- template<class T> const T& GetItem( TypedWhichId<T> nWhich ) const
- { return static_cast<const T&>(GetItem(sal_uInt16(nWhich))); }
+public:
+ CellAttributeHolder(const ScPatternAttr* pScPatternAttr = nullptr, bool bPassingOwnership = false);
+ CellAttributeHolder(const CellAttributeHolder& rHolder);
+ ~CellAttributeHolder();
- static const SfxPoolItem& GetItem( sal_uInt16 nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet );
- template<class T> static const T& GetItem( TypedWhichId<T> nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet )
- { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), rItemSet, pCondSet)); }
+ const CellAttributeHolder& operator=(const CellAttributeHolder& rHolder);
+ bool operator==(const CellAttributeHolder& rHolder) const;
- const SfxPoolItem& GetItem( sal_uInt16 nWhich, const SfxItemSet* pCondSet ) const;
- template<class T> const T& GetItem( TypedWhichId<T> nWhich, const SfxItemSet* pCondSet ) const
- { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), pCondSet)); }
+ const ScPatternAttr* getScPatternAttr() const { return mpScPatternAttr; }
+ void setScPatternAttr(const ScPatternAttr* pNew, bool bPassingOwnership = false);
- /// @param pWhich are no ranges, but single IDs, 0-terminated
- bool HasItemsSet( const sal_uInt16* pWhich ) const;
- void ClearItems( const sal_uInt16* pWhich );
+ bool operator!() const { return nullptr == mpScPatternAttr; }
+ explicit operator bool() const { return nullptr != mpScPatternAttr; }
- void DeleteUnchanged( const ScPatternAttr* pOldAttrs );
+ // version that allows nullptrs
+ static bool areSame(const CellAttributeHolder* p1, const CellAttributeHolder* p2);
+};
+
+class SC_DLLPUBLIC ScPatternAttr final
+{
+ friend class CellAttributeHelper;
+
+ SfxItemSet maLocalSfxItemSet;
+ std::optional<OUString> pName;
+ mutable std::optional<bool> mxVisible;
+ ScStyleSheet* pStyle;
+ CellAttributeHelper* pCellAttributeHelper;
+ sal_uInt64 mnPAKey;
+ mutable size_t mnRefCount;
+#ifdef DBG_UTIL
+ sal_uInt32 m_nSerialNumber;
+ bool m_bDeleted;
+#endif
+
+public:
+ ScPatternAttr(CellAttributeHelper& rHelper, const SfxItemSet* pItemSet = nullptr, const OUString* pStyleName = nullptr);
+ ScPatternAttr(const ScPatternAttr& rPatternAttr);
+ ~ScPatternAttr();
+
+ virtual bool operator==(const ScPatternAttr& rCmp) const;
+
+ // version that allows nullptrs
+ static bool areSame(const ScPatternAttr* pItem1, const ScPatternAttr* pItem2);
+ bool isRegistered() const { return 0 != mnRefCount; }
+ bool isDefault() const { return this == &pCellAttributeHelper->getDefaultCellAttribute(); }
+ CellAttributeHelper& getCellAttributeHelper() const { return *pCellAttributeHelper; }
+
+ const SfxItemSet& GetItemSet() const { return maLocalSfxItemSet; }
+ SfxItemSet& GetItemSet() { return maLocalSfxItemSet; }
+
+ const SfxPoolItem& GetItem(sal_uInt16 nWhichP) const { return maLocalSfxItemSet.Get(nWhichP); }
+ template<class T> const T& GetItem( TypedWhichId<T> nWhich ) const
+ { return static_cast<const T&>(GetItem(sal_uInt16(nWhich))); }
+ static const SfxPoolItem& GetItem(sal_uInt16 nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet);
+ template<class T> static const T& GetItem(TypedWhichId<T> nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet)
+ { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), rItemSet, pCondSet)); }
+ const SfxPoolItem& GetItem( sal_uInt16 nWhich, const SfxItemSet* pCondSet ) const;
+ template<class T> const T& GetItem(TypedWhichId<T> nWhich, const SfxItemSet* pCondSet) const
+ { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), pCondSet)); }
+
+ /// @param pWhich are no ranges, but single IDs, 0-terminated
+ bool HasItemsSet( const sal_uInt16* pWhich ) const;
+ void ClearItems( const sal_uInt16* pWhich );
+ void DeleteUnchanged( const ScPatternAttr* pOldAttrs );
static SvxCellOrientation GetCellOrientation( const SfxItemSet& rItemSet, const SfxItemSet* pCondSet );
- SvxCellOrientation GetCellOrientation( const SfxItemSet* pCondSet = nullptr ) const;
+ SvxCellOrientation GetCellOrientation( const SfxItemSet* pCondSet = nullptr ) const;
/** Static helper function to fill a font object from the passed item set. */
static void fillFontOnly(vcl::Font& rFont, const SfxItemSet& rItemSet,
@@ -119,7 +183,7 @@ public:
const Color* pBackConfigColor = nullptr,
const Color* pTextConfigColor = nullptr) const
{
- fillColor(rComplexColor, GetItemSet(), eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
+ fillColor(rComplexColor, maLocalSfxItemSet, eAutoMode, pCondSet, pBackConfigColor, pTextConfigColor);
}
void fillFontOnly(vcl::Font& rFont,
@@ -128,7 +192,7 @@ public:
const SfxItemSet* pCondSet = nullptr,
SvtScriptType nScript = SvtScriptType::NONE) const
{
- fillFontOnly(rFont, GetItemSet(), pOutDev, pScale, pCondSet, nScript);
+ fillFontOnly(rFont, maLocalSfxItemSet, pOutDev, pScale, pCondSet, nScript);
}
/** Fills a font object from the own item set. */
@@ -140,7 +204,7 @@ public:
const Color* pBackConfigColor = nullptr,
const Color* pTextConfigColor = nullptr) const
{
- fillFont(rFont, GetItemSet(), eAutoMode, pOutDev, pScale, pCondSet, nScript, pBackConfigColor, pTextConfigColor);
+ fillFont(rFont, maLocalSfxItemSet, eAutoMode, pOutDev, pScale, pCondSet, nScript, pBackConfigColor, pTextConfigColor);
}
/** Converts all Calc items contained in rSrcSet to edit engine items and puts them into rEditSet. */
@@ -155,7 +219,7 @@ public:
void FillEditParaItems( SfxItemSet* pSet ) const;
- ScPatternAttr* PutInPool( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const;
+ CellAttributeHolder MigrateToDocument( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const;
void SetStyleSheet(ScStyleSheet* pNewStyle, bool bClearDirectFormat = true);
const ScStyleSheet* GetStyleSheet() const { return pStyle; }
@@ -180,12 +244,6 @@ public:
void SetPAKey(sal_uInt64 nKey);
sal_uInt64 GetPAKey() const;
- // TODO: tdf#135215: This is a band-aid to detect changes and invalidate the hash,
- // a proper way would be probably to override SfxItemSet::Changed(), but 6cb400f41df0dd10
- // hardcoded SfxSetItem to contain SfxItemSet.
- SfxItemSet& GetItemSet() { mxVisible.reset(); return SfxSetItem::GetItemSet(); }
- using SfxSetItem::GetItemSet;
-
private:
bool CalcVisible() const;
};
diff --git a/sc/inc/poolcach.hxx b/sc/inc/poolcach.hxx
index 6e3c3deda916..5b9057b7faf3 100644
--- a/sc/inc/poolcach.hxx
+++ b/sc/inc/poolcach.hxx
@@ -19,35 +19,33 @@
#pragma once
#include "scdllapi.h"
+#include "patattr.hxx"
#include <vector>
-class SfxItemPool;
+class CellAttributeHelper;
class SfxItemSet;
class SfxPoolItem;
-class ScPatternAttr;
class ScItemPoolCache
{
struct SfxItemModifyImpl
{
- const ScPatternAttr *pOrigItem;
- ScPatternAttr *pPoolItem;
+ const CellAttributeHolder aOriginal;
+ const CellAttributeHolder aModified;
+ SfxItemModifyImpl(const CellAttributeHolder& a, const CellAttributeHolder &b) : aOriginal(a), aModified(b) {}
};
- SfxItemPool *pPool;
- std::vector<SfxItemModifyImpl>
- m_aCache;
- const SfxItemSet *pSetToPut;
- const SfxPoolItem *pItemToPut;
+ CellAttributeHelper& rHelper;
+ std::vector<SfxItemModifyImpl> m_aCache;
+ const SfxItemSet* pSetToPut;
+ const SfxPoolItemHolder aItemToPut;
public:
- ScItemPoolCache( SfxItemPool *pPool,
- const SfxPoolItem *pPutItem );
- ScItemPoolCache( SfxItemPool *pPool,
- const SfxItemSet *pPutSet );
- ~ScItemPoolCache();
+ ScItemPoolCache( CellAttributeHelper& rHelper, const SfxPoolItem& rPutItem );
+ ScItemPoolCache( CellAttributeHelper& rHelper, const SfxItemSet& rPutSet );
+ ~ScItemPoolCache();
- const ScPatternAttr& ApplyTo( const ScPatternAttr& rSetItem );
+ const CellAttributeHolder& ApplyTo( const CellAttributeHolder& rSetItem );
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/scitems.hxx b/sc/inc/scitems.hxx
index dd91e2f63a3c..538624e4c5cb 100644
--- a/sc/inc/scitems.hxx
+++ b/sc/inc/scitems.hxx
@@ -162,48 +162,46 @@ constexpr TypedWhichId<ScCondFormatItem> ATTR_CONDITIONAL (154);
constexpr TypedWhichId<SfxStringItem> ATTR_HYPERLINK (155);
constexpr sal_uInt16 ATTR_PATTERN_END(155); // end cell-attribute-pattern
-
-constexpr TypedWhichId<ScPatternAttr> ATTR_PATTERN (156);
// page attributes
-constexpr TypedWhichId<SvxLRSpaceItem> ATTR_LRSPACE (157); // editor: PageDesc-TabPage
-constexpr TypedWhichId<SvxULSpaceItem> ATTR_ULSPACE (158);
-constexpr TypedWhichId<SvxPageItem> ATTR_PAGE (159);
-constexpr TypedWhichId<SvxPaperBinItem> ATTR_PAGE_PAPERBIN (160);
-constexpr TypedWhichId<SvxSizeItem> ATTR_PAGE_SIZE (161);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_HORCENTER (162);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_VERCENTER (163);
-
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_ON (164); // editor: header/footer-page
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_DYNAMIC (165);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_SHARED (166);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_SHARED_FIRST (167);
-
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_NOTES (168); // editor: table
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_GRID (169);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_HEADERS (170);
-constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_CHARTS (171);
-constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_OBJECTS (172);
-constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_DRAWINGS (173);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_TOPDOWN (174);
-constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_SCALE (175);
-constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_SCALETOPAGES (176);
-constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_FIRSTPAGENO (177);
-
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERLEFT (178); // contents of header/
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERLEFT (179); // footer (left)
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERRIGHT (180); // contents of header/
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERRIGHT (181); // footer (right)
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERFIRST (182); // contents of header/
-constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERFIRST (183); // footer (first page)
-constexpr TypedWhichId<SvxSetItem> ATTR_PAGE_HEADERSET (184); // the corresponding sets
-constexpr TypedWhichId<SvxSetItem> ATTR_PAGE_FOOTERSET (185);
-
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_FORMULAS (186);
-constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_NULLVALS (187);
-
-constexpr TypedWhichId<ScPageScaleToItem> ATTR_PAGE_SCALETO (188); // #i8868# scale printout to width/height
-
-constexpr TypedWhichId<SfxBoolItem> ATTR_HIDDEN (189);
+constexpr TypedWhichId<SvxLRSpaceItem> ATTR_LRSPACE (156); // editor: PageDesc-TabPage
+constexpr TypedWhichId<SvxULSpaceItem> ATTR_ULSPACE (157);
+constexpr TypedWhichId<SvxPageItem> ATTR_PAGE (158);
+constexpr TypedWhichId<SvxPaperBinItem> ATTR_PAGE_PAPERBIN (159);
+constexpr TypedWhichId<SvxSizeItem> ATTR_PAGE_SIZE (160);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_HORCENTER (161);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_VERCENTER (162);
+
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_ON (163); // editor: header/footer-page
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_DYNAMIC (164);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_SHARED (165);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_SHARED_FIRST (166);
+
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_NOTES (167); // editor: table
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_GRID (168);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_HEADERS (169);
+constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_CHARTS (170);
+constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_OBJECTS (171);
+constexpr TypedWhichId<ScViewObjectModeItem> ATTR_PAGE_DRAWINGS (172);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_TOPDOWN (173);
+constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_SCALE (174);
+constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_SCALETOPAGES (175);
+constexpr TypedWhichId<SfxUInt16Item> ATTR_PAGE_FIRSTPAGENO (176);
+
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERLEFT (177); // contents of header/
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERLEFT (178); // footer (left)
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERRIGHT (179); // contents of header/
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERRIGHT (180); // footer (right)
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_HEADERFIRST (181); // contents of header/
+constexpr TypedWhichId<ScPageHFItem> ATTR_PAGE_FOOTERFIRST (182); // footer (first page)
+constexpr TypedWhichId<SvxSetItem> ATTR_PAGE_HEADERSET (183); // the corresponding sets
+constexpr TypedWhichId<SvxSetItem> ATTR_PAGE_FOOTERSET (184);
+
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_FORMULAS (185);
+constexpr TypedWhichId<SfxBoolItem> ATTR_PAGE_NULLVALS (186);
+
+constexpr TypedWhichId<ScPageScaleToItem> ATTR_PAGE_SCALETO (187); // #i8868# scale printout to width/height
+
+constexpr TypedWhichId<SfxBoolItem> ATTR_HIDDEN (188);
constexpr sal_uInt16 ATTR_ENDINDEX(ATTR_HIDDEN); // end of pool-range
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 3b47a52c0ab8..72e78b195986 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -780,7 +780,7 @@ public:
void SetAttrEntries( SCCOL nStartCol, SCCOL nEndCol, std::vector<ScAttrEntry> && vNewData);
void SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr );
- const ScPatternAttr* SetPattern( SCCOL nCol, SCROW nRow, std::unique_ptr<ScPatternAttr> );
+ void SetPattern( SCCOL nCol, SCROW nRow, const CellAttributeHolder& rHolder );
void SetPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr );
void ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
const ScPatternAttr& rPattern, SvNumFormatType nNewType );
@@ -810,7 +810,7 @@ public:
bool ApplyFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScMF nFlags );
bool RemoveFlags( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScMF nFlags );
- void ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark, ScEditDataArray* pDataArray = nullptr, bool* const pIsChanged = nullptr );
+ void ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark, ScEditDataArray* pDataArray = nullptr, bool* const pIsChanged = nullptr );
void DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rMark, bool bBroadcast = true );
void ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark );
diff --git a/sc/qa/unit/subsequent_export_test.cxx b/sc/qa/unit/subsequent_export_test.cxx
index 30600191d54a..4fc83ab7df9f 100644
--- a/sc/qa/unit/subsequent_export_test.cxx
+++ b/sc/qa/unit/subsequent_export_test.cxx
@@ -1740,7 +1740,7 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, testRichTextExportODS)
pEditText = pDoc->GetEditText(ScAddress(1, 8, 0));
CPPUNIT_ASSERT_MESSAGE("Incorrect B9 value.", aCheckFunc.checkB9(pEditText));
- ScPatternAttr aCellFontColor(pDoc->GetPool());
+ ScPatternAttr aCellFontColor(pDoc->getCellAttributeHelper());
aCellFontColor.GetItemSet().Put(SvxColorItem(COL_BLUE, ATTR_FONT_COLOR));
// Set font color of B10 to blue.
pDoc->ApplyPattern(1, 9, 0, aCellFontColor);
diff --git a/sc/qa/unit/subsequent_export_test4.cxx b/sc/qa/unit/subsequent_export_test4.cxx
index 95c7057aef2d..41d76cc9698d 100644
--- a/sc/qa/unit/subsequent_export_test4.cxx
+++ b/sc/qa/unit/subsequent_export_test4.cxx
@@ -223,7 +223,7 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf143979)
sal_uInt32 nFormat;
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
pFormatter->PutEntry(aCode, nCheckPos, nType, nFormat);
- ScPatternAttr aNewAttrs(pDoc->GetPool());
+ ScPatternAttr aNewAttrs(pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
pDoc->ApplyPattern(0, 0, 0, aNewAttrs);
@@ -1418,7 +1418,7 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testWholeRowBold)
ScDocument* pDoc = getScDoc();
// Make entire second row bold.
- ScPatternAttr boldAttr(pDoc->GetPool());
+ ScPatternAttr boldAttr(pDoc->getCellAttributeHelper());
boldAttr.GetItemSet().Put(SvxWeightItem(WEIGHT_BOLD, ATTR_FONT_WEIGHT));
pDoc->ApplyPatternAreaTab(0, 1, pDoc->MaxCol(), 1, 0, boldAttr);
}
diff --git a/sc/qa/unit/subsequent_filters_test2.cxx b/sc/qa/unit/subsequent_filters_test2.cxx
index 22339c010e8f..31dae9282166 100644
--- a/sc/qa/unit/subsequent_filters_test2.cxx
+++ b/sc/qa/unit/subsequent_filters_test2.cxx
@@ -1637,10 +1637,10 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest2, testBackColorFilter)
createScDoc();
ScDocument* pDoc = getScDoc();
- ScPatternAttr aPattern1(pDoc->GetPool());
+ ScPatternAttr aPattern1(pDoc->getCellAttributeHelper());
aPattern1.GetItemSet().Put(SvxBrushItem(aBackColor1, ATTR_BACKGROUND));
- ScPatternAttr aPattern2(pDoc->GetPool());
+ ScPatternAttr aPattern2(pDoc->getCellAttributeHelper());
aPattern2.GetItemSet().Put(SvxBrushItem(aBackColor2, ATTR_BACKGROUND));
// Apply the pattern to cell A1:A2
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index c75742eabdfc..370f2d1f5c80 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -1187,7 +1187,7 @@ CPPUNIT_TEST_FIXTURE(Test, testHorizontalAttrIterator)
m_pDoc->InsertTab(0, "Test");
// Set the background color of B2:C3,D2,E3,C4:D4,B5:D5 to blue
- ScPatternAttr aCellBackColor(m_pDoc->GetPool());
+ ScPatternAttr aCellBackColor(m_pDoc->getCellAttributeHelper());
aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(1, 1, 2, 2, 0, aCellBackColor);
m_pDoc->ApplyPatternAreaTab(3, 1, 3, 1, 0, aCellBackColor);
@@ -1210,7 +1210,7 @@ CPPUNIT_TEST_FIXTURE(Test, testHorizontalAttrIterator)
size_t nCheckPos = 0;
for (const ScPatternAttr* pAttr = aIter.GetNext(nCol1, nCol2, nRow); pAttr; pAttr = aIter.GetNext(nCol1, nCol2, nRow))
{
- if (SfxPoolItem::areSame( pAttr, m_pDoc->GetDefPattern()))
+ if (pAttr->isDefault())
continue;
CPPUNIT_ASSERT_MESSAGE("Iteration longer than expected.", nCheckPos < nCheckLen);
CPPUNIT_ASSERT_EQUAL(aChecks[nCheckPos][0], static_cast<int>(nCol1));
@@ -1235,7 +1235,7 @@ CPPUNIT_TEST_FIXTURE(Test, testIteratorsUnallocatedColumnsAttributes)
CPPUNIT_ASSERT_EQUAL(allocatedColsCount, m_pDoc->GetAllocatedColumnsCount(0));
// Make entire second row and third row bold.
- ScPatternAttr boldAttr(m_pDoc->GetPool());
+ ScPatternAttr boldAttr(m_pDoc->getCellAttributeHelper());
boldAttr.GetItemSet().Put(SvxWeightItem(WEIGHT_BOLD, ATTR_FONT_WEIGHT));
m_pDoc->ApplyPatternAreaTab(0, 1, m_pDoc->MaxCol(), 2, 0, boldAttr);
@@ -1293,15 +1293,15 @@ CPPUNIT_TEST_FIXTURE(Test, testIteratorsDefPattern)
// Set cells as bold, default allocated, bold, default unallocated.
SCCOL firstCol = 100;
SCCOL lastCol = 103;
- ScPatternAttr boldAttr(m_pDoc->GetPool());
+ ScPatternAttr boldAttr(m_pDoc->getCellAttributeHelper());
boldAttr.GetItemSet().Put(SvxWeightItem(WEIGHT_BOLD, ATTR_FONT_WEIGHT));
m_pDoc->ApplyPattern(100, 0, 0, boldAttr);
m_pDoc->ApplyPattern(102, 0, 0, boldAttr);
CPPUNIT_ASSERT_EQUAL(SCCOL(102 + 1), m_pDoc->GetAllocatedColumnsCount(0));
const ScPatternAttr* pattern = m_pDoc->GetPattern(100, 0, 0);
- const ScPatternAttr* defPattern = m_pDoc->GetDefPattern();
- CPPUNIT_ASSERT(!SfxPoolItem::areSame(pattern, defPattern));
+ const ScPatternAttr* defPattern(&m_pDoc->getCellAttributeHelper().getDefaultCellAttribute()); //GetDefPattern();
+ CPPUNIT_ASSERT(!ScPatternAttr::areSame(pattern, defPattern));
CPPUNIT_ASSERT_EQUAL(pattern, m_pDoc->GetPattern(102, 0, 0));
CPPUNIT_ASSERT_EQUAL(defPattern, m_pDoc->GetPattern(101, 0, 0));
CPPUNIT_ASSERT_EQUAL(defPattern, m_pDoc->GetPattern(103, 0, 0));
@@ -3481,7 +3481,7 @@ CPPUNIT_TEST_FIXTURE(Test, testAutoFilterTimeValue)
// Apply the "hour:minute:second" format to A2:A3.
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
sal_uInt32 nFormat = pFormatter->GetFormatIndex(NF_TIME_HH_MMSS, LANGUAGE_ENGLISH_US);
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
@@ -3634,7 +3634,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf76441)
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
pFormatter->PutEntry( aCode, nCheckPos, nType, nFormat );
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
{
@@ -3672,7 +3672,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf76836)
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
pFormatter->PutEntry( aCode, nCheckPos, nType, nFormat );
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
@@ -3705,7 +3705,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf142186)
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
pFormatter->PutEntry( aCode, nCheckPos, nType, nFormat );
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
{
@@ -3759,7 +3759,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf126342)
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
pFormatter->PutEntry( aCode, nCheckPos, nType, nFormat );
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
m_pDoc->ApplyPattern(0, 0, 0, aNewAttrs);
@@ -3892,7 +3892,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDateFilterContains)
// Set the fields as dates.
SvNumberFormatter* pFormatter = m_pDoc->GetFormatTable();
sal_uInt32 nFormat = pFormatter->GetFormatIndex(NF_DATE_DIN_YYMMDD, LANGUAGE_ENGLISH_US);
- ScPatternAttr aNewAttrs(m_pDoc->GetPool());
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
m_pDoc->ApplyPatternAreaTab(0, 1, 0, 5, 0, aNewAttrs); // apply it to A1:A6
@@ -6657,7 +6657,7 @@ CPPUNIT_TEST_FIXTURE(Test, testProtectedSheetEditByRow)
{
// Remove protected flags from rows 2-5.
- ScPatternAttr aAttr(m_pDoc->GetPool());
+ ScPatternAttr aAttr(m_pDoc->getCellAttributeHelper());
aAttr.GetItemSet().Put(ScProtectionAttr(false));
m_pDoc->ApplyPatternAreaTab(0, 1, m_pDoc->MaxCol(), 4, 0, aAttr);
@@ -6733,7 +6733,7 @@ CPPUNIT_TEST_FIXTURE(Test, testProtectedSheetEditByColumn)
{
// Remove protected flags from columns B to E.
- ScPatternAttr aAttr(m_pDoc->GetPool());
+ ScPatternAttr aAttr(m_pDoc->getCellAttributeHelper());
aAttr.GetItemSet().Put(ScProtectionAttr(false));
m_pDoc->ApplyPatternAreaTab(1, 0, 4, m_pDoc->MaxRow(), 0, aAttr);
diff --git a/sc/qa/unit/ucalc_DocumentThemes.cxx b/sc/qa/unit/ucalc_DocumentThemes.cxx
index d0bd29052c16..2a05badedc65 100644
--- a/sc/qa/unit/ucalc_DocumentThemes.cxx
+++ b/sc/qa/unit/ucalc_DocumentThemes.cxx
@@ -57,7 +57,7 @@ CPPUNIT_TEST_FIXTURE(DocumentThemesTest, testChangeTheme)
auto eBackgroundThemeType = model::ThemeColorType::Accent5;
auto eCellTextThemeType = model::ThemeColorType::Accent2;
- ScPatternAttr aNewPattern(m_pDoc->GetPool());
+ ScPatternAttr aNewPattern(m_pDoc->getCellAttributeHelper());
{
model::ComplexColor aComplexColor;
aComplexColor.setThemeColor(eBackgroundThemeType);
diff --git a/sc/qa/unit/ucalc_copypaste.cxx b/sc/qa/unit/ucalc_copypaste.cxx
index bec9bb499b94..b673ad7de3a1 100644
--- a/sc/qa/unit/ucalc_copypaste.cxx
+++ b/sc/qa/unit/ucalc_copypaste.cxx
@@ -1609,7 +1609,7 @@ void TestCopyPaste::executeCopyPasteSpecial(const SCTAB srcSheet, const SCTAB de
m_pDoc->SetString(10, 17, srcSheet, "=SUM(Range_aCa5_aCa10)");
// add patterns
- ScPatternAttr aCellBlueColor(m_pDoc->GetPool());
+ ScPatternAttr aCellBlueColor(m_pDoc->getCellAttributeHelper());
aCellBlueColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(1, 2, 1, 4, srcSheet, aCellBlueColor);
@@ -1624,12 +1624,12 @@ void TestCopyPaste::executeCopyPasteSpecial(const SCTAB srcSheet, const SCTAB de
CPPUNIT_ASSERT_MESSAGE("SrcSheet.B6 has no pattern", !pItem);
// row 2 on empty cell
- ScPatternAttr aCellGreenColor(m_pDoc->GetPool());
+ ScPatternAttr aCellGreenColor(m_pDoc->getCellAttributeHelper());
aCellGreenColor.GetItemSet().Put(SvxBrushItem(COL_GREEN, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(5, 4, 5, 4, srcSheet, aCellGreenColor);
// row 4 for multi range row selection
- ScPatternAttr aCellRedColor(m_pDoc->GetPool());
+ ScPatternAttr aCellRedColor(m_pDoc->getCellAttributeHelper());
aCellRedColor.GetItemSet().Put(SvxBrushItem(COL_RED, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(3, 6, 4, 6, srcSheet, aCellRedColor);
@@ -9345,7 +9345,7 @@ CPPUNIT_TEST_FIXTURE(TestCopyPaste, testCopyPasteSkipEmpty)
m_pDoc->SetString(ScAddress(1, 4, 0), "E");
// Set the background color of B1:B5 to blue.
- ScPatternAttr aCellBackColor(m_pDoc->GetPool());
+ ScPatternAttr aCellBackColor(m_pDoc->getCellAttributeHelper());
aCellBackColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(1, 0, 1, 4, 0, aCellBackColor);
@@ -10723,7 +10723,7 @@ CPPUNIT_TEST_FIXTURE(TestCopyPaste, testUndoBackgroundColor)
m_pDoc->SetValue(ScAddress(3, 4, 0), 3.0); // D5
// Add patterns
- ScPatternAttr aCellBlueColor(m_pDoc->GetPool());
+ ScPatternAttr aCellBlueColor(m_pDoc->getCellAttributeHelper());
aCellBlueColor.GetItemSet().Put(SvxBrushItem(COL_BLUE, ATTR_BACKGROUND));
m_pDoc->ApplyPatternAreaTab(0, 3, m_pDoc->MaxCol(), 3, 0, aCellBlueColor);
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index feb0e8fef22a..105c7e4a772d 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -4257,8 +4257,7 @@ CPPUNIT_TEST_FIXTURE(TestFormula, testFormulaRefUpdateValidity)
sal_uInt32 nIndex = m_pDoc->AddValidationEntry(aData);
SfxUInt32Item aItem(ATTR_VALIDDATA, nIndex);
- ScPatternAttr aNewAttrs(
- SfxItemSet(*m_pDoc->GetPool(), svl::Items<ATTR_PATTERN_START, ATTR_PATTERN_END>));
+ ScPatternAttr aNewAttrs(m_pDoc->getCellAttributeHelper());
aNewAttrs.GetItemSet().Put(aItem);
m_pDoc->ApplyPattern(0, 1, 0, aNewAttrs);
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index 7124e78be37e..4b9bbc7a4e2c 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -62,11 +62,11 @@ ScAttrArray::ScAttrArray( SCCOL nNewCol, SCTAB nNewTab, ScDocument& rDoc, ScAttr
for ( size_t nIdx = 0; nIdx < pDefaultColAttrArray->mvData.size(); ++nIdx )
{
mvData[nIdx].nEndRow = pDefaultColAttrArray->mvData[nIdx].nEndRow;
- ScPatternAttr aNewPattern( *(pDefaultColAttrArray->mvData[nIdx].pPattern) );
- mvData[nIdx].pPattern = &rDocument.GetPool()->DirectPutItemInPool( aNewPattern );
+ mvData[nIdx].setScPatternAttr(pDefaultColAttrArray->mvData[nIdx].getScPatternAttr());
bool bNumFormatChanged = false;
if ( ScGlobal::CheckWidthInvalidate( bNumFormatChanged,
- mvData[nIdx].pPattern->GetItemSet(), rDocument.GetDefPattern()->GetItemSet() ) )
+ mvData[nIdx].getScPatternAttr()->GetItemSet(),
+ rDocument.getCellAttributeHelper().getDefaultCellAttribute().GetItemSet() ) )
{
aAdrStart.SetRow( nIdx ? mvData[nIdx-1].nEndRow+1 : 0 );
aAdrEnd.SetRow( mvData[nIdx].nEndRow );
@@ -80,10 +80,6 @@ ScAttrArray::~ScAttrArray()
#if DEBUG_SC_TESTATTRARRAY
TestData();
#endif
-
- ScDocumentPool* pDocPool = rDocument.GetPool();
- for (auto const & rEntry : mvData)
- pDocPool->DirectRemoveItemFromPool(*rEntry.pPattern);
}
#if DEBUG_SC_TESTATTRARRAY
@@ -97,8 +93,6 @@ void ScAttrArray::TestData() const
if (nPos > 0)
if (mvData[nPos].pPattern == mvData[nPos-1].pPattern || mvData[nPos].nRow <= mvData[nPos-1].nRow)
++nErr;
- if (mvData[nPos].pPattern->Which() != ATTR_PATTERN)
- ++nErr;
}
if ( nPos && mvData[nPos-1].nRow != rDocument.MaxRow() )
++nErr;
@@ -116,19 +110,22 @@ void ScAttrArray::SetDefaultIfNotInit( SCSIZE nNeeded )
mvData.reserve( nNewLimit );
mvData.emplace_back();
mvData[0].nEndRow = rDocument.MaxRow();
- mvData[0].pPattern = rDocument.GetDefPattern(); // no put
+ mvData[0].setScPatternAttr(&rDocument.getCellAttributeHelper().getDefaultCellAttribute()); // no put
}
-void ScAttrArray::Reset( const ScPatternAttr* pPattern )
+void ScAttrArray::Reset(const CellAttributeHolder& rPattern)
{
- ScDocumentPool* pDocPool = rDocument.GetPool();
+ const ScPatternAttr* pPattern(rPattern.getScPatternAttr());
+ if (nullptr == pPattern)
+ return;
+
ScAddress aAdrStart( nCol, 0, nTab );
ScAddress aAdrEnd ( nCol, 0, nTab );
for (SCSIZE i=0; i<mvData.size(); i++)
{
// ensure that attributing changes text width of cell
- const ScPatternAttr* pOldPattern = mvData[i].pPattern;
+ const ScPatternAttr* pOldPattern(mvData[i].getScPatternAttr());
if ( nCol != -1 )
{
bool bNumFormatChanged;
@@ -140,16 +137,14 @@ void ScAttrArray::Reset( const ScPatternAttr* pPattern )
rDocument.InvalidateTextWidth( &aAdrStart, &aAdrEnd, bNumFormatChanged );
}
}
- pDocPool->DirectRemoveItemFromPool(*pOldPattern);
}
mvData.resize(0);
rDocument.SetStreamValid(nTab, false);
mvData.resize(1);
- const ScPatternAttr* pNewPattern = &pDocPool->DirectPutItemInPool(*pPattern);
mvData[0].nEndRow = rDocument.MaxRow();
- mvData[0].pPattern = pNewPattern;
+ mvData[0].setScPatternAttr(pPattern);
}
bool ScAttrArray::Concat(SCSIZE nPos)
@@ -159,10 +154,9 @@ bool ScAttrArray::Concat(SCSIZE nPos)
{
if (nPos > 0)
{
- if (SfxPoolItem::areSame(mvData[nPos - 1].pPattern, mvData[nPos].pPattern))
+ if (ScPatternAttr::areSame(mvData[nPos - 1].getScPatternAttr(), mvData[nPos].getScPatternAttr()))
{
mvData[nPos - 1].nEndRow = mvData[nPos].nEndRow;
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
mvData.erase(mvData.begin() + nPos);
nPos--;
bRet = true;
@@ -170,10 +164,9 @@ bool ScAttrArray::Concat(SCSIZE nPos)
}
if (nPos + 1 < mvData.size())
{
- if (SfxPoolItem::areSame(mvData[nPos + 1].pPattern, mvData[nPos].pPattern))
+ if (ScPatternAttr::areSame(mvData[nPos + 1].getScPatternAttr(), mvData[nPos].getScPatternAttr()))
{
mvData[nPos].nEndRow = mvData[nPos + 1].nEndRow;
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
mvData.erase(mvData.begin() + nPos + 1);
bRet = true;
}
@@ -246,11 +239,11 @@ const ScPatternAttr* ScAttrArray::GetPattern( SCROW nRow ) const
{
if ( !rDocument.ValidRow(nRow) )
return nullptr;
- return rDocument.GetDefPattern();
+ return &rDocument.getCellAttributeHelper().getDefaultCellAttribute();
}
SCSIZE i;
if (Search( nRow, i ))
- return mvData[i].pPattern;
+ return mvData[i].getScPatternAttr();
else
return nullptr;
}
@@ -264,7 +257,7 @@ const ScPatternAttr* ScAttrArray::GetPatternRange( SCROW& rStartRow,
return nullptr;
rStartRow = 0;
rEndRow = rDocument.MaxRow();
- return rDocument.GetDefPattern();
+ return &rDocument.getCellAttributeHelper().getDefaultCellAttribute();
}
SCSIZE nIndex;
if ( Search( nRow, nIndex ) )
@@ -274,7 +267,7 @@ const ScPatternAttr* ScAttrArray::GetPatternRange( SCROW& rStartRow,
else
rStartRow = 0;
rEndRow = mvData[nIndex].nEndRow;
- return mvData[nIndex].pPattern;
+ return mvData[nIndex].getScPatternAttr();
}
return nullptr;
}
@@ -296,7 +289,7 @@ void ScAttrArray::AddCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 nInd
// changed to create pNewPattern only if needed, else use already
// existing pPattern. This shows by example how to avoid that special
- // handling of ATTR_PATTERN/ScPatternAttr in SC and massive
+ // handling of ScPatternAttr in SC and massive
// incarnations/destructions of that Item (which contains an ItemSet)
std::unique_ptr<ScPatternAttr> pNewPattern;
if(pPattern)
@@ -329,16 +322,16 @@ void ScAttrArray::AddCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 nInd
}
else
{
- pNewPattern.reset( new ScPatternAttr( rDocument.GetPool() ) );
+ pNewPattern.reset( new ScPatternAttr( rDocument.getCellAttributeHelper() ) );
ScCondFormatItem aItem(nIndex);
pNewPattern->GetItemSet().Put( aItem );
nTempEndRow = nEndRow;
}
if (pNewPattern)
- SetPatternArea( nTempStartRow, nTempEndRow, std::move(pNewPattern), true );
+ SetPatternArea( nTempStartRow, nTempEndRow, CellAttributeHolder(pNewPattern.release(), true) );
else
- SetPatternArea( nTempStartRow, nTempEndRow, pPattern, true );
+ SetPatternArea( nTempStartRow, nTempEndRow, CellAttributeHolder(pPattern) );
nTempStartRow = nTempEndRow + 1;
}
@@ -370,12 +363,12 @@ void ScAttrArray::RemoveCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 n
nTempEndRow = std::min<SCROW>( nPatternEndRow, nEndRow );
if (const ScCondFormatItem* pItem = pPattern->GetItemSet().GetItemIfSet( ATTR_CONDITIONAL ))
{
- auto pPatternAttr = std::make_unique<ScPatternAttr>( *pPattern );
if (nIndex == 0)
{
ScCondFormatItem aItem;
- pPatternAttr->GetItemSet().Put( aItem );
- SetPatternArea( nTempStartRow, nTempEndRow, std::move(pPatternAttr), true );
+ ScPatternAttr* pTemp(new ScPatternAttr(*pPattern));
+ pTemp->GetItemSet().Put( aItem );
+ SetPatternArea( nTempStartRow, nTempEndRow, CellAttributeHolder(pTemp, true) );
}
else
{
@@ -386,8 +379,9 @@ void ScAttrArray::RemoveCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 n
ScCondFormatIndexes aNewCondFormatData(rCondFormatData);
aNewCondFormatData.erase_at(std::distance(rCondFormatData.begin(), itr));
ScCondFormatItem aItem( std::move(aNewCondFormatData) );
- pPatternAttr->GetItemSet().Put( aItem );
- SetPatternArea( nTempStartRow, nTempEndRow, std::move(pPatternAttr), true );
+ ScPatternAttr* pTemp(new ScPatternAttr(*pPattern));
+ pTemp->GetItemSet().Put( aItem );
+ SetPatternArea( nTempStartRow, nTempEndRow, CellAttributeHolder(pTemp, true) );
}
}
}
@@ -441,7 +435,7 @@ bool ScAttrArray::Reserve( SCSIZE nReserve )
mvData.reserve(nReserve);
mvData.emplace_back();
mvData[0].nEndRow = rDocument.MaxRow();
- mvData[0].pPattern = rDocument.GetDefPattern(); // no put
+ mvData[0].setScPatternAttr(&rDocument.getCellAttributeHelper().getDefaultCellAttribute()); // no put
return true;
} catch (std::bad_alloc const &) {
return false;
@@ -460,20 +454,17 @@ bool ScAttrArray::Reserve( SCSIZE nReserve )
return false;
}
-const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEndRow, const ScPatternAttr* pPattern,
- bool bPutToPool, ScEditDataArray* pDataArray, bool bPassingOwnership )
+const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(
+ SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rPattern, ScEditDataArray* pDataArray)
{
+ const ScPatternAttr* pPattern(rPattern.getScPatternAttr());
+ if (nullptr == pPattern)
+ return nullptr;
+
if (rDocument.ValidRow(nStartRow) && rDocument.ValidRow(nEndRow))
{
- if (bPutToPool)
- {
- if (bPassingOwnership)
- pPattern = &rDocument.GetPool()->DirectPutItemInPool(std::unique_ptr<ScPatternAttr>(const_cast<ScPatternAttr*>(pPattern)));
- else
- pPattern = &rDocument.GetPool()->DirectPutItemInPool(*pPattern);
- }
if ((nStartRow == 0) && (nEndRow == rDocument.MaxRow()))
- Reset(pPattern);
+ Reset(rPattern);
else
{
SCSIZE nNeeded = mvData.size() + 2;
@@ -507,7 +498,7 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
if ( nCol != -1 && !bIsLoading )
{
const SfxItemSet& rNewSet = pPattern->GetItemSet();
- const SfxItemSet& rOldSet = mvData[nx].pPattern->GetItemSet();
+ const SfxItemSet& rOldSet = mvData[nx].getScPatternAttr()->GetItemSet();
bool bNumFormatChanged;
if ( ScGlobal::CheckWidthInvalidate( bNumFormatChanged,
rNewSet, rOldSet ) )
@@ -529,7 +520,7 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
if ( nStartRow > 0 )
{
nInsert = rDocument.MaxRow() + 1;
- if ( !SfxPoolItem::areSame(mvData[ni].pPattern, pPattern ) )
+ if ( !ScPatternAttr::areSame(mvData[ni].getScPatternAttr(), pPattern ) )
{
if ( ni == 0 || (mvData[ni-1].nEndRow < nStartRow - 1) )
{ // may be a split or a simple insert or just a shrink,
@@ -542,7 +533,7 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
else if (mvData[ni - 1].nEndRow == nStartRow - 1)
nInsert = ni;
}
- if ( ni > 0 && SfxPoolItem::areSame(mvData[ni-1].pPattern, pPattern) )
+ if ( ni > 0 && ScPatternAttr::areSame(mvData[ni-1].getScPatternAttr(), pPattern) )
{ // combine
mvData[ni-1].nEndRow = nEndRow;
nInsert = rDocument.MaxRow() + 1;
@@ -557,11 +548,11 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
nj++;
if ( !bSplit )
{
- if ( nj < mvData.size() && SfxPoolItem::areSame(mvData[nj].pPattern, pPattern ) )
+ if ( nj < mvData.size() && ScPatternAttr::areSame(mvData[nj].getScPatternAttr(), pPattern ) )
{ // combine
if ( ni > 0 )
{
- if ( SfxPoolItem::areSame(mvData[ni-1].pPattern, pPattern ) )
+ if ( ScPatternAttr::areSame(mvData[ni-1].getScPatternAttr(), pPattern ) )
{ // adjacent entries
mvData[ni-1].nEndRow = mvData[nj].nEndRow;
nj++;
@@ -575,21 +566,12 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
else if ( ni > 0 && ni == nInsert )
mvData[ni-1].nEndRow = nStartRow - 1; // shrink
}
- ScDocumentPool* pDocPool = rDocument.GetPool();
- if ( bSplit )
- { // duplicate split entry in pool
- pDocPool->DirectPutItemInPool( *mvData[ni-1].pPattern );
- }
if ( ni < nj )
{ // remove middle entries
- for ( SCSIZE nk=ni; nk<nj; nk++)
- { // remove entries from pool
- pDocPool->DirectRemoveItemFromPool( *mvData[nk].pPattern );
- }
if ( !bCombined )
{ // replace one entry
mvData[ni].nEndRow = nEndRow;
- mvData[ni].pPattern = pPattern;
+ mvData[ni].setScPatternAttr(pPattern);
ni++;
nInsert = rDocument.MaxRow() + 1;
}
@@ -614,7 +596,7 @@ const ScPatternAttr* ScAttrArray::SetPatternAreaImpl(SCROW nStartRow, SCROW nEnd
if ( nInsert )
mvData[nInsert-1].nEndRow = nStartRow - 1;
mvData[nInsert].nEndRow = nEndRow;
- mvData[nInsert].pPattern = pPattern;
+ mvData[nInsert].setScPatternAttr(pPattern);
// Remove character attributes from these cells if the pattern
// is applied during normal session.
@@ -651,7 +633,7 @@ void ScAttrArray::ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, const ScStyleS
do
{
- const ScPatternAttr* pOldPattern = mvData[nPos].pPattern;
+ const ScPatternAttr* pOldPattern = mvData[nPos].getScPatternAttr();
std::unique_ptr<ScPatternAttr> pNewPattern(new ScPatternAttr(*pOldPattern));
pNewPattern->SetStyleSheet(const_cast<ScStyleSheet*>(&rStyle));
SCROW nY1 = nStart;
@@ -668,7 +650,7 @@ void ScAttrArray::ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, const ScStyleS
{
if (nY1 < nStartRow) nY1=nStartRow;
if (nY2 > nEndRow) nY2=nEndRow;
- SetPatternArea( nY1, nY2, std::move(pNewPattern), true );
+ SetPatternArea( nY1, nY2, CellAttributeHolder(pNewPattern.release(), true) );
Search( nStart, nPos );
}
else
@@ -690,8 +672,7 @@ void ScAttrArray::ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, const ScStyleS
}
}
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
- mvData[nPos].pPattern = &rDocument.GetPool()->DirectPutItemInPool(*pNewPattern);
+ mvData[nPos].setScPatternAttr(pNewPattern.release(), true);
if (Concat(nPos))
Search(nStart, nPos);
else
@@ -746,7 +727,7 @@ void ScAttrArray::ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
do
{
- const ScPatternAttr* pOldPattern = mvData[nPos].pPattern;
+ const ScPatternAttr* pOldPattern = mvData[nPos].getScPatternAttr();
const SfxItemSet& rOldSet = pOldPattern->GetItemSet();
const SvxBoxItem* pBoxItem = rOldSet.GetItemIfSet( ATTR_BORDER );
const SvxLineItem* pTLBRItem = rOldSet.GetItemIfSet( ATTR_BORDER_TLBR );
@@ -821,15 +802,13 @@ void ScAttrArray::ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
{
if (nY1 < nStartRow) nY1=nStartRow;
if (nY2 > nEndRow) nY2=nEndRow;
- SetPatternArea( nY1, nY2, std::move(pNewPattern), true );
+ SetPatternArea( nY1, nY2, CellAttributeHolder(pNewPattern.release(), true) );
Search( nStart, nPos );
}
else
{
// remove from pool ?
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
- mvData[nPos].pPattern =
- &rDocument.GetPool()->DirectPutItemInPool(std::move(pNewPattern));
+ mvData[nPos].setScPatternAttr(pNewPattern.release(), true);
if (Concat(nPos))
Search(nStart, nPos);
@@ -846,7 +825,7 @@ void ScAttrArray::ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
while ((nStart <= nEndRow) && (nPos < mvData.size()));
}
-void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCache* pCache, ScEditDataArray* pDataArray, bool* const pIsChanged )
+void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCache& rCache, ScEditDataArray* pDataArray, bool* const pIsChanged )
{
#if DEBUG_SC_TESTATTRARRAY
TestData();
@@ -869,9 +848,10 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCach
do
{
- const ScPatternAttr& rOldPattern = *mvData[nPos].pPattern;
- const ScPatternAttr& rNewPattern = pCache->ApplyTo( rOldPattern );
- if (!SfxPoolItem::areSame(rNewPattern, rOldPattern))
+ const CellAttributeHolder& rOldPattern(mvData[nPos].getCellAttributeHolder());
+ const CellAttributeHolder& rNewPattern(rCache.ApplyTo( rOldPattern ));
+
+ if (!CellAttributeHolder::areSame(&rNewPattern, &rOldPattern))
{
SCROW nY1 = nStart;
SCROW nY2 = mvData[nPos].nEndRow;
@@ -884,7 +864,7 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCach
{
if (nY1 < nStartRow) nY1=nStartRow;
if (nY2 > nEndRow) nY2=nEndRow;
- SetPatternArea( nY1, nY2, &rNewPattern, false, pDataArray );
+ SetPatternArea( nY1, nY2, rNewPattern, pDataArray );
Search( nStart, nPos );
}
else
@@ -893,8 +873,8 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCach
{
// ensure attributing changes text-width of cell
- const SfxItemSet& rNewSet = rNewPattern.GetItemSet();
- const SfxItemSet& rOldSet = rOldPattern.GetItemSet();
+ const SfxItemSet& rNewSet = rNewPattern.getScPatternAttr()->GetItemSet();
+ const SfxItemSet& rOldSet = rOldPattern.getScPatternAttr()->GetItemSet();
bool bNumFormatChanged;
if ( ScGlobal::CheckWidthInvalidate( bNumFormatChanged,
@@ -906,8 +886,7 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCach
}
}
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
- mvData[nPos].pPattern = &rNewPattern;
+ mvData[nPos].setCellAttributeHolder(rNewPattern);
if (Concat(nPos))
Search(nStart, nPos);
else
@@ -931,10 +910,6 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, ScItemPoolCach
void ScAttrArray::SetAttrEntries(std::vector<ScAttrEntry> && vNewData)
{
- ScDocumentPool* pDocPool = rDocument.GetPool();
- for (auto const & rEntry : mvData)
- pDocPool->DirectRemoveItemFromPool(*rEntry.pPattern);
-
mvData = std::move(vNewData);
#ifdef DBG_UTIL
@@ -1000,12 +975,12 @@ void ScAttrArray::MergePatternArea( SCROW nStartRow, SCROW nEndRow,
do
{
// similar patterns must not be repeated
- const ScPatternAttr* pPattern = nullptr;
+ const ScPatternAttr* pPattern(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
if ( !mvData.empty() )
- pPattern = mvData[nPos].pPattern;
- else
- pPattern = rDocument.GetDefPattern();
- if ( !SfxPoolItem::areSame(pPattern, rState.pOld1) && !SfxPoolItem::areSame(pPattern, rState.pOld2) )
+ pPattern = mvData[nPos].getScPatternAttr();
+
+ if ( !ScPatternAttr::areSame(pPattern, rState.aOld1.getScPatternAttr())
+ && !ScPatternAttr::areSame(pPattern, rState.aOld2.getScPatternAttr()) )
{
const SfxItemSet& rThisSet = pPattern->GetItemSet();
if (rState.pItemSet)
@@ -1024,8 +999,8 @@ void ScAttrArray::MergePatternArea( SCROW nStartRow, SCROW nEndRow,
rState.mnPatternId = pPattern->GetPAKey();
}
- rState.pOld2 = rState.pOld1;
- rState.pOld1 = pPattern;
+ rState.aOld2 = rState.aOld1;
+ rState.aOld1 = pPattern;
}
if ( !mvData.empty() )
@@ -1156,7 +1131,7 @@ void ScAttrArray::MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLine
Search( nEndRow-1, nEndIndex );
for (SCSIZE i=nStartIndex; i<=nEndIndex; i++)
{
- pPattern = mvData[i].pPattern;
+ pPattern = mvData[i].getScPatternAttr();
lcl_MergeToFrame( pLineOuter, pLineInner, rFlags, pPattern, bLeft, nDistRight, false,
nEndRow - std::min( mvData[i].nEndRow, static_cast<SCROW>(nEndRow-1) ) );
// nDistBottom here always > 0
@@ -1167,7 +1142,7 @@ void ScAttrArray::MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLine
}
else
{
- lcl_MergeToFrame( pLineOuter, pLineInner, rFlags, rDocument.GetDefPattern(), bLeft, nDistRight, true, 0 );
+ lcl_MergeToFrame( pLineOuter, pLineInner, rFlags, &rDocument.getCellAttributeHelper().getDefaultCellAttribute(), bLeft, nDistRight, true, 0 );
}
}
@@ -1237,8 +1212,8 @@ bool ScAttrArray::ApplyFrame( const SvxBoxItem& rBoxItem,
}
else
{
- ScItemPoolCache aCache( rDocument.GetPool(), &aNewFrame );
- ApplyCacheArea( nStartRow, nEndRow, &aCache );
+ ScItemPoolCache aCache( rDocument.getCellAttributeHelper(), aNewFrame );
+ ApplyCacheArea( nStartRow, nEndRow, aCache );
return true;
}
@@ -1410,7 +1385,7 @@ bool ScAttrArray::HasAttrib( SCROW nRow1, SCROW nRow2, HasAttrFlags nMask ) cons
{
if (mvData.empty())
{
- return HasAttrib_Impl(rDocument.GetDefPattern(), nMask, 0, rDocument.MaxRow(), 0);
+ return HasAttrib_Impl(&rDocument.getCellAttributeHelper().getDefaultCellAttribute(), nMask, 0, rDocument.MaxRow(), 0);
}
SCSIZE nStartIndex;
@@ -1424,7 +1399,7 @@ bool ScAttrArray::HasAttrib( SCROW nRow1, SCROW nRow2, HasAttrFlags nMask ) cons
for (SCSIZE i=nStartIndex; i<=nEndIndex && !bFound; i++)
{
- const ScPatternAttr* pPattern = mvData[i].pPattern;
+ const ScPatternAttr* pPattern = mvData[i].getScPatternAttr();
bFound = HasAttrib_Impl(pPattern, nMask, nRow1, nRow2, i);
}
@@ -1439,7 +1414,7 @@ bool ScAttrArray::HasAttrib( SCROW nRow, HasAttrFlags nMask, SCROW* nStartRow, S
*nStartRow = 0;
if( nEndRow )
*nEndRow = rDocument.MaxRow();
- return HasAttrib_Impl(rDocument.GetDefPattern(), nMask, 0, rDocument.MaxRow(), 0);
+ return HasAttrib_Impl(&rDocument.getCellAttributeHelper().getDefaultCellAttribute(), nMask, 0, rDocument.MaxRow(), 0);
}
SCSIZE nIndex;
@@ -1448,7 +1423,7 @@ bool ScAttrArray::HasAttrib( SCROW nRow, HasAttrFlags nMask, SCROW* nStartRow, S
*nStartRow = nIndex > 0 ? mvData[nIndex-1].nEndRow+1 : 0;
if( nEndRow )
*nEndRow = mvData[nIndex].nEndRow;
- const ScPatternAttr* pPattern = mvData[nIndex].pPattern;
+ const ScPatternAttr* pPattern = mvData[nIndex].getScPatternAttr();
return HasAttrib_Impl(pPattern, nMask, nRow, nRow, nIndex);
}
@@ -1458,12 +1433,12 @@ bool ScAttrArray::IsMerged( SCROW nRow ) const
{
SCSIZE nIndex;
Search(nRow, nIndex);
- const ScMergeAttr& rItem = mvData[nIndex].pPattern->GetItem(ATTR_MERGE);
+ const ScMergeAttr& rItem = mvData[nIndex].getScPatternAttr()->GetItem(ATTR_MERGE);
return rItem.IsMerged();
}
- return rDocument.GetDefPattern()->GetItem(ATTR_MERGE).IsMerged();
+ return rDocument.getCellAttributeHelper().getDefaultCellAttribute().GetItem(ATTR_MERGE).IsMerged();
}
/**
@@ -1485,7 +1460,7 @@ bool ScAttrArray::ExtendMerge( SCCOL nThisCol, SCROW nStartRow, SCROW nEndRow,
for (SCSIZE i=nStartIndex; i<=nEndIndex; i++)
{
- pPattern = mvData[i].pPattern;
+ pPattern = mvData[i].getScPatternAttr();
pItem = &pPattern->GetItem( ATTR_MERGE );
SCCOL nCountX = pItem->GetColMerge();
SCROW nCountY = pItem->GetRowMerge();
@@ -1541,7 +1516,7 @@ void ScAttrArray::RemoveAreaMerge(SCROW nStartRow, SCROW nEndRow)
if (nThisEnd > nEndRow)
nThisEnd = nEndRow;
- pPattern = mvData[nIndex].pPattern;
+ pPattern = mvData[nIndex].getScPatternAttr();
pItem = &pPattern->GetItem( ATTR_MERGE );
SCCOL nCountX = pItem->GetColMerge();
SCROW nCountY = pItem->GetRowMerge();
@@ -1560,7 +1535,7 @@ void ScAttrArray::RemoveAreaMerge(SCROW nStartRow, SCROW nEndRow)
for (SCROW nThisRow = nThisStart; nThisRow <= nThisEnd; nThisRow++)
rDocument.ApplyAttr( nThisCol, nThisRow, nTab, *pAttr );
- ScPatternAttr aNewPattern( rDocument.GetPool() );
+ ScPatternAttr aNewPattern( rDocument.getCellAttributeHelper() );
SfxItemSet* pSet = &aNewPattern.GetItemSet();
pSet->Put( *pFlagAttr );
rDocument.ApplyPatternAreaTab( nThisCol, nThisStart, nMergeEndCol, nMergeEndRow,
@@ -1577,51 +1552,40 @@ void ScAttrArray::RemoveAreaMerge(SCROW nStartRow, SCROW nEndRow)
}
}
-void ScAttrArray::SetPatternAreaSafe( SCROW nStartRow, SCROW nEndRow,
- const ScPatternAttr* pWantedPattern, bool bDefault )
+void ScAttrArray::SetPatternAreaSafe(SCROW nStartRow, SCROW nEndRow, const CellAttributeHolder& rWantedPattern)
{
SetDefaultIfNotInit();
- const ScPatternAttr* pOldPattern;
- const ScMergeFlagAttr* pItem;
+ const ScMergeFlagAttr* pItem;
SCSIZE nIndex;
SCROW nRow;
SCROW nThisRow;
- bool bFirstUse = true;
Search( nStartRow, nIndex );
nThisRow = (nIndex>0) ? mvData[nIndex-1].nEndRow+1 : 0;
while ( nThisRow <= nEndRow )
{
- pOldPattern = mvData[nIndex].pPattern;
- if (!SfxPoolItem::areSame(pOldPattern, pWantedPattern)) // FIXME: else-branch?
+ const CellAttributeHolder& rOldPattern(mvData[nIndex].getCellAttributeHolder());
+ if (!CellAttributeHolder::areSame(&rOldPattern, &rWantedPattern)) // FIXME: else-branch?
{
if (nThisRow < nStartRow) nThisRow = nStartRow;
nRow = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nRow, nEndRow );
- pItem = &pOldPattern->GetItem( ATTR_MERGE_FLAG );
+ pItem = &rOldPattern.getScPatternAttr()->GetItem( ATTR_MERGE_FLAG );
if (pItem->IsOverlapped() || pItem->HasAutoFilter())
{
// default-constructing a ScPatternAttr for DeleteArea doesn't work
// because it would have no cell style information.
- // Instead, the document's GetDefPattern is copied. Since it is passed as
+ // Instead, the document's getCellAttributeHelper().getDefaultCellAttribute() is copied. Since it is passed as
// pWantedPattern, no special treatment of default is needed here anymore.
- std::unique_ptr<ScPatternAttr> pNewPattern(new ScPatternAttr( *pWantedPattern ));
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*rWantedPattern.getScPatternAttr()));
pNewPattern->GetItemSet().Put( *pItem );
- SetPatternArea( nThisRow, nAttrRow, std::move(pNewPattern), true );
+ SetPatternArea( nThisRow, nAttrRow, CellAttributeHolder(pNewPattern, true) );
}
else
{
- if ( !bDefault )
- {
- if (bFirstUse)
- bFirstUse = false;
- else
- // it's in the pool
- rDocument.GetPool()->DirectPutItemInPool( *pWantedPattern );
- }
- SetPatternArea( nThisRow, nAttrRow, pWantedPattern );
+ SetPatternArea(nThisRow, nAttrRow, rWantedPattern);
}
Search( nThisRow, nIndex ); // data changed
@@ -1649,15 +1613,15 @@ bool ScAttrArray::ApplyFlags( SCROW nStartRow, SCROW nEndRow, ScMF nFlags )
while ( nThisRow <= nEndRow )
{
- pOldPattern = mvData[nIndex].pPattern;
+ pOldPattern = mvData[nIndex].getScPatternAttr();
nOldValue = pOldPattern->GetItem( ATTR_MERGE_FLAG ).GetValue();
if ( (nOldValue | nFlags) != nOldValue )
{
nRow = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nRow, nEndRow );
- auto pNewPattern = std::make_unique<ScPatternAttr>(*pOldPattern);
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
pNewPattern->GetItemSet().Put( ScMergeFlagAttr( nOldValue | nFlags ) );
- SetPatternArea( nThisRow, nAttrRow, std::move(pNewPattern), true );
+ SetPatternArea( nThisRow, nAttrRow, CellAttributeHolder(pNewPattern, true) );
Search( nThisRow, nIndex ); // data changed
bChanged = true;
}
@@ -1686,15 +1650,15 @@ bool ScAttrArray::RemoveFlags( SCROW nStartRow, SCROW nEndRow, ScMF nFlags )
while ( nThisRow <= nEndRow )
{
- pOldPattern = mvData[nIndex].pPattern;
+ pOldPattern = mvData[nIndex].getScPatternAttr();
nOldValue = pOldPattern->GetItem( ATTR_MERGE_FLAG ).GetValue();
if ( (nOldValue & ~nFlags) != nOldValue )
{
nRow = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nRow, nEndRow );
- auto pNewPattern = std::make_unique<ScPatternAttr>(*pOldPattern);
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
pNewPattern->GetItemSet().Put( ScMergeFlagAttr( nOldValue & ~nFlags ) );
- SetPatternArea( nThisRow, nAttrRow, std::move(pNewPattern), true );
+ SetPatternArea( nThisRow, nAttrRow, CellAttributeHolder(pNewPattern, true) );
Search( nThisRow, nIndex ); // data changed
bChanged = true;
}
@@ -1719,15 +1683,15 @@ void ScAttrArray::ClearItems( SCROW nStartRow, SCROW nEndRow, const sal_uInt16*
while ( nThisRow <= nEndRow )
{
- const ScPatternAttr* pOldPattern = mvData[nIndex].pPattern;
+ const ScPatternAttr* pOldPattern = mvData[nIndex].getScPatternAttr();
if ( pOldPattern->HasItemsSet( pWhich ) )
{
- auto pNewPattern = std::make_unique<ScPatternAttr>(*pOldPattern);
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
pNewPattern->ClearItems( pWhich );
nRow = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nRow, nEndRow );
- SetPatternArea( nThisRow, nAttrRow, std::move(pNewPattern), true );
+ SetPatternArea( nThisRow, nAttrRow, CellAttributeHolder(pNewPattern, true) );
Search( nThisRow, nIndex ); // data changed
}
@@ -1746,7 +1710,7 @@ void ScAttrArray::ChangeIndent( SCROW nStartRow, SCROW nEndRow, bool bIncrement
while ( nThisStart <= nEndRow )
{
- const ScPatternAttr* pOldPattern = mvData[nIndex].pPattern;
+ const ScPatternAttr* pOldPattern = mvData[nIndex].getScPatternAttr();
const SfxItemSet& rOldSet = pOldPattern->GetItemSet();
const SvxHorJustifyItem* pItem;
@@ -1782,12 +1746,12 @@ void ScAttrArray::ChangeIndent( SCROW nStartRow, SCROW nEndRow, bool bIncrement
{
SCROW nThisEnd = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nThisEnd, nEndRow );
- auto pNewPattern = std::make_unique<ScPatternAttr>(*pOldPattern);
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
pNewPattern->GetItemSet().Put( ScIndentItem( nNewValue ) );
if ( bNeedJust )
pNewPattern->GetItemSet().Put(
SvxHorJustifyItem( SvxCellHorJustify::Left, ATTR_HOR_JUSTIFY ) );
- SetPatternArea( nThisStart, nAttrRow, std::move(pNewPattern), true );
+ SetPatternArea( nThisStart, nAttrRow, CellAttributeHolder(pNewPattern, true) );
nThisStart = nThisEnd + 1;
Search( nThisStart, nIndex ); // data changed
@@ -1815,8 +1779,7 @@ SCROW ScAttrArray::GetNextUnprotected( SCROW nRow, bool bUp ) const
SCSIZE nIndex;
Search(nRow, nIndex);
- while (mvData[nIndex].pPattern->
- GetItem(ATTR_PROTECTION).GetProtection())
+ while (mvData[nIndex].getScPatternAttr()->GetItem(ATTR_PROTECTION).GetProtection())
{
if (bUp)
{
@@ -1845,20 +1808,19 @@ void ScAttrArray::FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, ScFlatBo
while (nPos < mvData.size())
{
SCROW nEnd = mvData[nPos].nEndRow;
- if (mvData[nPos].pPattern->GetStyleSheet() == pStyleSheet)
+ if (mvData[nPos].getScPatternAttr()->GetStyleSheet() == pStyleSheet)
{
rUsedRows.setTrue(nStart, nEnd);
if (bReset)
{
- ScPatternAttr aNewPattern(*mvData[nPos].pPattern);
- rDocument.GetPool()->DirectRemoveItemFromPool(*mvData[nPos].pPattern);
- aNewPattern.SetStyleSheet( static_cast<ScStyleSheet*>(
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*mvData[nPos].getScPatternAttr()));
+ pNewPattern->SetStyleSheet( static_cast<ScStyleSheet*>(
rDocument.GetStyleSheetPool()->
Find( ScResId(STR_STYLENAME_STANDARD),
SfxStyleFamily::Para,
SfxStyleSearchBits::Auto | SfxStyleSearchBits::ScStandard ) ) );
- mvData[nPos].pPattern = &rDocument.GetPool()->DirectPutItemInPool(aNewPattern);
+ mvData[nPos].setScPatternAttr(pNewPattern, true);
if (Concat(nPos))
{
@@ -1876,7 +1838,7 @@ bool ScAttrArray::IsStyleSheetUsed( const ScStyleSheet& rStyle ) const
{
if ( mvData.empty() )
{
- const ScStyleSheet* pStyle = rDocument.GetDefPattern()->GetStyleSheet();
+ const ScStyleSheet* pStyle = rDocument.getCellAttributeHelper().getDefaultCellAttribute().GetStyleSheet();
if ( pStyle )
{
pStyle->SetUsage( ScStyleSheet::Usage::USED );
@@ -1891,7 +1853,7 @@ bool ScAttrArray::IsStyleSheetUsed( const ScStyleSheet& rStyle ) const
while ( nPos < mvData.size() )
{
- const ScStyleSheet* pStyle = mvData[nPos].pPattern->GetStyleSheet();
+ const ScStyleSheet* pStyle = mvData[nPos].getScPatternAttr()->GetStyleSheet();
if ( pStyle )
{
pStyle->SetUsage( ScStyleSheet::Usage::USED );
@@ -1913,7 +1875,7 @@ bool ScAttrArray::IsEmpty() const
if (mvData.size() == 1)
{
- return SfxPoolItem::areSame(mvData[0].pPattern, rDocument.GetDefPattern());
+ return mvData[0].getScPatternAttr()->isDefault();
}
else
return false;
@@ -1931,14 +1893,14 @@ bool ScAttrArray::GetFirstVisibleAttr( SCROW& rFirstRow ) const
// Entries at the end are not skipped, GetFirstVisibleAttr may be larger than GetLastVisibleAttr.
SCSIZE nVisStart = 1;
- while ( nVisStart < mvData.size() && mvData[nVisStart].pPattern->IsVisibleEqual(*mvData[nVisStart-1].pPattern) )
+ while ( nVisStart < mvData.size() && mvData[nVisStart].getScPatternAttr()->IsVisibleEqual(*mvData[nVisStart-1].getScPatternAttr()) )
++nVisStart;
if ( nVisStart >= mvData.size() || mvData[nVisStart-1].nEndRow > 0 ) // more than 1 row?
nStart = nVisStart;
while ( nStart < mvData.size() && !bFound )
{
- if ( mvData[nStart].pPattern->IsVisible() )
+ if ( mvData[nStart].getScPatternAttr()->IsVisible() )
{
rFirstRow = nStart ? ( mvData[nStart-1].nEndRow + 1 ) : 0;
bFound = true;
@@ -1995,7 +1957,7 @@ bool ScAttrArray::GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData, bool bSk
// find range of visually equal formats
SCSIZE nEndPos = nPos;
while ( nEndPos < mvData.size()-1 &&
- mvData[nEndPos].pPattern->IsVisibleEqual(*mvData[nEndPos+1].pPattern))
+ mvData[nEndPos].getScPatternAttr()->IsVisibleEqual(*mvData[nEndPos+1].getScPatternAttr()))
++nEndPos;
SCROW nAttrStartRow = ( nPos > 0 ) ? ( mvData[nPos-1].nEndRow + 1) : 0;
if ( nAttrStartRow <= nLastData )
@@ -2003,7 +1965,7 @@ bool ScAttrArray::GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData, bool bSk
SCROW nAttrSize = mvData[nEndPos].nEndRow + 1 - nAttrStartRow;
if ( nAttrSize >= SC_VISATTR_STOP )
break; // while, ignore this range and below
- else if ( mvData[nEndPos].pPattern->IsVisible() )
+ else if ( mvData[nEndPos].getScPatternAttr()->IsVisible() )
{
rLastRow = mvData[nEndPos].nEndRow;
bFound = true;
@@ -2013,8 +1975,8 @@ bool ScAttrArray::GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData, bool bSk
}
else
{
- if ((nPos > 0 && mvData[nPos-1].pPattern->IsVisible())
- || (nPos > 1 && !mvData[nPos-1].pPattern->IsVisibleEqual(*mvData[nPos-2].pPattern)))
+ if ((nPos > 0 && mvData[nPos-1].getScPatternAttr()->IsVisible())
+ || (nPos > 1 && !mvData[nPos-1].getScPatternAttr()->IsVisibleEqual(*mvData[nPos-2].getScPatternAttr())))
{
rLastRow = mvData[nPos-1].nEndRow;
return true;
@@ -2027,7 +1989,7 @@ bool ScAttrArray::GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData, bool bSk
bool ScAttrArray::HasVisibleAttrIn( SCROW nStartRow, SCROW nEndRow ) const
{
if ( mvData.empty() )
- return rDocument.GetDefPattern()->IsVisible();
+ return rDocument.getCellAttributeHelper().getDefaultCellAttribute().IsVisible();
SCSIZE nIndex;
Search( nStartRow, nIndex );
@@ -2035,7 +1997,7 @@ bool ScAttrArray::HasVisibleAttrIn( SCROW nStartRow, SCROW nEndRow ) const
bool bFound = false;
while ( nIndex < mvData.size() && nThisStart <= nEndRow && !bFound )
{
- if ( mvData[nIndex].pPattern->IsVisible() )
+ if ( mvData[nIndex].getScPatternAttr()->IsVisible() )
bFound = true;
nThisStart = mvData[nIndex].nEndRow + 1;
@@ -2050,9 +2012,9 @@ bool ScAttrArray::IsVisibleEqual( const ScAttrArray& rOther,
{
if ( mvData.empty() && rOther.mvData.empty() )
{
- const ScPatternAttr* pDefPattern1 = rDocument.GetDefPattern();
- const ScPatternAttr* pDefPattern2 = rOther.rDocument.GetDefPattern();
- return ( SfxPoolItem::areSame(pDefPattern1, pDefPattern2) || pDefPattern1->IsVisibleEqual( *pDefPattern2 ) );
+ const ScPatternAttr* pDefPattern1(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
+ const ScPatternAttr* pDefPattern2(&rOther.rDocument.getCellAttributeHelper().getDefaultCellAttribute());
+ return ( ScPatternAttr::areSame(pDefPattern1, pDefPattern2) || pDefPattern1->IsVisibleEqual( *pDefPattern2 ) );
}
{
@@ -2062,13 +2024,13 @@ bool ScAttrArray::IsVisibleEqual( const ScAttrArray& rOther,
if ( mvData.empty() && !rOther.mvData.empty() )
{
pNonDefault = &rOther;
- pDefPattern = rDocument.GetDefPattern();
+ pDefPattern = &rDocument.getCellAttributeHelper().getDefaultCellAttribute();
bDefNonDefCase = true;
}
else if ( !mvData.empty() && rOther.mvData.empty() )
{
pNonDefault = this;
- pDefPattern = rOther.rDocument.GetDefPattern();
+ pDefPattern = &rOther.rDocument.getCellAttributeHelper().getDefaultCellAttribute();
bDefNonDefCase = true;
}
@@ -2081,9 +2043,8 @@ bool ScAttrArray::IsVisibleEqual( const ScAttrArray& rOther,
while ( nPos < pNonDefault->Count() && bEqual )
{
- const ScPatternAttr* pNonDefPattern = pNonDefault->mvData[nPos].pPattern;
- bEqual = ( SfxPoolItem::areSame(pNonDefPattern, pDefPattern) ||
- pNonDefPattern->IsVisibleEqual( *pDefPattern ) );
+ const ScPatternAttr* pNonDefPattern = pNonDefault->mvData[nPos].getScPatternAttr();
+ bEqual = ScPatternAttr::areSame(pNonDefPattern, pDefPattern) || pNonDefPattern->IsVisibleEqual( *pDefPattern );
if ( pNonDefault->mvData[nPos].nEndRow >= nEndRow ) break;
++nPos;
@@ -2105,10 +2066,9 @@ bool ScAttrArray::IsVisibleEqual( const ScAttrArray& rOther,
{
SCROW nThisRow = mvData[nThisPos].nEndRow;
SCROW nOtherRow = rOther.mvData[nOtherPos].nEndRow;
- const ScPatternAttr* pThisPattern = mvData[nThisPos].pPattern;
- const ScPatternAttr* pOtherPattern = rOther.mvData[nOtherPos].pPattern;
- bEqual = ( SfxPoolItem::areSame(pThisPattern, pOtherPattern) ||
- pThisPattern->IsVisibleEqual(*pOtherPattern) );
+ const ScPatternAttr* pThisPattern = mvData[nThisPos].getScPatternAttr();
+ const ScPatternAttr* pOtherPattern = rOther.mvData[nOtherPos].getScPatternAttr();
+ bEqual = ( ScPatternAttr::areSame(pThisPattern, pOtherPattern) || pThisPattern->IsVisibleEqual(*pOtherPattern) );
if ( nThisRow >= nOtherRow )
{
@@ -2130,9 +2090,9 @@ bool ScAttrArray::IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW
// summarised with IsVisibleEqual
if ( mvData.empty() && rOther.mvData.empty() )
{
- const ScPatternAttr* pDefPattern1 = rDocument.GetDefPattern();
- const ScPatternAttr* pDefPattern2 = rOther.rDocument.GetDefPattern();
- return SfxPoolItem::areSame(pDefPattern1, pDefPattern2);
+ const ScPatternAttr* pDefPattern1(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
+ const ScPatternAttr* pDefPattern2(&rOther.rDocument.getCellAttributeHelper().getDefaultCellAttribute());
+ return ScPatternAttr::areSame(pDefPattern1, pDefPattern2);
}
{
@@ -2142,13 +2102,13 @@ bool ScAttrArray::IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW
if ( mvData.empty() && !rOther.mvData.empty() )
{
pNonDefault = &rOther;
- pDefPattern = rDocument.GetDefPattern();
+ pDefPattern = &rDocument.getCellAttributeHelper().getDefaultCellAttribute();
bDefNonDefCase = true;
}
else if ( !mvData.empty() && rOther.mvData.empty() )
{
pNonDefault = this;
- pDefPattern = rOther.rDocument.GetDefPattern();
+ pDefPattern = &rOther.rDocument.getCellAttributeHelper().getDefaultCellAttribute();
bDefNonDefCase = true;
}
@@ -2161,8 +2121,8 @@ bool ScAttrArray::IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW
while ( nPos < pNonDefault->Count() && bEqual )
{
- const ScPatternAttr* pNonDefPattern = pNonDefault->mvData[nPos].pPattern;
- bEqual = SfxPoolItem::areSame( pNonDefPattern, pDefPattern );
+ const ScPatternAttr* pNonDefPattern = pNonDefault->mvData[nPos].getScPatternAttr();
+ bEqual = ScPatternAttr::areSame( pNonDefPattern, pDefPattern );
if ( pNonDefault->mvData[nPos].nEndRow >= nEndRow ) break;
++nPos;
@@ -2184,9 +2144,9 @@ bool ScAttrArray::IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW
{
SCROW nThisRow = mvData[nThisPos].nEndRow;
SCROW nOtherRow = rOther.mvData[nOtherPos].nEndRow;
- const ScPatternAttr* pThisPattern = mvData[nThisPos].pPattern;
- const ScPatternAttr* pOtherPattern = rOther.mvData[nOtherPos].pPattern;
- bEqual = SfxPoolItem::areSame( pThisPattern, pOtherPattern );
+ const ScPatternAttr* pThisPattern = mvData[nThisPos].getScPatternAttr();
+ const ScPatternAttr* pOtherPattern = rOther.mvData[nOtherPos].getScPatternAttr();
+ bEqual = ScPatternAttr::areSame( pThisPattern, pOtherPattern );
if ( nThisRow >= nOtherRow )
{
@@ -2217,8 +2177,7 @@ bool ScAttrArray::TestInsertCol( SCROW nStartRow, SCROW nEndRow) const
for ( ; nIndex < mvData.size(); nIndex++ )
{
- if ( mvData[nIndex].pPattern->
- GetItem(ATTR_MERGE_FLAG).IsHorOverlapped() )
+ if ( mvData[nIndex].getScPatternAttr()->GetItem(ATTR_MERGE_FLAG).IsHorOverlapped() )
{
bTest = false; // may not be pushed out
break;
@@ -2237,15 +2196,13 @@ bool ScAttrArray::TestInsertRow( SCSIZE nSize ) const
// rDocument.MaxRow() + 1 - nSize = 1st row pushed out
if ( mvData.empty() )
- return !rDocument.GetDefPattern()->
- GetItem(ATTR_MERGE_FLAG).IsVerOverlapped();
+ return !rDocument.getCellAttributeHelper().getDefaultCellAttribute().GetItem(ATTR_MERGE_FLAG).IsVerOverlapped();
SCSIZE nFirstLost = mvData.size()-1;
while ( nFirstLost && mvData[nFirstLost-1].nEndRow >= sal::static_int_cast<SCROW>(rDocument.MaxRow() + 1 - nSize) )
--nFirstLost;
- return !mvData[nFirstLost].pPattern->
- GetItem(ATTR_MERGE_FLAG).IsVerOverlapped();
+ return !mvData[nFirstLost].getScPatternAttr()->GetItem(ATTR_MERGE_FLAG).IsVerOverlapped();
}
void ScAttrArray::InsertRow( SCROW nStartRow, SCSIZE nSize )
@@ -2258,7 +2215,7 @@ void ScAttrArray::InsertRow( SCROW nStartRow, SCSIZE nSize )
// set ScMergeAttr may not be extended (so behind delete again)
- bool bDoMerge = mvData[nIndex].pPattern->GetItem(ATTR_MERGE).IsMerged();
+ bool bDoMerge = mvData[nIndex].getScPatternAttr()->GetItem(ATTR_MERGE).IsMerged();
assert( !bDoMerge || nCol != -1 );
@@ -2332,7 +2289,7 @@ void ScAttrArray::DeleteRow( SCROW nStartRow, SCSIZE nSize )
{
DeleteRange( nStartIndex, nEndIndex );
if (nStartIndex > 0)
- if ( SfxPoolItem::areSame( mvData[nStartIndex-1].pPattern, mvData[nStartIndex].pPattern ) )
+ if ( ScPatternAttr::areSame( mvData[nStartIndex-1].getScPatternAttr(), mvData[nStartIndex].getScPatternAttr() ) )
DeleteRange( nStartIndex-1, nStartIndex-1 );
}
}
@@ -2348,10 +2305,6 @@ void ScAttrArray::DeleteRow( SCROW nStartRow, SCSIZE nSize )
void ScAttrArray::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex )
{
SetDefaultIfNotInit();
- ScDocumentPool* pDocPool = rDocument.GetPool();
- for (SCSIZE i = nStartIndex; i <= nEndIndex; i++)
- pDocPool->DirectRemoveItemFromPool(*mvData[i].pPattern);
-
mvData.erase(mvData.begin() + nStartIndex, mvData.begin() + nEndIndex + 1);
}
@@ -2361,16 +2314,18 @@ void ScAttrArray::DeleteArea(SCROW nStartRow, SCROW nEndRow)
if ( nCol != -1 )
RemoveAreaMerge( nStartRow, nEndRow ); // remove from combined flags
+ const CellAttributeHolder aDefHolder(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
+
if ( !HasAttrib( nStartRow, nEndRow, HasAttrFlags::Overlapped | HasAttrFlags::AutoFilter) )
- SetPatternArea( nStartRow, nEndRow, rDocument.GetDefPattern() );
+ SetPatternArea( nStartRow, nEndRow, aDefHolder );
else
- SetPatternAreaSafe( nStartRow, nEndRow, rDocument.GetDefPattern(), true ); // leave merge flags
+ SetPatternAreaSafe( nStartRow, nEndRow, aDefHolder ); // leave merge flags
}
void ScAttrArray::DeleteHardAttr(SCROW nStartRow, SCROW nEndRow)
{
SetDefaultIfNotInit();
- const ScPatternAttr* pDefPattern = rDocument.GetDefPattern();
+ const ScPatternAttr* pDefPattern(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
SCSIZE nIndex;
SCROW nRow;
@@ -2382,23 +2337,28 @@ void ScAttrArray::DeleteHardAttr(SCROW nStartRow, SCROW nEndRow)
while ( nThisRow <= nEndRow )
{
- const ScPatternAttr* pOldPattern = mvData[nIndex].pPattern;
+ const ScPatternAttr* pOldPattern = mvData[nIndex].getScPatternAttr();
if ( pOldPattern->GetItemSet().Count() ) // hard attributes ?
{
nRow = mvData[nIndex].nEndRow;
SCROW nAttrRow = std::min( nRow, nEndRow );
- auto pNewPattern = std::make_unique<ScPatternAttr>(*pOldPattern);
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
SfxItemSet& rSet = pNewPattern->GetItemSet();
for (sal_uInt16 nId = ATTR_PATTERN_START; nId <= ATTR_PATTERN_END; nId++)
if (nId != ATTR_MERGE && nId != ATTR_MERGE_FLAG)
rSet.ClearItem(nId);
if ( *pNewPattern == *pDefPattern )
+ {
+ delete pNewPattern;
SetPatternArea( nThisRow, nAttrRow, pDefPattern );
+ }
else
- SetPatternArea( nThisRow, nAttrRow, std::move(pNewPattern), true );
+ {
+ SetPatternArea( nThisRow, nAttrRow, CellAttributeHolder(pNewPattern, true) );
+ }
Search( nThisRow, nIndex ); // data changed
}
@@ -2420,8 +2380,7 @@ void ScAttrArray::MoveTo(SCROW nStartRow, SCROW nEndRow, ScAttrArray& rAttrArray
if ((mvData[i].nEndRow >= nStartRow) && (i == 0 || mvData[i-1].nEndRow < nEndRow))
{
// copy (bPutToPool=TRUE)
- rAttrArray.SetPatternArea( nStart, std::min( mvData[i].nEndRow, nEndRow ),
- mvData[i].pPattern, true );
+ rAttrArray.SetPatternArea( nStart, std::min( mvData[i].nEndRow, nEndRow ), mvData[i].getCellAttributeHolder() );
}
nStart = std::max( nStart, mvData[i].nEndRow + 1 );
}
@@ -2439,14 +2398,11 @@ void ScAttrArray::CopyArea(
SCROW nDestStart = std::max(static_cast<tools::Long>(static_cast<tools::Long>(nStartRow) + nDy), tools::Long(0));
SCROW nDestEnd = std::min(static_cast<tools::Long>(static_cast<tools::Long>(nEndRow) + nDy), tools::Long(rDocument.MaxRow()));
-
- ScDocumentPool* pSourceDocPool = rDocument.GetPool();
- ScDocumentPool* pDestDocPool = rAttrArray.rDocument.GetPool();
- bool bSamePool = (pSourceDocPool==pDestDocPool);
+ const bool bSameCellAttributeHelper(&rDocument.getCellAttributeHelper() == &rAttrArray.rDocument.getCellAttributeHelper());
if ( mvData.empty() )
{
- const ScPatternAttr* pNewPattern = &pDestDocPool->GetDefaultItem( ATTR_PATTERN );
+ const ScPatternAttr* pNewPattern = &rAttrArray.rDocument.getCellAttributeHelper().getDefaultCellAttribute();
rAttrArray.SetPatternArea(nDestStart, nDestEnd, pNewPattern);
return;
}
@@ -2455,42 +2411,44 @@ void ScAttrArray::CopyArea(
{
if (mvData[i].nEndRow >= nStartRow)
{
- const ScPatternAttr* pOldPattern = mvData[i].pPattern;
- const ScPatternAttr* pNewPattern;
+ const ScPatternAttr* pOldPattern = mvData[i].getScPatternAttr();
+ CellAttributeHolder aNewPattern;
- if (IsDefaultItem( pOldPattern ))
+ if (ScPatternAttr::areSame(&rDocument.getCellAttributeHelper().getDefaultCellAttribute(), pOldPattern ))
{
// default: nothing changed
-
- pNewPattern = &pDestDocPool->GetDefaultItem( ATTR_PATTERN );
+ aNewPattern.setScPatternAttr(&rAttrArray.rDocument.getCellAttributeHelper().getDefaultCellAttribute());
}
else if ( nStripFlags != ScMF::NONE )
{
- ScPatternAttr aTmpPattern( *pOldPattern );
+ ScPatternAttr* pTmpPattern(new ScPatternAttr(*pOldPattern ));
ScMF nNewFlags = ScMF::NONE;
if ( nStripFlags != ScMF::All )
- nNewFlags = aTmpPattern.GetItem(ATTR_MERGE_FLAG).GetValue() & ~nStripFlags;
+ nNewFlags = pTmpPattern->GetItem(ATTR_MERGE_FLAG).GetValue() & ~nStripFlags;
if ( nNewFlags != ScMF::NONE )
- aTmpPattern.GetItemSet().Put( ScMergeFlagAttr( nNewFlags ) );
+ pTmpPattern->GetItemSet().Put( ScMergeFlagAttr( nNewFlags ) );
else
- aTmpPattern.GetItemSet().ClearItem( ATTR_MERGE_FLAG );
+ pTmpPattern->GetItemSet().ClearItem( ATTR_MERGE_FLAG );
- if (bSamePool)
- pNewPattern = &pDestDocPool->DirectPutItemInPool(aTmpPattern);
+ if (bSameCellAttributeHelper)
+ aNewPattern.setScPatternAttr(pTmpPattern, true);
else
- pNewPattern = aTmpPattern.PutInPool( &rAttrArray.rDocument, &rDocument );
+ {
+ aNewPattern = pTmpPattern->MigrateToDocument( &rAttrArray.rDocument, &rDocument );
+ delete pTmpPattern;
+ }
}
else
{
- if (bSamePool)
- pNewPattern = &pDestDocPool->DirectPutItemInPool(*pOldPattern);
+ if (bSameCellAttributeHelper)
+ aNewPattern.setScPatternAttr(pOldPattern);
else
- pNewPattern = pOldPattern->PutInPool( &rAttrArray.rDocument, &rDocument );
+ aNewPattern = pOldPattern->MigrateToDocument( &rAttrArray.rDocument, &rDocument );
}
rAttrArray.SetPatternArea(nDestStart,
- std::min(static_cast<SCROW>(mvData[i].nEndRow + nDy), nDestEnd), pNewPattern);
+ std::min(static_cast<SCROW>(mvData[i].nEndRow + nDy), nDestEnd), aNewPattern.getScPatternAttr());
}
// when pasting from clipboard and skipping filtered rows, the adjusted
@@ -2517,19 +2475,17 @@ void ScAttrArray::CopyAreaSafe( SCROW nStartRow, SCROW nEndRow, tools::Long nDy,
return;
}
- ScDocumentPool* pSourceDocPool = rDocument.GetPool();
- ScDocumentPool* pDestDocPool = rAttrArray.rDocument.GetPool();
- bool bSamePool = (pSourceDocPool==pDestDocPool);
+ const bool bSameCellAttributeHelper(&rDocument.getCellAttributeHelper() == &rAttrArray.rDocument.getCellAttributeHelper());
if ( mvData.empty() )
{
- const ScPatternAttr* pNewPattern;
- if (bSamePool)
- pNewPattern = &pDestDocPool->DirectPutItemInPool(*rDocument.GetDefPattern());
+ CellAttributeHolder aNewPattern;
+ if (bSameCellAttributeHelper)
+ aNewPattern.setScPatternAttr(&rDocument.getCellAttributeHelper().getDefaultCellAttribute());
else
- pNewPattern = rDocument.GetDefPattern()->PutInPool( &rAttrArray.rDocument, &rDocument );
+ aNewPattern = rDocument.getCellAttributeHelper().getDefaultCellAttribute().MigrateToDocument( &rAttrArray.rDocument, &rDocument );
- rAttrArray.SetPatternAreaSafe(nDestStart, nDestEnd, pNewPattern, false);
+ rAttrArray.SetPatternAreaSafe(nDestStart, nDestEnd, aNewPattern);
return;
}
@@ -2538,16 +2494,16 @@ void ScAttrArray::CopyAreaSafe( SCROW nStartRow, SCROW nEndRow, tools::Long nDy,
{
if (mvData[i].nEndRow >= nStartRow)
{
- const ScPatternAttr* pOldPattern = mvData[i].pPattern;
- const ScPatternAttr* pNewPattern;
+ const ScPatternAttr* pOldPattern = mvData[i].getScPatternAttr();
+ CellAttributeHolder aNewPattern;
- if (bSamePool)
- pNewPattern = &pDestDocPool->DirectPutItemInPool(*pOldPattern);
+ if (bSameCellAttributeHelper)
+ aNewPattern.setScPatternAttr(pOldPattern);
else
- pNewPattern = pOldPattern->PutInPool( &rAttrArray.rDocument, &rDocument );
+ aNewPattern = pOldPattern->MigrateToDocument( &rAttrArray.rDocument, &rDocument );
rAttrArray.SetPatternAreaSafe(nDestStart,
- std::min(static_cast<SCROW>(mvData[i].nEndRow + nDy), nDestEnd), pNewPattern, false);
+ std::min(static_cast<SCROW>(mvData[i].nEndRow + nDy), nDestEnd), aNewPattern);
}
// when pasting from clipboard and skipping filtered rows, the adjusted
@@ -2571,7 +2527,7 @@ SCROW ScAttrArray::SearchStyle(
if ( mvData.empty() )
{
- if (rDocument.GetDefPattern()->GetStyleSheet() == pSearchStyle)
+ if (rDocument.getCellAttributeHelper().getDefaultCellAttribute().GetStyleSheet() == pSearchStyle)
return nRow;
nRow = bUp ? -1 : rDocument.MaxRow() + 1;
@@ -2580,7 +2536,7 @@ SCROW ScAttrArray::SearchStyle(
SCSIZE nIndex;
Search(nRow, nIndex);
- const ScPatternAttr* pPattern = mvData[nIndex].pPattern;
+ const ScPatternAttr* pPattern = mvData[nIndex].getScPatternAttr();
while (nIndex < mvData.size() && !bFound)
{
@@ -2610,7 +2566,7 @@ SCROW ScAttrArray::SearchStyle(
{
--nIndex;
nRow = mvData[nIndex].nEndRow;
- pPattern = mvData[nIndex].pPattern;
+ pPattern = mvData[nIndex].getScPatternAttr();
}
}
else
@@ -2618,7 +2574,7 @@ SCROW ScAttrArray::SearchStyle(
nRow = mvData[nIndex].nEndRow+1;
++nIndex;
if (nIndex<mvData.size())
- pPattern = mvData[nIndex].pPattern;
+ pPattern = mvData[nIndex].getScPatternAttr();
}
}
}
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 9052c6d098b6..198e56fb7158 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -76,7 +76,7 @@ bool IsAmbiguousScriptNonZero( SvtScriptType nScript )
}
ScNeededSizeOptions::ScNeededSizeOptions() :
- pPattern(nullptr), bFormula(false), bSkipMerged(true), bGetFont(true), bTotalSize(false)
+ aPattern(), bFormula(false), bSkipMerged(true), bGetFont(true), bTotalSize(false)
{
}
@@ -341,7 +341,7 @@ const ScPatternAttr* ScColumnData::GetMostUsedPattern( SCROW nStartRow, SCROW nE
const ScPatternAttr* pMaxPattern = nullptr;
size_t nMaxCount = 0;
- ScAttrIterator aAttrIter( pAttrArray.get(), nStartRow, nEndRow, GetDoc().GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), nStartRow, nEndRow, &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
const ScPatternAttr* pPattern;
SCROW nAttrRow1 = 0, nAttrRow2 = 0;
@@ -375,13 +375,13 @@ sal_uInt32 ScColumnData::GetNumberFormat( SCROW nStartRow, SCROW nEndRow ) const
return nFormat;
}
-SCROW ScColumn::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark, ScEditDataArray* pDataArray,
+SCROW ScColumn::ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark, ScEditDataArray* pDataArray,
bool* const pIsChanged )
{
- return ScColumnData::ApplySelectionCache( pCache, rMark, pDataArray, pIsChanged, nCol );
+ return ScColumnData::ApplySelectionCache( rCache, rMark, pDataArray, pIsChanged, nCol );
}
-SCROW ScColumnData::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark, ScEditDataArray* pDataArray,
+SCROW ScColumnData::ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark, ScEditDataArray* pDataArray,
bool* const pIsChanged, SCCOL nCol )
{
SCROW nTop = 0;
@@ -393,7 +393,7 @@ SCROW ScColumnData::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkDa
ScMultiSelIter aMultiIter( rMark.GetMultiSelData(), nCol );
while (aMultiIter.Next( nTop, nBottom ))
{
- pAttrArray->ApplyCacheArea( nTop, nBottom, pCache, pDataArray, pIsChanged );
+ pAttrArray->ApplyCacheArea( nTop, nBottom, rCache, pDataArray, pIsChanged );
bFound = true;
}
}
@@ -468,31 +468,31 @@ void ScColumn::DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rM
void ScColumn::ApplyPattern( SCROW nRow, const ScPatternAttr& rPatAttr )
{
const SfxItemSet* pSet = &rPatAttr.GetItemSet();
- ScItemPoolCache aCache( GetDoc().GetPool(), pSet );
+ ScItemPoolCache aCache( GetDoc().getCellAttributeHelper(), *pSet );
- const ScPatternAttr* pPattern = pAttrArray->GetPattern( nRow );
+ const CellAttributeHolder aPattern(pAttrArray->GetPattern( nRow ));
// true = keep old content
- const ScPatternAttr& rNewPattern = aCache.ApplyTo( *pPattern );
+ const CellAttributeHolder& rNewPattern = aCache.ApplyTo( aPattern );
- if (!SfxPoolItem::areSame(rNewPattern, *pPattern))
- pAttrArray->SetPattern( nRow, &rNewPattern );
+ if (!CellAttributeHolder::areSame(&rNewPattern, &aPattern))
+ pAttrArray->SetPattern( nRow, rNewPattern );
}
void ScColumnData::ApplyPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr& rPatAttr,
ScEditDataArray* pDataArray, bool* const pIsChanged )
{
const SfxItemSet* pSet = &rPatAttr.GetItemSet();
- ScItemPoolCache aCache( GetDoc().GetPool(), pSet );
- pAttrArray->ApplyCacheArea( nStartRow, nEndRow, &aCache, pDataArray, pIsChanged );
+ ScItemPoolCache aCache( GetDoc().getCellAttributeHelper(), *pSet );
+ pAttrArray->ApplyCacheArea( nStartRow, nEndRow, aCache, pDataArray, pIsChanged );
}
void ScColumn::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
const ScPatternAttr& rPattern, SvNumFormatType nNewType )
{
const SfxItemSet* pSet = &rPattern.GetItemSet();
- ScItemPoolCache aCache( GetDoc().GetPool(), pSet );
+ ScItemPoolCache aCache( GetDoc().getCellAttributeHelper(), *pSet );
SvNumberFormatter* pFormatter = GetDoc().GetFormatTable();
SCROW nEndRow = rRange.aEnd.Row();
for ( SCROW nRow = rRange.aStart.Row(); nRow <= nEndRow; nRow++ )
@@ -508,7 +508,7 @@ void ScColumn::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
{
SCROW nNewRow1 = std::max( nRow1, nRow );
SCROW nNewRow2 = std::min( nRow2, nEndRow );
- pAttrArray->ApplyCacheArea( nNewRow1, nNewRow2, &aCache );
+ pAttrArray->ApplyCacheArea( nNewRow1, nNewRow2, aCache );
nRow = nNewRow2;
}
}
@@ -517,9 +517,9 @@ void ScColumn::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
void ScColumn::ApplyStyle( SCROW nRow, const ScStyleSheet* rStyle )
{
const ScPatternAttr* pPattern = pAttrArray->GetPattern(nRow);
- std::unique_ptr<ScPatternAttr> pNewPattern(new ScPatternAttr(*pPattern));
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pPattern));
pNewPattern->SetStyleSheet(const_cast<ScStyleSheet*>(rStyle));
- pAttrArray->SetPattern(nRow, std::move(pNewPattern), true);
+ pAttrArray->SetPattern(nRow, CellAttributeHolder(pNewPattern, true));
}
void ScColumn::ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkData& rMark)
@@ -572,7 +572,7 @@ const ScStyleSheet* ScColumn::GetSelectionStyle( const ScMarkData& rMark, bool&
SCROW nBottom;
while (bEqual && aMultiIter.Next( nTop, nBottom ))
{
- ScAttrIterator aAttrIter( pAttrArray.get(), nTop, nBottom, rDocument.GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), nTop, nBottom, &rDocument.getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nRow;
SCROW nDummy;
while (bEqual)
@@ -600,7 +600,7 @@ const ScStyleSheet* ScColumn::GetAreaStyle( bool& rFound, SCROW nRow1, SCROW nRo
const ScStyleSheet* pStyle = nullptr;
const ScStyleSheet* pNewStyle;
- ScAttrIterator aAttrIter( pAttrArray.get(), nRow1, nRow2, GetDoc().GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), nRow1, nRow2, &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nRow;
SCROW nDummy;
while (bEqual)
@@ -623,17 +623,14 @@ void ScColumn::ApplyAttr( SCROW nRow, const SfxPoolItem& rAttr )
// in order to only create a new SetItem, we don't need SfxItemPoolCache.
//TODO: Warning: ScItemPoolCache seems to create too many Refs for the new SetItem ??
- ScDocumentPool* pDocPool = GetDoc().GetPool();
+ const ScPatternAttr* pOldPattern(pAttrArray->GetPattern(nRow));
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pOldPattern));
+ pNewPattern->GetItemSet().Put(rAttr);
- const ScPatternAttr* pOldPattern = pAttrArray->GetPattern( nRow );
- ScPatternAttr aTemp(*pOldPattern);
- aTemp.GetItemSet().Put(rAttr);
- const ScPatternAttr* pNewPattern = &pDocPool->DirectPutItemInPool( aTemp );
-
- if (!SfxPoolItem::areSame( pNewPattern, pOldPattern ))
- pAttrArray->SetPattern( nRow, pNewPattern );
+ if (!ScPatternAttr::areSame( pNewPattern, pOldPattern ))
+ pAttrArray->SetPattern( nRow, CellAttributeHolder(pNewPattern, true) );
else
- pDocPool->DirectRemoveItemFromPool( *pNewPattern ); // free up resources
+ delete pNewPattern;
}
ScRefCellValue ScColumn::GetCellValue( SCROW nRow ) const
@@ -1623,12 +1620,10 @@ void ScColumn::CopyToColumn(
// e.g. DIF and RTF Clipboard-Import
for ( SCROW nRow = nRow1; nRow <= nRow2; nRow++ )
{
- const ScStyleSheet* pStyle =
- rColumn.pAttrArray->GetPattern( nRow )->GetStyleSheet();
- const ScPatternAttr* pPattern = pAttrArray->GetPattern( nRow );
- std::unique_ptr<ScPatternAttr> pNewPattern(new ScPatternAttr( *pPattern ));
- pNewPattern->SetStyleSheet( const_cast<ScStyleSheet*>(pStyle) );
- rColumn.pAttrArray->SetPattern( nRow, std::move(pNewPattern), true );
+ const ScStyleSheet* pStyle(rColumn.pAttrArray->GetPattern( nRow )->GetStyleSheet());
+ ScPatternAttr* pNewPattern(new ScPatternAttr(*pAttrArray->GetPattern(nRow)));
+ pNewPattern->SetStyleSheet(const_cast<ScStyleSheet*>(pStyle));
+ rColumn.pAttrArray->SetPattern(nRow, CellAttributeHolder(pNewPattern, true));
}
}
else
@@ -1700,7 +1695,7 @@ void ScColumn::CopyScenarioFrom( const ScColumn& rSrcCol )
{
// This is the scenario table, the data is copied into it
ScDocument& rDocument = GetDoc();
- ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), rDocument.GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), &rDocument.getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nStart = -1, nEnd = -1;
const ScPatternAttr* pPattern = aAttrIter.Next( nStart, nEnd );
while (pPattern)
@@ -1729,7 +1724,7 @@ void ScColumn::CopyScenarioTo( ScColumn& rDestCol ) const
{
// This is the scenario table, the data is copied to the other
ScDocument& rDocument = GetDoc();
- ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), rDocument.GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), &rDocument.getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nStart = -1, nEnd = -1;
const ScPatternAttr* pPattern = aAttrIter.Next( nStart, nEnd );
while (pPattern)
@@ -1754,7 +1749,7 @@ void ScColumn::CopyScenarioTo( ScColumn& rDestCol ) const
bool ScColumn::TestCopyScenarioTo( const ScColumn& rDestCol ) const
{
bool bOk = true;
- ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), GetDoc().GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nStart = 0, nEnd = 0;
const ScPatternAttr* pPattern = aAttrIter.Next( nStart, nEnd );
while (pPattern && bOk)
@@ -1772,7 +1767,7 @@ void ScColumn::MarkScenarioIn( ScMarkData& rDestMark ) const
{
ScRange aRange( nCol, 0, nTab );
- ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), GetDoc().GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), 0, GetDoc().MaxRow(), &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nStart = -1, nEnd = -1;
const ScPatternAttr* pPattern = aAttrIter.Next( nStart, nEnd );
while (pPattern)
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 28d928cacea1..4b50d060eec5 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -109,7 +109,7 @@ tools::Long ScColumn::GetNeededSize(
return bInPrintTwips ? nMeasure : static_cast<tools::Long>(nMeasure * fScale);
};
- const ScPatternAttr* pPattern = rOptions.pPattern;
+ const ScPatternAttr* pPattern = rOptions.aPattern.getScPatternAttr();
if (!pPattern)
pPattern = pAttrArray->GetPattern( nRow );
@@ -193,7 +193,7 @@ tools::Long ScColumn::GetNeededSize(
// result may set a number format. In which case there's also the
// General format not set anymore...
bool bMayInvalidatePattern = (aCell.getType() == CELLTYPE_FORMULA);
- const ScPatternAttr* pOldPattern = pPattern;
+ const CellAttributeHolder aOldPattern(pPattern);
bool bNumeric = aCell.hasNumeric();
if (bMayInvalidatePattern)
{
@@ -203,7 +203,7 @@ tools::Long ScColumn::GetNeededSize(
}
if (bNumeric)
{
- if (!bMayInvalidatePattern || SfxPoolItem::areSame(pPattern, pOldPattern))
+ if (!bMayInvalidatePattern || ScPatternAttr::areSame(pPattern, aOldPattern.getScPatternAttr()))
bBreak = false;
else
{
@@ -772,7 +772,7 @@ sal_uInt16 ScColumn::GetOptimalColWidth(
// Or again in case there was a leading sep=";" row or two header
// rows..
const ScPatternAttr* pNextPattern = GetPattern( ++nRow );
- if (!SfxPoolItem::areSame(pNextPattern, pPattern))
+ if (!ScPatternAttr::areSame(pNextPattern, pPattern))
nFormat = pNextPattern->GetNumberFormat( pFormatter );
}
OUString aLongStr;
@@ -829,8 +829,8 @@ sal_uInt16 ScColumn::GetOptimalColWidth(
nScript = ScGlobal::GetDefaultScriptType();
const ScPatternAttr* pPattern = GetPattern(nRow);
- aOptions.pPattern = pPattern;
- aOptions.bGetFont = (!SfxPoolItem::areSame(pPattern, pOldPattern) || nScript != SvtScriptType::NONE);
+ aOptions.aPattern.setScPatternAttr(pPattern);
+ aOptions.bGetFont = (!ScPatternAttr::areSame(pPattern, pOldPattern) || nScript != SvtScriptType::NONE);
pOldPattern = pPattern;
sal_uInt16 nThis = static_cast<sal_uInt16>(GetNeededSize(
nRow, pDev, nPPTX, nPPTY, rZoomX, rZoomY, true, aOptions, &pOldPattern));
@@ -893,7 +893,7 @@ void ScColumn::GetOptimalHeight(
{
ScDocument& rDocument = GetDoc();
RowHeightsArray& rHeights = rCxt.getHeightArray();
- ScAttrIterator aIter( pAttrArray.get(), nStartRow, nEndRow, rDocument.GetDefPattern() );
+ ScAttrIterator aIter( pAttrArray.get(), nStartRow, nEndRow, &rDocument.getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nStart = -1;
SCROW nEnd = -1;
@@ -1068,8 +1068,8 @@ void ScColumn::GetOptimalHeight(
if (rCxt.isForceAutoSize() || !(rDocument.GetRowFlags(nRow, nTab) & CRFlags::ManualSize) )
{
- aOptions.pPattern = pPattern;
- const ScPatternAttr* pOldPattern = pPattern;
+ aOptions.aPattern.setScPatternAttr(pPattern);
+ const CellAttributeHolder aOldPattern(pPattern);
sal_uInt16 nHeight = static_cast<sal_uInt16>(
std::min(
GetNeededSize( nRow, rCxt.getOutputDevice(), rCxt.getPPTX(), rCxt.getPPTY(),
@@ -1078,8 +1078,9 @@ void ScColumn::GetOptimalHeight(
double(std::numeric_limits<sal_uInt16>::max())));
if (nHeight > rHeights.GetValue(nRow))
rHeights.SetValue(nRow, nRow, nHeight);
+
// Pattern changed due to calculation? => sync.
- if (!SfxPoolItem::areSame(pPattern, pOldPattern))
+ if (!ScPatternAttr::areSame(pPattern, aOldPattern.getScPatternAttr()))
{
pPattern = aIter.Resync( nRow, nStart, nEnd);
nNextEnd = 0;
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index a0b0c639a003..5e3411b71b4c 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -2046,7 +2046,7 @@ void ScColumn::MixData(
std::unique_ptr<ScAttrIterator> ScColumnData::CreateAttrIterator( SCROW nStartRow, SCROW nEndRow ) const
{
- return std::make_unique<ScAttrIterator>( pAttrArray.get(), nStartRow, nEndRow, GetDoc().GetDefPattern() );
+ return std::make_unique<ScAttrIterator>( pAttrArray.get(), nStartRow, nEndRow, &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
}
namespace {
@@ -2097,7 +2097,7 @@ namespace {
void applyTextNumFormat( ScColumn& rCol, SCROW nRow, SvNumberFormatter* pFormatter )
{
sal_uInt32 nFormat = pFormatter->GetStandardFormat(SvNumFormatType::TEXT);
- ScPatternAttr aNewAttrs(rCol.GetDoc().GetPool());
+ ScPatternAttr aNewAttrs(rCol.GetDoc().getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put(SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat));
rCol.ApplyPattern(nRow, aNewAttrs);
@@ -2995,7 +2995,7 @@ void ScColumn::RemoveProtected( SCROW nStartRow, SCROW nEndRow )
FormulaToValueHandler aFunc;
sc::CellStoreType::const_iterator itPos = maCells.begin();
- ScAttrIterator aAttrIter( pAttrArray.get(), nStartRow, nEndRow, GetDoc().GetDefPattern() );
+ ScAttrIterator aAttrIter( pAttrArray.get(), nStartRow, nEndRow, &GetDoc().getCellAttributeHelper().getDefaultCellAttribute() );
SCROW nTop = -1;
SCROW nBottom = -1;
const ScPatternAttr* pPattern = aAttrIter.Next( nTop, nBottom );
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index 324e54be2a92..3ddec747b7ef 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -135,7 +135,7 @@ void ScColumn::DeleteBeforeCopyFromClip(
if (rCxt.isTableProtected())
{
- ScPatternAttr aPattern(rDocument.GetPool());
+ ScPatternAttr aPattern(rDocument.getCellAttributeHelper());
aPattern.GetItemSet().Put(ScProtectionAttr(false));
ApplyPatternArea(aRange.mnRow1, aRange.mnRow2, aPattern);
}
@@ -230,7 +230,7 @@ void ScColumn::DeleteBeforeCopyFromClip(
if (rCxt.isTableProtected())
{
- ScPatternAttr aPattern(rDocument.GetPool());
+ ScPatternAttr aPattern(rDocument.getCellAttributeHelper());
aPattern.GetItemSet().Put(ScProtectionAttr(false));
ApplyPatternArea(nRow1, nRow2, aPattern);
}
@@ -265,10 +265,13 @@ void ScColumn::CopyOneCellFromClip( sc::CopyFromClipContext& rCxt, SCROW nRow1,
{
if (!rCxt.isSkipEmptyCells() || rSrcCell.getType() != CELLTYPE_NONE)
{
- const ScPatternAttr* pAttr = (bSameDocPool ? rCxt.getSingleCellPattern(nColOffset) :
- rCxt.getSingleCellPattern(nColOffset)->PutInPool( &rDocument, rCxt.getClipDoc()));
+ CellAttributeHolder aNewPattern;
+ if (bSameDocPool)
+ aNewPattern.setScPatternAttr(rCxt.getSingleCellPattern(nColOffset));
+ else
+ aNewPattern = rCxt.getSingleCellPattern(nColOffset)->MigrateToDocument( &rDocument, rCxt.getClipDoc());
- pAttrArray->SetPatternArea(nRow1, nRow2, pAttr, true);
+ pAttrArray->SetPatternArea(nRow1, nRow2, aNewPattern);
}
}
@@ -1248,10 +1251,9 @@ void ScColumn::Swap( ScColumn& rOther, SCROW nRow1, SCROW nRow2, bool bPattern )
{
const ScPatternAttr* pPat1 = GetPattern(nRow);
const ScPatternAttr* pPat2 = rOther.GetPattern(nRow);
- if (!SfxPoolItem::areSame(pPat1, pPat2))
+ if (!ScPatternAttr::areSame(pPat1, pPat2))
{
- if (pPat1->GetRefCount() == 1)
- pPat1 = &rOther.GetDoc().GetPool()->DirectPutItemInPool(*pPat1);
+ CellAttributeHolder aTemp(pPat1);
SetPattern(nRow, *pPat2);
rOther.SetPattern(nRow, *pPat1);
}
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index 222a8f1fba26..4fcbcb792cd9 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -74,7 +74,7 @@ static void ScAttrArray_IterGetNumberFormat( sal_uInt32& nFormat, const ScAttrAr
const ScPatternAttr* pPattern = pNewArr->GetPatternRange( nRowStart, nRowEnd, nRow );
if( !pPattern )
{
- pPattern = rDoc.GetDefPattern();
+ pPattern = &rDoc.getCellAttributeHelper().getDefaultCellAttribute();
nRowEnd = rDoc.MaxRow();
}
@@ -1402,11 +1402,11 @@ void ScHorizontalAttrIterator::InitForNextRow(bool bInitialization)
{
pNextEnd[nPos] = rDoc.MaxRow();
assert( pNextEnd[nPos] >= nRow && "Sequence out of order" );
- ppPatterns[nPos] = rDoc.GetDefPattern();
+ ppPatterns[nPos] = &rDoc.getCellAttributeHelper().getDefaultCellAttribute();
}
else if ( nIndex < pArray.Count() )
{
- const ScPatternAttr* pPattern = pArray.mvData[nIndex].pPattern;
+ const ScPatternAttr* pPattern = pArray.mvData[nIndex].getScPatternAttr();
SCROW nThisEnd = pArray.mvData[nIndex].nEndRow;
pNextEnd[nPos] = nThisEnd;
assert( pNextEnd[nPos] >= nRow && "Sequence out of order" );
@@ -1424,7 +1424,7 @@ void ScHorizontalAttrIterator::InitForNextRow(bool bInitialization)
nMinNextEnd = pNextEnd[nPos];
// store positions of ScHorizontalAttrIterator elements (minimizing expensive ScPatternAttr comparisons)
- if (i > nStartCol && !SfxPoolItem::areSame(ppPatterns[nThisHead], ppPatterns[nPos]))
+ if (i > nStartCol && !ScPatternAttr::areSame(ppPatterns[nThisHead], ppPatterns[nPos]))
{
pHorizEnd[nThisHead] = i - 1;
nThisHead = nPos; // start position of the next horizontal group
diff --git a/sc/source/core/data/docpool.cxx b/sc/source/core/data/docpool.cxx
index 05dd88958288..d540c9939380 100644
--- a/sc/source/core/data/docpool.cxx
+++ b/sc/source/core/data/docpool.cxx
@@ -28,6 +28,7 @@
#include <vcl/settings.hxx>
#include <svl/itemiter.hxx>
#include <svl/stritem.hxx>
+#include <svl/voiditem.hxx>
#include <svx/algitem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/lineitem.hxx>
@@ -145,7 +146,6 @@ SfxItemInfo const aItemInfos[] =
{ 0, false, true }, // ATTR_VALIDDATA
{ 0, false, true }, // ATTR_CONDITIONAL
{ 0, false, true }, // ATTR_HYPERLINK
- { 0, true, true }, // ATTR_PATTERN
{ SID_ATTR_LRSPACE, false, true }, // ATTR_LRSPACE
{ SID_ATTR_ULSPACE, false, true }, // ATTR_ULSPACE
{ SID_ATTR_PAGE, false, true }, // ATTR_PAGE
@@ -184,12 +184,8 @@ static_assert(
SAL_N_ELEMENTS(aItemInfos) == ATTR_ENDINDEX - ATTR_STARTINDEX + 1, "these must match");
ScDocumentPool::ScDocumentPool()
-
- : SfxItemPool ( "ScDocumentPool",
- ATTR_STARTINDEX, ATTR_ENDINDEX,
- aItemInfos, nullptr ),
- mvPoolDefaults(ATTR_ENDINDEX-ATTR_STARTINDEX+1),
- mnCurrentMaxKey(0)
+: SfxItemPool ( "ScDocumentPool", ATTR_STARTINDEX, ATTR_ENDINDEX, aItemInfos, nullptr )
+, mvPoolDefaults(ATTR_ENDINDEX-ATTR_STARTINDEX+1)
{
LanguageType nDefLang, nCjkLang, nCtlLang;
@@ -274,20 +270,6 @@ ScDocumentPool::ScDocumentPool()
mvPoolDefaults[ ATTR_VALIDDATA - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_VALIDDATA, 0 );
mvPoolDefaults[ ATTR_CONDITIONAL - ATTR_STARTINDEX ] = new ScCondFormatItem;
mvPoolDefaults[ ATTR_HYPERLINK - ATTR_STARTINDEX ] = new SfxStringItem( ATTR_HYPERLINK, OUString() ) ;
-
- // GetRscString only works after ScGlobal::Init (indicated by the EmptyBrushItem)
- // TODO: Write additional method ScGlobal::IsInit() or somesuch
- // or detect whether this is the Secondary Pool for a MessagePool
- if ( ScGlobal::GetEmptyBrushItem() )
-
- mvPoolDefaults[ ATTR_PATTERN - ATTR_STARTINDEX ] =
- new ScPatternAttr( SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END>( *this ),
- ScResId(STR_STYLENAME_STANDARD) );
- else
- mvPoolDefaults[ ATTR_PATTERN - ATTR_STARTINDEX ] =
- new ScPatternAttr( SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END>( *this ),
- STRING_STANDARD ); // FIXME: without name?
-
mvPoolDefaults[ ATTR_LRSPACE - ATTR_STARTINDEX ] = new SvxLRSpaceItem( ATTR_LRSPACE );
mvPoolDefaults[ ATTR_ULSPACE - ATTR_STARTINDEX ] = new SvxULSpaceItem( ATTR_ULSPACE );
mvPoolDefaults[ ATTR_PAGE - ATTR_STARTINDEX ] = new SvxPageItem( ATTR_PAGE );
@@ -337,51 +319,6 @@ ScDocumentPool::~ScDocumentPool()
}
}
-void ScDocumentPool::newItem_Callback(const SfxPoolItem& rItem) const
-{
- if (ATTR_PATTERN == rItem.Which() && 1 == rItem.GetRefCount())
- {
- const_cast<ScDocumentPool*>(this)->mnCurrentMaxKey++;
- const_cast<ScPatternAttr&>(static_cast<const ScPatternAttr&>(rItem)).SetPAKey(mnCurrentMaxKey);
- }
-}
-
-bool ScDocumentPool::newItem_UseDirect(const SfxPoolItem& rItem) const
-{
- // I have evaluated that this is currently needed for ATTR_PATTERN/ScPatternAttr to work,
- // so this needs to stay at ptr-compare
- return (ATTR_PATTERN == rItem.Which() && areSfxPoolItemPtrsEqual(&rItem, mvPoolDefaults[ATTR_PATTERN - ATTR_STARTINDEX]));
-}
-
-void ScDocumentPool::StyleDeleted( const ScStyleSheet* pStyle )
-{
- for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
- {
- ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
- if ( pPattern && pPattern->GetStyleSheet() == pStyle )
- pPattern->StyleToName();
- }
-}
-
-void ScDocumentPool::CellStyleCreated( std::u16string_view rName, const ScDocument& rDoc )
-{
- // If a style was created, don't keep any pattern with its name string in the pool,
- // because it would compare equal to a pattern with a pointer to the new style.
- // Calling StyleSheetChanged isn't enough because the pool may still contain items
- // for undo or clipboard content.
-
- for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
- {
- auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
- if ( pPattern && pPattern->GetStyleSheet() == nullptr )
- {
- const OUString* pStyleName = pPattern->GetStyleName();
- if ( pStyleName && *pStyleName == rName )
- pPattern->UpdateStyleSheet(rDoc); // find and store style pointer
- }
- }
-}
-
rtl::Reference<SfxItemPool> ScDocumentPool::Clone() const
{
return new SfxItemPool (*this, true);
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 3b9b24cfec49..026b2e1b9956 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -90,6 +90,7 @@
#include <drwlayer.hxx>
#include <sharedstringpoolpurge.hxx>
#include <dociter.hxx>
+#include <docpool.hxx>
#include <config_features.h>
using namespace com::sun::star;
@@ -111,7 +112,21 @@ ScSheetLimits ScSheetLimits::CreateDefault()
return ScSheetLimits(MAXCOL, MAXROW);
}
+CellAttributeHelper& ScDocument::getCellAttributeHelper() const
+{
+ if (!mpCellAttributeHelper)
+ {
+ assert(!IsClipOrUndo() && "CellAttributeHelper needs to be shared using SharePooledResources, not created (!)");
+ SfxItemPool* pPool(const_cast<ScDocument*>(this)->GetPool());
+ assert(nullptr != pPool && "No SfxItemPool for this ScDocument (!)");
+ mpCellAttributeHelper.reset(new CellAttributeHelper(*pPool));
+ }
+
+ return *mpCellAttributeHelper;
+}
+
ScDocument::ScDocument( ScDocumentMode eMode, ScDocShell* pDocShell ) :
+ mpCellAttributeHelper(),
mpCellStringPool(std::make_shared<svl::SharedStringPool>(ScGlobal::getCharClass())),
mpDocLinkMgr(new sc::DocumentLinkManager(pDocShell)),
mbFormulaGroupCxtBlockDiscard(false),
@@ -216,6 +231,7 @@ ScDocument::ScDocument( ScDocumentMode eMode, ScDocShell* pDocShell ) :
{
pChartListenerCollection = nullptr;
}
+
pDBCollection.reset( new ScDBCollection(*this) );
pSelectionAttr = nullptr;
apTemporaryChartLock.reset( new ScTemporaryChartLock(this) );
@@ -503,7 +519,7 @@ ScNoteEditEngine& ScDocument::GetNoteEngine()
mpNoteEngine->EnableUndo( false );
mpNoteEngine->SetRefMapMode(MapMode(MapUnit::Map100thMM));
ApplyAsianEditSettings( *mpNoteEngine );
- const SfxItemSet& rItemSet = GetDefPattern()->GetItemSet();
+ const SfxItemSet& rItemSet(getCellAttributeHelper().getDefaultCellAttribute().GetItemSet());
SfxItemSet aEEItemSet( mpNoteEngine->GetEmptyItemSet() );
ScPatternAttr::FillToEditItemSet( aEEItemSet, rItemSet );
mpNoteEngine->SetDefaults( std::move(aEEItemSet) ); // edit engine takes ownership
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index e9a4fea132f2..e62956771cb7 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -739,8 +739,7 @@ sal_uLong ScDocument::AddValidationEntry( const ScValidationData& rNew )
nMax = nKey;
}
- // might be called from ScPatternAttr::PutInPool; thus clone (real copy)
-
+ // might be called from ScPatternAttr::MigrateToDocument; thus clone (real copy)
sal_uLong nNewKey = nMax + 1;
std::unique_ptr<ScValidationData> pInsert(rNew.Clone(this));
pInsert->SetKey( nNewKey );
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 6a51d364d9ce..aafd4271e5d1 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -5017,29 +5017,28 @@ bool ScDocument::RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow,
return false;
}
-const ScPatternAttr* ScDocument::SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, std::unique_ptr<ScPatternAttr> pAttr )
+void ScDocument::SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const CellAttributeHolder& rHolder )
{
if (ScTable* pTable = FetchTable(nTab))
- return pTable->SetPattern(nCol, nRow, std::move(pAttr));
- return nullptr;
+ pTable->SetPattern(nCol, nRow, rHolder);
}
-const ScPatternAttr* ScDocument::SetPattern( const ScAddress& rPos, std::unique_ptr<ScPatternAttr> pAttr )
+void ScDocument::SetPattern( const ScAddress& rPos, const CellAttributeHolder& rHolder )
{
- return SetPattern(rPos.Col(), rPos.Row(), rPos.Tab(), std::move(pAttr));
+ SetPattern(rPos.Col(), rPos.Row(), rPos.Tab(), rHolder);
}
void ScDocument::SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr )
{
if (ScTable* pTable = FetchTable(nTab))
- pTable->SetPattern(nCol, nRow, rAttr);
+ pTable->SetPattern(nCol, nRow, CellAttributeHolder(&rAttr));
}
void ScDocument::SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr )
{
SCTAB nTab = rPos.Tab();
if (ScTable* pTable = FetchTable(nTab))
- pTable->SetPattern(rPos, rAttr);
+ pTable->SetPattern(rPos, rAttr);
}
std::unique_ptr<ScPatternAttr> ScDocument::CreateSelectionPattern( const ScMarkData& rMark, bool bDeep )
@@ -5075,14 +5074,14 @@ std::unique_ptr<ScPatternAttr> ScDocument::CreateSelectionPattern( const ScMarkD
OSL_ENSURE( aState.pItemSet, "SelectionPattern Null" );
if (aState.pItemSet)
{
- std::unique_ptr<ScPatternAttr> pPattern(new ScPatternAttr( std::move(*aState.pItemSet) ));
+ std::unique_ptr<ScPatternAttr> pPattern(new ScPatternAttr(getCellAttributeHelper(), &aState.pItemSet.value()));
if (aState.mbValidPatternId)
pPattern->SetPAKey(aState.mnPatternId);
return pPattern;
}
else
- return std::unique_ptr<ScPatternAttr>(new ScPatternAttr( GetPool() )); // empty
+ return std::unique_ptr<ScPatternAttr>(new ScPatternAttr(getCellAttributeHelper())); // empty
}
const ScPatternAttr* ScDocument::GetSelectionPattern( const ScMarkData& rMark )
@@ -5522,9 +5521,10 @@ void ScDocument::ExtendOverlapped( SCCOL& rStartCol, SCROW& rStartRow,
bool bHorOverlapped;
if ( pAttrArray.Count() )
- bHorOverlapped = pAttrArray.mvData[nIndex].pPattern->GetItem(ATTR_MERGE_FLAG).IsHorOverlapped();
+ bHorOverlapped = pAttrArray.mvData[nIndex].getScPatternAttr()->GetItem(ATTR_MERGE_FLAG).IsHorOverlapped();
else
- bHorOverlapped = GetDefPattern()->GetItem(ATTR_MERGE_FLAG).IsHorOverlapped();
+ bHorOverlapped = getCellAttributeHelper().getDefaultCellAttribute().GetItem(ATTR_MERGE_FLAG).IsHorOverlapped();
+
if ( bHorOverlapped )
{
SCROW nEndRowSeg = (pAttrArray.Count()) ? pAttrArray.mvData[nIndex].nEndRow : MaxRow();
@@ -5912,14 +5912,14 @@ void ScDocument::ApplySelectionPattern( const ScPatternAttr& rAttr, const ScMark
}
else
{
- ScItemPoolCache aCache( mxPoolHelper->GetDocPool(), pSet );
+ ScItemPoolCache aCache( getCellAttributeHelper(), *pSet );
SCTAB nMax = GetTableCount();
for (const auto& rTab : rMark)
{
if (rTab >= nMax)
break;
if (maTabs[rTab])
- maTabs[rTab]->ApplySelectionCache( &aCache, rMark, pDataArray, pIsChanged );
+ maTabs[rTab]->ApplySelectionCache( aCache, rMark, pDataArray, pIsChanged );
}
}
}
@@ -6072,11 +6072,6 @@ void ScDocument::DeleteSelectionTab(
}
}
-ScPatternAttr* ScDocument::GetDefPattern() const
-{
- return const_cast<ScPatternAttr*>(&mxPoolHelper->GetDocPool()->GetDefaultItem(ATTR_PATTERN));
-}
-
ScDocumentPool* ScDocument::GetPool()
{
return mxPoolHelper ? mxPoolHelper->GetDocPool() : nullptr;
@@ -6126,32 +6121,6 @@ void ScDocument::GetNextPos( SCCOL& rCol, SCROW& rRow, SCTAB nTab, SCCOL nMovX,
// Data operations
-void ScDocument::UpdStlShtPtrsFrmNms()
-{
- ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
-
- for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_PATTERN))
- {
- auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
- if (pPattern)
- pPattern->UpdateStyleSheet(*this);
- }
- const_cast<ScPatternAttr&>(pPool->GetDefaultItem(ATTR_PATTERN)).UpdateStyleSheet(*this);
-}
-
-void ScDocument::StylesToNames()
-{
- ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
-
- for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_PATTERN))
- {
- auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
- if (pPattern)
- pPattern->StyleToName();
- }
- const_cast<ScPatternAttr&>(pPool->GetDefaultItem(ATTR_PATTERN)).StyleToName();
-}
-
sal_uInt64 ScDocument::GetCellCount() const
{
sal_uInt64 nCellCount = 0;
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index acf0f27672b0..08c4886d5e61 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -332,6 +332,10 @@ void ScDocument::SharePooledResources( const ScDocument* pSrcDoc )
ScMutationGuard aGuard(*this, ScMutationGuardFlags::CORE);
mxPoolHelper = pSrcDoc->mxPoolHelper;
mpCellStringPool = pSrcDoc->mpCellStringPool;
+
+ // force lazy creation/existance in source document *before* sharing
+ pSrcDoc->getCellAttributeHelper();
+ mpCellAttributeHelper = pSrcDoc->mpCellAttributeHelper;
}
void ScDocument::UpdateScriptTypes( const ScAddress& rPos, SCCOL nColSize, SCROW nRowSize )
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 3f98fc770a6b..2570bcd214d8 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -398,7 +398,7 @@ void ScDrawLayer::CreateDefaultStyles()
// text formatting
SfxItemSet aEditSet(GetItemPool());
- ScPatternAttr::FillToEditItemSet(aEditSet, pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN).GetItemSet());
+ ScPatternAttr::FillToEditItemSet(aEditSet, pDoc->getCellAttributeHelper().getDefaultCellAttribute().GetItemSet());
pSet->Put(aEditSet.Get(EE_CHAR_FONTINFO));
pSet->Put(aEditSet.Get(EE_CHAR_FONTINFO_CJK));
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 4a573e1c21da..544c58a65e46 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -473,12 +473,12 @@ void ScDocument::FillInfo(
if ( pThisAttrArr->Count() )
{
nThisRow = pThisAttrArr->mvData[nIndex].nEndRow; // End of range
- pPattern = pThisAttrArr->mvData[nIndex].pPattern;
+ pPattern = pThisAttrArr->mvData[nIndex].getScPatternAttr();
}
else
{
nThisRow = MaxRow();
- pPattern = GetDefPattern();
+ pPattern = &getCellAttributeHelper().getDefaultCellAttribute();
}
const SvxBrushItem* pBackground = &pPattern->GetItem(ATTR_BACKGROUND);
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index 29a616c6b6e8..18094086c50f 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -510,21 +510,19 @@ void ScGlobal::SetClipDocName( const OUString& rNew )
aStrClipDocName = rNew;
}
-void ScGlobal::InitTextHeight(const SfxItemPool* pPool)
+void ScGlobal::InitTextHeight(SfxItemPool& rPool)
{
- if (!pPool)
- {
- OSL_FAIL("ScGlobal::InitTextHeight: No Pool");
- return;
- }
-
- const ScPatternAttr& rPattern = pPool->GetDefaultItem(ATTR_PATTERN);
+ // this gets handed over the m_pMessagePool in ScModule::ScModule, so
+ // the previously used item ScPatternAttr is unchanged. This allows to
+ // just use an temporary incarnation of a CellAttributeHelper here
+ const CellAttributeHelper aTempHelper(rPool);
+ const ScPatternAttr& rDefaultCellAttribute(aTempHelper.getDefaultCellAttribute());
OutputDevice* pDefaultDev = Application::GetDefaultDevice();
ScopedVclPtrInstance< VirtualDevice > pVirtWindow( *pDefaultDev );
pVirtWindow->SetMapMode(MapMode(MapUnit::MapPixel));
vcl::Font aDefFont;
- rPattern.fillFontOnly(aDefFont, pVirtWindow); // Font color doesn't matter here
+ rDefaultCellAttribute.fillFontOnly(aDefFont, pVirtWindow); // Font color doesn't matter here
pVirtWindow->SetFont(aDefFont);
sal_uInt16 nTest = static_cast<sal_uInt16>(
pVirtWindow->PixelToLogic(Size(0, pVirtWindow->GetTextHeight()), MapMode(MapUnit::MapTwip)).Height());
@@ -532,7 +530,7 @@ void ScGlobal::InitTextHeight(const SfxItemPool* pPool)
if (nTest > nDefFontHeight)
nDefFontHeight = nTest;
- const SvxMarginItem& rMargin = rPattern.GetItem(ATTR_MARGIN);
+ const SvxMarginItem& rMargin(rDefaultCellAttribute.GetItem(ATTR_MARGIN));
nTest = static_cast<sal_uInt16>(nDefFontHeight + rMargin.GetTopMargin()
+ rMargin.GetBottomMargin() - STD_ROWHEIGHT_DIFF);
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index 4bb79828da13..871095ec7bf1 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -68,62 +68,272 @@
#include <comphelper/lok.hxx>
#include <tabvwsh.hxx>
-const WhichRangesContainer aScPatternAttrSchema(svl::Items<ATTR_PATTERN_START, ATTR_PATTERN_END>);
+CellAttributeHelper::CellAttributeHelper(SfxItemPool& rSfxItemPool)
+: mrSfxItemPool(rSfxItemPool)
+, mpDefaultCellAttribute(nullptr)
+, maRegisteredCellAttributes()
+, mpLastHit(nullptr)
+, mnCurrentMaxKey(0)
+{
+}
-ScPatternAttr::ScPatternAttr( SfxItemSet&& pItemSet, const OUString& rStyleName )
- : SfxSetItem ( ATTR_PATTERN, std::move(pItemSet) ),
- pName ( rStyleName ),
- pStyle ( nullptr ),
- mnPAKey(0)
+CellAttributeHelper::~CellAttributeHelper()
{
- setExceptionalSCItem();
+ delete mpDefaultCellAttribute;
+}
- // We need to ensure that ScPatternAttr is using the correct WhichRange,
- // see comments in commit message. This does transfers the items with
- // minimized overhead, too
- if (GetItemSet().GetRanges() != aScPatternAttrSchema)
- GetItemSet().SetRanges(aScPatternAttrSchema);
+const ScPatternAttr* CellAttributeHelper::registerAndCheck(const ScPatternAttr& rCandidate, bool bPassingOwnership) const
+{
+ if (&rCandidate == &getDefaultCellAttribute())
+ return &rCandidate;
+
+ assert(rCandidate.pCellAttributeHelper == this && "WRONG CellAttributeHelper in ScPatternAttr (!)");
+
+ if (rCandidate.isRegistered())
+ {
+ assert(!bPassingOwnership && "Trying to register an already registered CellAttribute with ownership change (!)");
+ rCandidate.mnRefCount++;
+ return &rCandidate;
+ }
+
+ if (nullptr != mpLastHit && ScPatternAttr::areSame(mpLastHit, &rCandidate))
+ {
+ // hit for single-entry cache, make use of it
+ mpLastHit->mnRefCount++;
+ if (bPassingOwnership)
+ delete &rCandidate;
+ return mpLastHit;
+ }
+
+ for (const ScPatternAttr* pCheck : maRegisteredCellAttributes)
+ {
+ if (ScPatternAttr::areSame(pCheck, &rCandidate))
+ {
+ pCheck->mnRefCount++;
+ if (bPassingOwnership)
+ delete &rCandidate;
+ mpLastHit = pCheck;
+ return pCheck;
+ }
+ }
+
+ const ScPatternAttr* pCandidate(bPassingOwnership ? &rCandidate : new ScPatternAttr(rCandidate));
+ pCandidate->mnRefCount++;
+ const_cast<ScPatternAttr*>(pCandidate)->SetPAKey(mnCurrentMaxKey++);
+ maRegisteredCellAttributes.insert(pCandidate);
+ mpLastHit = pCandidate;
+ return pCandidate;
}
-ScPatternAttr::ScPatternAttr( SfxItemSet&& pItemSet )
- : SfxSetItem ( ATTR_PATTERN, std::move(pItemSet) ),
- pStyle ( nullptr ),
- mnPAKey(0)
+void CellAttributeHelper::doUnregister(const ScPatternAttr& rCandidate)
{
- setExceptionalSCItem();
+ if (&rCandidate == &getDefaultCellAttribute())
+ return;
- // We need to ensure that ScPatternAttr is using the correct WhichRange,
- // see comments in commit message. This does transfers the items with
- // minimized overhead, too
- if (GetItemSet().GetRanges() != aScPatternAttrSchema)
- GetItemSet().SetRanges(aScPatternAttrSchema);
+ assert(rCandidate.isRegistered());
+ rCandidate.mnRefCount--;
+
+ if (0 != rCandidate.mnRefCount)
+ return;
+
+ if (mpLastHit == &rCandidate)
+ mpLastHit = nullptr;
+
+ maRegisteredCellAttributes.erase(&rCandidate);
+ delete &rCandidate;
}
-ScPatternAttr::ScPatternAttr( SfxItemPool* pItemPool )
- : SfxSetItem ( ATTR_PATTERN, SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END>( *pItemPool ) ),
- pStyle ( nullptr ),
- mnPAKey(0)
+const ScPatternAttr& CellAttributeHelper::getDefaultCellAttribute() const
{
- setExceptionalSCItem();
+ // *have* to create on-demand due to mrScDocument.GetPool() *can* be nullptr
+ // since mxPoolHelper is *only* created for SCDOCMODE_DOCUMENT and
+ // SCDOCMODE_FUNCTIONACCESS (!)
+ if (!mpDefaultCellAttribute)
+ {
+ // GetRscString only works after ScGlobal::Init (indicated by the EmptyBrushItem)
+ // TODO: Write additional method ScGlobal::IsInit() or somesuch
+ // or detect whether this is the Secondary Pool for a MessagePool
+ if (ScGlobal::GetEmptyBrushItem())
+ {
+ const OUString aInitialStyle(ScResId(STR_STYLENAME_STANDARD));
+ mpDefaultCellAttribute = new ScPatternAttr(
+ *const_cast<CellAttributeHelper*>(this),
+ nullptr, // no SfxItemSet
+ &aInitialStyle);
+ }
+ else
+ {
+ mpDefaultCellAttribute = new ScPatternAttr(*const_cast<CellAttributeHelper*>(this));
+ }
+ }
+ return *mpDefaultCellAttribute;
}
-ScPatternAttr::ScPatternAttr( const ScPatternAttr& rPatternAttr )
- : SfxSetItem ( rPatternAttr ),
- pName ( rPatternAttr.pName ),
- pStyle ( rPatternAttr.pStyle ),
- mnPAKey(rPatternAttr.mnPAKey)
+void CellAttributeHelper::CellStyleDeleted(const ScStyleSheet& rStyle)
{
- setExceptionalSCItem();
+ for (const ScPatternAttr* pCheck : maRegisteredCellAttributes)
+ {
+ if (&rStyle == pCheck->GetStyleSheet())
+ const_cast<ScPatternAttr*>(pCheck)->StyleToName();
+ }
}
-ScPatternAttr* ScPatternAttr::Clone( SfxItemPool *pPool ) const
+void CellAttributeHelper::CellStyleCreated(ScDocument& rDoc, std::u16string_view rName)
{
- ScPatternAttr* pPattern = new ScPatternAttr( GetItemSet().CloneAsValue(true, pPool) );
+ // If a style was created, don't keep any pattern with its name string in the pool,
+ // because it would compare equal to a pattern with a pointer to the new style.
+ // Calling StyleSheetChanged isn't enough because the pool may still contain items
+ // for undo or clipboard content.
+ for (const ScPatternAttr* pCheck : maRegisteredCellAttributes)
+ {
+ if (nullptr == pCheck->GetStyleSheet() && rName == *pCheck->GetStyleName())
+ const_cast<ScPatternAttr*>(pCheck)->UpdateStyleSheet(rDoc); // find and store style pointer
+ }
+}
- pPattern->pStyle = pStyle;
- pPattern->pName = pName;
+void CellAttributeHelper::UpdateAllStyleSheets(ScDocument& rDoc)
+{
+ for (const ScPatternAttr* pCheck : maRegisteredCellAttributes)
+ const_cast<ScPatternAttr*>(pCheck)->UpdateStyleSheet(rDoc);
- return pPattern;
+ // force existance, then access
+ getDefaultCellAttribute();
+ mpDefaultCellAttribute->UpdateStyleSheet(rDoc);
+}
+
+void CellAttributeHelper::AllStylesToNames()
+{
+ for (const ScPatternAttr* pCheck : maRegisteredCellAttributes)
+ const_cast<ScPatternAttr*>(pCheck)->StyleToName();
+
+ // force existance, then access
+ getDefaultCellAttribute();
+ mpDefaultCellAttribute->StyleToName();
+}
+
+CellAttributeHolder::CellAttributeHolder(const ScPatternAttr* pNew, bool bPassingOwnership)
+: mpScPatternAttr(nullptr)
+{
+ if (nullptr != pNew)
+ mpScPatternAttr = pNew->getCellAttributeHelper().registerAndCheck(*pNew, bPassingOwnership);
+}
+
+CellAttributeHolder::CellAttributeHolder(const CellAttributeHolder& rHolder)
+: mpScPatternAttr(nullptr)
+{
+ if (rHolder.getScPatternAttr())
+ mpScPatternAttr = rHolder.getScPatternAttr()->getCellAttributeHelper().registerAndCheck(*rHolder.getScPatternAttr(), false);
+}
+
+CellAttributeHolder::~CellAttributeHolder()
+{
+ if (nullptr != mpScPatternAttr)
+ mpScPatternAttr->getCellAttributeHelper().doUnregister(*mpScPatternAttr);
+}
+
+const CellAttributeHolder& CellAttributeHolder::operator=(const CellAttributeHolder& rHolder)
+{
+ if (nullptr != mpScPatternAttr)
+ mpScPatternAttr->getCellAttributeHelper().doUnregister(*mpScPatternAttr);
+
+ mpScPatternAttr = nullptr;
+
+ if (rHolder.getScPatternAttr())
+ mpScPatternAttr = rHolder.getScPatternAttr()->getCellAttributeHelper().registerAndCheck(*rHolder.getScPatternAttr(), false);
+
+ return *this;
+}
+
+bool CellAttributeHolder::operator==(const CellAttributeHolder& rHolder) const
+{
+ // here we have registered entries, so no need to test for equality
+ return mpScPatternAttr == rHolder.mpScPatternAttr;
+}
+
+void CellAttributeHolder::setScPatternAttr(const ScPatternAttr* pNew, bool bPassingOwnership)
+{
+ if (nullptr != mpScPatternAttr)
+ mpScPatternAttr->getCellAttributeHelper().doUnregister(*mpScPatternAttr);
+
+ mpScPatternAttr = nullptr;
+
+ if (nullptr != pNew)
+ mpScPatternAttr = pNew->getCellAttributeHelper().registerAndCheck(*pNew, bPassingOwnership);
+}
+
+bool CellAttributeHolder::areSame(const CellAttributeHolder* p1, const CellAttributeHolder* p2)
+{
+ if (p1 == p2)
+ // pointer compare, this handles already
+ // nullptr and if indeed handed over twice
+ return true;
+
+ if (nullptr == p1 || nullptr == p2)
+ // one ptr is nullptr, not both, that would
+ // have triggered above
+ return false;
+
+ // return content compare using operator== at last
+ return *p1 == *p2;
+}
+
+#ifdef DBG_UTIL
+static size_t nUsedScPatternAttr(0);
+#endif
+
+const WhichRangesContainer aScPatternAttrSchema(svl::Items<ATTR_PATTERN_START, ATTR_PATTERN_END>);
+
+ScPatternAttr::ScPatternAttr(CellAttributeHelper& rHelper, const SfxItemSet* pItemSet, const OUString* pStyleName)
+: maLocalSfxItemSet(rHelper.GetPool(), aScPatternAttrSchema)
+, pName()
+, mxVisible()
+, pStyle(nullptr)
+, pCellAttributeHelper(&rHelper)
+, mnPAKey(0)
+, mnRefCount(0)
+#ifdef DBG_UTIL
+, m_nSerialNumber(nUsedScPatternAttr++)
+, m_bDeleted(false)
+#endif
+{
+ if (nullptr != pStyleName)
+ pName = *pStyleName;
+
+ // We need to ensure that ScPatternAttr is using the correct WhichRange,
+ // see comments in commit message. This does transfers the items with
+ // minimized overhead, too
+ if (nullptr != pItemSet)
+ {
+ // CAUTION: Use bInvalidAsDefault == false for the ::Put,
+ // we *need* to take over also Items/Slots in state
+ // SfxItemState::DONTCARE aka IsInvalidItem, this is a precious
+ // value/information e.g. in ScDocument::CreateSelectionPattern
+ maLocalSfxItemSet.Put(*pItemSet, false);
+ }
+}
+
+ScPatternAttr::ScPatternAttr(const ScPatternAttr& rPatternAttr)
+: maLocalSfxItemSet(rPatternAttr.maLocalSfxItemSet)
+, pName(rPatternAttr.pName)
+, mxVisible()
+, pStyle(rPatternAttr.pStyle)
+, pCellAttributeHelper(rPatternAttr.pCellAttributeHelper)
+, mnPAKey(rPatternAttr.mnPAKey)
+, mnRefCount(0)
+#ifdef DBG_UTIL
+, m_nSerialNumber(nUsedScPatternAttr++)
+, m_bDeleted(false)
+#endif
+{
+}
+
+ScPatternAttr::~ScPatternAttr()
+{
+#ifdef DBG_UTIL
+ m_bDeleted = true;
+#endif
+ // should no longer be referenced, complain if not so
+ assert(!isRegistered());
}
static bool StrCmp( const OUString* pStr1, const OUString* pStr2 )
@@ -139,37 +349,26 @@ static bool StrCmp( const OUString* pStr1, const OUString* pStr2 )
constexpr size_t compareSize = ATTR_PATTERN_END - ATTR_PATTERN_START + 1;
-bool ScPatternAttr::operator==( const SfxPoolItem& rCmp ) const
+bool ScPatternAttr::operator==(const ScPatternAttr& rCmp) const
{
// check if same incarnation
if (this == &rCmp)
return true;
- // check SfxPoolItem base class
- if (!SfxPoolItem::operator==(rCmp) )
- return false;
-
// check everything except the SfxItemSet from base class SfxSetItem
- const ScPatternAttr& rOther(static_cast<const ScPatternAttr&>(rCmp));
- if (!StrCmp(GetStyleName(), rOther.GetStyleName()))
+ if (!StrCmp(GetStyleName(), rCmp.GetStyleName()))
return false;
// here we need to compare the SfxItemSet. We *know* that these are
// all simple (one range, same range)
- const SfxItemSet& rSet1(GetItemSet());
- const SfxItemSet& rSet2(rOther.GetItemSet());
+ const SfxItemSet& rSet1(maLocalSfxItemSet);
+ const SfxItemSet& rSet2(rCmp.maLocalSfxItemSet);
// the former method 'FastEqualPatternSets' mentioned:
// "Actually test_tdf133629 from UITest_calc_tests9 somehow manages to have
// a different range (and I don't understand enough why), so better be safe and compare fully."
// in that case the hash code above would already fail, too
- if (rSet1.TotalCount() != compareSize || rSet2.TotalCount() != compareSize)
- {
- // assert this for now, should not happen. If it does, look for it and evtl.
- // enable SfxItemSet::operator== below
- assert(false);
- return rSet1 == rSet2;
- }
+ assert(rSet1.TotalCount() == compareSize && rSet2.TotalCount() == compareSize);
// check pools, do not accept different pools
if (rSet1.GetPool() != rSet2.GetPool())
@@ -179,6 +378,10 @@ bool ScPatternAttr::operator==( const SfxPoolItem& rCmp ) const
if (rSet1.Count() != rSet2.Count())
return false;
+ // both have no items, done
+ if (0 == rSet1.Count())
+ return true;
+
// compare each item separately
const SfxPoolItem **ppItem1(rSet1.GetItems_Impl());
const SfxPoolItem **ppItem2(rSet2.GetItems_Impl());
@@ -198,6 +401,22 @@ bool ScPatternAttr::operator==( const SfxPoolItem& rCmp ) const
return true;
}
+bool ScPatternAttr::areSame(const ScPatternAttr* pItem1, const ScPatternAttr* pItem2)
+{
+ if (pItem1 == pItem2)
+ // pointer compare, this handles already
+ // nullptr and if indeed handed over twice
+ return true;
+
+ if (nullptr == pItem1 || nullptr == pItem2)
+ // one ptr is nullptr, not both, that would
+ // have triggered above
+ return false;
+
+ // return content compare using operator== at last
+ return *pItem1 == *pItem2;
+}
+
SvxCellOrientation ScPatternAttr::GetCellOrientation( const SfxItemSet& rItemSet, const SfxItemSet* pCondSet )
{
SvxCellOrientation eOrient = SvxCellOrientation::Standard;
@@ -1134,15 +1353,13 @@ static SfxStyleSheetBase* lcl_CopyStyleToPool
return pDestStyle;
}
-ScPatternAttr* ScPatternAttr::PutInPool( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const
+CellAttributeHolder ScPatternAttr::MigrateToDocument( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const
{
const SfxItemSet* pSrcSet = &GetItemSet();
-
- ScPatternAttr aDestPattern( pDestDoc->GetPool() );
- SfxItemSet* pDestSet = &aDestPattern.GetItemSet();
+ ScPatternAttr* pDestPattern(new ScPatternAttr(pDestDoc->getCellAttributeHelper()));
+ SfxItemSet* pDestSet(&pDestPattern->GetItemSet());
// Copy cell pattern style to other document:
-
if ( pDestDoc != pSrcDoc )
{
OSL_ENSURE( pStyle, "Missing Pattern-Style! :-/" );
@@ -1155,7 +1372,7 @@ ScPatternAttr* ScPatternAttr::PutInPool( ScDocument* pDestDoc, ScDocument* pSrcD
pDestDoc->GetStyleSheetPool(),
pDestDoc->GetFormatExchangeList() );
- aDestPattern.SetStyleSheet( static_cast<ScStyleSheet*>(pStyleCpy) );
+ pDestPattern->SetStyleSheet( static_cast<ScStyleSheet*>(pStyleCpy) );
}
for ( sal_uInt16 nAttrId = ATTR_PATTERN_START; nAttrId <= ATTR_PATTERN_END; nAttrId++ )
@@ -1203,8 +1420,7 @@ ScPatternAttr* ScPatternAttr::PutInPool( ScDocument* pDestDoc, ScDocument* pSrcD
}
}
- ScPatternAttr* pPatternAttr = const_cast<ScPatternAttr*>( &pDestDoc->GetPool()->DirectPutItemInPool(aDestPattern) );
- return pPatternAttr;
+ return CellAttributeHolder(pDestPattern, true);
}
bool ScPatternAttr::IsVisible() const
diff --git a/sc/source/core/data/poolcach.cxx b/sc/source/core/data/poolcach.cxx
index d929933d0e96..3ab41d416c49 100644
--- a/sc/source/core/data/poolcach.cxx
+++ b/sc/source/core/data/poolcach.cxx
@@ -18,94 +18,61 @@
*/
-#include <svl/itempool.hxx>
#include <svl/itemset.hxx>
-#include <svl/setitem.hxx>
#include <poolcach.hxx>
#include <tools/debug.hxx>
#include <patattr.hxx>
-ScItemPoolCache::ScItemPoolCache( SfxItemPool *pItemPool,
- const SfxPoolItem *pPutItem ):
- pPool(pItemPool),
- pSetToPut( nullptr ),
- pItemToPut( &pItemPool->DirectPutItemInPool(*pPutItem) )
+ScItemPoolCache::ScItemPoolCache(CellAttributeHelper& _rHelper, const SfxPoolItem& rPutItem)
+: rHelper(_rHelper)
+, pSetToPut(nullptr)
+, aItemToPut(_rHelper.GetPool(), &rPutItem)
{
- DBG_ASSERT(pItemPool, "No Pool provided");
}
-
-ScItemPoolCache::ScItemPoolCache( SfxItemPool *pItemPool,
- const SfxItemSet *pPutSet ):
- pPool(pItemPool),
- pSetToPut( pPutSet ),
- pItemToPut( nullptr )
+ScItemPoolCache::ScItemPoolCache(CellAttributeHelper& _rHelper, const SfxItemSet& rPutSet)
+: rHelper(_rHelper)
+, pSetToPut(&rPutSet)
+, aItemToPut()
{
- DBG_ASSERT(pItemPool, "No Pool provided");
}
-
ScItemPoolCache::~ScItemPoolCache()
{
- for (const SfxItemModifyImpl & rImpl : m_aCache) {
- pPool->DirectRemoveItemFromPool( *rImpl.pPoolItem );
- pPool->DirectRemoveItemFromPool( *rImpl.pOrigItem );
- }
-
- if ( pItemToPut )
- pPool->DirectRemoveItemFromPool( *pItemToPut );
}
-
-const ScPatternAttr& ScItemPoolCache::ApplyTo( const ScPatternAttr &rOrigItem )
+const CellAttributeHolder& ScItemPoolCache::ApplyTo(const CellAttributeHolder& rOrigItem)
{
- DBG_ASSERT( pPool == rOrigItem.GetItemSet().GetPool(), "invalid Pool" );
- DBG_ASSERT( IsDefaultItem( &rOrigItem ) || IsPooledItem( &rOrigItem ),
- "original not in pool" );
+ const ScPatternAttr* pAttr(rOrigItem.getScPatternAttr());
+ if (nullptr == pAttr)
+ return rOrigItem;
+
+ DBG_ASSERT(&rHelper.GetPool() == pAttr->GetItemSet().GetPool(), "invalid Pool (!)");
// Find whether this Transformations ever occurred
for (const SfxItemModifyImpl & rMapEntry : m_aCache)
{
- // use Item PtrCompare OK
- if ( areSfxPoolItemPtrsEqual(rMapEntry.pOrigItem, &rOrigItem) )
+ // ptr compare: same used rOrigItem?
+ if (rMapEntry.aOriginal.getScPatternAttr() == pAttr)
{
- // Did anything change at all? use Item PtrCompare OK
- if ( !areSfxPoolItemPtrsEqual(rMapEntry.pPoolItem, &rOrigItem) )
- {
- rMapEntry.pPoolItem->AddRef(2); // One for the cache
- pPool->DirectPutItemInPool( rOrigItem ); //FIXME: AddRef?
- }
- return *rMapEntry.pPoolItem;
+ return rMapEntry.aModified;
}
}
// Insert the new attributes in a new Set
- std::unique_ptr<ScPatternAttr> pNewItem(rOrigItem.Clone());
- if ( pItemToPut )
+ ScPatternAttr* pNewItem(new ScPatternAttr(*pAttr));
+
+ if (nullptr != aItemToPut.getItem())
{
- pNewItem->GetItemSet().Put( *pItemToPut );
- DBG_ASSERT( areSfxPoolItemPtrsEqual(&pNewItem->GetItemSet().Get( pItemToPut->Which() ), pItemToPut),
- "wrong item in temporary set" );
+ pNewItem->GetItemSet().Put(*aItemToPut.getItem());
}
else
- pNewItem->GetItemSet().Put( *pSetToPut );
- const ScPatternAttr* pNewPoolItem = &pPool->DirectPutItemInPool( std::move(pNewItem) );
-
- // Adapt refcount; one each for the cache
- pNewPoolItem->AddRef( !areSfxPoolItemPtrsEqual(pNewPoolItem, &rOrigItem) ? 2 : 1 );
- pPool->DirectPutItemInPool( rOrigItem ); //FIXME: AddRef?
-
- // Add the transformation to the cache
- SfxItemModifyImpl aModify;
- aModify.pOrigItem = &rOrigItem;
- aModify.pPoolItem = const_cast<ScPatternAttr*>(pNewPoolItem);
- m_aCache.push_back( aModify );
-
- DBG_ASSERT( !pItemToPut ||
- areSfxPoolItemPtrsEqual(&pNewPoolItem->GetItemSet().Get( pItemToPut->Which() ), pItemToPut),
- "wrong item in resulting set" );
+ {
+ pNewItem->GetItemSet().Put(*pSetToPut);
+ }
- return *pNewPoolItem;
+ m_aCache.emplace_back(rOrigItem, CellAttributeHolder(pNewItem, true));
+ return m_aCache.back().aModified;
}
diff --git a/sc/source/core/data/stlpool.cxx b/sc/source/core/data/stlpool.cxx
index 6fa08b8112de..53413b9f5234 100644
--- a/sc/source/core/data/stlpool.cxx
+++ b/sc/source/core/data/stlpool.cxx
@@ -120,7 +120,8 @@ void ScStyleSheetPool::Remove( SfxStyleSheetBase* pStyle )
OSL_ENSURE( SfxStyleSearchBits::UserDefined & pStyle->GetMask(),
"SfxStyleSearchBits::UserDefined not set!" );
- static_cast<ScDocumentPool&>(rPool).StyleDeleted(static_cast<ScStyleSheet*>(pStyle));
+ assert(nullptr != pDoc);
+ pDoc->getCellAttributeHelper().CellStyleDeleted(static_cast<ScStyleSheet&>(*pStyle));
SfxStyleSheetPool::Remove(pStyle);
}
}
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index ec7f96731ac6..b995aec2e7b4 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -439,7 +439,7 @@ void ScTable::DeleteArea(
if ( IsProtected() && (nDelFlag & InsertDeleteFlags::ATTRIB) )
{
- ScPatternAttr aPattern(rDocument.GetPool());
+ ScPatternAttr aPattern(rDocument.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScProtectionAttr( false ) );
ApplyPatternArea( nCol1, nRow1, nCol2, nRow2, aPattern );
}
@@ -476,11 +476,10 @@ void ScTable::DeleteSelection( InsertDeleteFlags nDelFlag, const ScMarkData& rMa
if ( IsProtected() && (nDelFlag & InsertDeleteFlags::ATTRIB) )
{
- ScDocumentPool* pPool = rDocument.GetPool();
- SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END> aSet( *pPool );
+ SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END> aSet(*rDocument.GetPool());
aSet.Put( ScProtectionAttr( false ) );
- ScItemPoolCache aCache( pPool, &aSet );
- ApplySelectionCache( &aCache, rMark );
+ ScItemPoolCache aCache(rDocument.getCellAttributeHelper(), aSet );
+ ApplySelectionCache( aCache, rMark );
}
// TODO: In the future we may want to check if the table has been
@@ -773,7 +772,7 @@ void ScTable::CopyFromClip(
// Do not set protected cell in a protected sheet
if (IsProtected() && (rCxt.getInsertFlag() & InsertDeleteFlags::ATTRIB))
{
- ScPatternAttr aPattern(rDocument.GetPool());
+ ScPatternAttr aPattern(rDocument.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScProtectionAttr( false ) );
ApplyPatternArea( nCol1, nRow1, nCol2, nRow2, aPattern );
}
@@ -1057,7 +1056,8 @@ void ScTable::TransposeColPatterns(ScTable* pTransClip, SCCOL nCol1, SCCOL nCol,
std::unique_ptr<ScAttrIterator> pAttrIter(aCol[nCol].CreateAttrIterator( nRow1, nRow2 ));
while ( (pPattern = pAttrIter->Next( nAttrRow1, nAttrRow2 )) != nullptr )
{
- if ( !IsDefaultItem( pPattern ) )
+ // ptr compare OK, was so before
+ if (&rDocument.getCellAttributeHelper().getDefaultCellAttribute() != pPattern)
{
const SfxItemSet& rSet = pPattern->GetItemSet();
if ( rSet.GetItemState( ATTR_MERGE, false ) == SfxItemState::DEFAULT &&
@@ -2932,13 +2932,11 @@ void ScTable::ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol,
namespace
{
- std::vector<ScAttrEntry> duplicateScAttrEntries(ScDocument& rDocument, const std::vector<ScAttrEntry>& rOrigData)
+ std::vector<ScAttrEntry> duplicateScAttrEntries(const std::vector<ScAttrEntry>& rOrigData)
{
+ // this can now just be copied, will do the right thing with the
+ // ref-counted ScAttrEntry instances
std::vector<ScAttrEntry> aData(rOrigData);
- for (size_t nIdx = 0; nIdx < aData.size(); ++nIdx)
- {
- aData[nIdx].pPattern = &rDocument.GetPool()->DirectPutItemInPool(*aData[nIdx].pPattern);
- }
return aData;
}
}
@@ -2954,7 +2952,7 @@ void ScTable::SetAttrEntries( SCCOL nStartCol, SCCOL nEndCol, std::vector<ScAttr
// If we would like set all columns to same attrs, then change only attrs for not existing columns
nEndCol = aCol.size() - 1;
for (SCCOL i = nStartCol; i <= nEndCol; i++)
- aCol[i].SetAttrEntries(duplicateScAttrEntries(rDocument, vNewData));
+ aCol[i].SetAttrEntries(duplicateScAttrEntries(vNewData));
aDefaultColData.SetAttrEntries(std::move(vNewData));
}
else
@@ -2967,7 +2965,7 @@ void ScTable::SetAttrEntries( SCCOL nStartCol, SCCOL nEndCol, std::vector<ScAttr
{
CreateColumnIfNotExists( nEndCol );
for (SCCOL i = nStartCol; i < nEndCol; i++) // all but last need a copy
- aCol[i].SetAttrEntries(duplicateScAttrEntries(rDocument, vNewData));
+ aCol[i].SetAttrEntries(duplicateScAttrEntries(vNewData));
aCol[nEndCol].SetAttrEntries( std::move(vNewData));
}
}
@@ -3021,7 +3019,7 @@ void ScTable::RemoveCondFormatData( const ScRangeList& rRangeList, sal_uInt32 nI
void ScTable::SetPatternAreaCondFormat( SCCOL nCol, SCROW nStartRow, SCROW nEndRow,
const ScPatternAttr& rAttr, const ScCondFormatIndexes& rCondFormatIndexes )
{
- CreateColumnIfNotExists(nCol).SetPatternArea( nStartRow, nEndRow, rAttr);
+ CreateColumnIfNotExists(nCol).SetPatternArea( nStartRow, nEndRow, CellAttributeHolder(&rAttr));
for (const auto& rIndex : rCondFormatIndexes)
{
@@ -3217,11 +3215,10 @@ void ScTable::SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr )
CreateColumnIfNotExists(rPos.Col()).SetPattern(rPos.Row(), rAttr);
}
-const ScPatternAttr* ScTable::SetPattern( SCCOL nCol, SCROW nRow, std::unique_ptr<ScPatternAttr> pAttr )
+void ScTable::SetPattern( SCCOL nCol, SCROW nRow, const CellAttributeHolder& rHolder )
{
if (ValidColRow(nCol,nRow))
- return CreateColumnIfNotExists(nCol).SetPattern(nRow, std::move(pAttr));
- return nullptr;
+ CreateColumnIfNotExists(nCol).SetPattern(nRow, rHolder);
}
void ScTable::SetPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr )
@@ -3236,7 +3233,7 @@ void ScTable::ApplyAttr( SCCOL nCol, SCROW nRow, const SfxPoolItem& rAttr )
CreateColumnIfNotExists(nCol).ApplyAttr( nRow, rAttr );
}
-void ScTable::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rMark,
+void ScTable::ApplySelectionCache( ScItemPoolCache& rCache, const ScMarkData& rMark,
ScEditDataArray* pDataArray, bool* const pIsChanged )
{
if(!rMark.GetTableSelect(nTab))
@@ -3248,7 +3245,7 @@ void ScTable::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rM
lastChangeCol = rMark.GetStartOfEqualColumns( GetDoc().MaxCol(), aCol.size()) - 1;
if( lastChangeCol >= 0 )
CreateColumnIfNotExists(lastChangeCol); // Allocate needed different columns before changing the default.
- aDefaultColData.ApplySelectionCache( pCache, rMark, pDataArray, pIsChanged, GetDoc().MaxCol());
+ aDefaultColData.ApplySelectionCache( rCache, rMark, pDataArray, pIsChanged, GetDoc().MaxCol());
}
else // need to allocate all columns affected
{
@@ -3257,7 +3254,7 @@ void ScTable::ApplySelectionCache( ScItemPoolCache* pCache, const ScMarkData& rM
}
for (SCCOL i=0; i <= lastChangeCol; i++)
- aCol[i].ApplySelectionCache( pCache, rMark, pDataArray, pIsChanged );
+ aCol[i].ApplySelectionCache( rCache, rMark, pDataArray, pIsChanged );
}
void ScTable::ChangeSelectionIndent( bool bIncrement, const ScMarkData& rMark )
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 359cc5dcc4f5..05be5597d60a 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -238,9 +238,9 @@ public:
const sc::CellTextAttr* mpAttr;
const ScPostIt* mpNote;
std::vector<SdrObject*> maDrawObjects;
- const ScPatternAttr* mpPattern;
+ CellAttributeHolder maPattern;
- Cell() : mpAttr(nullptr), mpNote(nullptr), mpPattern(nullptr) {}
+ Cell() : mpAttr(nullptr), mpNote(nullptr), maPattern() {}
};
struct Row
@@ -441,7 +441,7 @@ void initDataRows(
rCell.maDrawObjects = aRowDrawObjects[nRow];
if (!bUniformPattern && bPattern)
- rCell.mpPattern = rCol.GetPattern(nRow);
+ rCell.maPattern.setScPatternAttr(rCol.GetPattern(nRow));
}
}
@@ -543,7 +543,7 @@ namespace {
struct SortedColumn
{
- typedef mdds::flat_segment_tree<SCROW, const ScPatternAttr*> PatRangeType;
+ typedef mdds::flat_segment_tree<SCROW, CellAttributeHolder> PatRangeType;
sc::CellStoreType maCells;
sc::CellTextAttrStoreType maCellTextAttrs;
@@ -565,9 +565,9 @@ struct SortedColumn
maPatterns(0, rSheetLimits.GetMaxRowCount(), nullptr),
miPatternPos(maPatterns.begin()) {}
- void setPattern( SCROW nRow, const ScPatternAttr* pPat )
+ void setPattern( SCROW nRow, const CellAttributeHolder& rPat )
{
- miPatternPos = maPatterns.insert(miPatternPos, nRow, nRow+1, pPat).first;
+ miPatternPos = maPatterns.insert(miPatternPos, nRow, nRow+1, rPat).first;
}
};
@@ -611,10 +611,10 @@ struct PatternSpan
{
SCROW mnRow1;
SCROW mnRow2;
- const ScPatternAttr* mpPattern;
+ CellAttributeHolder maPattern;
- PatternSpan( SCROW nRow1, SCROW nRow2, const ScPatternAttr* pPat ) :
- mnRow1(nRow1), mnRow2(nRow2), mpPattern(pPat) {}
+ PatternSpan( SCROW nRow1, SCROW nRow2, const CellAttributeHolder& rPat ) :
+ mnRow1(nRow1), mnRow2(nRow2), maPattern(rPat) {}
};
}
@@ -809,8 +809,8 @@ void fillSortedColumnArray(
// Add cell anchored images
aSortedCols.at(j)->maCellDrawObjects.push_back(rCell.maDrawObjects);
- if (rCell.mpPattern)
- aSortedCols.at(j)->setPattern(nRow, rCell.mpPattern);
+ if (rCell.maPattern)
+ aSortedCols.at(j)->setPattern(nRow, rCell.maPattern);
}
if (!bOnlyDataAreaExtras && pArray->IsKeepQuery())
@@ -1186,19 +1186,12 @@ void ScTable::SortReorderByRow( ScSortInfoArray* pArray, SCCOL nCol1, SCCOL nCol
{
// Get all row spans where the pattern is not NULL.
std::vector<PatternSpan> aSpans =
- sc::toSpanArrayWithValue<SCROW,const ScPatternAttr*,PatternSpan>(
+ sc::toSpanArrayWithValue<SCROW, CellAttributeHolder, PatternSpan>(
aSortedCols[i]->maPatterns);
for (const auto& rSpan : aSpans)
{
- assert(rSpan.mpPattern); // should never be NULL.
- rDocument.GetPool()->DirectPutItemInPool(*rSpan.mpPattern);
- }
-
- for (const auto& rSpan : aSpans)
- {
- aCol[nThisCol].SetPatternArea(rSpan.mnRow1, rSpan.mnRow2, *rSpan.mpPattern);
- rDocument.GetPool()->DirectRemoveItemFromPool(*rSpan.mpPattern);
+ aCol[nThisCol].SetPatternArea(rSpan.mnRow1, rSpan.mnRow2, rSpan.maPattern);
}
}
@@ -1387,19 +1380,12 @@ void ScTable::SortReorderByRowRefUpdate(
{
// Get all row spans where the pattern is not NULL.
std::vector<PatternSpan> aSpans =
- sc::toSpanArrayWithValue<SCROW,const ScPatternAttr*,PatternSpan>(
+ sc::toSpanArrayWithValue<SCROW, CellAttributeHolder, PatternSpan>(
aSortedCols[i]->maPatterns);
for (const auto& rSpan : aSpans)
{
- assert(rSpan.mpPattern); // should never be NULL.
- rDocument.GetPool()->DirectPutItemInPool(*rSpan.mpPattern);
- }
-
- for (const auto& rSpan : aSpans)
- {
- aCol[nThisCol].SetPatternArea(rSpan.mnRow1, rSpan.mnRow2, *rSpan.mpPattern);
- rDocument.GetPool()->DirectRemoveItemFromPool(*rSpan.mpPattern);
+ aCol[nThisCol].SetPatternArea(rSpan.mnRow1, rSpan.mnRow2, rSpan.maPattern);
}
}
@@ -2045,11 +2031,11 @@ static void lcl_RemoveNumberFormat( ScTable* pTab, SCCOL nCol, SCROW nRow )
if ( pPattern->GetItemSet().GetItemState( ATTR_VALUE_FORMAT, false )
== SfxItemState::SET )
{
- auto pNewPattern = std::make_unique<ScPatternAttr>( *pPattern );
+ ScPatternAttr* pNewPattern(new ScPatternAttr( *pPattern ));
SfxItemSet& rSet = pNewPattern->GetItemSet();
rSet.ClearItem( ATTR_VALUE_FORMAT );
rSet.ClearItem( ATTR_LANGUAGE_FORMAT );
- pTab->SetPattern( nCol, nRow, std::move(pNewPattern) );
+ pTab->SetPattern( nCol, nRow, CellAttributeHolder(pNewPattern, true) );
}
}
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index 2d53f46337ae..e7cc13734511 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -1006,7 +1006,7 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
if ( bVertical && nISrcStart == nISrcEnd && !bHasFiltered )
{
// set all attributes at once (en bloc)
- if (pNewPattern || !SfxPoolItem::areSame(pSrcPattern, rDocument.GetDefPattern()))
+ if (pNewPattern || !pSrcPattern->isDefault())
{
// Default is already present (DeleteArea)
SCROW nY1 = static_cast<SCROW>(std::min( nIStart, nIEnd ));
@@ -1037,7 +1037,7 @@ void ScTable::FillAuto( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
DeleteArea(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow),
static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), InsertDeleteFlags::AUTOFILL);
- if ( !SfxPoolItem::areSame(pSrcPattern, aCol[nCol].GetPattern( static_cast<SCROW>(nRow) ) ) )
+ if ( !ScPatternAttr::areSame(pSrcPattern, aCol[nCol].GetPattern( static_cast<SCROW>(nRow) ) ) )
{
// Transfer template too
//TODO: Merge ApplyPattern to AttrArray ??
@@ -2697,7 +2697,7 @@ void ScTable::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW
std::unique_ptr<ScPatternAttr> pPatternAttrs[16];
for (sal_uInt8 i = 0; i < 16; ++i)
{
- pPatternAttrs[i].reset(new ScPatternAttr(rDocument.GetPool()));
+ pPatternAttrs[i].reset(new ScPatternAttr(rDocument.getCellAttributeHelper()));
pData->FillToItemSet(i, pPatternAttrs[i]->GetItemSet(), rDocument);
}
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index a46b09986b3d..9d97fe48c109 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -791,7 +791,7 @@ sal_uLong lclGetCellFormat( const ScDocument& rDoc, const ScAddress& rPos )
{
const ScPatternAttr* pPattern = rDoc.GetPattern( rPos.Col(), rPos.Row(), rPos.Tab() );
if( !pPattern )
- pPattern = rDoc.GetDefPattern();
+ pPattern = &rDoc.getCellAttributeHelper().getDefaultCellAttribute();
return pPattern->GetNumberFormat( rDoc.GetFormatTable() );
}
diff --git a/sc/source/core/tool/ddelink.cxx b/sc/source/core/tool/ddelink.cxx
index 5000e0bf8769..4c854321509e 100644
--- a/sc/source/core/tool/ddelink.cxx
+++ b/sc/source/core/tool/ddelink.cxx
@@ -168,9 +168,7 @@ sfx2::SvBaseLink::UpdateResult ScDdeLink::DataChanged(
sal_uLong nStdFormat = 0;
if ( nMode == SC_DDE_DEFAULT )
{
- ScPatternAttr* pDefPattern = rDoc.GetDefPattern(); // contains standard template
- if ( pDefPattern )
- nStdFormat = pDefPattern->GetNumberFormat( pFormatter );
+ nStdFormat = rDoc.getCellAttributeHelper().getDefaultCellAttribute().GetNumberFormat( pFormatter );
}
else if ( nMode == SC_DDE_ENGLISH )
nStdFormat = pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US);
diff --git a/sc/source/core/tool/editutil.cxx b/sc/source/core/tool/editutil.cxx
index 57e93d513866..33fa00f8cc9a 100644
--- a/sc/source/core/tool/editutil.cxx
+++ b/sc/source/core/tool/editutil.cxx
@@ -741,7 +741,8 @@ ScTabEditEngine::ScTabEditEngine( ScDocument* pDoc )
: ScFieldEditEngine( pDoc, pDoc->GetEnginePool() )
{
SetEditTextObjectPool( pDoc->GetEditPool() );
- Init(pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN));
+ const ScPatternAttr& rScPatternAttr(pDoc->getCellAttributeHelper().getDefaultCellAttribute());
+ Init(rScPatternAttr);
}
ScTabEditEngine::ScTabEditEngine( const ScPatternAttr& rPattern,
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index e372228721e3..eeb4cc6b1b9e 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -2416,7 +2416,7 @@ void ScInterpreter::ScCell()
pPrinter->SetMapMode(MapMode(MapUnit::MapTwip));
// font color doesn't matter here
- mrDoc.GetDefPattern()->fillFontOnly(aDefFont, pPrinter);
+ mrDoc.getCellAttributeHelper().getDefaultCellAttribute().fillFontOnly(aDefFont, pPrinter);
pPrinter->SetFont(aDefFont);
tools::Long nZeroWidth = pPrinter->GetTextWidth( OUString( '0' ) );
assert(nZeroWidth != 0);
diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx
index 224cb998fb1a..4007d6f66511 100644
--- a/sc/source/filter/dif/difimp.cxx
+++ b/sc/source/filter/dif/difimp.cxx
@@ -629,7 +629,7 @@ void DifColumn::NewEntry( const SCROW nPos, const sal_uInt32 nNumFormat )
void DifColumn::Apply( ScDocument& rDoc, const SCCOL nCol, const SCTAB nTab )
{
- ScPatternAttr aAttr( rDoc.GetPool() );
+ ScPatternAttr aAttr(rDoc.getCellAttributeHelper());
SfxItemSet &rItemSet = aAttr.GetItemSet();
for (const auto& rEntry : maEntries)
diff --git a/sc/source/filter/excel/xehelper.cxx b/sc/source/filter/excel/xehelper.cxx
index aa21902dfb73..649219f89bdb 100644
--- a/sc/source/filter/excel/xehelper.cxx
+++ b/sc/source/filter/excel/xehelper.cxx
@@ -373,7 +373,9 @@ XclExpStringRef lclCreateFormattedString(
// font buffer and cell item set
XclExpFontBuffer& rFontBuffer = rRoot.GetFontBuffer();
- const SfxItemSet& rItemSet = pCellAttr ? pCellAttr->GetItemSet() : rRoot.GetDoc().GetDefPattern()->GetItemSet();
+ const SfxItemSet& rItemSet = pCellAttr ?
+ pCellAttr->GetItemSet() :
+ rRoot.GetDoc().getCellAttributeHelper().getDefaultCellAttribute().GetItemSet();
// process all script portions
sal_Int32 nPortionPos = 0;
@@ -587,7 +589,9 @@ XclExpStringRef XclExpStringHelper::CreateCellString(
bool bOldUpdateMode = rEE.SetUpdateLayout( true );
// default items
- const SfxItemSet& rItemSet = pCellAttr ? pCellAttr->GetItemSet() : rRoot.GetDoc().GetDefPattern()->GetItemSet();
+ const SfxItemSet& rItemSet = pCellAttr ?
+ pCellAttr->GetItemSet() :
+ rRoot.GetDoc().getCellAttributeHelper().getDefaultCellAttribute().GetItemSet();
auto pEEItemSet = std::make_unique<SfxItemSet>( rEE.GetEmptyItemSet() );
ScPatternAttr::FillToEditItemSet( *pEEItemSet, rItemSet );
rEE.SetDefaults( std::move(pEEItemSet) ); // edit engine takes ownership
diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index 678327bd1a58..6ee407c369f9 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -2810,12 +2810,11 @@ XclExpXFBuffer::FindKey XclExpXFBuffer::ToFindKey(XclExpXF const & rRec)
sal_uInt32 XclExpXFBuffer::InsertCellXF( const ScPatternAttr* pPattern, sal_Int16 nScript,
sal_uInt32 nForceScNumFmt, sal_uInt16 nForceXclFont, bool bForceLineBreak )
{
- const ScPatternAttr* pDefPattern = GetDoc().GetDefPattern();
if( !pPattern )
- pPattern = pDefPattern;
+ pPattern = &GetDoc().getCellAttributeHelper().getDefaultCellAttribute();
// special handling for default cell formatting
- if( SfxPoolItem::areSame(pPattern, pDefPattern) && !bForceLineBreak &&
+ if ( pPattern->isDefault() && !bForceLineBreak &&
(nForceScNumFmt == NUMBERFORMAT_ENTRY_NOT_FOUND) &&
(nForceXclFont == EXC_FONT_NOTFOUND) )
{
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index 32a6ec04a4d8..014ada4d9490 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -942,7 +942,7 @@ void XclImpValidationManager::Apply()
DVItem& rItem = *rxDVItem;
// set the handle ID
sal_uInt32 nHandle = rDoc.AddValidationEntry( rItem.maValidData );
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nHandle ) );
// apply all ranges
diff --git a/sc/source/filter/excel/xistyle.cxx b/sc/source/filter/excel/xistyle.cxx
index 21b86a4ed4fa..15ce0ce667c4 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -1249,7 +1249,7 @@ const ScPatternAttr& XclImpXF::CreatePattern( bool bSkipPoolDefs )
return *mpPattern;
// create new pattern attribute set
- mpPattern.reset( new ScPatternAttr( GetDoc().GetPool() ) );
+ mpPattern.reset( new ScPatternAttr(GetDoc().getCellAttributeHelper()) );
SfxItemSet& rItemSet = mpPattern->GetItemSet();
XclImpXF* pParentXF = IsCellXF() ? GetXFBuffer().GetXF( mnParent ) : nullptr;
@@ -1376,7 +1376,7 @@ void XclImpXF::ApplyPatternToAttrVector(
if (nForceScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND)
{
- ScPatternAttr aNumPat(rDoc.GetPool());
+ ScPatternAttr aNumPat(rDoc.getCellAttributeHelper());
GetNumFmtBuffer().FillScFmtToItemSet(aNumPat.GetItemSet(), nForceScNumFmt);
rPat.GetItemSet().Put(aNumPat.GetItemSet());
}
@@ -1399,13 +1399,13 @@ void XclImpXF::ApplyPatternToAttrVector(
// Fill this gap with the default pattern.
ScAttrEntry aEntry;
aEntry.nEndRow = nRow1 - 1;
- aEntry.pPattern = rDoc.GetDefPattern();
+ aEntry.setScPatternAttr(&rDoc.getCellAttributeHelper().getDefaultCellAttribute());
rAttrs.push_back(aEntry);
}
ScAttrEntry aEntry;
aEntry.nEndRow = nRow2;
- aEntry.pPattern = &rDoc.GetPool()->DirectPutItemInPool(rPat);
+ aEntry.setScPatternAttr(&rPat, false);
rAttrs.push_back(aEntry);
}
@@ -2022,7 +2022,7 @@ void XclImpXFRangeBuffer::Finalize()
{
ScAttrEntry aEntry;
aEntry.nEndRow = rDoc.MaxRow();
- aEntry.pPattern = rDoc.GetDefPattern();
+ aEntry.setScPatternAttr(&rDoc.getCellAttributeHelper().getDefaultCellAttribute());
aAttrs.push_back(aEntry);
}
diff --git a/sc/source/filter/inc/xistyle.hxx b/sc/source/filter/inc/xistyle.hxx
index b4e5250dc37f..b7ed707f9822 100644
--- a/sc/source/filter/inc/xistyle.hxx
+++ b/sc/source/filter/inc/xistyle.hxx
@@ -29,7 +29,7 @@
class ScPatternAttr;
struct XclRange;
-struct ScAttrEntry;
+class ScAttrEntry;
enum class SvxBoxItemLine;
/* ============================================================================
diff --git a/sc/source/filter/lotus/lotattr.cxx b/sc/source/filter/lotus/lotattr.cxx
index 458e3c677b62..995e244f4c7b 100644
--- a/sc/source/filter/lotus/lotattr.cxx
+++ b/sc/source/filter/lotus/lotattr.cxx
@@ -88,7 +88,7 @@ const ScPatternAttr& LotAttrCache::GetPattAttr( const LotAttrWK3& rAttr )
return *((*iter)->pPattAttr);
// generate new Pattern Attribute
- ScPatternAttr* pNewPatt = new ScPatternAttr(pDocPool);
+ ScPatternAttr* pNewPatt = new ScPatternAttr(mrContext.rDoc.getCellAttributeHelper());
SfxItemSet& rItemSet = pNewPatt->GetItemSet();
ENTRY *pCurrent = new ENTRY( std::unique_ptr<ScPatternAttr>(pNewPatt) );
@@ -189,7 +189,7 @@ void LotAttrCol::SetAttr( const ScDocument* pDoc, const SCROW nRow, const ScPatt
if(iterLast != aEntries.rend())
{
- if( ( (*iterLast)->nLastRow == nRow - 1 ) && SfxPoolItem::areSame( &rAttr, (*iterLast)->pPattAttr ) )
+ if( ( (*iterLast)->nLastRow == nRow - 1 ) && ScPatternAttr::areSame( &rAttr, (*iterLast)->pPattAttr ) )
(*iterLast)->nLastRow = nRow;
else
{
diff --git a/sc/source/filter/lotus/op.cxx b/sc/source/filter/lotus/op.cxx
index 58007a518325..c1f11736e8f3 100644
--- a/sc/source/filter/lotus/op.cxx
+++ b/sc/source/filter/lotus/op.cxx
@@ -535,7 +535,7 @@ void OP_CreatePattern123(LotusContext& rContext, SvStream& r, sal_uInt16 n)
{
sal_uInt16 nCode;
- ScPatternAttr aPattern(rContext.rDoc.GetPool());
+ ScPatternAttr aPattern(rContext.rDoc.getCellAttributeHelper());
SfxItemSet& rItemSet = aPattern.GetItemSet();
r.ReadUInt16( nCode );
diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx
index 98d50c2a05c3..f42694f5623a 100644
--- a/sc/source/filter/oox/sheetdatabuffer.cxx
+++ b/sc/source/filter/oox/sheetdatabuffer.cxx
@@ -508,7 +508,7 @@ void SheetDataBuffer::finalizeImport()
nScRow++;
}
if ( !pDefPattern || nScRow == rDoc.MaxRow() )
- pDefPattern = rDoc.GetDefPattern();
+ pDefPattern = &rDoc.getCellAttributeHelper().getDefaultCellAttribute();
Xf::AttrList aAttrs(pDefPattern);
for ( const auto& rRowStyle : rRowStyles )
@@ -523,11 +523,10 @@ void SheetDataBuffer::finalizeImport()
{
ScAttrEntry aEntry;
aEntry.nEndRow = rDoc.MaxRow();
- aEntry.pPattern = pDefPattern;
- rDoc.GetPool()->DirectPutItemInPool(*aEntry.pPattern);
+ aEntry.setScPatternAttr(pDefPattern, false);
aAttrs.maAttrs.push_back(aEntry);
- if (!sc::NumFmtUtil::isLatinScript(*aEntry.pPattern, rDoc))
+ if (!sc::NumFmtUtil::isLatinScript(*aEntry.getScPatternAttr(), rDoc))
aAttrs.mbLatinNumFmtOnly = false;
}
diff --git a/sc/source/filter/oox/stylesbuffer.cxx b/sc/source/filter/oox/stylesbuffer.cxx
index f31cde38bcff..22ebb2025833 100644
--- a/sc/source/filter/oox/stylesbuffer.cxx
+++ b/sc/source/filter/oox/stylesbuffer.cxx
@@ -2140,7 +2140,7 @@ void Xf::applyPatternToAttrList( AttrList& rAttrs, SCROW nRow1, SCROW nRow2, sal
}
if ( !pCachedPattern && nNumFmtId >= 0 )
{
- ScPatternAttr aNumPat(rDoc.GetPool());
+ ScPatternAttr aNumPat(rDoc.getCellAttributeHelper());
mnScNumFmt = getStyles().writeNumFmtToItemSet( aNumPat.GetItemSet(), nNumFmtId, false );
rPat.GetItemSet().Put(aNumPat.GetItemSet());
}
@@ -2166,24 +2166,24 @@ void Xf::applyPatternToAttrList( AttrList& rAttrs, SCROW nRow1, SCROW nRow2, sal
// Fill this gap with the default pattern.
ScAttrEntry aEntry;
aEntry.nEndRow = nRow1 - 1;
- aEntry.pPattern = &rDoc.GetPool()->DirectPutItemInPool(*rAttrs.mpDefPattern);
+ aEntry.setScPatternAttr(rAttrs.mpDefPattern, false);
rAttrs.maAttrs.push_back(aEntry);
// Check if the default pattern is 'General'.
- if (!rDocImport.isLatinScript(*aEntry.pPattern))
+ if (!rDocImport.isLatinScript(*aEntry.getScPatternAttr()))
rAttrs.mbLatinNumFmtOnly = false;
}
ScAttrEntry aEntry;
aEntry.nEndRow = nRow2;
- aEntry.pPattern = &rDoc.GetPool()->DirectPutItemInPool(rPat);
+ aEntry.setScPatternAttr(&rPat, false);
// Put the allocated pattern to cache
if (!pCachedPattern)
- rCache.add(nXfId, nNumFmtId, const_cast<ScPatternAttr*>(aEntry.pPattern));
+ rCache.add(nXfId, nNumFmtId, const_cast<ScPatternAttr*>(aEntry.getScPatternAttr()));
rAttrs.maAttrs.push_back(aEntry);
- if (!rDocImport.isLatinScript(*aEntry.pPattern))
+ if (!rDocImport.isLatinScript(*aEntry.getScPatternAttr()))
rAttrs.mbLatinNumFmtOnly = false;
}
@@ -2218,7 +2218,7 @@ Xf::createPattern( bool bSkipPoolDefs )
{
if( mpPattern )
return *mpPattern;
- mpPattern.reset( new ::ScPatternAttr( getScDocument().GetPool() ) );
+ mpPattern.reset( new ::ScPatternAttr(getScDocument().getCellAttributeHelper()) );
SfxItemSet& rItemSet = mpPattern->GetItemSet();
/* Enables the used flags, if the formatting attributes differ from the
style XF. In cell XFs Excel uses the cell attributes, if they differ
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index f9e78e27f4b1..af425079708d 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -1255,7 +1255,7 @@ void ScOrcusSheet::set_format(os::row_t row, os::col_t col, size_t xf_index)
{
SAL_INFO("sc.orcus.style", "set format: " << xf_index);
- ScPatternAttr aPattern(mrDoc.getDoc().GetPool());
+ ScPatternAttr aPattern(mrDoc.getDoc().getCellAttributeHelper());
mrStyles.applyXfToItemSet(aPattern.GetItemSet(), xf_index);
mrDoc.getDoc().ApplyPattern(col, row, mnTab, aPattern);
}
@@ -1264,7 +1264,7 @@ void ScOrcusSheet::set_format(os::row_t row_start, os::col_t col_start,
os::row_t row_end, os::col_t col_end, size_t xf_index)
{
SAL_INFO("sc.orcus.style", "set format range: " << xf_index);
- ScPatternAttr aPattern(mrDoc.getDoc().GetPool());
+ ScPatternAttr aPattern(mrDoc.getDoc().getCellAttributeHelper());
mrStyles.applyXfToItemSet(aPattern.GetItemSet(), xf_index);
mrDoc.getDoc().ApplyPatternAreaTab(col_start, row_start, col_end, row_end, mnTab, aPattern);
}
@@ -1272,7 +1272,7 @@ void ScOrcusSheet::set_format(os::row_t row_start, os::col_t col_start,
void ScOrcusSheet::set_column_format(
os::col_t col, os::col_t col_span, std::size_t xf_index)
{
- ScPatternAttr aPattern(mrDoc.getDoc().GetPool());
+ ScPatternAttr aPattern(mrDoc.getDoc().getCellAttributeHelper());
mrStyles.applyXfToItemSet(aPattern.GetItemSet(), xf_index);
mrDoc.getDoc().ApplyPatternAreaTab(
@@ -1281,7 +1281,7 @@ void ScOrcusSheet::set_column_format(
void ScOrcusSheet::set_row_format(os::row_t row, std::size_t xf_index)
{
- ScPatternAttr aPattern(mrDoc.getDoc().GetPool());
+ ScPatternAttr aPattern(mrDoc.getDoc().getCellAttributeHelper());
mrStyles.applyXfToItemSet(aPattern.GetItemSet(), xf_index);
mrDoc.getDoc().ApplyPatternAreaTab(
diff --git a/sc/source/filter/qpro/qprostyle.cxx b/sc/source/filter/qpro/qprostyle.cxx
index a23187c477b2..5889e5f1c8d1 100644
--- a/sc/source/filter/qpro/qprostyle.cxx
+++ b/sc/source/filter/qpro/qprostyle.cxx
@@ -40,7 +40,7 @@ void ScQProStyle::SetFormat( ScDocument *pDoc, sal_uInt8 nCol, sal_uInt16 nRow,
if (nStyle >= maxsize)
return;
- ScPatternAttr aPattern(pDoc->GetPool());
+ ScPatternAttr aPattern(pDoc->getCellAttributeHelper());
SfxItemSet& rItemSet = aPattern.GetItemSet();
sal_uInt8 nTmp = maAlign[ nStyle ];
diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx
index 70562308120f..446f6850f4da 100644
--- a/sc/source/filter/rtf/eeimpars.cxx
+++ b/sc/source/filter/rtf/eeimpars.cxx
@@ -143,7 +143,6 @@ void ScEEImport::WriteToDocument( bool bSizeColsRows, double nOutputFactor, SvNu
// Automatic language option selected. Check for the global 'use US English' option.
bNumbersEnglishUS = officecfg::Office::Common::Filter::HTML::Import::NumbersEnglishUS::get();
}
- ScDocumentPool* pDocPool = mpDoc->GetPool();
ScRangeName* pRangeNames = mpDoc->GetRangeName();
for ( size_t i = 0, n = mpParser->ListSize(); i < n; ++i )
{
@@ -218,7 +217,7 @@ void ScEEImport::WriteToDocument( bool bSizeColsRows, double nOutputFactor, SvNu
}
// Set attributes
- auto pAttr = std::make_unique<ScPatternAttr>( pDocPool );
+ ScPatternAttr* pAttr(new ScPatternAttr(mpDoc->getCellAttributeHelper()));
pAttr->GetFromEditItemSet( &aSet );
SfxItemSet* pAttrItemSet = &pAttr->GetItemSet();
if (!aNumStr.isEmpty())
@@ -325,7 +324,9 @@ void ScEEImport::WriteToDocument( bool bSizeColsRows, double nOutputFactor, SvNu
const ScStyleSheet* pStyleSheet =
mpDoc->GetPattern( nCol, nRow, nTab )->GetStyleSheet();
pAttr->SetStyleSheet( const_cast<ScStyleSheet*>(pStyleSheet) );
- auto rAttrItemSet2 = mpDoc->SetPattern( nCol, nRow, nTab, std::move(pAttr) )->GetItemSet();
+ CellAttributeHolder aHolder(pAttr, true);
+ mpDoc->SetPattern( nCol, nRow, nTab, aHolder);
+ const SfxItemSet& rAttrItemSet2(aHolder.getScPatternAttr()->GetItemSet());
// Add data
if (bSimple)
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index 6c739dc42304..c7d21dfc3a17 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -795,7 +795,7 @@ void ScXMLTableRowCellContext::SetContentValidation( const ScRange& rScRange )
sal_uInt32 nIndex = pDoc->AddValidationEntry( aScValidationData );
- ScPatternAttr aPattern( pDoc->GetPool() );
+ ScPatternAttr aPattern(pDoc->getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) );
if( rScRange.aStart == rScRange.aEnd ) //for a single cell
{
diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx
index 60fa7ba71741..ea1445450a19 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -605,8 +605,8 @@ void ScXMLImport::ExamineDefaultStyle()
// #i62435# after inserting the styles, check if the default style has a latin-script-only
// number format (then, value cells can be pre-initialized with western script type)
- const ScPatternAttr* pDefPattern = pDoc->GetDefPattern();
- if (pDefPattern && sc::NumFmtUtil::isLatinScript(*pDefPattern, *pDoc))
+ const ScPatternAttr& rDefPattern(pDoc->getCellAttributeHelper().getDefaultCellAttribute());
+ if (sc::NumFmtUtil::isLatinScript(rDefPattern, *pDoc))
mpDocImport->setDefaultNumericScript(SvtScriptType::LATIN);
}
}
diff --git a/sc/source/ui/Accessibility/AccessibleText.cxx b/sc/source/ui/Accessibility/AccessibleText.cxx
index 3f7ff57f8f4a..52d5257af8cc 100644
--- a/sc/source/ui/Accessibility/AccessibleText.cxx
+++ b/sc/source/ui/Accessibility/AccessibleText.cxx
@@ -1131,15 +1131,29 @@ SvxTextForwarder* ScAccessibleHeaderTextData::GetTextForwarder()
// default font must be set, independently of document
// -> use global pool from module
+ std::unique_ptr<CellAttributeHelper> pTmp;
+ const ScPatternAttr* pCellAttributeDefault(nullptr);
+
+ if (nullptr != mpDocSh)
+ {
+ // we can use default CellAttribute from ScDocument
+ pCellAttributeDefault = &mpDocSh->GetDocument().getCellAttributeHelper().getDefaultCellAttribute();
+ }
+ else
+ {
+ // no access to ScDocument, use temporary CellAttributeHelper.
+ // also see ScHeaderFooterTextData::GetTextForwarder for more comments
+ pTmp.reset(new CellAttributeHelper(SC_MOD()->GetPool()));
+ pCellAttributeDefault = &pTmp->getDefaultCellAttribute();
+ }
SfxItemSet aDefaults( pHdrEngine->GetEmptyItemSet() );
- const ScPatternAttr& rPattern = SC_MOD()->GetPool().GetDefaultItem(ATTR_PATTERN);
- rPattern.FillEditItemSet( &aDefaults );
+ pCellAttributeDefault->FillEditItemSet( &aDefaults );
// FillEditItemSet adjusts font height to 1/100th mm,
// but for header/footer twips is needed, as in the PatternAttr:
- aDefaults.Put( rPattern.GetItem(ATTR_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT) );
- aDefaults.Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CJK) );
- aDefaults.Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CTL) );
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT) );
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_CJK_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CJK) );
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_CTL_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CTL) );
aDefaults.Put( SvxAdjustItem( meAdjust, EE_PARA_JUST ) );
pHdrEngine->SetDefaults( aDefaults );
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index 809ba8520e33..4c627e4bac6a 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -2541,7 +2541,7 @@ bool ScInputHandler::StartTable( sal_Unicode cTyped, bool bFromCommand, bool bIn
const ScPatternAttr* pPattern = rDoc.GetPattern( aCursorPos.Col(),
aCursorPos.Row(),
aCursorPos.Tab() );
- if (!SfxPoolItem::areSame(pPattern, pLastPattern))
+ if (!ScPatternAttr::areSame(pPattern, pLastPattern))
{
// Percent format?
const SfxItemSet& rAttrSet = pPattern->GetItemSet();
@@ -3292,7 +3292,7 @@ void ScInputHandler::EnterHandler( ScEnterMode nBlockMode, bool bBeforeSavingInL
if ( pCommonAttrs )
{
ScDocument& rDoc = pActiveViewSh->GetViewData().GetDocument();
- pCellAttrs = std::make_unique<ScPatternAttr>(rDoc.GetPool());
+ pCellAttrs = std::make_unique<ScPatternAttr>(rDoc.getCellAttributeHelper());
pCellAttrs->GetFromEditItemSet( &*pCommonAttrs );
}
}
diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx
index d31cfc675b64..3755aa7f7748 100644
--- a/sc/source/ui/app/scmod.cxx
+++ b/sc/source/ui/app/scmod.cxx
@@ -150,7 +150,8 @@ ScModule::ScModule( SfxObjectFactory* pFact ) :
m_pMessagePool = new ScMessagePool;
m_pMessagePool->FreezeIdRanges();
SetPool( m_pMessagePool.get() );
- ScGlobal::InitTextHeight( m_pMessagePool.get() );
+
+ ScGlobal::InitTextHeight( *m_pMessagePool );
StartListening( *SfxGetpApp() ); // for SfxHintId::Deinitializing
diff --git a/sc/source/ui/cctrl/dpcontrol.cxx b/sc/source/ui/cctrl/dpcontrol.cxx
index cbb1aaa456c8..3815aeb8cf69 100644
--- a/sc/source/ui/cctrl/dpcontrol.cxx
+++ b/sc/source/ui/cctrl/dpcontrol.cxx
@@ -138,7 +138,7 @@ void ScDPFieldButton::draw()
{
// use ScPatternAttr::GetFont only for font size
vcl::Font aAttrFont;
- mpDoc->GetPool()->GetDefaultItem(ATTR_PATTERN).fillFontOnly(aAttrFont, mpOutDev, &maZoomY);
+ mpDoc->getCellAttributeHelper().getDefaultCellAttribute().fillFontOnly(aAttrFont, mpOutDev, &maZoomY);
aTextFont.SetFontSize(aAttrFont.GetFontSize());
}
mpOutDev->SetFont(aTextFont);
diff --git a/sc/source/ui/docshell/arealink.cxx b/sc/source/ui/docshell/arealink.cxx
index 26e076bd1cdf..31636bd148af 100644
--- a/sc/source/ui/docshell/arealink.cxx
+++ b/sc/source/ui/docshell/arealink.cxx
@@ -389,7 +389,7 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter,
{
//! ResetAttrib at document !!!
- ScPatternAttr aPattern( rSrcDoc.GetPool() );
+ ScPatternAttr aPattern( rSrcDoc.getCellAttributeHelper() );
aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults
aPattern.GetItemSet().Put( ScMergeFlagAttr() );
aClipDoc.ApplyPatternAreaTab( 0,0, rDoc.MaxCol(),rDoc.MaxRow(), nSrcTab, aPattern );
diff --git a/sc/source/ui/docshell/dbdocimp.cxx b/sc/source/ui/docshell/dbdocimp.cxx
index 5b4dec1731bf..fb9f7909f24a 100644
--- a/sc/source/ui/docshell/dbdocimp.cxx
+++ b/sc/source/ui/docshell/dbdocimp.cxx
@@ -452,7 +452,7 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam,
// don't set cell protection attribute if table is protected
if (rDoc.IsTabProtected(nTab))
{
- ScPatternAttr aPattern(pImportDoc->GetPool());
+ ScPatternAttr aPattern(pImportDoc->getCellAttributeHelper());
aPattern.GetItemSet().Put( ScProtectionAttr( false,false,false,false ) );
pImportDoc->ApplyPatternAreaTab( 0,0,rDoc.MaxCol(),rDoc.MaxRow(), nTab, aPattern );
}
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index 50dc53ec546f..73c3f6dd6738 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -1224,7 +1224,7 @@ void ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine,
return;
const SfxItemSet& rEditAttr = aTester.GetAttribs();
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetFromEditItemSet( &rEditAttr );
aPattern.DeleteUnchanged( rDoc.GetPattern( rPos.Col(), rPos.Row(), rPos.Tab() ) );
aPattern.GetItemSet().ClearItem( ATTR_HOR_JUSTIFY ); // wasn't removed above if no edit object
@@ -2770,7 +2770,7 @@ bool ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark,
// #i51445# old merge flag attributes must be deleted also for single cells,
// not only for whole columns/rows
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeFlagAttr() );
rDoc.ApplyPatternArea( nExtendStartCol, nExtendStartRow, nMergeTestEndCol, nMergeTestEndRow, aMark, aPattern );
@@ -5096,7 +5096,7 @@ bool ScDocFunc::UnmergeCells( const ScCellMergeOption& rOption, bool bRecord, Sc
}
const SfxPoolItem& rDefAttr = rDoc.GetPool()->GetDefaultItem( ATTR_MERGE );
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( rDefAttr );
rDoc.ApplyPatternAreaTab( aRange.aStart.Col(), aRange.aStart.Row(),
aRange.aEnd.Col(), aRange.aEnd.Row(), nTab,
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index a5638e6bfed2..826d8d7d995e 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -629,7 +629,7 @@ bool ScDocShell::Load( SfxMedium& rMedium )
// (for ConvertFrom, InitNew is called before)
m_pDocument->MakeTable(0);
m_pDocument->GetStyleSheetPool()->CreateStandardStyles();
- m_pDocument->UpdStlShtPtrsFrmNms();
+ m_pDocument->getCellAttributeHelper().UpdateAllStyleSheets(*m_pDocument);
/* Create styles that are imported through Orcus */
diff --git a/sc/source/ui/docshell/docsh2.cxx b/sc/source/ui/docshell/docsh2.cxx
index cf77e01774e5..5a8d161ff245 100644
--- a/sc/source/ui/docshell/docsh2.cxx
+++ b/sc/source/ui/docshell/docsh2.cxx
@@ -61,7 +61,7 @@ bool ScDocShell::InitNew( const uno::Reference < embed::XStorage >& xStor )
if (ScStyleSheetPool* pStyleSheetPool = m_pDocument->GetStyleSheetPool())
{
pStyleSheetPool->CreateStandardStyles();
- m_pDocument->UpdStlShtPtrsFrmNms();
+ m_pDocument->getCellAttributeHelper().UpdateAllStyleSheets(*m_pDocument);
/* Create styles that are imported through Orcus */
diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx
index 96546d11a5fe..7cc56770c113 100644
--- a/sc/source/ui/docshell/docsh3.cxx
+++ b/sc/source/ui/docshell/docsh3.cxx
@@ -375,7 +375,7 @@ void ScDocShell::CalcOutputFactor()
OUString aTestString(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789");
tools::Long nPrinterWidth = 0;
- const ScPatternAttr* pPattern = &m_pDocument->GetPool()->GetDefaultItem(ATTR_PATTERN);
+ const ScPatternAttr& rPattern(m_pDocument->getCellAttributeHelper().getDefaultCellAttribute());
vcl::Font aDefFont;
OutputDevice* pRefDev = GetRefDevice();
@@ -383,7 +383,7 @@ void ScDocShell::CalcOutputFactor()
vcl::Font aOldFont = pRefDev->GetFont();
pRefDev->SetMapMode(MapMode(MapUnit::MapPixel));
- pPattern->fillFontOnly(aDefFont, pRefDev); // font color doesn't matter here
+ rPattern.fillFontOnly(aDefFont, pRefDev); // font color doesn't matter here
pRefDev->SetFont(aDefFont);
nPrinterWidth = pRefDev->PixelToLogic(Size(pRefDev->GetTextWidth(aTestString), 0), MapMode(MapUnit::Map100thMM)).Width();
pRefDev->SetFont(aOldFont);
@@ -391,7 +391,7 @@ void ScDocShell::CalcOutputFactor()
ScopedVclPtrInstance< VirtualDevice > pVirtWindow( *Application::GetDefaultDevice() );
pVirtWindow->SetMapMode(MapMode(MapUnit::MapPixel));
- pPattern->fillFontOnly(aDefFont, pVirtWindow); // font color doesn't matter here
+ rPattern.fillFontOnly(aDefFont, pVirtWindow); // font color doesn't matter here
pVirtWindow->SetFont(aDefFont);
double nWindowWidth = pVirtWindow->GetTextWidth(aTestString) / ScGlobal::nScreenPPTX;
nWindowWidth = o3tl::convert(nWindowWidth, o3tl::Length::twip, o3tl::Length::mm100);
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index e4cec9200c01..bb29a6ef6b76 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -829,11 +829,11 @@ SCTAB ScDocShell::MakeScenario( SCTAB nTab, const OUString& rName, const OUStrin
//! test for filter / buttons / merging
- ScPatternAttr aProtPattern( m_pDocument->GetPool() );
+ ScPatternAttr aProtPattern(m_pDocument->getCellAttributeHelper());
aProtPattern.GetItemSet().Put( ScProtectionAttr( true ) );
m_pDocument->ApplyPatternAreaTab( 0,0, m_pDocument->MaxCol(),m_pDocument->MaxRow(), nNewTab, aProtPattern );
- ScPatternAttr aPattern( m_pDocument->GetPool() );
+ ScPatternAttr aPattern(m_pDocument->getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeFlagAttr( ScMF::Scenario ) );
aPattern.GetItemSet().Put( ScProtectionAttr( true ) );
m_pDocument->ApplySelectionPattern( aPattern, aDestMark );
diff --git a/sc/source/ui/docshell/docsh6.cxx b/sc/source/ui/docshell/docsh6.cxx
index caefdfc0fed3..4467182cee24 100644
--- a/sc/source/ui/docshell/docsh6.cxx
+++ b/sc/source/ui/docshell/docsh6.cxx
@@ -228,12 +228,12 @@ static void lcl_AdjustPool( SfxStyleSheetBasePool* pStylePool )
void ScDocShell::LoadStyles( SfxObjectShell &rSource )
{
- m_pDocument->StylesToNames();
+ m_pDocument->getCellAttributeHelper().AllStylesToNames();
SfxObjectShell::LoadStyles(rSource);
lcl_AdjustPool( GetStyleSheetPool() ); // adjust SetItems
- m_pDocument->UpdStlShtPtrsFrmNms();
+ m_pDocument->getCellAttributeHelper().UpdateAllStyleSheets(*m_pDocument);
UpdateAllRowHeights();
diff --git a/sc/source/ui/docshell/docsh8.cxx b/sc/source/ui/docshell/docsh8.cxx
index cc0be89a4bd6..2b75ccc7d626 100644
--- a/sc/source/ui/docshell/docsh8.cxx
+++ b/sc/source/ui/docshell/docsh8.cxx
@@ -261,7 +261,7 @@ static void lcl_setScalesToColumns(ScDocument& rDoc, const vector<tools::Long>&
continue;
}
- ScPatternAttr aNewAttrs( rDoc.GetPool() );
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put( SfxUInt32Item(ATTR_VALUE_FORMAT, nNewFormat) );
rDoc.ApplyPatternAreaTab(i, 0, i, rDoc.MaxRow(), 0, aNewAttrs);
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 159a4639e666..bc87bdb4ba4e 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1038,7 +1038,7 @@ static bool lcl_PutString(
// This is only necessary for ScDocumentImport,
// ScDocument::SetTextCell() forces it by ScSetStringParam.
sal_uInt32 nFormat = rDoc.GetFormatTable()->GetStandardFormat(SvNumFormatType::TEXT);
- ScPatternAttr aNewAttrs(rDoc.GetPool());
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put( SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat) );
rDoc.ApplyPattern(nCol, nRow, nTab, aNewAttrs);
diff --git a/sc/source/ui/inc/undoblk.hxx b/sc/source/ui/inc/undoblk.hxx
index 9bda36a1e176..523b48963a25 100644
--- a/sc/source/ui/inc/undoblk.hxx
+++ b/sc/source/ui/inc/undoblk.hxx
@@ -345,9 +345,10 @@ private:
std::unique_ptr<ScEditDataArray> mpDataArray;
ScDocumentUniquePtr pUndoDoc;
bool bMulti;
- ScPatternAttr* pApplyPattern;
- SvxBoxItem* pLineOuter;
- SvxBoxInfoItem* pLineInner;
+ const CellAttributeHolder aApplyPattern;
+
+ SfxPoolItemHolder maLineOuter;
+ SfxPoolItemHolder maLineInner;
void DoChange( const bool bUndo );
void ChangeEditData( const bool bUndo );
diff --git a/sc/source/ui/inc/undocell.hxx b/sc/source/ui/inc/undocell.hxx
index bfc82abe97f6..ec465e75e646 100644
--- a/sc/source/ui/inc/undocell.hxx
+++ b/sc/source/ui/inc/undocell.hxx
@@ -58,13 +58,13 @@ private:
SCCOL nCol;
SCROW nRow;
SCTAB nTab;
- ScPatternAttr* pOldPattern;
- ScPatternAttr* pNewPattern;
- ScPatternAttr* pApplyPattern;
+ const CellAttributeHolder aOldPattern;
+ const CellAttributeHolder aNewPattern;
+ const CellAttributeHolder aApplyPattern;
std::unique_ptr<EditTextObject> pOldEditData;
std::unique_ptr<EditTextObject> pNewEditData;
- void DoChange( const ScPatternAttr* pWhichPattern, const std::unique_ptr<EditTextObject>& pEditData ) const;
+ void DoChange( const CellAttributeHolder& rWhichPattern, const std::unique_ptr<EditTextObject>& pEditData ) const;
};
class ScUndoEnterData: public ScSimpleUndo
diff --git a/sc/source/ui/pagedlg/scuitphfedit.cxx b/sc/source/ui/pagedlg/scuitphfedit.cxx
index d82c923e56c4..e087370f84cd 100644
--- a/sc/source/ui/pagedlg/scuitphfedit.cxx
+++ b/sc/source/ui/pagedlg/scuitphfedit.cxx
@@ -80,8 +80,8 @@ ScHFEditPage::ScHFEditPage(weld::Container* pPage, weld::DialogController* pCont
//! use default style from current document?
//! if font color is used, header/footer background color must be set
-
- ScPatternAttr aPatAttr( rCoreAttrs.GetPool() );
+ const CellAttributeHelper aTempHelper(*rCoreAttrs.GetPool());
+ const ScPatternAttr& rDefaultCellAttribute(aTempHelper.getDefaultCellAttribute());
m_xLbDefined->connect_popup_toggled( LINK( this, ScHFEditPage, ListToggleHdl_Impl) );
m_xLbDefined->connect_changed( LINK( this, ScHFEditPage, ListHdl_Impl ) );
@@ -109,9 +109,9 @@ ScHFEditPage::ScHFEditPage(weld::Container* pPage, weld::DialogController* pCont
m_xWndLeftWnd->set_grid_left_attach(nOldRightAttach);
m_xWndRightWnd->set_grid_left_attach(nOldLeftAttach);
}
- m_xWndLeft->SetFont( aPatAttr );
- m_xWndCenter->SetFont( aPatAttr );
- m_xWndRight->SetFont( aPatAttr );
+ m_xWndLeft->SetFont( rDefaultCellAttribute );
+ m_xWndCenter->SetFont( rDefaultCellAttribute );
+ m_xWndRight->SetFont( rDefaultCellAttribute );
m_xWndLeft->SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
m_xWndCenter->SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index d352ba143ba8..ef46e1b7e7c2 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -475,7 +475,7 @@ void ScUndoDeleteCells::DoChange( const bool bUndo )
aWorkRange.aEnd.SetRow(rDoc.MaxRow());
ScMarkData aMarkData(rDoc.GetSheetLimits());
aMarkData.SelectOneTable( aWorkRange.aStart.Tab() );
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeFlagAttr() );
rDoc.ApplyPatternArea( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(),
aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(),
@@ -2308,7 +2308,7 @@ void ScUndoRemoveMerge::Redo()
ScRange aRange = rOption.getSingleRange(nTab);
const SfxPoolItem& rDefAttr = rDoc.GetPool()->GetDefaultItem( ATTR_MERGE );
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( rDefAttr );
rDoc.ApplyPatternAreaTab( rOption.mnStartCol, rOption.mnStartRow,
rOption.mnEndCol, rOption.mnEndRow, nTab,
diff --git a/sc/source/ui/undo/undoblk3.cxx b/sc/source/ui/undo/undoblk3.cxx
index bc967d96d47f..82d381d2f9ae 100644
--- a/sc/source/ui/undo/undoblk3.cxx
+++ b/sc/source/ui/undo/undoblk3.cxx
@@ -352,31 +352,23 @@ ScUndoSelectionAttr::ScUndoSelectionAttr( ScDocShell* pNewDocShell,
aRange ( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ),
mpDataArray(new ScEditDataArray),
pUndoDoc ( std::move(pNewUndoDoc) ),
- bMulti ( bNewMulti )
+ bMulti ( bNewMulti ),
+ aApplyPattern( pNewApply ),
+ maLineOuter(*pDocShell->GetDocument().GetPool(), pNewOuter),
+ maLineInner(*pDocShell->GetDocument().GetPool(), pNewInner)
{
- ScDocumentPool* pPool = pDocShell->GetDocument().GetPool();
- pApplyPattern = const_cast<ScPatternAttr*>(&pPool->DirectPutItemInPool( *pNewApply ));
- pLineOuter = pNewOuter ? const_cast<SvxBoxItem*>( &pPool->DirectPutItemInPool( *pNewOuter ) ) : nullptr;
- pLineInner = pNewInner ? const_cast<SvxBoxInfoItem*>( &pPool->DirectPutItemInPool( *pNewInner ) ) : nullptr;
aRangeCover = pRangeCover ? *pRangeCover : aRange;
}
ScUndoSelectionAttr::~ScUndoSelectionAttr()
{
- ScDocumentPool* pPool = pDocShell->GetDocument().GetPool();
- pPool->DirectRemoveItemFromPool(*pApplyPattern);
- if (pLineOuter)
- pPool->DirectRemoveItemFromPool(*pLineOuter);
- if (pLineInner)
- pPool->DirectRemoveItemFromPool(*pLineInner);
-
pUndoDoc.reset();
}
OUString ScUndoSelectionAttr::GetComment() const
{
//"Attribute" "/Lines"
- return ScResId( pLineOuter ? STR_UNDO_SELATTRLINES : STR_UNDO_SELATTR );
+ return ScResId( maLineOuter.getItem() ? STR_UNDO_SELATTRLINES : STR_UNDO_SELATTR );
}
ScEditDataArray* ScUndoSelectionAttr::GetDataArray()
@@ -410,11 +402,13 @@ void ScUndoSelectionAttr::DoChange( const bool bUndo )
else // only for Redo
{
aMarkData.MarkToMulti();
- rDoc.ApplySelectionPattern( *pApplyPattern, aMarkData );
+ rDoc.ApplySelectionPattern( *aApplyPattern.getScPatternAttr(), aMarkData );
aMarkData.MarkToSimple();
- if (pLineOuter)
- rDoc.ApplySelectionFrame(aMarkData, *pLineOuter, pLineInner);
+ if (maLineOuter.getItem())
+ rDoc.ApplySelectionFrame(aMarkData,
+ *static_cast<const SvxBoxItem*>(maLineOuter.getItem()),
+ static_cast<const SvxBoxInfoItem*>(maLineInner.getItem()));
}
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
@@ -469,10 +463,12 @@ void ScUndoSelectionAttr::Repeat(SfxRepeatTarget& rTarget)
if (auto pViewTarget = dynamic_cast<ScTabViewTarget*>( &rTarget))
{
ScTabViewShell& rViewShell = *pViewTarget->GetViewShell();
- if (pLineOuter)
- rViewShell.ApplyPatternLines(*pApplyPattern, *pLineOuter, pLineInner);
+ if (maLineOuter.getItem())
+ rViewShell.ApplyPatternLines(*aApplyPattern.getScPatternAttr(),
+ *static_cast<const SvxBoxItem*>(maLineOuter.getItem()),
+ static_cast<const SvxBoxInfoItem*>(maLineInner.getItem()));
else
- rViewShell.ApplySelectionPattern( *pApplyPattern );
+ rViewShell.ApplySelectionPattern( *aApplyPattern.getScPatternAttr() );
}
}
diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx
index 84e4a95bcb1e..c83acc3afcbc 100644
--- a/sc/source/ui/undo/undocell.cxx
+++ b/sc/source/ui/undo/undocell.cxx
@@ -80,21 +80,16 @@ ScUndoCursorAttr::ScUndoCursorAttr( ScDocShell* pNewDocShell,
nCol( nNewCol ),
nRow( nNewRow ),
nTab( nNewTab ),
+ aOldPattern( pOldPat ),
+ aNewPattern( pNewPat ),
+ aApplyPattern( pApplyPat ),
pOldEditData( static_cast<EditTextObject*>(nullptr) ),
pNewEditData( static_cast<EditTextObject*>(nullptr) )
{
- ScDocumentPool* pPool = pDocShell->GetDocument().GetPool();
- pNewPattern = const_cast<ScPatternAttr*>( &pPool->DirectPutItemInPool( *pNewPat ) );
- pOldPattern = const_cast<ScPatternAttr*>( &pPool->DirectPutItemInPool( *pOldPat ) );
- pApplyPattern = const_cast<ScPatternAttr*>( &pPool->DirectPutItemInPool( *pApplyPat ) );
}
ScUndoCursorAttr::~ScUndoCursorAttr()
{
- ScDocumentPool* pPool = pDocShell->GetDocument().GetPool();
- pPool->DirectRemoveItemFromPool(*pNewPattern);
- pPool->DirectRemoveItemFromPool(*pOldPattern);
- pPool->DirectRemoveItemFromPool(*pApplyPattern);
}
OUString ScUndoCursorAttr::GetComment() const
@@ -109,11 +104,11 @@ void ScUndoCursorAttr::SetEditData( std::unique_ptr<EditTextObject> pOld, std::u
pNewEditData = std::move(pNew);
}
-void ScUndoCursorAttr::DoChange( const ScPatternAttr* pWhichPattern, const std::unique_ptr<EditTextObject>& pEditData ) const
+void ScUndoCursorAttr::DoChange( const CellAttributeHolder& rWhichPattern, const std::unique_ptr<EditTextObject>& pEditData ) const
{
ScDocument& rDoc = pDocShell->GetDocument();
ScAddress aPos(nCol, nRow, nTab);
- rDoc.SetPattern( nCol, nRow, nTab, *pWhichPattern );
+ rDoc.SetPattern( nCol, nRow, nTab, rWhichPattern );
if (rDoc.GetCellType(aPos) == CELLTYPE_EDIT && pEditData)
rDoc.SetEditText(aPos, *pEditData, nullptr);
@@ -126,7 +121,7 @@ void ScUndoCursorAttr::DoChange( const ScPatternAttr* pWhichPattern, const std::
pViewShell->AdjustBlockHeight();
}
- const SfxItemSet& rApplySet = pApplyPattern->GetItemSet();
+ const SfxItemSet& rApplySet = aApplyPattern.getScPatternAttr()->GetItemSet();
bool bPaintExt = ( rApplySet.GetItemState( ATTR_SHADOW ) != SfxItemState::DEFAULT ||
rApplySet.GetItemState( ATTR_CONDITIONAL ) != SfxItemState::DEFAULT );
bool bPaintRows = ( rApplySet.GetItemState( ATTR_HOR_JUSTIFY ) != SfxItemState::DEFAULT );
@@ -142,21 +137,21 @@ void ScUndoCursorAttr::DoChange( const ScPatternAttr* pWhichPattern, const std::
void ScUndoCursorAttr::Undo()
{
BeginUndo();
- DoChange(pOldPattern, pOldEditData);
+ DoChange(aOldPattern, pOldEditData);
EndUndo();
}
void ScUndoCursorAttr::Redo()
{
BeginRedo();
- DoChange(pNewPattern, pNewEditData);
+ DoChange(aNewPattern, pNewEditData);
EndRedo();
}
void ScUndoCursorAttr::Repeat(SfxRepeatTarget& rTarget)
{
if (auto pViewTarget = dynamic_cast<ScTabViewTarget*>( &rTarget))
- pViewTarget->GetViewShell()->ApplySelectionPattern( *pApplyPattern );
+ pViewTarget->GetViewShell()->ApplySelectionPattern( *aApplyPattern.getScPatternAttr() );
}
bool ScUndoCursorAttr::CanRepeat(SfxRepeatTarget& rTarget) const
@@ -252,9 +247,9 @@ void ScUndoEnterData::Undo()
SfxUInt32Item(ATTR_VALUE_FORMAT, rVal.mnFormat));
else
{
- auto pPattern = std::make_unique<ScPatternAttr>(*rDoc.GetPattern(maPos.Col(), maPos.Row(), rVal.mnTab));
+ ScPatternAttr* pPattern(new ScPatternAttr(*rDoc.GetPattern(maPos.Col(), maPos.Row(), rVal.mnTab)));
pPattern->GetItemSet().ClearItem( ATTR_VALUE_FORMAT );
- rDoc.SetPattern(maPos.Col(), maPos.Row(), rVal.mnTab, std::move(pPattern));
+ rDoc.SetPattern(maPos.Col(), maPos.Row(), rVal.mnTab, CellAttributeHolder(pPattern, true));
}
pDocShell->PostPaintCell(maPos.Col(), maPos.Row(), rVal.mnTab);
}
diff --git a/sc/source/ui/undo/undostyl.cxx b/sc/source/ui/undo/undostyl.cxx
index 0c1ab96c2b16..696855188830 100644
--- a/sc/source/ui/undo/undostyl.cxx
+++ b/sc/source/ui/undo/undostyl.cxx
@@ -143,7 +143,7 @@ void ScUndoModifyStyle::DoChange( ScDocShell* pDocSh, const OUString& rName,
pStyle = &pStlPool->Make( aNewName, eStyleFamily, SfxStyleSearchBits::UserDefined );
if ( eStyleFamily == SfxStyleFamily::Para )
- rDoc.GetPool()->CellStyleCreated( aNewName, rDoc );
+ rDoc.getCellAttributeHelper().CellStyleCreated(rDoc, aNewName);
}
if ( pStyle )
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 3325b0bbcf6c..d5f69cd7d85f 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -1869,7 +1869,7 @@ uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const OUString& aPropert
{
if ( IsScItemWid( pEntry->nWID ) )
{
- const ScPatternAttr* pPattern = rDoc.GetDefPattern();
+ const ScPatternAttr* pPattern(&rDoc.getCellAttributeHelper().getDefaultCellAttribute());
if ( pPattern )
{
const SfxItemSet& rSet = pPattern->GetItemSet();
@@ -1903,7 +1903,7 @@ uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const OUString& aPropert
case SC_WID_UNO_TBLBORD:
case SC_WID_UNO_TBLBORD2:
{
- const ScPatternAttr* pPattern = rDoc.GetDefPattern();
+ const ScPatternAttr* pPattern(&rDoc.getCellAttributeHelper().getDefaultCellAttribute());
if ( pPattern )
{
if (pEntry->nWID == SC_WID_UNO_TBLBORD2)
@@ -2278,7 +2278,7 @@ void ScCellRangesBase::SetOnePropertyValue( const SfxItemPropertyMapEntry* pEntr
sal_uInt32 nIndex = rDoc.AddValidationEntry( *pNewData );
pNewData.reset();
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) );
pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), aPattern, true );
}
@@ -2548,7 +2548,7 @@ void SAL_CALL ScCellRangesBase::setPropertyValues( const uno::Sequence< OUString
{
pOldPattern.reset(new ScPatternAttr( *GetCurrentAttrsDeep() ));
pOldPattern->GetItemSet().ClearInvalidItems();
- pNewPattern.reset(new ScPatternAttr( rDoc.GetPool() ));
+ pNewPattern.reset(new ScPatternAttr(rDoc.getCellAttributeHelper()));
}
// collect items in pNewPattern, apply with one call after the loop
@@ -2684,7 +2684,7 @@ uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL ScCellRangesBase::set
{
pOldPattern.reset(new ScPatternAttr( *GetCurrentAttrsDeep() ));
pOldPattern->GetItemSet().ClearInvalidItems();
- pNewPattern.reset(new ScPatternAttr( rDoc.GetPool() ));
+ pNewPattern.reset(new ScPatternAttr(rDoc.getCellAttributeHelper()));
}
// collect items in pNewPattern, apply with one call after the loop
@@ -5884,7 +5884,7 @@ void ScCellObj::InputEnglishString( const OUString& rText )
sal_uInt32 nNewFormat = ScGlobal::GetStandardFormat(*pFormatter, nOldFormat, aRes.mnFormatType);
if (nNewFormat != nOldFormat)
{
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
// ATTR_LANGUAGE_FORMAT remains unchanged
rFunc.ApplyAttributes( *GetMarkData(), aPattern, true );
@@ -7630,7 +7630,7 @@ void SAL_CALL ScTableSheetObj::addRanges( const uno::Sequence<table::CellRangeAd
}
// Scenario ranges are tagged with attribute
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeFlagAttr( ScMF::Scenario ) );
aPattern.GetItemSet().Put( ScProtectionAttr( true ) );
pDocSh->GetDocFunc().ApplyAttributes( aMarkData, aPattern, true );
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 66f805b37c78..e1a70b742517 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -1031,8 +1031,7 @@ static void lcl_sendLOKDocumentBackground(const ScViewData* pViewData)
{
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocument& rDoc = pDocSh->GetDocument();
- const ScPatternAttr *pAttr = rDoc.GetDefPattern();
- const SfxPoolItem& rItem = pAttr->GetItem(ATTR_BACKGROUND);
+ const SfxPoolItem& rItem(rDoc.getCellAttributeHelper().getDefaultCellAttribute().GetItem(ATTR_BACKGROUND));
const SvxBrushItem& rBackground = static_cast<const SvxBrushItem&>(rItem);
const Color& rColor = rBackground.GetColor();
diff --git a/sc/source/ui/unoobj/funcuno.cxx b/sc/source/ui/unoobj/funcuno.cxx
index 6f5226452bf7..3316450da370 100644
--- a/sc/source/ui/unoobj/funcuno.cxx
+++ b/sc/source/ui/unoobj/funcuno.cxx
@@ -152,7 +152,7 @@ static bool lcl_CopyData( ScDocument* pSrcDoc, const ScRange& rSrcRange,
if ( pClipDoc->HasAttrib( 0,0,nSrcTab, pClipDoc->MaxCol(), pClipDoc->MaxRow(),nSrcTab,
HasAttrFlags::Merged | HasAttrFlags::Overlapped ) )
{
- ScPatternAttr aPattern( pSrcDoc->GetPool() );
+ ScPatternAttr aPattern(pSrcDoc->getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults
aPattern.GetItemSet().Put( ScMergeFlagAttr() );
pClipDoc->ApplyPatternAreaTab( 0,0, pClipDoc->MaxCol(), pClipDoc->MaxRow(), nSrcTab, aPattern );
diff --git a/sc/source/ui/unoobj/styleuno.cxx b/sc/source/ui/unoobj/styleuno.cxx
index 8dd6fc58f86a..beef2e67f41b 100644
--- a/sc/source/ui/unoobj/styleuno.cxx
+++ b/sc/source/ui/unoobj/styleuno.cxx
@@ -720,7 +720,7 @@ void SAL_CALL ScStyleFamilyObj::insertByName( const OUString& aName, const uno::
(void)pStylePool->Make( aNameStr, eFamily, SfxStyleSearchBits::UserDefined );
if ( eFamily == SfxStyleFamily::Para && !rDoc.IsImportingXML() )
- rDoc.GetPool()->CellStyleCreated( aNameStr, rDoc );
+ rDoc.getCellAttributeHelper().CellStyleCreated(rDoc, aNameStr);
pStyleObj->InitDoc( pDocShell, aNameStr ); // object can be used
@@ -1140,7 +1140,7 @@ void SAL_CALL ScStyleObj::setName( const OUString& aNewName )
ScDocument& rDoc = pDocShell->GetDocument();
if ( eFamily == SfxStyleFamily::Para && !rDoc.IsImportingXML() )
- rDoc.GetPool()->CellStyleCreated( aNewName, rDoc );
+ rDoc.getCellAttributeHelper().CellStyleCreated(rDoc, aNewName);
// cell styles = 2, drawing styles = 3, page styles = 4
sal_uInt16 nId = eFamily == SfxStyleFamily::Para ? SID_STYLE_FAMILY2 :
diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx
index 6102cdb9fac2..dea96fc2310d 100644
--- a/sc/source/ui/unoobj/textuno.cxx
+++ b/sc/source/ui/unoobj/textuno.cxx
@@ -172,16 +172,33 @@ SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder()
pHdrEngine->SetRefMapMode(MapMode(MapUnit::MapTwip));
// default font must be set, independently of document
- // -> use global pool from module
+ ScDocShell* pDocSh(dynamic_cast<ScDocShell*>(SfxObjectShell::Current()));
+ std::unique_ptr<CellAttributeHelper> pTmp;
+ const ScPatternAttr* pCellAttributeDefault(nullptr);
+
+ if (nullptr != pDocSh)
+ {
+ // we can use default CellAttribute from ScDocument
+ pCellAttributeDefault = &pDocSh->GetDocument().getCellAttributeHelper().getDefaultCellAttribute();
+ }
+ else
+ {
+ // no access to ScDocument, use temporary default CellAttributeHelper
+ // was: "use global pool from module" which is usually ScMessagePool
+ // and gets set in ScTabViewObj::SelectionChanged() by
+ // ScFormatShell::ScFormatShell which calls
+ // SetPool( &pTabViewShell->GetPool() );
+ pTmp.reset(new CellAttributeHelper(SC_MOD()->GetPool()));
+ pCellAttributeDefault = &pTmp->getDefaultCellAttribute();
+ }
SfxItemSet aDefaults( pHdrEngine->GetEmptyItemSet() );
- const ScPatternAttr& rPattern = SC_MOD()->GetPool().GetDefaultItem(ATTR_PATTERN);
- rPattern.FillEditItemSet( &aDefaults );
+ pCellAttributeDefault->FillEditItemSet( &aDefaults );
// FillEditItemSet adjusts font height to 1/100th mm,
// but for header/footer twips is needed, as in the PatternAttr:
- aDefaults.Put( rPattern.GetItem(ATTR_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT) );
- aDefaults.Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CJK) ) ;
- aDefaults.Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CTL) );
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT) );
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_CJK_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CJK) ) ;
+ aDefaults.Put( pCellAttributeDefault->GetItem(ATTR_CTL_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CTL) );
pHdrEngine->SetDefaults( aDefaults );
ScHeaderFieldData aData;
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index f1ce525daa2d..12d38b5e9b0b 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -3831,9 +3831,8 @@ static double getDefaultCharWidth( ScDocShell* pDocShell )
{
ScDocument& rDoc = pDocShell->GetDocument();
OutputDevice* pRefDevice = rDoc.GetRefDevice();
- ScPatternAttr* pAttr = rDoc.GetDefPattern();
vcl::Font aDefFont;
- pAttr->fillFontOnly(aDefFont, pRefDevice);
+ rDoc.getCellAttributeHelper().getDefaultCellAttribute().fillFontOnly(aDefFont, pRefDevice);
pRefDevice->SetFont(aDefFont);
tools::Long nCharWidth = pRefDevice->GetTextWidth( OUString( '0' ) ); // 1/100th mm
return o3tl::convert<double>(nCharWidth, o3tl::Length::mm100, o3tl::Length::pt);
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 9720bf7f4f9f..41c8d9e9e268 100644
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -2086,7 +2086,7 @@ void ScDBFunc::ShowDataPilotSourceData( ScDPObject& rDPObj, const Sequence<sheet
if (!(any >>= nNumFmt))
continue;
- ScPatternAttr aPattern( pInsDoc->GetPool() );
+ ScPatternAttr aPattern(pInsDoc->getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item(ATTR_VALUE_FORMAT, static_cast<sal_uInt32>(nNumFmt)) );
pInsDoc->ApplyPatternAreaTab(nCol, 1, nCol, nRowSize-1, nNewTab, aPattern);
}
diff --git a/sc/source/ui/view/formatsh.cxx b/sc/source/ui/view/formatsh.cxx
index 93a456e46b53..9c231f1d4b5a 100644
--- a/sc/source/ui/view/formatsh.cxx
+++ b/sc/source/ui/view/formatsh.cxx
@@ -191,7 +191,7 @@ void ScFormatShell::ExecuteStyle( SfxRequest& rReq )
SfxItemSet aItemSet( GetPool() );
- ScPatternAttr aNewAttrs( GetViewData().GetDocument().GetPool() );
+ ScPatternAttr aNewAttrs(GetViewData().GetDocument().getCellAttributeHelper());
SfxItemSet& rNewSet = aNewAttrs.GetItemSet();
rNewSet.Put( aItemSet, false );
@@ -214,7 +214,7 @@ void ScFormatShell::ExecuteStyle( SfxRequest& rReq )
SfxItemSet aItemSet( GetPool() );
- ScPatternAttr aNewAttrs( GetViewData().GetDocument().GetPool() );
+ ScPatternAttr aNewAttrs(GetViewData().GetDocument().getCellAttributeHelper());
SfxItemSet& rNewSet = aNewAttrs.GetItemSet();
rNewSet.Put( aItemSet, false );
rDoc.ApplySelectionPattern( aNewAttrs, aPreviewMark );
@@ -345,7 +345,7 @@ void ScFormatShell::ExecuteNumFormat( SfxRequest& rReq )
if ( nOldFormat != nNewFormat )
{
const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat );
- ScPatternAttr aNewAttrs( rDoc.GetPool() );
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
LanguageType eNewLang = pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW;
if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW )
@@ -1924,7 +1924,7 @@ void ScFormatShell::ExecuteTextDirection( const SfxRequest& rReq )
case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
{
bool bVert = (nSlot == SID_TEXTDIRECTION_TOP_TO_BOTTOM);
- ScPatternAttr aAttr( GetViewData().GetDocument().GetPool() );
+ ScPatternAttr aAttr(GetViewData().GetDocument().getCellAttributeHelper());
SfxItemSet& rItemSet = aAttr.GetItemSet();
rItemSet.Put( ScVerticalStackCell( bVert ) );
rItemSet.Put( SfxBoolItem( ATTR_VERTICAL_ASIAN, bVert ) );
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index 3639e8287698..218c98b12a6c 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -119,8 +119,7 @@ static void lcl_DrawOneFrame( vcl::RenderContext* pDev, const tools::Rectangle&
// use ScPatternAttr::GetFont only for font size
vcl::Font aAttrFont;
- rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN).
- fillFontOnly(aAttrFont, pDev, &rZoomY);
+ rDoc.getCellAttributeHelper().getDefaultCellAttribute().fillFontOnly(aAttrFont, pDev, &rZoomY);
// everything else from application font
vcl::Font aAppFont = pDev->GetSettings().GetStyleSettings().GetAppFont();
@@ -1916,7 +1915,7 @@ void ScGridWindow::DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
vcl::Font aFont;
std::unique_ptr<ScEditEngineDefaulter> pEditEng;
- const ScPatternAttr& rDefPattern = rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN);
+ const ScPatternAttr& rDefPattern(rDoc.getCellAttributeHelper().getDefaultCellAttribute());
if ( nPageScript == SvtScriptType::LATIN )
{
// use single font and call DrawText directly
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index 473671ea1cf3..70c2f1904c7d 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -1025,7 +1025,7 @@ static bool StringDiffer( const ScPatternAttr*& rpOldPattern, const ScPatternAtt
{
OSL_ENSURE( pNewPattern, "pNewPattern" );
- if ( SfxPoolItem::areSame( pNewPattern, rpOldPattern ) )
+ if ( ScPatternAttr::areSame( pNewPattern, rpOldPattern ) )
return false;
else if ( !rpOldPattern )
return true;
@@ -1714,7 +1714,7 @@ void ScOutputData::LayoutStrings(bool bPixelToLogic)
if (nScript == SvtScriptType::NONE)
nScript = ScGlobal::GetDefaultScriptType();
- if ( !SfxPoolItem::areSame(pPattern, pOldPattern) || pCondSet != pOldCondSet ||
+ if ( !ScPatternAttr::areSame(pPattern, pOldPattern) || pCondSet != pOldCondSet ||
nScript != nOldScript || mbSyntaxMode )
{
if ( StringDiffer(pOldPattern,pPattern) ||
@@ -2488,7 +2488,7 @@ void ScOutputData::DrawEditParam::setPatternToEngine(bool bUseStyleColor)
// syntax highlighting mode is ignored here
// StringDiffer doesn't look at hyphenate, language items
- if (SfxPoolItem::areSame(mpPattern, mpOldPattern) && mpCondSet == mpOldCondSet && mpPreviewFontSet == mpOldPreviewFontSet )
+ if (ScPatternAttr::areSame(mpPattern, mpOldPattern) && mpCondSet == mpOldCondSet && mpPreviewFontSet == mpOldPreviewFontSet )
return;
Color nConfBackColor = SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor;
@@ -4701,7 +4701,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
// syntax mode is ignored here...
// StringDiffer doesn't look at hyphenate, language items
- if ( !SfxPoolItem::areSame(pPattern, pOldPattern) || pCondSet != pOldCondSet )
+ if ( !ScPatternAttr::areSame(pPattern, pOldPattern) || pCondSet != pOldCondSet )
{
auto pSet = std::make_unique<SfxItemSet>( mxOutputEditEngine->GetEmptyItemSet() );
pPattern->FillEditItemSet( pSet.get(), pCondSet );
diff --git a/sc/source/ui/view/preview.cxx b/sc/source/ui/view/preview.cxx
index 33430883da53..ac7de60f8fda 100644
--- a/sc/source/ui/view/preview.cxx
+++ b/sc/source/ui/view/preview.cxx
@@ -499,8 +499,7 @@ void ScPreview::DoPrint( ScPreviewLocationData* pFillLocation )
GetOutDev()->SetFillColor(aBackColor);
GetOutDev()->DrawRect(tools::Rectangle(0, 0, aWinEnd.X(), aWinEnd.Y()));
- const ScPatternAttr& rDefPattern =
- rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN);
+ const ScPatternAttr& rDefPattern(rDoc.getCellAttributeHelper().getDefaultCellAttribute());
std::unique_ptr<ScEditEngineDefaulter> pEditEng(
new ScEditEngineDefaulter(EditEngine::CreatePool().get(), true));
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index 697a03f8a315..db81b8692849 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -1741,7 +1741,8 @@ void ScPrintFunc::MakeEditEngine()
// Default-Set for alignment
pEditDefaults.reset( new SfxItemSet( pEditEngine->GetEmptyItemSet() ) );
- const ScPatternAttr& rPattern = rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN);
+ const ScPatternAttr& rPattern(rDoc.getCellAttributeHelper().getDefaultCellAttribute());
+
rPattern.FillEditItemSet( pEditDefaults.get() );
// FillEditItemSet adjusts font height to 1/100th mm,
// but for header/footer twips is needed, as in the PatternAttr:
@@ -1908,7 +1909,7 @@ tools::Long ScPrintFunc::DoNotes( tools::Long nNoteStart, bool bDoPrint, ScPrevi
vcl::Font aMarkFont;
ScAutoFontColorMode eColorMode = bUseStyleColor ? ScAutoFontColorMode::Display : ScAutoFontColorMode::Print;
- rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN).fillFont(aMarkFont, eColorMode);
+ rDoc.getCellAttributeHelper().getDefaultCellAttribute().fillFont(aMarkFont, eColorMode);
pDev->SetFont(aMarkFont);
tools::Long nMarkLen = pDev->GetTextWidth("GW99999:");
// without Space-Char, because it rarely arrives there
@@ -2320,7 +2321,7 @@ void ScPrintFunc::PrintPage( tools::Long nPageNo, SCCOL nX1, SCROW nY1, SCCOL nX
pDev->SetMapMode(aOffsetMode);
}
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
vcl::Font aFont;
ScAutoFontColorMode eColorMode = bUseStyleColor ? ScAutoFontColorMode::Display : ScAutoFontColorMode::Print;
aPattern.fillFont(aFont, eColorMode, pDev);
diff --git a/sc/source/ui/view/spelleng.cxx b/sc/source/ui/view/spelleng.cxx
index ae50d82930ee..0183e1e04f34 100644
--- a/sc/source/ui/view/spelleng.cxx
+++ b/sc/source/ui/view/spelleng.cxx
@@ -135,16 +135,16 @@ bool ScConversionEngineBase::FindNextConversionCell()
// Set the new string and update the language with the cell.
mrDoc.SetString(aPos, aNewStr);
- const ScPatternAttr* pAttr = mrDoc.GetPattern(aPos);
- std::unique_ptr<ScPatternAttr> pNewAttr;
+ const ScPatternAttr* pAttr(mrDoc.GetPattern(aPos));
+ ScPatternAttr* pNewAttr(nullptr);
- if (pAttr)
- pNewAttr = std::make_unique<ScPatternAttr>(*pAttr);
+ if (nullptr != pAttr)
+ pNewAttr = new ScPatternAttr(*pAttr);
else
- pNewAttr = std::make_unique<ScPatternAttr>(mrDoc.GetPool());
+ pNewAttr = new ScPatternAttr(mrDoc.getCellAttributeHelper());
pNewAttr->GetItemSet().Put(SvxLanguageItem(aLang.nLang, EE_CHAR_LANGUAGE), ATTR_FONT_LANGUAGE);
- mrDoc.SetPattern(aPos, std::move(pNewAttr));
+ mrDoc.SetPattern(aPos, CellAttributeHolder(pNewAttr, true));
}
if (mpRedoDoc && !bEmptyCell)
@@ -209,7 +209,7 @@ bool ScConversionEngineBase::FindNextConversionCell()
{
// GetPattern may implicitly allocates the column if not exists,
pPattern = mrDoc.GetPattern( nNewCol, nNewRow, mnStartTab );
- if( pPattern && !SfxPoolItem::areSame(pPattern, pLastPattern) )
+ if( pPattern && !ScPatternAttr::areSame(pPattern, pLastPattern) )
{
pPattern->FillEditItemSet( &aEditDefaults );
SetDefaults( aEditDefaults );
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 46baa40875fb..52b815e34e16 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -1203,7 +1203,7 @@ void ScTabViewShell::ExecStyle( SfxRequest& rReq )
// style pointer to names before erase,
// otherwise cells will get invalid pointer
//!!! As it happens, a method that does it for a particular style
- rDoc.StylesToNames();
+ rDoc.getCellAttributeHelper().AllStylesToNames();
bConvertBack = true;
pStylePool->Remove(pStyleSheet);
}
@@ -1219,9 +1219,9 @@ void ScTabViewShell::ExecStyle( SfxRequest& rReq )
if ( bConvertBack )
// Name to style pointer
- rDoc.UpdStlShtPtrsFrmNms();
+ rDoc.getCellAttributeHelper().UpdateAllStyleSheets(rDoc);
else
- rDoc.GetPool()->CellStyleCreated( aStyleName, rDoc );
+ rDoc.getCellAttributeHelper().CellStyleCreated(rDoc, aStyleName);
// Adopt attribute and use style
pStyleSheet->GetItemSet().Put( aAttrSet );
@@ -1598,7 +1598,7 @@ void ScTabViewShell::ExecStyle( SfxRequest& rReq )
pNew->GetLanguage(), ATTR_LANGUAGE_FORMAT ) );
}
- rDoc.GetPool()->CellStyleCreated( pStyleSheet->GetName(), rDoc );
+ rDoc.getCellAttributeHelper().CellStyleCreated(rDoc, pStyleSheet->GetName());
}
else if ( SfxStyleFamily::Page == eFam )
{
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 5cb800fe8ce1..ea896d6423f0 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -958,7 +958,7 @@ void ScViewFunc::EnterBlock( const OUString& rString, const EditTextObject* pDat
{ // set number format if incompatible
// MarkData was already MarkToSimple'ed in PasteFromClip
const ScRange& aRange = rMark.GetMarkArea();
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( *pItem );
SvNumFormatType nNewType = rDoc.GetFormatTable()->GetType( pItem->GetValue() );
rDoc.ApplyPatternIfNumberformatIncompatible( aRange, rMark,
@@ -2379,7 +2379,7 @@ void ScViewFunc::ExtendScenario()
// Undo: apply attributes
ScDocument& rDoc = GetViewData().GetDocument();
- ScPatternAttr aPattern( rDoc.GetPool() );
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( ScMergeFlagAttr( ScMF::Scenario ) );
aPattern.GetItemSet().Put( ScProtectionAttr( true ) );
ApplySelectionPattern(aPattern);
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 0b8b0865f0fc..2958f13cd2eb 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -627,7 +627,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab,
const SvNumberformat* pEntry = pFormatter->GetEntry( nIndex);
const LanguageType nLang = (pEntry ? pEntry->GetLanguage() : ScGlobal::eLnge);
const sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::NUMBER, nLang);
- ScPatternAttr aPattern( rDoc.GetPool());
+ ScPatternAttr aPattern(rDoc.getCellAttributeHelper());
aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nFormat));
ScMarkData aMark(rDoc.GetSheetLimits());
aMark.SelectTable( i, true);
@@ -1005,8 +1005,9 @@ void ScViewFunc::ApplyAttributes( const SfxItemSet& rDialogSet,
return;
}
- ScPatternAttr aOldAttrs(( SfxItemSet(rOldSet) ));
- ScPatternAttr aNewAttrs(( SfxItemSet(rDialogSet) ));
+ ScDocument& rDoc = GetViewData().GetDocument();
+ ScPatternAttr aOldAttrs(rDoc.getCellAttributeHelper(), &rOldSet);
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper(), &rDialogSet);
aNewAttrs.DeleteUnchanged( &aOldAttrs );
if ( rDialogSet.GetItemState( ATTR_VALUE_FORMAT ) == SfxItemState::SET )
@@ -1115,8 +1116,8 @@ void ScViewFunc::ApplyAttr( const SfxPoolItem& rAttrItem, bool bAdjustBlockHeigh
return;
}
- ScPatternAttr aNewAttrs(
- SfxItemSetFixed<ATTR_PATTERN_START, ATTR_PATTERN_END>( *GetViewData().GetDocument().GetPool() ) );
+ ScDocument& rDoc = GetViewData().GetDocument();
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
aNewAttrs.GetItemSet().Put( rAttrItem );
// if justify is set (with Buttons), always indentation 0
@@ -1426,7 +1427,7 @@ void ScViewFunc::ApplyUserItemSet( const SfxItemSet& rItemSet )
return;
}
- ScPatternAttr aNewAttrs( GetViewData().GetDocument().GetPool() );
+ ScPatternAttr aNewAttrs(GetViewData().GetDocument().getCellAttributeHelper());
SfxItemSet& rNewSet = aNewAttrs.GetItemSet();
rNewSet.Put( rItemSet, false );
ApplySelectionPattern( aNewAttrs );
@@ -2781,7 +2782,7 @@ void ScViewFunc::SetNumberFormat( SvNumFormatType nFormatType, sal_uLong nAdd )
ScDocument& rDoc = rViewData.GetDocument();
SvNumberFormatter* pNumberFormatter = rDoc.GetFormatTable();
LanguageType eLanguage = ScGlobal::eLnge;
- ScPatternAttr aNewAttrs( rDoc.GetPool() );
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
// always take language from cursor position, even if there is a selection
@@ -2837,7 +2838,7 @@ void ScViewFunc::SetNumFmtByStr( const OUString& rCode )
if ( bOk ) // valid format?
{
- ScPatternAttr aNewAttrs( rDoc.GetPool() );
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumberFormat ) );
rSet.Put( SvxLanguageItem( eLanguage, ATTR_LANGUAGE_FORMAT ) );
@@ -2970,7 +2971,7 @@ void ScViewFunc::ChangeNumFmtDecimals( bool bIncrement )
if (!bError)
{
- ScPatternAttr aNewAttrs( rDoc.GetPool() );
+ ScPatternAttr aNewAttrs(rDoc.getCellAttributeHelper());
SfxItemSet& rSet = aNewAttrs.GetItemSet();
rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
// ATTR_LANGUAGE_FORMAT not