1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
27 class ScEditDataArray
;
31 class ScFlatBoolRowSegments
;
33 class SfxItemPoolCache
;
34 class SfxStyleSheetBase
;
38 namespace editeng
{ class SvxBorderLine
; }
40 #define SC_LINE_EMPTY 0
42 #define SC_LINE_DONTCARE 2
44 #define SC_ATTRARRAY_DELTA 4
55 ScLineFlags() : nLeft(SC_LINE_EMPTY
),nRight(SC_LINE_EMPTY
),nTop(SC_LINE_EMPTY
),
56 nBottom(SC_LINE_EMPTY
),nHori(SC_LINE_EMPTY
),nVert(SC_LINE_EMPTY
) {}
59 struct ScMergePatternState
61 SfxItemSet
* pItemSet
; ///< allocated in MergePatternArea, used for resulting ScPatternAttr
62 const ScPatternAttr
* pOld1
; ///< existing objects, temporary
63 const ScPatternAttr
* pOld2
;
65 ScMergePatternState() : pItemSet(NULL
), pOld1(NULL
), pOld2(NULL
) {}
71 const ScPatternAttr
* pPattern
;
80 ScDocument
* pDocument
;
86 friend class ScDocument
; // for FillInfo
87 friend class ScDocumentIterator
;
88 friend class ScAttrIterator
;
89 friend class ScHorizontalAttrIterator
;
90 friend void ScAttrArray_IterGetNumberFormat( sal_uLong
& nFormat
,
91 const ScAttrArray
*& rpArr
, SCROW
& nAttrEndRow
,
92 const ScAttrArray
* pNewArr
, SCROW nRow
, ScDocument
* pDoc
);
94 bool ApplyFrame( const SvxBoxItem
* pLineOuter
, const SvxBoxInfoItem
* pLineInner
,
95 SCROW nStartRow
, SCROW nEndRow
,
96 bool bLeft
, SCCOL nDistRight
, bool bTop
, SCROW nDistBottom
);
98 void RemoveCellCharAttribs( SCROW nStartRow
, SCROW nEndRow
,
99 const ScPatternAttr
* pPattern
, ScEditDataArray
* pDataArray
);
102 ScAttrArray( SCCOL nNewCol
, SCTAB nNewTab
, ScDocument
* pDoc
);
105 void SetTab(SCTAB nNewTab
) { nTab
= nNewTab
; }
106 void SetCol(SCCOL nNewCol
) { nCol
= nNewCol
; }
107 #if OSL_DEBUG_LEVEL > 1
108 void TestData() const;
110 void Reset( const ScPatternAttr
* pPattern
, bool bAlloc
= sal_True
);
111 bool Concat(SCSIZE nPos
);
113 const ScPatternAttr
* GetPattern( SCROW nRow
) const;
114 const ScPatternAttr
* GetPatternRange( SCROW
& rStartRow
, SCROW
& rEndRow
, SCROW nRow
) const;
115 void MergePatternArea( SCROW nStartRow
, SCROW nEndRow
, ScMergePatternState
& rState
, bool bDeep
) const;
117 void MergeBlockFrame( SvxBoxItem
* pLineOuter
, SvxBoxInfoItem
* pLineInner
, ScLineFlags
& rFlags
,
118 SCROW nStartRow
, SCROW nEndRow
, bool bLeft
, SCCOL nDistRight
) const;
119 void ApplyBlockFrame( const SvxBoxItem
* pLineOuter
, const SvxBoxInfoItem
* pLineInner
,
120 SCROW nStartRow
, SCROW nEndRow
, bool bLeft
, SCCOL nDistRight
);
122 void SetPattern( SCROW nRow
, const ScPatternAttr
* pPattern
, bool bPutToPool
= false );
123 void SetPatternArea( SCROW nStartRow
, SCROW nEndRow
, const ScPatternAttr
* pPattern
,
124 bool bPutToPool
= false, ScEditDataArray
* pDataArray
= NULL
);
125 void ApplyStyleArea( SCROW nStartRow
, SCROW nEndRow
, ScStyleSheet
* pStyle
);
126 void ApplyCacheArea( SCROW nStartRow
, SCROW nEndRow
, SfxItemPoolCache
* pCache
,
127 ScEditDataArray
* pDataArray
= NULL
);
128 bool SetAttrEntries(ScAttrEntry
* pNewData
, SCSIZE nSize
);
129 void ApplyLineStyleArea( SCROW nStartRow
, SCROW nEndRow
,
130 const ::editeng::SvxBorderLine
* pLine
, bool bColorOnly
);
132 void AddCondFormat( SCROW nStartRow
, SCROW nEndRow
, sal_uInt32 nIndex
);
133 void RemoveCondFormat( SCROW nStartRow
, SCROW nEndRow
, sal_uInt32 nIndex
);
135 void ClearItems( SCROW nStartRow
, SCROW nEndRow
, const sal_uInt16
* pWhich
);
136 void ChangeIndent( SCROW nStartRow
, SCROW nEndRow
, bool bIncrement
);
138 /// Including current, may return -1
139 SCsROW
GetNextUnprotected( SCsROW nRow
, bool bUp
) const;
141 /// May return -1 if not found
143 SCsROW nRow
, const ScStyleSheet
* pSearchStyle
, bool bUp
,
144 const ScMarkArray
* pMarkArray
= NULL
) const;
146 bool SearchStyleRange(
147 SCsROW
& rRow
, SCsROW
& rEndRow
, const ScStyleSheet
* pSearchStyle
, bool bUp
,
148 const ScMarkArray
* pMarkArray
= NULL
) const;
150 bool ApplyFlags( SCROW nStartRow
, SCROW nEndRow
, sal_Int16 nFlags
);
151 bool RemoveFlags( SCROW nStartRow
, SCROW nEndRow
, sal_Int16 nFlags
);
153 bool Search( SCROW nRow
, SCSIZE
& nIndex
) const;
155 bool HasAttrib( SCROW nRow1
, SCROW nRow2
, sal_uInt16 nMask
) const;
156 bool ExtendMerge( SCCOL nThisCol
, SCROW nStartRow
, SCROW nEndRow
,
157 SCCOL
& rPaintCol
, SCROW
& rPaintRow
,
159 bool RemoveAreaMerge( SCROW nStartRow
, SCROW nEndRow
);
161 void FindStyleSheet( const SfxStyleSheetBase
* pStyleSheet
, ScFlatBoolRowSegments
& rUsedRows
, bool bReset
);
162 bool IsStyleSheetUsed( const ScStyleSheet
& rStyle
, bool bGatherAllStyles
) const;
164 void DeleteAreaSafe(SCROW nStartRow
, SCROW nEndRow
);
165 void SetPatternAreaSafe( SCROW nStartRow
, SCROW nEndRow
,
166 const ScPatternAttr
* pWantedPattern
, bool bDefault
);
167 void CopyAreaSafe( SCROW nStartRow
, SCROW nEndRow
, long nDy
, ScAttrArray
& rAttrArray
);
169 bool IsEmpty() const;
171 bool GetFirstVisibleAttr( SCROW
& rFirstRow
) const;
172 bool GetLastVisibleAttr( SCROW
& rLastRow
, SCROW nLastData
, bool bFullFormattedArea
= false ) const;
173 bool HasVisibleAttrIn( SCROW nStartRow
, SCROW nEndRow
) const;
174 bool IsVisibleEqual( const ScAttrArray
& rOther
,
175 SCROW nStartRow
, SCROW nEndRow
) const;
176 bool IsAllEqual( const ScAttrArray
& rOther
, SCROW nStartRow
, SCROW nEndRow
) const;
178 bool TestInsertCol( SCROW nStartRow
, SCROW nEndRow
) const;
179 bool TestInsertRow( SCSIZE nSize
) const;
180 void InsertRow( SCROW nStartRow
, SCSIZE nSize
);
181 void DeleteRow( SCROW nStartRow
, SCSIZE nSize
);
182 void DeleteRange( SCSIZE nStartIndex
, SCSIZE nEndIndex
);
183 void DeleteArea( SCROW nStartRow
, SCROW nEndRow
);
184 void MoveTo( SCROW nStartRow
, SCROW nEndRow
, ScAttrArray
& rAttrArray
);
186 SCROW nStartRow
, SCROW nEndRow
, long nDy
, ScAttrArray
& rAttrArray
, sal_Int16 nStripFlags
= 0) const;
188 void DeleteHardAttr( SCROW nStartRow
, SCROW nEndRow
);
192 // ------------------------------------------------------------------------------
193 // Iterator for attributes
194 // ------------------------------------------------------------------------------
198 const ScAttrArray
* pArray
;
203 inline ScAttrIterator( const ScAttrArray
* pNewArray
, SCROW nStart
, SCROW nEnd
);
204 inline const ScPatternAttr
* Next( SCROW
& rTop
, SCROW
& rBottom
);
205 SCROW
GetNextRow() const { return nRow
; }
209 inline ScAttrIterator::ScAttrIterator( const ScAttrArray
* pNewArray
, SCROW nStart
, SCROW nEnd
) :
215 pArray
->Search( nStart
, nPos
);
220 inline const ScPatternAttr
* ScAttrIterator::Next( SCROW
& rTop
, SCROW
& rBottom
)
222 const ScPatternAttr
* pRet
;
223 if ( nPos
< pArray
->nCount
&& nRow
<= nEndRow
)
226 rBottom
= Min( pArray
->pData
[nPos
].nRow
, nEndRow
);
227 pRet
= pArray
->pData
[nPos
].pPattern
;
241 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */