xref: /trunk/main/sc/inc/dociter.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
138d50f7bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
338d50f7bSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
438d50f7bSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
538d50f7bSAndrew Rist  * distributed with this work for additional information
638d50f7bSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
738d50f7bSAndrew Rist  * to you under the Apache License, Version 2.0 (the
838d50f7bSAndrew Rist  * "License"); you may not use this file except in compliance
938d50f7bSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1138d50f7bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1338d50f7bSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1438d50f7bSAndrew Rist  * software distributed under the License is distributed on an
1538d50f7bSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1638d50f7bSAndrew Rist  * KIND, either express or implied.  See the License for the
1738d50f7bSAndrew Rist  * specific language governing permissions and limitations
1838d50f7bSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2038d50f7bSAndrew Rist  *************************************************************/
2138d50f7bSAndrew Rist 
2238d50f7bSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef SC_DOCITER_HXX
25cdf0e10cSrcweir #define SC_DOCITER_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "address.hxx"
28cdf0e10cSrcweir #include <tools/solar.h>
29cdf0e10cSrcweir #include "global.hxx"
30cdf0e10cSrcweir #include "scdllapi.h"
31cdf0e10cSrcweir #include "queryparam.hxx"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <memory>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <set>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir class ScDocument;
38cdf0e10cSrcweir class ScBaseCell;
39cdf0e10cSrcweir class ScPatternAttr;
40cdf0e10cSrcweir class ScAttrArray;
41cdf0e10cSrcweir class ScAttrIterator;
42cdf0e10cSrcweir class ScRange;
43cdf0e10cSrcweir 
44f750960cSPeter Kovacs class ScDocumentIterator                // run through all non empty cells
45cdf0e10cSrcweir {
46cdf0e10cSrcweir private:
47cdf0e10cSrcweir     ScDocument*             pDoc;
48cdf0e10cSrcweir     SCTAB                   nStartTab;
49cdf0e10cSrcweir     SCTAB                   nEndTab;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir     const ScPatternAttr*    pDefPattern;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir     SCCOL                   nCol;
54cdf0e10cSrcweir     SCROW                   nRow;
55cdf0e10cSrcweir     SCTAB                   nTab;
56cdf0e10cSrcweir     ScBaseCell*             pCell;
57cdf0e10cSrcweir     const ScPatternAttr*    pPattern;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     SCSIZE                  nColPos;
61cdf0e10cSrcweir     SCSIZE                  nAttrPos;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir     sal_Bool                    GetThis();
64cdf0e10cSrcweir     sal_Bool                    GetThisCol();
65cdf0e10cSrcweir 
66cdf0e10cSrcweir public:
67cdf0e10cSrcweir             ScDocumentIterator( ScDocument* pDocument, SCTAB nStartTable, SCTAB nEndTable );
68cdf0e10cSrcweir             ~ScDocumentIterator();
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     sal_Bool                    GetFirst();
71cdf0e10cSrcweir     sal_Bool                    GetNext();
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     ScBaseCell*             GetCell();
74cdf0e10cSrcweir     const ScPatternAttr*    GetPattern();
75cdf0e10cSrcweir     void                    GetPos( SCCOL& rCol, SCROW& rRow, SCTAB& rTab );
76cdf0e10cSrcweir };
77cdf0e10cSrcweir 
78f750960cSPeter Kovacs class ScValueIterator            // run through all numbers in one area
79cdf0e10cSrcweir {
80cdf0e10cSrcweir private:
81cdf0e10cSrcweir     double          fNextValue;
82cdf0e10cSrcweir     ScDocument*     pDoc;
83cdf0e10cSrcweir     const ScAttrArray*  pAttrArray;
84f750960cSPeter Kovacs     sal_uLong           nNumFormat;     // for CalcAsShown
85cdf0e10cSrcweir     sal_uLong           nNumFmtIndex;
86cdf0e10cSrcweir     SCCOL           nStartCol;
87cdf0e10cSrcweir     SCROW           nStartRow;
88cdf0e10cSrcweir     SCTAB           nStartTab;
89cdf0e10cSrcweir     SCCOL           nEndCol;
90cdf0e10cSrcweir     SCROW           nEndRow;
91cdf0e10cSrcweir     SCTAB           nEndTab;
92cdf0e10cSrcweir     SCCOL           nCol;
93cdf0e10cSrcweir     SCROW           nRow;
94cdf0e10cSrcweir     SCTAB           nTab;
95cdf0e10cSrcweir     SCSIZE          nColRow;
96cdf0e10cSrcweir     SCROW           nNextRow;
97cdf0e10cSrcweir     SCROW           nAttrEndRow;
98cdf0e10cSrcweir     short           nNumFmtType;
99cdf0e10cSrcweir     sal_Bool            bNumValid;
100cdf0e10cSrcweir     sal_Bool            bSubTotal;
101cdf0e10cSrcweir     sal_Bool            bNextValid;
102cdf0e10cSrcweir     sal_Bool            bCalcAsShown;
103cdf0e10cSrcweir     sal_Bool            bTextAsZero;
104cdf0e10cSrcweir 
105cdf0e10cSrcweir     sal_Bool            GetThis(double& rValue, sal_uInt16& rErr);
106cdf0e10cSrcweir public:
107cdf0e10cSrcweir //UNUSED2008-05  ScValueIterator(ScDocument* pDocument,
108cdf0e10cSrcweir //UNUSED2008-05                  SCCOL nSCol, SCROW nSRow, SCTAB nSTab,
109cdf0e10cSrcweir //UNUSED2008-05                  SCCOL nECol, SCROW nERow, SCTAB nETab,
110cdf0e10cSrcweir //UNUSED2008-05                  sal_Bool bSTotal = sal_False, sal_Bool bTextAsZero = sal_False);
111cdf0e10cSrcweir 
112cdf0e10cSrcweir                     ScValueIterator(ScDocument* pDocument,
113cdf0e10cSrcweir                                     const ScRange& rRange, sal_Bool bSTotal = sal_False,
114cdf0e10cSrcweir                                     sal_Bool bTextAsZero = sal_False );
115cdf0e10cSrcweir     void            GetCurNumFmtInfo( short& nType, sal_uLong& nIndex );
116cdf0e10cSrcweir     /// Does NOT reset rValue if no value found!
117cdf0e10cSrcweir     sal_Bool            GetFirst(double& rValue, sal_uInt16& rErr);
118cdf0e10cSrcweir     /// Does NOT reset rValue if no value found!
GetNext(double & rValue,sal_uInt16 & rErr)119cdf0e10cSrcweir     sal_Bool            GetNext(double& rValue, sal_uInt16& rErr)
120cdf0e10cSrcweir                     {
121cdf0e10cSrcweir                         return bNextValid ? ( bNextValid = sal_False, rValue = fNextValue,
122cdf0e10cSrcweir                                                 rErr = 0, nRow = nNextRow,
123cdf0e10cSrcweir                                                 ++nColRow, bNumValid = sal_False, sal_True )
124cdf0e10cSrcweir                                           : ( ++nRow, GetThis(rValue, rErr) );
125cdf0e10cSrcweir                     }
126cdf0e10cSrcweir };
127cdf0e10cSrcweir 
128cdf0e10cSrcweir // ============================================================================
129cdf0e10cSrcweir 
130cdf0e10cSrcweir class ScDBQueryDataIterator
131cdf0e10cSrcweir {
132cdf0e10cSrcweir public:
133cdf0e10cSrcweir     struct Value
134cdf0e10cSrcweir     {
135cdf0e10cSrcweir         ::rtl::OUString maString;
136cdf0e10cSrcweir         double          mfValue;
137cdf0e10cSrcweir         sal_uInt16      mnError;
138cdf0e10cSrcweir         bool            mbIsNumber;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir         Value();
141cdf0e10cSrcweir     };
142cdf0e10cSrcweir 
143cdf0e10cSrcweir private:
144cdf0e10cSrcweir     static SCROW        GetRowByColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCCOL nCol, SCSIZE nColRow);
145cdf0e10cSrcweir     static ScBaseCell*  GetCellByColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCCOL nCol, SCSIZE nColRow);
146cdf0e10cSrcweir     static ScAttrArray* GetAttrArrayByCol(ScDocument& rDoc, SCTAB nTab, SCCOL nCol);
147cdf0e10cSrcweir     static bool         IsQueryValid(ScDocument& rDoc, const ScQueryParam& rParam, SCTAB nTab, SCROW nRow, ScBaseCell* pCell);
148cdf0e10cSrcweir     static SCSIZE       SearchColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCROW nRow, SCCOL nCol);
149cdf0e10cSrcweir 
150cdf0e10cSrcweir     class DataAccess
151cdf0e10cSrcweir     {
152cdf0e10cSrcweir     public:
153cdf0e10cSrcweir         DataAccess(const ScDBQueryDataIterator* pParent);
154cdf0e10cSrcweir         virtual ~DataAccess() = 0;
155cdf0e10cSrcweir         virtual bool getCurrent(Value& rValue) = 0;
156cdf0e10cSrcweir         virtual bool getFirst(Value& rValue) = 0;
157cdf0e10cSrcweir         virtual bool getNext(Value& rValue) = 0;
158cdf0e10cSrcweir     protected:
159cdf0e10cSrcweir         const ScDBQueryDataIterator* mpParent;
160cdf0e10cSrcweir     };
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     class DataAccessInternal : public DataAccess
163cdf0e10cSrcweir     {
164cdf0e10cSrcweir     public:
165cdf0e10cSrcweir         DataAccessInternal(const ScDBQueryDataIterator* pParent, ScDBQueryParamInternal* pParam, ScDocument* pDoc);
166cdf0e10cSrcweir         virtual ~DataAccessInternal();
167cdf0e10cSrcweir         virtual bool getCurrent(Value& rValue);
168cdf0e10cSrcweir         virtual bool getFirst(Value& rValue);
169cdf0e10cSrcweir         virtual bool getNext(Value& rValue);
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     private:
172cdf0e10cSrcweir         ScDBQueryParamInternal* mpParam;
173cdf0e10cSrcweir         ScDocument*         mpDoc;
174cdf0e10cSrcweir         const ScAttrArray*  pAttrArray;
175cdf0e10cSrcweir         sal_uLong               nNumFormat;     // for CalcAsShown
176cdf0e10cSrcweir         sal_uLong               nNumFmtIndex;
177cdf0e10cSrcweir         SCCOL               nCol;
178cdf0e10cSrcweir         SCROW               nRow;
179cdf0e10cSrcweir         SCSIZE              nColRow;
180cdf0e10cSrcweir         SCROW               nAttrEndRow;
181cdf0e10cSrcweir         SCTAB               nTab;
182cdf0e10cSrcweir         short               nNumFmtType;
183cdf0e10cSrcweir         bool                bCalcAsShown;
184cdf0e10cSrcweir     };
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     class DataAccessMatrix : public DataAccess
187cdf0e10cSrcweir     {
188cdf0e10cSrcweir     public:
189cdf0e10cSrcweir         DataAccessMatrix(const ScDBQueryDataIterator* pParent, ScDBQueryParamMatrix* pParam);
190cdf0e10cSrcweir         virtual ~DataAccessMatrix();
191cdf0e10cSrcweir         virtual bool getCurrent(Value& rValue);
192cdf0e10cSrcweir         virtual bool getFirst(Value& rValue);
193cdf0e10cSrcweir         virtual bool getNext(Value& rValue);
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     private:
196cdf0e10cSrcweir         bool isValidQuery(SCROW mnRow, const ScMatrix& rMat) const;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir         ScDBQueryParamMatrix* mpParam;
199cdf0e10cSrcweir         SCROW mnCurRow;
200cdf0e10cSrcweir         SCROW mnRows;
201cdf0e10cSrcweir         SCCOL mnCols;
202cdf0e10cSrcweir     };
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     ::std::auto_ptr<ScDBQueryParamBase> mpParam;
205cdf0e10cSrcweir     ::std::auto_ptr<DataAccess>         mpData;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir public:
208cdf0e10cSrcweir                     ScDBQueryDataIterator(ScDocument* pDocument, ScDBQueryParamBase* pParam);
209cdf0e10cSrcweir     /// Does NOT reset rValue if no value found!
210cdf0e10cSrcweir     bool            GetFirst(Value& rValue);
211cdf0e10cSrcweir     /// Does NOT reset rValue if no value found!
212cdf0e10cSrcweir     bool            GetNext(Value& rValue);
213cdf0e10cSrcweir };
214cdf0e10cSrcweir 
215cdf0e10cSrcweir // ============================================================================
216cdf0e10cSrcweir 
217f750960cSPeter Kovacs class ScCellIterator            // run through all cell in one Area
218f750960cSPeter Kovacs {                               // at SubTotal, skip hidden and
219f750960cSPeter Kovacs private:                        // SubTotal line
220cdf0e10cSrcweir     ScDocument*     pDoc;
221cdf0e10cSrcweir     SCCOL           nStartCol;
222cdf0e10cSrcweir     SCROW           nStartRow;
223cdf0e10cSrcweir     SCTAB           nStartTab;
224cdf0e10cSrcweir     SCCOL           nEndCol;
225cdf0e10cSrcweir     SCROW           nEndRow;
226cdf0e10cSrcweir     SCTAB           nEndTab;
227cdf0e10cSrcweir     SCCOL           nCol;
228cdf0e10cSrcweir     SCROW           nRow;
229cdf0e10cSrcweir     SCTAB           nTab;
230cdf0e10cSrcweir     SCSIZE          nColRow;
231cdf0e10cSrcweir     sal_Bool            bSubTotal;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     ScBaseCell*     GetThis();
234cdf0e10cSrcweir public:
235cdf0e10cSrcweir                     ScCellIterator(ScDocument* pDocument,
236cdf0e10cSrcweir                                    SCCOL nSCol, SCROW nSRow, SCTAB nSTab,
237cdf0e10cSrcweir                                    SCCOL nECol, SCROW nERow, SCTAB nETab,
238cdf0e10cSrcweir                                    sal_Bool bSTotal = sal_False);
239cdf0e10cSrcweir                     ScCellIterator(ScDocument* pDocument,
240cdf0e10cSrcweir                                    const ScRange& rRange, sal_Bool bSTotal = sal_False);
241cdf0e10cSrcweir     ScBaseCell*     GetFirst();
242cdf0e10cSrcweir     ScBaseCell*     GetNext();
GetCol() const243cdf0e10cSrcweir     SCCOL           GetCol() const { return nCol; }
GetRow() const244cdf0e10cSrcweir     SCROW           GetRow() const { return nRow; }
GetTab() const245cdf0e10cSrcweir     SCTAB           GetTab() const { return nTab; }
GetPos() const246cdf0e10cSrcweir     ScAddress       GetPos() const { return ScAddress( nCol, nRow, nTab ); }
247cdf0e10cSrcweir };
248cdf0e10cSrcweir 
249f750960cSPeter Kovacs class ScQueryCellIterator           // run through all not empty cells in an area
250f750960cSPeter Kovacs {
251cdf0e10cSrcweir     enum StopOnMismatchBits
252cdf0e10cSrcweir     {
253cdf0e10cSrcweir         nStopOnMismatchDisabled = 0x00,
254cdf0e10cSrcweir         nStopOnMismatchEnabled  = 0x01,
255cdf0e10cSrcweir         nStopOnMismatchOccured  = 0x02,
256cdf0e10cSrcweir         nStopOnMismatchExecuted = nStopOnMismatchEnabled | nStopOnMismatchOccured
257cdf0e10cSrcweir     };
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     enum TestEqualConditionBits
260cdf0e10cSrcweir     {
261cdf0e10cSrcweir         nTestEqualConditionDisabled = 0x00,
262cdf0e10cSrcweir         nTestEqualConditionEnabled  = 0x01,
263cdf0e10cSrcweir         nTestEqualConditionMatched  = 0x02,
264cdf0e10cSrcweir         nTestEqualConditionFulfilled = nTestEqualConditionEnabled | nTestEqualConditionMatched
265cdf0e10cSrcweir     };
266cdf0e10cSrcweir 
267cdf0e10cSrcweir private:
268cdf0e10cSrcweir     ScQueryParam    aParam;
269cdf0e10cSrcweir     ScDocument*     pDoc;
270cdf0e10cSrcweir     const ScAttrArray*  pAttrArray;
271cdf0e10cSrcweir     sal_uLong           nNumFormat;
272cdf0e10cSrcweir     SCTAB           nTab;
273cdf0e10cSrcweir     SCCOL           nCol;
274cdf0e10cSrcweir     SCROW           nRow;
275cdf0e10cSrcweir     SCSIZE          nColRow;
276cdf0e10cSrcweir     SCROW           nAttrEndRow;
277cdf0e10cSrcweir     sal_uInt8            nStopOnMismatch;
278cdf0e10cSrcweir     sal_uInt8            nTestEqualCondition;
279cdf0e10cSrcweir     sal_Bool            bAdvanceQuery;
280cdf0e10cSrcweir     sal_Bool            bIgnoreMismatchOnLeadingStrings;
281cdf0e10cSrcweir 
282cdf0e10cSrcweir     ScBaseCell*     GetThis();
283cdf0e10cSrcweir 
284cdf0e10cSrcweir                     /* Only works if no regular expression is involved, only
285cdf0e10cSrcweir                        searches for rows in one column, and only the first
286cdf0e10cSrcweir                        query entry is considered with simple conditions
287cdf0e10cSrcweir                        SC_LESS_EQUAL (sorted ascending) or SC_GREATER_EQUAL
288cdf0e10cSrcweir                        (sorted descending). Check these things before
289cdf0e10cSrcweir                        invocation! Delivers a starting point, continue with
290cdf0e10cSrcweir                        GetThis() and GetNext() afterwards. Introduced for
291cdf0e10cSrcweir                        FindEqualOrSortedLastInRange()
292cdf0e10cSrcweir                      */
293cdf0e10cSrcweir     ScBaseCell*     BinarySearch();
294cdf0e10cSrcweir 
295cdf0e10cSrcweir public:
296cdf0e10cSrcweir                     ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable,
297cdf0e10cSrcweir                                         const ScQueryParam& aParam, sal_Bool bMod = sal_True);
298f750960cSPeter Kovacs                                         // for bMod = sal_False has to be QueryParam be filled
299f750960cSPeter Kovacs                                         // (bIsString)
300cdf0e10cSrcweir     ScBaseCell*     GetFirst();
301cdf0e10cSrcweir     ScBaseCell*     GetNext();
GetCol()302cdf0e10cSrcweir     SCCOL           GetCol() { return nCol; }
GetRow()303cdf0e10cSrcweir     SCROW           GetRow() { return nRow; }
304cdf0e10cSrcweir 
305f750960cSPeter Kovacs                     // move Entry.nField by one, if row
306f750960cSPeter Kovacs                     // changes, for ScInterpreter ScHLookup()
SetAdvanceQueryParamEntryField(sal_Bool bVal)307cdf0e10cSrcweir     void            SetAdvanceQueryParamEntryField( sal_Bool bVal )
308cdf0e10cSrcweir                         { bAdvanceQuery = bVal; }
309cdf0e10cSrcweir     void            AdvanceQueryParamEntryField();
310cdf0e10cSrcweir 
311cdf0e10cSrcweir                     /** If set, iterator stops on first non-matching cell
312cdf0e10cSrcweir                         content. May be used in SC_LESS_EQUAL queries where a
313cdf0e10cSrcweir                         cell range is assumed to be sorted; stops on first
314cdf0e10cSrcweir                         value being greater than the queried value and
315cdf0e10cSrcweir                         GetFirst()/GetNext() return NULL. StoppedOnMismatch()
316cdf0e10cSrcweir                         returns sal_True then.
317cdf0e10cSrcweir                         However, the iterator's conditions are not set to end
318cdf0e10cSrcweir                         all queries, GetCol() and GetRow() return values for
319cdf0e10cSrcweir                         the non-matching cell, further GetNext() calls may be
320cdf0e10cSrcweir                         executed. */
SetStopOnMismatch(sal_Bool bVal)321cdf0e10cSrcweir     void            SetStopOnMismatch( sal_Bool bVal )
322cdf0e10cSrcweir                         {
323cdf0e10cSrcweir                             nStopOnMismatch = sal::static_int_cast<sal_uInt8>(bVal ? nStopOnMismatchEnabled :
324cdf0e10cSrcweir                                 nStopOnMismatchDisabled);
325cdf0e10cSrcweir                         }
StoppedOnMismatch() const326cdf0e10cSrcweir     sal_Bool            StoppedOnMismatch() const
327cdf0e10cSrcweir                         { return nStopOnMismatch == nStopOnMismatchExecuted; }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir                     /** If set, an additional test for SC_EQUAL condition is
330cdf0e10cSrcweir                         executed in ScTable::ValidQuery() if SC_LESS_EQUAL or
331cdf0e10cSrcweir                         SC_GREATER_EQUAL conditions are to be tested. May be
332cdf0e10cSrcweir                         used where a cell range is assumed to be sorted to stop
333cdf0e10cSrcweir                         if an equal match is found. */
SetTestEqualCondition(sal_Bool bVal)334cdf0e10cSrcweir     void            SetTestEqualCondition( sal_Bool bVal )
335cdf0e10cSrcweir                         {
336cdf0e10cSrcweir                             nTestEqualCondition = sal::static_int_cast<sal_uInt8>(bVal ?
337cdf0e10cSrcweir                                 nTestEqualConditionEnabled :
338cdf0e10cSrcweir                                 nTestEqualConditionDisabled);
339cdf0e10cSrcweir                         }
IsEqualConditionFulfilled() const340cdf0e10cSrcweir     sal_Bool            IsEqualConditionFulfilled() const
341cdf0e10cSrcweir                         { return nTestEqualCondition == nTestEqualConditionFulfilled; }
342cdf0e10cSrcweir 
343cdf0e10cSrcweir                     /** In a range assumed to be sorted find either the last of
344cdf0e10cSrcweir                         a sequence of equal entries or the last being less than
345cdf0e10cSrcweir                         (or greater than) the queried value. Used by the
346cdf0e10cSrcweir                         interpreter for [HV]?LOOKUP() and MATCH(). Column and
347cdf0e10cSrcweir                         row position of the found entry are returned, otherwise
348cdf0e10cSrcweir                         invalid.
349cdf0e10cSrcweir 
350cdf0e10cSrcweir                         @param bSearchForEqualAfterMismatch
351cdf0e10cSrcweir                             Continue searching for an equal entry even if the
352cdf0e10cSrcweir                             last entry matching the range was found, in case
353cdf0e10cSrcweir                             the data is not sorted. Is always done if regular
354cdf0e10cSrcweir                             expressions are involved.
355cdf0e10cSrcweir 
356cdf0e10cSrcweir                         @param bIgnoreMismatchOnLeadingStrings
357cdf0e10cSrcweir                             Normally strings are sorted behind numerical
358cdf0e10cSrcweir                             values. If this parameter is sal_True, the search does
359cdf0e10cSrcweir                             not stop when encountering a string and does not
360cdf0e10cSrcweir                             assume that no values follow anymore.
361cdf0e10cSrcweir                             If querying for a string a mismatch on the first
362cdf0e10cSrcweir                             entry, e.g. column header, is ignored.
363cdf0e10cSrcweir 
364cdf0e10cSrcweir                         @ATTENTION! StopOnMismatch, TestEqualCondition and
365cdf0e10cSrcweir                         the internal IgnoreMismatchOnLeadingStrings and query
366cdf0e10cSrcweir                         params are in an undefined state upon return! The
367cdf0e10cSrcweir                         iterator is not usable anymore except for obtaining the
368cdf0e10cSrcweir                         number format!
369cdf0e10cSrcweir                       */
370cdf0e10cSrcweir     sal_Bool            FindEqualOrSortedLastInRange( SCCOL& nFoundCol,
371cdf0e10cSrcweir                         SCROW& nFoundRow, sal_Bool bSearchForEqualAfterMismatch = sal_False,
372cdf0e10cSrcweir                         sal_Bool bIgnoreMismatchOnLeadingStrings = sal_True );
373cdf0e10cSrcweir };
374cdf0e10cSrcweir 
375f750960cSPeter Kovacs class ScDocAttrIterator             // all Attribut-Areas
376cdf0e10cSrcweir {
377cdf0e10cSrcweir private:
378cdf0e10cSrcweir     ScDocument*     pDoc;
379cdf0e10cSrcweir     SCTAB           nTab;
380cdf0e10cSrcweir     SCCOL           nEndCol;
381cdf0e10cSrcweir     SCROW           nStartRow;
382cdf0e10cSrcweir     SCROW           nEndRow;
383cdf0e10cSrcweir     SCCOL           nCol;
384cdf0e10cSrcweir     ScAttrIterator* pColIter;
385cdf0e10cSrcweir 
386cdf0e10cSrcweir public:
387cdf0e10cSrcweir                     ScDocAttrIterator(ScDocument* pDocument, SCTAB nTable,
388cdf0e10cSrcweir                                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
389cdf0e10cSrcweir                     ~ScDocAttrIterator();
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     const ScPatternAttr*    GetNext( SCCOL& rCol, SCROW& rRow1, SCROW& rRow2 );
392cdf0e10cSrcweir };
393cdf0e10cSrcweir 
394f750960cSPeter Kovacs class ScAttrRectIterator            // all Attribute-Areas, including Areas containing multiple rows
395cdf0e10cSrcweir {
396cdf0e10cSrcweir private:
397cdf0e10cSrcweir     ScDocument*     pDoc;
398cdf0e10cSrcweir     SCTAB           nTab;
399cdf0e10cSrcweir     SCCOL           nEndCol;
400cdf0e10cSrcweir     SCROW           nStartRow;
401cdf0e10cSrcweir     SCROW           nEndRow;
402cdf0e10cSrcweir     SCCOL           nIterStartCol;
403cdf0e10cSrcweir     SCCOL           nIterEndCol;
404cdf0e10cSrcweir     ScAttrIterator* pColIter;
405cdf0e10cSrcweir 
406cdf0e10cSrcweir public:
407cdf0e10cSrcweir                     ScAttrRectIterator(ScDocument* pDocument, SCTAB nTable,
408cdf0e10cSrcweir                                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
409cdf0e10cSrcweir                     ~ScAttrRectIterator();
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     void                    DataChanged();
412cdf0e10cSrcweir     const ScPatternAttr*    GetNext( SCCOL& rCol1, SCCOL& rCol2, SCROW& rRow1, SCROW& rRow2 );
413cdf0e10cSrcweir };
414cdf0e10cSrcweir 
415f750960cSPeter Kovacs class ScHorizontalCellIterator      // run through all not empty cells, line by line
416f750960cSPeter Kovacs {
417cdf0e10cSrcweir private:
418cdf0e10cSrcweir     ScDocument*     pDoc;
419cdf0e10cSrcweir     SCTAB           nTab;
420cdf0e10cSrcweir     SCCOL           nStartCol;
421cdf0e10cSrcweir     SCCOL           nEndCol;
422cdf0e10cSrcweir     SCROW           nStartRow;
423cdf0e10cSrcweir     SCROW           nEndRow;
424cdf0e10cSrcweir     SCROW*          pNextRows;
425cdf0e10cSrcweir     SCSIZE*         pNextIndices;
426cdf0e10cSrcweir     SCCOL           nCol;
427cdf0e10cSrcweir     SCROW           nRow;
428cdf0e10cSrcweir     sal_Bool            bMore;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir public:
431cdf0e10cSrcweir                     ScHorizontalCellIterator(ScDocument* pDocument, SCTAB nTable,
432cdf0e10cSrcweir                                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
433cdf0e10cSrcweir                     ~ScHorizontalCellIterator();
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     ScBaseCell*     GetNext( SCCOL& rCol, SCROW& rRow );
436cdf0e10cSrcweir     sal_Bool            ReturnNext( SCCOL& rCol, SCROW& rRow );
437cdf0e10cSrcweir     /// Set a(nother) sheet and (re)init.
438cdf0e10cSrcweir     void            SetTab( SCTAB nTab );
439cdf0e10cSrcweir 
440cdf0e10cSrcweir private:
441cdf0e10cSrcweir     void            Advance();
442cdf0e10cSrcweir };
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 
445cdf0e10cSrcweir /** Row-wise value iterator. */
446cdf0e10cSrcweir class ScHorizontalValueIterator
447cdf0e10cSrcweir {
448cdf0e10cSrcweir private:
449cdf0e10cSrcweir     ScDocument               *pDoc;
450cdf0e10cSrcweir     const ScAttrArray        *pAttrArray;
451cdf0e10cSrcweir     ScHorizontalCellIterator *pCellIter;
452cdf0e10cSrcweir     sal_uLong                 nNumFormat;     // for CalcAsShown
453cdf0e10cSrcweir     sal_uLong                 nNumFmtIndex;
454cdf0e10cSrcweir     SCTAB                     nEndTab;
455cdf0e10cSrcweir     SCCOL                     nCurCol;
456cdf0e10cSrcweir     SCROW                     nCurRow;
457cdf0e10cSrcweir     SCTAB                     nCurTab;
458cdf0e10cSrcweir     SCROW                     nAttrEndRow;
459cdf0e10cSrcweir     short                     nNumFmtType;
460cdf0e10cSrcweir     bool                      bNumValid;
461cdf0e10cSrcweir     bool                      bSubTotal;
462cdf0e10cSrcweir     bool                      bCalcAsShown;
463cdf0e10cSrcweir     bool                      bTextAsZero;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir public:
466cdf0e10cSrcweir 
467cdf0e10cSrcweir                     ScHorizontalValueIterator( ScDocument* pDocument,
468cdf0e10cSrcweir                                                const ScRange& rRange,
469cdf0e10cSrcweir                                                bool bSTotal = false,
470cdf0e10cSrcweir                                                bool bTextAsZero = false );
471cdf0e10cSrcweir                     ~ScHorizontalValueIterator();
472cdf0e10cSrcweir     void            GetCurNumFmtInfo( short& nType, sal_uLong& nIndex );
473cdf0e10cSrcweir     /// Does NOT reset rValue if no value found!
474cdf0e10cSrcweir     bool            GetNext( double& rValue, sal_uInt16& rErr );
475cdf0e10cSrcweir };
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //
479*06fb39a1SJohn Bampton //  returns all areas that do not have a Default-Formatting (horizontal)
480cdf0e10cSrcweir //
481cdf0e10cSrcweir 
482cdf0e10cSrcweir class ScHorizontalAttrIterator
483cdf0e10cSrcweir {
484cdf0e10cSrcweir private:
485cdf0e10cSrcweir     ScDocument*             pDoc;
486cdf0e10cSrcweir     SCTAB                   nTab;
487cdf0e10cSrcweir     SCCOL                   nStartCol;
488cdf0e10cSrcweir     SCROW                   nStartRow;
489cdf0e10cSrcweir     SCCOL                   nEndCol;
490cdf0e10cSrcweir     SCROW                   nEndRow;
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     SCROW*                  pNextEnd;
493cdf0e10cSrcweir     SCSIZE*                 pIndices;
494cdf0e10cSrcweir     const ScPatternAttr**   ppPatterns;
495cdf0e10cSrcweir     SCCOL                   nCol;
496cdf0e10cSrcweir     SCROW                   nRow;
497cdf0e10cSrcweir     sal_Bool                    bRowEmpty;
498cdf0e10cSrcweir 
499cdf0e10cSrcweir public:
500cdf0e10cSrcweir             ScHorizontalAttrIterator( ScDocument* pDocument, SCTAB nTable,
501cdf0e10cSrcweir                                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
502cdf0e10cSrcweir             ~ScHorizontalAttrIterator();
503cdf0e10cSrcweir 
504cdf0e10cSrcweir     const ScPatternAttr*    GetNext( SCCOL& rCol1, SCCOL& rCol2, SCROW& rRow );
505cdf0e10cSrcweir };
506cdf0e10cSrcweir 
507cdf0e10cSrcweir //
508*06fb39a1SJohn Bampton //  returns all non empty cells and areas with formatting (horizontal)
509cdf0e10cSrcweir //
510cdf0e10cSrcweir 
511cdf0e10cSrcweir class SC_DLLPUBLIC ScUsedAreaIterator
512cdf0e10cSrcweir {
513cdf0e10cSrcweir private:
514cdf0e10cSrcweir     ScHorizontalCellIterator    aCellIter;
515cdf0e10cSrcweir     ScHorizontalAttrIterator    aAttrIter;
516cdf0e10cSrcweir 
517cdf0e10cSrcweir     SCCOL                   nNextCol;
518cdf0e10cSrcweir     SCROW                   nNextRow;
519cdf0e10cSrcweir 
520cdf0e10cSrcweir     SCCOL                   nCellCol;
521cdf0e10cSrcweir     SCROW                   nCellRow;
522cdf0e10cSrcweir     const ScBaseCell*       pCell;
523cdf0e10cSrcweir     SCCOL                   nAttrCol1;
524cdf0e10cSrcweir     SCCOL                   nAttrCol2;
525cdf0e10cSrcweir     SCROW                   nAttrRow;
526cdf0e10cSrcweir     const ScPatternAttr*    pPattern;
527cdf0e10cSrcweir 
528f750960cSPeter Kovacs     SCCOL                   nFoundStartCol;         // results after GetNext
529cdf0e10cSrcweir     SCCOL                   nFoundEndCol;
530cdf0e10cSrcweir     SCROW                   nFoundRow;
531cdf0e10cSrcweir     const ScPatternAttr*    pFoundPattern;
532cdf0e10cSrcweir     const ScBaseCell*       pFoundCell;
533cdf0e10cSrcweir 
534cdf0e10cSrcweir public:
535cdf0e10cSrcweir             ScUsedAreaIterator( ScDocument* pDocument, SCTAB nTable,
536cdf0e10cSrcweir                                 SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
537cdf0e10cSrcweir             ~ScUsedAreaIterator();
538cdf0e10cSrcweir 
539cdf0e10cSrcweir     sal_Bool    GetNext();
540cdf0e10cSrcweir 
GetStartCol() const541cdf0e10cSrcweir     SCCOL                   GetStartCol() const     { return nFoundStartCol; }
GetEndCol() const542cdf0e10cSrcweir     SCCOL                   GetEndCol() const       { return nFoundEndCol; }
GetRow() const543cdf0e10cSrcweir     SCROW                   GetRow() const          { return nFoundRow; }
GetPattern() const544cdf0e10cSrcweir     const ScPatternAttr*    GetPattern() const      { return pFoundPattern; }
GetCell() const545cdf0e10cSrcweir     const ScBaseCell*       GetCell() const         { return pFoundCell; }
546cdf0e10cSrcweir };
547cdf0e10cSrcweir 
548cdf0e10cSrcweir // ============================================================================
549cdf0e10cSrcweir 
550cdf0e10cSrcweir class ScRowBreakIterator
551cdf0e10cSrcweir {
552cdf0e10cSrcweir public:
553cdf0e10cSrcweir     static SCROW NOT_FOUND;
554cdf0e10cSrcweir 
555cdf0e10cSrcweir     explicit ScRowBreakIterator(::std::set<SCROW>& rBreaks);
556cdf0e10cSrcweir     SCROW first();
557cdf0e10cSrcweir     SCROW next();
558cdf0e10cSrcweir 
559cdf0e10cSrcweir private:
560cdf0e10cSrcweir     ::std::set<SCROW>& mrBreaks;
561cdf0e10cSrcweir     ::std::set<SCROW>::const_iterator maItr;
562cdf0e10cSrcweir     ::std::set<SCROW>::const_iterator maEnd;
563cdf0e10cSrcweir };
564cdf0e10cSrcweir 
565cdf0e10cSrcweir #endif
566