Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #ifndef SC_ATRARR_HXX
21 : #define SC_ATRARR_HXX
22 :
23 : #include "global.hxx"
24 : #include "attrib.hxx"
25 :
26 : class ScDocument;
27 : class ScEditDataArray;
28 : class ScMarkArray;
29 : class ScPatternAttr;
30 : class ScStyleSheet;
31 : class ScFlatBoolRowSegments;
32 :
33 : class SfxItemPoolCache;
34 : class SfxStyleSheetBase;
35 : class SvxBoxItem;
36 : class SvxBoxInfoItem;
37 :
38 : namespace editeng { class SvxBorderLine; }
39 :
40 : #define SC_LINE_EMPTY 0
41 : #define SC_LINE_SET 1
42 : #define SC_LINE_DONTCARE 2
43 :
44 : #define SC_ATTRARRAY_DELTA 4
45 :
46 : struct ScLineFlags
47 : {
48 : sal_uInt8 nLeft;
49 : sal_uInt8 nRight;
50 : sal_uInt8 nTop;
51 : sal_uInt8 nBottom;
52 : sal_uInt8 nHori;
53 : sal_uInt8 nVert;
54 :
55 54 : ScLineFlags() : nLeft(SC_LINE_EMPTY),nRight(SC_LINE_EMPTY),nTop(SC_LINE_EMPTY),
56 54 : nBottom(SC_LINE_EMPTY),nHori(SC_LINE_EMPTY),nVert(SC_LINE_EMPTY) {}
57 : };
58 :
59 : struct ScMergePatternState
60 : {
61 : SfxItemSet* pItemSet; ///< allocated in MergePatternArea, used for resulting ScPatternAttr
62 : const ScPatternAttr* pOld1; ///< existing objects, temporary
63 : const ScPatternAttr* pOld2;
64 :
65 10406 : ScMergePatternState() : pItemSet(NULL), pOld1(NULL), pOld2(NULL) {}
66 : };
67 :
68 : struct ScAttrEntry
69 : {
70 : SCROW nRow;
71 : const ScPatternAttr* pPattern;
72 : };
73 :
74 :
75 : class ScAttrArray
76 : {
77 : private:
78 : SCCOL nCol;
79 : SCTAB nTab;
80 : ScDocument* pDocument;
81 :
82 : SCSIZE nCount;
83 : SCSIZE nLimit;
84 : ScAttrEntry* pData;
85 :
86 : friend class ScDocument; // for FillInfo
87 : friend class ScDocumentIterator;
88 : friend class ScAttrIterator;
89 : friend class ScHorizontalAttrIterator;
90 :
91 : bool ApplyFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
92 : SCROW nStartRow, SCROW nEndRow,
93 : bool bLeft, SCCOL nDistRight, bool bTop, SCROW nDistBottom );
94 :
95 : void RemoveCellCharAttribs( SCROW nStartRow, SCROW nEndRow,
96 : const ScPatternAttr* pPattern, ScEditDataArray* pDataArray );
97 :
98 : // prevent the copy c'tor and operator=
99 : // this is just to prevent accidental use
100 : ScAttrArray(const ScAttrArray&);
101 : ScAttrArray& operator=(const ScAttrArray&);
102 :
103 : public:
104 : ScAttrArray( SCCOL nNewCol, SCTAB nNewTab, ScDocument* pDoc );
105 : ~ScAttrArray();
106 :
107 97280 : void SetTab(SCTAB nNewTab) { nTab = nNewTab; }
108 26586 : void SetCol(SCCOL nNewCol) { nCol = nNewCol; }
109 : #if OSL_DEBUG_LEVEL > 1
110 : void TestData() const;
111 : #endif
112 : void Reset( const ScPatternAttr* pPattern);
113 : bool Concat(SCSIZE nPos);
114 :
115 : const ScPatternAttr* GetPattern( SCROW nRow ) const;
116 : const ScPatternAttr* GetPatternRange( SCROW& rStartRow, SCROW& rEndRow, SCROW nRow ) const;
117 : void MergePatternArea( SCROW nStartRow, SCROW nEndRow, ScMergePatternState& rState, bool bDeep ) const;
118 :
119 : void MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner, ScLineFlags& rFlags,
120 : SCROW nStartRow, SCROW nEndRow, bool bLeft, SCCOL nDistRight ) const;
121 : void ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
122 : SCROW nStartRow, SCROW nEndRow, bool bLeft, SCCOL nDistRight );
123 :
124 : void SetPattern( SCROW nRow, const ScPatternAttr* pPattern, bool bPutToPool = false );
125 : void SetPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr* pPattern,
126 : bool bPutToPool = false, ScEditDataArray* pDataArray = NULL );
127 : void ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, ScStyleSheet* pStyle );
128 : void ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, SfxItemPoolCache* pCache,
129 : ScEditDataArray* pDataArray = NULL );
130 : bool SetAttrEntries(ScAttrEntry* pNewData, SCSIZE nSize);
131 : void ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
132 : const ::editeng::SvxBorderLine* pLine, bool bColorOnly );
133 :
134 : void AddCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 nIndex );
135 : void RemoveCondFormat( SCROW nStartRow, SCROW nEndRow, sal_uInt32 nIndex );
136 :
137 : void ClearItems( SCROW nStartRow, SCROW nEndRow, const sal_uInt16* pWhich );
138 : void ChangeIndent( SCROW nStartRow, SCROW nEndRow, bool bIncrement );
139 :
140 : /// Including current, may return -1
141 : SCsROW GetNextUnprotected( SCsROW nRow, bool bUp ) const;
142 :
143 : /// May return -1 if not found
144 : SCsROW SearchStyle(
145 : SCsROW nRow, const ScStyleSheet* pSearchStyle, bool bUp,
146 : const ScMarkArray* pMarkArray = NULL) const;
147 :
148 : bool SearchStyleRange(
149 : SCsROW& rRow, SCsROW& rEndRow, const ScStyleSheet* pSearchStyle, bool bUp,
150 : const ScMarkArray* pMarkArray = NULL) const;
151 :
152 : bool ApplyFlags( SCROW nStartRow, SCROW nEndRow, sal_Int16 nFlags );
153 : bool RemoveFlags( SCROW nStartRow, SCROW nEndRow, sal_Int16 nFlags );
154 :
155 : bool Search( SCROW nRow, SCSIZE& nIndex ) const;
156 :
157 : bool HasAttrib( SCROW nRow1, SCROW nRow2, sal_uInt16 nMask ) const;
158 : bool ExtendMerge( SCCOL nThisCol, SCROW nStartRow, SCROW nEndRow,
159 : SCCOL& rPaintCol, SCROW& rPaintRow,
160 : bool bRefresh );
161 : bool RemoveAreaMerge( SCROW nStartRow, SCROW nEndRow );
162 :
163 : void FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, ScFlatBoolRowSegments& rUsedRows, bool bReset );
164 : bool IsStyleSheetUsed( const ScStyleSheet& rStyle, bool bGatherAllStyles ) const;
165 :
166 : void DeleteAreaSafe(SCROW nStartRow, SCROW nEndRow);
167 : void SetPatternAreaSafe( SCROW nStartRow, SCROW nEndRow,
168 : const ScPatternAttr* pWantedPattern, bool bDefault );
169 : void CopyAreaSafe( SCROW nStartRow, SCROW nEndRow, long nDy, ScAttrArray& rAttrArray );
170 :
171 : bool IsEmpty() const;
172 :
173 : bool GetFirstVisibleAttr( SCROW& rFirstRow ) const;
174 : bool GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData, bool bFullFormattedArea = false ) const;
175 : bool HasVisibleAttrIn( SCROW nStartRow, SCROW nEndRow ) const;
176 : bool IsVisibleEqual( const ScAttrArray& rOther,
177 : SCROW nStartRow, SCROW nEndRow ) const;
178 : bool IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW nEndRow ) const;
179 :
180 : bool TestInsertCol( SCROW nStartRow, SCROW nEndRow) const;
181 : bool TestInsertRow( SCSIZE nSize ) const;
182 : void InsertRow( SCROW nStartRow, SCSIZE nSize );
183 : void DeleteRow( SCROW nStartRow, SCSIZE nSize );
184 : void DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex );
185 : void DeleteArea( SCROW nStartRow, SCROW nEndRow );
186 : void MoveTo( SCROW nStartRow, SCROW nEndRow, ScAttrArray& rAttrArray );
187 : void CopyArea(
188 : SCROW nStartRow, SCROW nEndRow, long nDy, ScAttrArray& rAttrArray, sal_Int16 nStripFlags = 0) const;
189 :
190 : void DeleteHardAttr( SCROW nStartRow, SCROW nEndRow );
191 : };
192 :
193 :
194 : // ------------------------------------------------------------------------------
195 : // Iterator for attributes
196 : // ------------------------------------------------------------------------------
197 :
198 : class ScAttrIterator
199 : {
200 : const ScAttrArray* pArray;
201 : SCSIZE nPos;
202 : SCROW nRow;
203 : SCROW nEndRow;
204 : public:
205 : inline ScAttrIterator( const ScAttrArray* pNewArray, SCROW nStart, SCROW nEnd );
206 : inline const ScPatternAttr* Next( SCROW& rTop, SCROW& rBottom );
207 0 : SCROW GetNextRow() const { return nRow; }
208 : };
209 :
210 :
211 1264180 : inline ScAttrIterator::ScAttrIterator( const ScAttrArray* pNewArray, SCROW nStart, SCROW nEnd ) :
212 : pArray( pNewArray ),
213 : nRow( nStart ),
214 1264180 : nEndRow( nEnd )
215 : {
216 1264180 : if ( nStart > 0 )
217 379976 : pArray->Search( nStart, nPos );
218 : else
219 884204 : nPos = 0;
220 1264180 : }
221 :
222 2530648 : inline const ScPatternAttr* ScAttrIterator::Next( SCROW& rTop, SCROW& rBottom )
223 : {
224 : const ScPatternAttr* pRet;
225 2530648 : if ( nPos < pArray->nCount && nRow <= nEndRow )
226 : {
227 1268535 : rTop = nRow;
228 1268535 : rBottom = std::min( pArray->pData[nPos].nRow, nEndRow );
229 1268535 : pRet = pArray->pData[nPos].pPattern;
230 1268535 : nRow = rBottom + 1;
231 1268535 : ++nPos;
232 : }
233 : else
234 1262113 : pRet = NULL;
235 2530648 : return pRet;
236 : }
237 :
238 :
239 :
240 : #endif
241 :
242 :
243 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|