xref: /AOO41X/main/sc/source/filter/xml/XMLStylesImportHelper.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_XMLSTYLESIMPORTHELPER_HXX
25 #define SC_XMLSTYLESIMPORTHELPER_HXX
26 
27 #include "rangelst.hxx"
28 #include <rtl/ustring.hxx>
29 #include <com/sun/star/table/CellRangeAddress.hpp>
30 #include <com/sun/star/table/CellAddress.hpp>
31 
32 #include <set>
33 #include <vector>
34 
35 class ScXMLImport;
36 
37 struct ScMyStyleNumberFormat
38 {
39     rtl::OUString       sStyleName;
40     sal_Int32           nNumberFormat;
41 
ScMyStyleNumberFormatScMyStyleNumberFormat42     ScMyStyleNumberFormat() : nNumberFormat(-1) {}
ScMyStyleNumberFormatScMyStyleNumberFormat43     ScMyStyleNumberFormat(const rtl::OUString& rStyleName) :
44         sStyleName(rStyleName), nNumberFormat(-1) {}
ScMyStyleNumberFormatScMyStyleNumberFormat45     ScMyStyleNumberFormat(const rtl::OUString& rStyleName, const sal_Int32 nFormat) :
46         sStyleName(rStyleName), nNumberFormat(nFormat) {}
47 };
48 
49 struct LessStyleNumberFormat
50 {
operator ()LessStyleNumberFormat51     sal_Bool operator() (const ScMyStyleNumberFormat& rValue1, const ScMyStyleNumberFormat& rValue2) const
52     {
53         return rValue1.sStyleName < rValue2.sStyleName;
54     }
55 };
56 
57 typedef std::set< ScMyStyleNumberFormat, LessStyleNumberFormat >    ScMyStyleNumberFormatSet;
58 
59 class ScMyStyleNumberFormats
60 {
61     ScMyStyleNumberFormatSet    aSet;
62 
63 public:
64     void AddStyleNumberFormat(const rtl::OUString& rStyleName, const sal_Int32 nNumberFormat);
65     sal_Int32 GetStyleNumberFormat(const rtl::OUString& rStyleName);
66 };
67 
68 struct ScMyCurrencyStyle
69 {
70     rtl::OUString       sCurrency;
71     ScRangeListRef      xRanges;
72 
ScMyCurrencyStyleScMyCurrencyStyle73     ScMyCurrencyStyle() : xRanges(new ScRangeList()) {}
~ScMyCurrencyStyleScMyCurrencyStyle74     ~ScMyCurrencyStyle() {}
75 };
76 
77 struct LessCurrencyStyle
78 {
operator ()LessCurrencyStyle79     sal_Bool operator() (const ScMyCurrencyStyle& rValue1, const ScMyCurrencyStyle& rValue2) const
80     {
81         return rValue1.sCurrency < rValue2.sCurrency;
82     }
83 };
84 
85 typedef std::set<ScMyCurrencyStyle, LessCurrencyStyle>  ScMyCurrencyStylesSet;
86 
87 class ScMyStyleRanges : public SvRefBase
88 {
89     ScRangeList*            pTextList;
90     ScRangeList*            pNumberList;
91     ScRangeList*            pTimeList;
92     ScRangeList*            pDateTimeList;
93     ScRangeList*            pPercentList;
94     ScRangeList*            pLogicalList;
95     ScRangeList*            pUndefinedList;
96     ScMyCurrencyStylesSet*  pCurrencyList;
97 
98     void AddRange(const ScRange& rRange, ScRangeList* pList,
99         const rtl::OUString* pStyleName, const sal_Int16 nType,
100         ScXMLImport& rImport, const sal_uInt32 nMaxRanges);
101     void AddCurrencyRange(const ScRange& rRange, ScRangeListRef xList,
102         const rtl::OUString* pStyleName, const rtl::OUString* pCurrency,
103         ScXMLImport& rImport, const sal_uInt32 nMaxRanges);
104     void InsertColRow(const ScRange& rRange, const SCsCOL nDx, const SCsROW nDy,
105         const SCsTAB nDz, ScDocument* pDoc);
106     void SetStylesToRanges(ScRangeList* pList,
107         const rtl::OUString* pStyleName, const sal_Int16 nCellType,
108         const rtl::OUString* pCurrency, ScXMLImport& rImport);
109     void SetStylesToRanges(ScRangeListRef xList,
110         const rtl::OUString* pStyleName, const sal_Int16 nCellType,
111         const rtl::OUString* pCurrency, ScXMLImport& rImport);
112 public:
113     ScMyStyleRanges();
114     ~ScMyStyleRanges();
115     void AddRange(const ScRange& rRange,
116         const rtl::OUString* pStyleName, const sal_Int16 nType,
117         ScXMLImport& rImport, const sal_uInt32 nMaxRanges);
118     void AddCurrencyRange(const ScRange& rRange,
119         const rtl::OUString* pStyleName, const rtl::OUString* pCurrency,
120         ScXMLImport& rImport, const sal_uInt32 nMaxRanges);
121     void InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc);
122     void InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc);
123     void SetStylesToRanges(const rtl::OUString* pStyleName, ScXMLImport& rImport);
124 };
125 SV_DECL_IMPL_REF( ScMyStyleRanges );
126 
127 struct ScMyStyle
128 {
129     rtl::OUString       sStyleName;
130     ScMyStyleRangesRef  xRanges;
131 
ScMyStyleScMyStyle132     ScMyStyle() : xRanges(new ScMyStyleRanges()) {}
~ScMyStyleScMyStyle133     ~ScMyStyle() {}
134 };
135 
136 struct LessStyle
137 {
operator ()LessStyle138     sal_Bool operator() (const ScMyStyle& rValue1, const ScMyStyle& rValue2) const
139     {
140         return rValue1.sStyleName < rValue2.sStyleName;
141     }
142 };
143 
144 typedef std::set<ScMyStyle, LessStyle>  ScMyStylesSet;
145 typedef std::vector<ScMyStylesSet::iterator> ScMyStyles;
146 
147 class ScMyStylesImportHelper
148 {
149     ScMyStylesSet       aCellStyles;
150     ScMyStyles          aColDefaultStyles;
151     ScMyStylesSet::iterator aRowDefaultStyle;
152     ScXMLImport&        rImport;
153     rtl::OUString*      pStyleName;
154     rtl::OUString*      pPrevStyleName;
155     rtl::OUString*      pCurrency;
156     rtl::OUString*      pPrevCurrency;
157     ScRange             aPrevRange;
158     sal_uInt32          nMaxRanges;
159     sal_Int16           nCellType;
160     sal_Int16           nPrevCellType;
161     sal_Bool            bPrevRangeAdded;
162 
163     void ResetAttributes();
164     ScMyStylesSet::iterator GetIterator(const rtl::OUString* pStyleName);
165     void AddDefaultRange(const ScRange& rRange);
166     void AddSingleRange(const ScRange& rRange);
167     void AddRange();
IsEqual(const rtl::OUString * pFirst,const rtl::OUString * pSecond)168     sal_Bool IsEqual(const rtl::OUString* pFirst, const rtl::OUString* pSecond)
169     {
170         return ((pFirst && pSecond && pFirst->equals(*pSecond)) ||
171                 (!pFirst && !pSecond) ||
172                 (!pFirst && pSecond && !pSecond->getLength()) ||
173                 (!pSecond &&  pFirst && !pFirst->getLength()));
174     }
175 public:
176     ScMyStylesImportHelper(ScXMLImport& rImport);
177     ~ScMyStylesImportHelper();
178     void AddColumnStyle(const rtl::OUString& rStyleName, const sal_Int32 nColumn, const sal_Int32 nRepeat);
179     void SetRowStyle(const rtl::OUString& rStyleName);
180     void SetAttributes(rtl::OUString* pStyleName,
181         rtl::OUString* pCurrency, const sal_Int16 nCellType);
182     void AddRange(const ScRange& rRange);
183     void AddCell(const com::sun::star::table::CellAddress& rAddress);
184     void InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc); // a row is inserted before nRow
185     void InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc); // a col is inserted before nCol
186     void EndTable();
187     void SetStylesToRanges();
188 };
189 
190 #endif
191 
192