xref: /trunk/main/sc/inc/attarray.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_ATRARR_HXX
29 #define SC_ATRARR_HXX
30 
31 #include "global.hxx"
32 #include "attrib.hxx"
33 
34 class ScDocument;
35 class ScMarkArray;
36 class ScPatternAttr;
37 class ScStyleSheet;
38 class ScFlatBoolRowSegments;
39 
40 class Rectangle;
41 class SfxItemPoolCache;
42 class SfxStyleSheetBase;
43 class SvxBorderLine;
44 class SvxBoxItem;
45 class SvxBoxInfoItem;
46 
47 #define SC_LINE_EMPTY           0
48 #define SC_LINE_SET             1
49 #define SC_LINE_DONTCARE        2
50 
51 #define SC_ATTRARRAY_DELTA      4
52 
53 struct ScLineFlags
54 {
55     sal_uInt8   nLeft;
56     sal_uInt8   nRight;
57     sal_uInt8   nTop;
58     sal_uInt8   nBottom;
59     sal_uInt8   nHori;
60     sal_uInt8   nVert;
61 
62     ScLineFlags() : nLeft(SC_LINE_EMPTY),nRight(SC_LINE_EMPTY),nTop(SC_LINE_EMPTY),
63                     nBottom(SC_LINE_EMPTY),nHori(SC_LINE_EMPTY),nVert(SC_LINE_EMPTY) {}
64 };
65 
66 struct ScMergePatternState
67 {
68     SfxItemSet* pItemSet;           // allocated in MergePatternArea, used for resulting ScPatternAttr
69     const ScPatternAttr* pOld1;     // existing objects, temporary
70     const ScPatternAttr* pOld2;
71 
72     ScMergePatternState() : pItemSet(NULL), pOld1(NULL), pOld2(NULL) {}
73 };
74 
75 struct ScAttrEntry
76 {
77     SCROW                   nRow;
78     const ScPatternAttr*    pPattern;
79 };
80 
81 
82 class ScAttrArray
83 {
84 private:
85     SCCOL           nCol;
86     SCTAB           nTab;
87     ScDocument*     pDocument;
88 
89     SCSIZE          nCount;
90     SCSIZE          nLimit;
91     ScAttrEntry*    pData;
92 
93 friend class ScDocument;                // fuer FillInfo
94 friend class ScDocumentIterator;
95 friend class ScAttrIterator;
96 friend class ScHorizontalAttrIterator;
97 friend void lcl_IterGetNumberFormat( sal_uLong& nFormat,
98         const ScAttrArray*& rpArr, SCROW& nAttrEndRow,
99         const ScAttrArray* pNewArr, SCROW nRow, ScDocument* pDoc );
100 
101     sal_Bool    ApplyFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
102                             SCROW nStartRow, SCROW nEndRow,
103                             sal_Bool bLeft, SCCOL nDistRight, sal_Bool bTop, SCROW nDistBottom );
104 
105 public:
106             ScAttrArray( SCCOL nNewCol, SCTAB nNewTab, ScDocument* pDoc );
107             ~ScAttrArray();
108 
109     void    SetTab(SCTAB nNewTab)   { nTab = nNewTab; }
110     void    SetCol(SCCOL nNewCol)   { nCol = nNewCol; }
111 #ifdef DBG_UTIL
112     void    TestData() const;
113 #endif
114     void    Reset( const ScPatternAttr* pPattern, sal_Bool bAlloc = sal_True );
115     sal_Bool    Concat(SCSIZE nPos);
116 
117     const ScPatternAttr* GetPattern( SCROW nRow ) const;
118     const ScPatternAttr* GetPatternRange( SCROW& rStartRow, SCROW& rEndRow, SCROW nRow ) const;
119     void    MergePatternArea( SCROW nStartRow, SCROW nEndRow, ScMergePatternState& rState, sal_Bool bDeep ) const;
120 
121     void    MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner, ScLineFlags& rFlags,
122                             SCROW nStartRow, SCROW nEndRow, sal_Bool bLeft, SCCOL nDistRight ) const;
123     void    ApplyBlockFrame( const SvxBoxItem* pLineOuter, const SvxBoxInfoItem* pLineInner,
124                             SCROW nStartRow, SCROW nEndRow, sal_Bool bLeft, SCCOL nDistRight );
125 
126     void    SetPattern( SCROW nRow, const ScPatternAttr* pPattern, sal_Bool bPutToPool = sal_False );
127     void    SetPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr* pPattern, sal_Bool bPutToPool = sal_False);
128     void    ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, ScStyleSheet* pStyle );
129     void    ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, SfxItemPoolCache* pCache );
130     void    ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
131                                 const SvxBorderLine* pLine, sal_Bool bColorOnly );
132 
133     void    ClearItems( SCROW nStartRow, SCROW nEndRow, const sal_uInt16* pWhich );
134     void    ChangeIndent( SCROW nStartRow, SCROW nEndRow, sal_Bool bIncrement );
135 
136             /// Including current, may return -1
137     SCsROW  GetNextUnprotected( SCsROW nRow, sal_Bool bUp ) const;
138 
139             /// May return -1 if not found
140     SCsROW  SearchStyle( SCsROW nRow, const ScStyleSheet* pSearchStyle,
141                             sal_Bool bUp, ScMarkArray* pMarkArray = NULL );
142     sal_Bool    SearchStyleRange( SCsROW& rRow, SCsROW& rEndRow, const ScStyleSheet* pSearchStyle,
143                             sal_Bool bUp, ScMarkArray* pMarkArray = NULL );
144 
145     sal_Bool    ApplyFlags( SCROW nStartRow, SCROW nEndRow, sal_Int16 nFlags );
146     sal_Bool    RemoveFlags( SCROW nStartRow, SCROW nEndRow, sal_Int16 nFlags );
147 
148     sal_Bool    Search( SCROW nRow, SCSIZE& nIndex ) const;
149 
150     sal_Bool    HasLines( SCROW nRow1, SCROW nRow2, Rectangle& rSizes,
151                         sal_Bool bLeft, sal_Bool bRight ) const;
152     bool    HasAttrib( SCROW nRow1, SCROW nRow2, sal_uInt16 nMask ) const;
153     sal_Bool    ExtendMerge( SCCOL nThisCol, SCROW nStartRow, SCROW nEndRow,
154                                 SCCOL& rPaintCol, SCROW& rPaintRow,
155                                 sal_Bool bRefresh, sal_Bool bAttrs );
156     sal_Bool    RemoveAreaMerge( SCROW nStartRow, SCROW nEndRow );
157 
158     void    FindStyleSheet( const SfxStyleSheetBase* pStyleSheet, ScFlatBoolRowSegments& rUsedRows, bool bReset );
159     sal_Bool    IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGatherAllStyles ) const;
160 
161     void    DeleteAreaSafe(SCROW nStartRow, SCROW nEndRow);
162     void    SetPatternAreaSafe( SCROW nStartRow, SCROW nEndRow,
163                                     const ScPatternAttr* pWantedPattern, sal_Bool bDefault );
164     void    CopyAreaSafe( SCROW nStartRow, SCROW nEndRow, long nDy, ScAttrArray& rAttrArray );
165 
166     sal_Bool    IsEmpty() const;
167 
168 //UNUSED2008-05  SCROW  GetFirstEntryPos() const;
169 //UNUSED2008-05  SCROW  GetLastEntryPos( sal_Bool bIncludeBottom ) const;
170 
171     sal_Bool    GetFirstVisibleAttr( SCROW& rFirstRow ) const;
172     sal_Bool    GetLastVisibleAttr( SCROW& rLastRow, SCROW nLastData ) const;
173     sal_Bool    HasVisibleAttrIn( SCROW nStartRow, SCROW nEndRow ) const;
174     sal_Bool    IsVisibleEqual( const ScAttrArray& rOther,
175                             SCROW nStartRow, SCROW nEndRow ) const;
176     sal_Bool    IsAllEqual( const ScAttrArray& rOther, SCROW nStartRow, SCROW nEndRow ) const;
177 
178     sal_Bool    TestInsertCol( SCROW nStartRow, SCROW nEndRow) const;
179     sal_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 );
185     void    CopyArea( SCROW nStartRow, SCROW nEndRow, long nDy, ScAttrArray& rAttrArray,
186                         sal_Int16 nStripFlags = 0 );
187 
188     void    DeleteHardAttr( SCROW nStartRow, SCROW nEndRow );
189 
190 //UNUSED2008-05  void    ConvertFontsAfterLoad();     // old binary file format
191 };
192 
193 
194 //  ------------------------------------------------------------------------------
195 //                              Iterator fuer Attribute
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     SCROW               GetNextRow() const { return nRow; }
208 };
209 
210 
211 inline ScAttrIterator::ScAttrIterator( const ScAttrArray* pNewArray, SCROW nStart, SCROW nEnd ) :
212     pArray( pNewArray ),
213     nRow( nStart ),
214     nEndRow( nEnd )
215 {
216     if ( nStart > 0 )
217         pArray->Search( nStart, nPos );
218     else
219         nPos = 0;
220 }
221 
222 inline const ScPatternAttr* ScAttrIterator::Next( SCROW& rTop, SCROW& rBottom )
223 {
224     const ScPatternAttr* pRet;
225     if ( nPos < pArray->nCount && nRow <= nEndRow )
226     {
227         rTop = nRow;
228         rBottom = Min( pArray->pData[nPos].nRow, nEndRow );
229         pRet = pArray->pData[nPos].pPattern;
230         nRow = rBottom + 1;
231         ++nPos;
232     }
233     else
234         pRet = NULL;
235     return pRet;
236 }
237 
238 
239 
240 #endif
241 
242 
243