xref: /AOO41X/main/sc/source/filter/xml/XMLExportIterator.hxx (revision 38d50f7b14e1cf975d8c6468d9633894cd59b523)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_XMLEXPORTITERATOR_HXX
25 #define SC_XMLEXPORTITERATOR_HXX
26 
27 #include <vector>
28 #include <list>
29 #include <com/sun/star/sheet/XSpreadsheet.hpp>
30 #include <com/sun/star/table/CellAddress.hpp>
31 #include <com/sun/star/table/CellRangeAddress.hpp>
32 #include <com/sun/star/table/XCell.hpp>
33 #include <com/sun/star/text/XText.hpp>
34 #include <com/sun/star/sheet/XSheetAnnotation.hpp>
35 #include <com/sun/star/drawing/XShape.hpp>
36 #include "global.hxx"
37 #include "detfunc.hxx"
38 #include "detdata.hxx"
39 
40 class   ScHorizontalCellIterator;
41 struct  ScMyCell;
42 class   ScXMLExport;
43 class   ScFormatRangeStyles;
44 class   ScBaseCell;
45 
46 //==============================================================================
47 
48 class ScMyIteratorBase
49 {
50 protected:
51     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress ) = 0;
52 
53 public:
54                                 ScMyIteratorBase();
55     virtual                     ~ScMyIteratorBase();
56 
57     virtual void                SetCellData( ScMyCell& rMyCell ) = 0;
58     virtual void                Sort() = 0;
59 
60     virtual void                UpdateAddress( ::com::sun::star::table::CellAddress& rCellAddress );
61 };
62 
63 //==============================================================================
64 
65 struct ScMyShape
66 {
67     ScAddress   aAddress;
68     ScAddress   aEndAddress;
69     com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape;
70 
71     sal_Bool operator<(const ScMyShape& aShape) const;
72 };
73 
74 typedef std::list<ScMyShape>    ScMyShapeList;
75 
76 class ScMyShapesContainer : ScMyIteratorBase
77 {
78 private:
79     ScMyShapeList               aShapeList;
80 protected:
81     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
82 public:
83                                 ScMyShapesContainer();
84     virtual                     ~ScMyShapesContainer();
85 
86                                 using ScMyIteratorBase::UpdateAddress;
87     void                        AddNewShape(const ScMyShape& aShape);
HasShapes()88     sal_Bool                    HasShapes() { return !aShapeList.empty(); }
GetShapes()89     const ScMyShapeList*        GetShapes() { return &aShapeList; }
90     virtual void                SetCellData( ScMyCell& rMyCell );
91     virtual void                Sort();
92     void                        SkipTable(SCTAB nSkip);
93 };
94 
95 struct ScMyNoteShape
96 {
97     com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape;
98     ScAddress aPos;
99 
100     sal_Bool operator<(const ScMyNoteShape& aNote) const;
101 };
102 
103 typedef std::list<ScMyNoteShape>    ScMyNoteShapeList;
104 
105 class ScMyNoteShapesContainer : ScMyIteratorBase
106 {
107 private:
108     ScMyNoteShapeList           aNoteShapeList;
109 protected:
110     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
111 public:
112                                 ScMyNoteShapesContainer();
113     virtual                     ~ScMyNoteShapesContainer();
114 
115                                 using ScMyIteratorBase::UpdateAddress;
116     void                        AddNewNote(const ScMyNoteShape& aNote);
HasNotes()117     sal_Bool                    HasNotes() { return !aNoteShapeList.empty(); }
GetNotes()118     const ScMyNoteShapeList*    GetNotes() { return &aNoteShapeList; }
119     virtual void                SetCellData( ScMyCell& rMyCell );
120     virtual void                Sort();
121     void                        SkipTable(SCTAB nSkip);
122 };
123 
124 //==============================================================================
125 
126 struct ScMyMergedRange
127 {
128     com::sun::star::table::CellRangeAddress aCellRange;
129     sal_Int32                   nRows;
130     sal_Bool                    bIsFirst;
131     sal_Bool                    operator<(const ScMyMergedRange& aRange) const;
132 };
133 
134 typedef std::list<ScMyMergedRange>  ScMyMergedRangeList;
135 
136 class ScMyMergedRangesContainer : ScMyIteratorBase
137 {
138 private:
139     ScMyMergedRangeList         aRangeList;
140 protected:
141     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
142 public:
143                                 ScMyMergedRangesContainer();
144     virtual                     ~ScMyMergedRangesContainer();
145     void                        AddRange(const com::sun::star::table::CellRangeAddress aMergedRange);
146 
147                                 using ScMyIteratorBase::UpdateAddress;
148     virtual void                SetCellData( ScMyCell& rMyCell );
149     virtual void                Sort(); // + remove doublets
150     void                        SkipTable(SCTAB nSkip);
151 };
152 
153 //==============================================================================
154 
155 struct ScMyAreaLink
156 {
157     ::rtl::OUString             sFilter;
158     ::rtl::OUString             sFilterOptions;
159     ::rtl::OUString             sURL;
160     ::rtl::OUString             sSourceStr;
161     ::com::sun::star::table::CellRangeAddress aDestRange;
162     sal_Int32                   nRefresh;
163 
ScMyAreaLinkScMyAreaLink164     inline                      ScMyAreaLink() : nRefresh( 0 ) {}
165 
GetColCountScMyAreaLink166     inline sal_Int32            GetColCount() const { return aDestRange.EndColumn - aDestRange.StartColumn + 1; }
GetRowCountScMyAreaLink167     inline sal_Int32            GetRowCount() const { return aDestRange.EndRow - aDestRange.StartRow + 1; }
168 
169     sal_Bool                    Compare( const ScMyAreaLink& rAreaLink ) const;
170     sal_Bool                    operator<(const ScMyAreaLink& rAreaLink ) const;
171 };
172 
173 typedef ::std::list< ScMyAreaLink > ScMyAreaLinkList;
174 
175 class ScMyAreaLinksContainer : ScMyIteratorBase
176 {
177 private:
178     ScMyAreaLinkList            aAreaLinkList;
179 protected:
180     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
181 public:
182                                 ScMyAreaLinksContainer();
183     virtual                     ~ScMyAreaLinksContainer();
184 
AddNewAreaLink(const ScMyAreaLink & rAreaLink)185     inline void                 AddNewAreaLink( const ScMyAreaLink& rAreaLink )
186                                     { aAreaLinkList.push_back( rAreaLink ); }
187 
188                                 using ScMyIteratorBase::UpdateAddress;
189     virtual void                SetCellData( ScMyCell& rMyCell );
190     virtual void                Sort();
191     void                        SkipTable(SCTAB nSkip);
192 };
193 
194 //==============================================================================
195 
196 struct ScMyCellRangeAddress : com::sun::star::table::CellRangeAddress
197 {
198     ScMyCellRangeAddress(const com::sun::star::table::CellRangeAddress& rRange);
199     sal_Bool                    operator<(const ScMyCellRangeAddress& rCellRangeAddress ) const;
200 };
201 
202 typedef std::list<ScMyCellRangeAddress> ScMyEmptyDatabaseRangeList;
203 
204 class ScMyEmptyDatabaseRangesContainer : ScMyIteratorBase
205 {
206 private:
207     ScMyEmptyDatabaseRangeList  aDatabaseList;
208 protected:
209     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
210 public:
211                                 ScMyEmptyDatabaseRangesContainer();
212     virtual                     ~ScMyEmptyDatabaseRangesContainer();
213     void                        AddNewEmptyDatabaseRange(const com::sun::star::table::CellRangeAddress& aCellRangeAddress);
214 
215                                 using ScMyIteratorBase::UpdateAddress;
216     virtual void                SetCellData( ScMyCell& rMyCell );
217     virtual void                Sort();
218     void                        SkipTable(SCTAB nSkip);
219 };
220 
221 //==============================================================================
222 
223 struct ScMyDetectiveObj
224 {
225     ::com::sun::star::table::CellAddress        aPosition;
226     ::com::sun::star::table::CellRangeAddress   aSourceRange;
227     ScDetectiveObjType                          eObjType;
228     sal_Bool                                    bHasError;
229     sal_Bool operator<(const ScMyDetectiveObj& rDetObj) const;
230 };
231 
232 typedef ::std::list< ScMyDetectiveObj > ScMyDetectiveObjList;
233 typedef ::std::vector< ScMyDetectiveObj > ScMyDetectiveObjVec;
234 
235 class ScMyDetectiveObjContainer : ScMyIteratorBase
236 {
237 private:
238     ScMyDetectiveObjList            aDetectiveObjList;
239 protected:
240     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
241 public:
242                                 ScMyDetectiveObjContainer();
243     virtual                     ~ScMyDetectiveObjContainer();
244 
245     void                        AddObject(
246                                     ScDetectiveObjType eObjType,
247                                     const SCTAB nSheet,
248                                     const ScAddress& rPosition,
249                                     const ScRange& rSourceRange,
250                                     sal_Bool bHasError );
251 
252                                 using ScMyIteratorBase::UpdateAddress;
253     virtual void                SetCellData( ScMyCell& rMyCell );
254     virtual void                Sort();
255     void                        SkipTable(SCTAB nSkip);
256 };
257 
258 //==============================================================================
259 
260 struct ScMyDetectiveOp
261 {
262     ::com::sun::star::table::CellAddress    aPosition;
263     ScDetOpType                             eOpType;
264     sal_Int32                               nIndex;
265     sal_Bool operator<(const ScMyDetectiveOp& rDetOp) const;
266 };
267 
268 typedef ::std::list< ScMyDetectiveOp > ScMyDetectiveOpList;
269 typedef ::std::vector< ScMyDetectiveOp > ScMyDetectiveOpVec;
270 
271 class ScMyDetectiveOpContainer : ScMyIteratorBase
272 {
273 private:
274     ScMyDetectiveOpList         aDetectiveOpList;
275 protected:
276     virtual sal_Bool            GetFirstAddress( ::com::sun::star::table::CellAddress& rCellAddress );
277 public:
278                                 ScMyDetectiveOpContainer();
279     virtual                     ~ScMyDetectiveOpContainer();
280 
281     void                        AddOperation( ScDetOpType eOpType, const ScAddress& rPosition, sal_uInt32 nIndex );
282 
283                                 using ScMyIteratorBase::UpdateAddress;
284     virtual void                SetCellData( ScMyCell& rMyCell );
285     virtual void                Sort();
286     void                        SkipTable(SCTAB nSkip);
287 };
288 
289 //==============================================================================
290 
291 // contains data to export for the current cell position
292 struct ScMyCell
293 {
294 //  com::sun::star::uno::Reference<com::sun::star::table::XCell> xCell;
295 //  com::sun::star::uno::Reference<com::sun::star::text::XText> xText;
296     com::sun::star::uno::Reference<com::sun::star::sheet::XSheetAnnotation> xAnnotation;
297     com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xNoteShape;
298     com::sun::star::table::CellAddress      aCellAddress;
299     com::sun::star::table::CellRangeAddress aMergeRange;
300     com::sun::star::table::CellRangeAddress aMatrixRange;
301 
302     rtl::OUString               sStringValue;
303     rtl::OUString               sAnnotationText;
304 
305     ScMyAreaLink                aAreaLink;
306     ScMyShapeList               aShapeList;
307     ScMyDetectiveObjVec         aDetectiveObjVec;
308     ScMyDetectiveOpVec          aDetectiveOpVec;
309 
310     double                      fValue;
311     sal_Int32                   nValidationIndex;
312     sal_Int32                   nStyleIndex;
313     sal_Int32                   nNumberFormat;
314     com::sun::star::table::CellContentType  nType;
315 
316     ScBaseCell*                 pBaseCell;
317 
318     sal_Bool                    bIsAutoStyle;
319 
320     sal_Bool                    bHasShape;
321     sal_Bool                    bIsMergedBase;
322     sal_Bool                    bIsCovered;
323     sal_Bool                    bHasAreaLink;
324     sal_Bool                    bHasEmptyDatabase;
325     sal_Bool                    bHasDetectiveObj;
326     sal_Bool                    bHasDetectiveOp;
327 
328     sal_Bool                    bIsEditCell;
329     sal_Bool                    bKnowWhetherIsEditCell;
330     sal_Bool                    bHasStringValue;
331     sal_Bool                    bHasDoubleValue;
332     sal_Bool                    bHasXText;
333 
334     sal_Bool                    bIsMatrixBase;
335     sal_Bool                    bIsMatrixCovered;
336     sal_Bool                    bHasAnnotation;
337 
338                                 ScMyCell();
339                                 ~ScMyCell();
340 };
341 
342 //==============================================================================
343 
344 struct ScMyExportAnnotation
345 {
346     com::sun::star::uno::Reference<com::sun::star::sheet::XSheetAnnotation> xAnnotation;
347     com::sun::star::table::CellAddress      aCellAddress;
348     sal_Bool operator<(const ScMyExportAnnotation& rAnno) const;
349 };
350 
351 typedef ::std::list< ScMyExportAnnotation > ScMyExportAnnotationList;
352 
353 class ScMyNotEmptyCellsIterator
354 {
355     com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet> xTable;
356     com::sun::star::uno::Reference<com::sun::star::table::XCellRange> xCellRange;
357     com::sun::star::table::CellAddress  aLastAddress;
358     ScMyExportAnnotationList            aAnnotations;
359 
360     ScMyShapesContainer*                pShapes;
361     ScMyNoteShapesContainer*            pNoteShapes;
362     ScMyEmptyDatabaseRangesContainer*   pEmptyDatabaseRanges;
363     ScMyMergedRangesContainer*          pMergedRanges;
364     ScMyAreaLinksContainer*             pAreaLinks;
365     ScMyDetectiveObjContainer*          pDetectiveObj;
366     ScMyDetectiveOpContainer*           pDetectiveOp;
367 
368     ScXMLExport&                rExport;
369     ScHorizontalCellIterator*   pCellItr;
370 
371     SCCOL                   nCellCol;
372     SCROW                   nCellRow;
373     SCTAB                   nCurrentTable;
374 
375     void                        UpdateAddress( ::com::sun::star::table::CellAddress& rAddress );
376     void                        SetCellData( ScMyCell& rMyCell, ::com::sun::star::table::CellAddress& rAddress );
377 
378     void                        SetMatrixCellData( ScMyCell& rMyCell );
379     void                        HasAnnotation( ScMyCell& aCell );
380 public:
381                                 ScMyNotEmptyCellsIterator(ScXMLExport& rExport);
382                                 ~ScMyNotEmptyCellsIterator();
383 
384     void                        Clear();
385 
SetShapes(ScMyShapesContainer * pNewShapes)386     inline void                 SetShapes(ScMyShapesContainer* pNewShapes)
387                                     { pShapes = pNewShapes; }
SetNoteShapes(ScMyNoteShapesContainer * pNewNoteShapes)388     inline void                 SetNoteShapes(ScMyNoteShapesContainer* pNewNoteShapes)
389                                     { pNoteShapes = pNewNoteShapes; }
SetEmptyDatabaseRanges(ScMyEmptyDatabaseRangesContainer * pNewEmptyDatabaseRanges)390     inline void                 SetEmptyDatabaseRanges(ScMyEmptyDatabaseRangesContainer* pNewEmptyDatabaseRanges)
391                                     { pEmptyDatabaseRanges = pNewEmptyDatabaseRanges; }
SetMergedRanges(ScMyMergedRangesContainer * pNewMergedRanges)392     inline void                 SetMergedRanges(ScMyMergedRangesContainer* pNewMergedRanges)
393                                     { pMergedRanges = pNewMergedRanges; }
SetAreaLinks(ScMyAreaLinksContainer * pNewAreaLinks)394     inline void                 SetAreaLinks(ScMyAreaLinksContainer* pNewAreaLinks)
395                                     { pAreaLinks = pNewAreaLinks; }
SetDetectiveObj(ScMyDetectiveObjContainer * pNewDetectiveObj)396     inline void                 SetDetectiveObj(ScMyDetectiveObjContainer* pNewDetectiveObj)
397                                     { pDetectiveObj = pNewDetectiveObj; }
SetDetectiveOp(ScMyDetectiveOpContainer * pNewDetectiveOp)398     inline void                 SetDetectiveOp(ScMyDetectiveOpContainer* pNewDetectiveOp)
399                                     { pDetectiveOp = pNewDetectiveOp; }
400 
401     void                        SetCurrentTable(const SCTAB nTable,
402                                     com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& rxTable);
403     void                        SkipTable(SCTAB nSkip);
404 
405     sal_Bool                    GetNext(ScMyCell& aCell, ScFormatRangeStyles* pCellStyles);
406 };
407 
408 #endif
409 
410