Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef SC_RANGEUTL_HXX
30 : : #define SC_RANGEUTL_HXX
31 : :
32 : : #include <tools/string.hxx>
33 : :
34 : : #include "address.hxx"
35 : : #include "rangenam.hxx"
36 : : #include "dbdata.hxx"
37 : : #include "scdllapi.h"
38 : :
39 : : #include <com/sun/star/table/CellAddress.hpp>
40 : : #include <com/sun/star/table/CellRangeAddress.hpp>
41 : : #include <com/sun/star/uno/Sequence.hxx>
42 : :
43 : : //------------------------------------------------------------------------
44 : :
45 : : class ScArea;
46 : : class ScDocument;
47 : : class ScRange;
48 : : class ScRangeName;
49 : : class ScRangeList;
50 : : class ScDBCollection;
51 : :
52 : : enum RutlNameScope { RUTL_NONE=0, RUTL_NAMES, RUTL_DBASE };
53 : :
54 : : //------------------------------------------------------------------------
55 : :
56 : : class SC_DLLPUBLIC ScRangeUtil
57 : : {
58 : : public:
59 : 0 : ScRangeUtil() {}
60 : 0 : ~ScRangeUtil() {}
61 : :
62 : : sal_Bool MakeArea ( const String& rAreaStr,
63 : : ScArea& rArea,
64 : : ScDocument* pDoc,
65 : : SCTAB nTab,
66 : : ScAddress::Details const & rDetails = ScAddress::detailsOOOa1 ) const;
67 : :
68 : : void CutPosString ( const String& theAreaStr,
69 : : String& thePosStr ) const;
70 : :
71 : : sal_Bool IsAbsTabArea ( const String& rAreaStr,
72 : : ScDocument* pDoc,
73 : : ScArea*** pppAreas = 0,
74 : : sal_uInt16* pAreaCount = 0,
75 : : sal_Bool bAcceptCellRef = false,
76 : : ScAddress::Details const & rDetails = ScAddress::detailsOOOa1 ) const;
77 : :
78 : : sal_Bool IsAbsArea ( const String& rAreaStr,
79 : : ScDocument* pDoc,
80 : : SCTAB nTab,
81 : : String* pCompleteStr = 0,
82 : : ScRefAddress* pStartPos = 0,
83 : : ScRefAddress* pEndPos = 0,
84 : : ScAddress::Details const & rDetails = ScAddress::detailsOOOa1 ) const;
85 : :
86 : : sal_Bool IsRefArea ( const String&,
87 : : ScDocument*,
88 : : SCTAB,
89 : : String* = 0,
90 : : ScRefAddress* = 0 ) const
91 : : { return false; }
92 : :
93 : : sal_Bool IsAbsPos ( const String& rPosStr,
94 : : ScDocument* pDoc,
95 : : SCTAB nTab,
96 : : String* pCompleteStr = 0,
97 : : ScRefAddress* pPosTripel = 0,
98 : : ScAddress::Details const & rDetails = ScAddress::detailsOOOa1 ) const;
99 : :
100 : : sal_Bool MakeRangeFromName ( const String& rName,
101 : : ScDocument* pDoc,
102 : : SCTAB nCurTab,
103 : : ScRange& rRange,
104 : : RutlNameScope eScope=RUTL_NAMES,
105 : : ScAddress::Details const & rDetails = ScAddress::detailsOOOa1 ) const;
106 : : };
107 : :
108 : : //------------------------------------------------------------------------
109 : :
110 : : class SC_DLLPUBLIC ScRangeStringConverter
111 : : {
112 : : public:
113 : :
114 : : // helper methods
115 : : static void AssignString(
116 : : ::rtl::OUString& rString,
117 : : const ::rtl::OUString& rNewStr,
118 : : sal_Bool bAppendStr,
119 : : sal_Unicode cSeperator = ' ');
120 : :
121 : : static sal_Int32 IndexOf(
122 : : const ::rtl::OUString& rString,
123 : : sal_Unicode cSearchChar,
124 : : sal_Int32 nOffset,
125 : : sal_Unicode cQuote = '\'');
126 : :
127 : : static sal_Int32 IndexOfDifferent(
128 : : const ::rtl::OUString& rString,
129 : : sal_Unicode cSearchChar,
130 : : sal_Int32 nOffset );
131 : :
132 : : static sal_Int32 GetTokenCount(
133 : : const ::rtl::OUString& rString,
134 : : sal_Unicode cSeperator = ' ',
135 : : sal_Unicode cQuote = '\'');
136 : :
137 : : static void GetTokenByOffset(
138 : : ::rtl::OUString& rToken,
139 : : const ::rtl::OUString& rString,
140 : : sal_Int32& nOffset,
141 : : sal_Unicode cSeperator = ' ',
142 : : sal_Unicode cQuote = '\'');
143 : :
144 : : static void AppendTableName(
145 : : ::rtl::OUStringBuffer& rBuf,
146 : : const ::rtl::OUString& rTabName,
147 : : sal_Unicode cQuote = '\'');
148 : :
149 : : // String to Range core
150 : : static sal_Bool GetAddressFromString(
151 : : ScAddress& rAddress,
152 : : const ::rtl::OUString& rAddressStr,
153 : : const ScDocument* pDocument,
154 : : formula::FormulaGrammar::AddressConvention eConv,
155 : : sal_Int32& nOffset,
156 : : sal_Unicode cSeperator = ' ',
157 : : sal_Unicode cQuote = '\'');
158 : : static sal_Bool GetRangeFromString(
159 : : ScRange& rRange,
160 : : const ::rtl::OUString& rRangeStr,
161 : : const ScDocument* pDocument,
162 : : formula::FormulaGrammar::AddressConvention eConv,
163 : : sal_Int32& nOffset,
164 : : sal_Unicode cSeperator = ' ',
165 : : sal_Unicode cQuote = '\'');
166 : : static sal_Bool GetRangeListFromString(
167 : : ScRangeList& rRangeList,
168 : : const ::rtl::OUString& rRangeListStr,
169 : : const ScDocument* pDocument,
170 : : formula::FormulaGrammar::AddressConvention eConv,
171 : : sal_Unicode cSeperator = ' ',
172 : : sal_Unicode cQuote = '\'');
173 : :
174 : : static sal_Bool GetAreaFromString(
175 : : ScArea& rArea,
176 : : const ::rtl::OUString& rRangeStr,
177 : : const ScDocument* pDocument,
178 : : formula::FormulaGrammar::AddressConvention eConv,
179 : : sal_Int32& nOffset,
180 : : sal_Unicode cSeperator = ' ',
181 : : sal_Unicode cQuote = '\'');
182 : :
183 : : // String to Range API
184 : : static sal_Bool GetAddressFromString(
185 : : ::com::sun::star::table::CellAddress& rAddress,
186 : : const ::rtl::OUString& rAddressStr,
187 : : const ScDocument* pDocument,
188 : : formula::FormulaGrammar::AddressConvention eConv,
189 : : sal_Int32& nOffset,
190 : : sal_Unicode cSeperator = ' ',
191 : : sal_Unicode cQuote = '\'');
192 : : static sal_Bool GetRangeFromString(
193 : : ::com::sun::star::table::CellRangeAddress& rRange,
194 : : const ::rtl::OUString& rRangeStr,
195 : : const ScDocument* pDocument,
196 : : formula::FormulaGrammar::AddressConvention eConv,
197 : : sal_Int32& nOffset,
198 : : sal_Unicode cSeperator = ' ',
199 : : sal_Unicode cQuote = '\'');
200 : : static sal_Bool GetRangeListFromString(
201 : : ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress >& rRangeSeq,
202 : : const ::rtl::OUString& rRangeListStr,
203 : : const ScDocument* pDocument,
204 : : formula::FormulaGrammar::AddressConvention eConv,
205 : : sal_Unicode cSeperator = ' ',
206 : : sal_Unicode cQuote = '\'');
207 : :
208 : : // Range to String core
209 : : static void GetStringFromAddress(
210 : : ::rtl::OUString& rString,
211 : : const ScAddress& rAddress,
212 : : const ScDocument* pDocument,
213 : : formula::FormulaGrammar::AddressConvention eConv,
214 : : sal_Unicode cSeperator = ' ',
215 : : sal_Bool bAppendStr = false,
216 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
217 : : static void GetStringFromRange(
218 : : ::rtl::OUString& rString,
219 : : const ScRange& rRange,
220 : : const ScDocument* pDocument,
221 : : formula::FormulaGrammar::AddressConvention eConv,
222 : : sal_Unicode cSeperator = ' ',
223 : : sal_Bool bAppendStr = false,
224 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
225 : : static void GetStringFromRangeList(
226 : : ::rtl::OUString& rString,
227 : : const ScRangeList* pRangeList,
228 : : const ScDocument* pDocument,
229 : : formula::FormulaGrammar::AddressConvention eConv,
230 : : sal_Unicode cSeperator = ' ',
231 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D));
232 : :
233 : : static void GetStringFromArea(
234 : : ::rtl::OUString& rString,
235 : : const ScArea& rArea,
236 : : const ScDocument* pDocument,
237 : : formula::FormulaGrammar::AddressConvention eConv,
238 : : sal_Unicode cSeperator = ' ',
239 : : sal_Bool bAppendStr = false,
240 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
241 : :
242 : : // Range to String API
243 : : static void GetStringFromAddress(
244 : : ::rtl::OUString& rString,
245 : : const ::com::sun::star::table::CellAddress& rAddress,
246 : : const ScDocument* pDocument,
247 : : formula::FormulaGrammar::AddressConvention eConv,
248 : : sal_Unicode cSeperator = ' ',
249 : : sal_Bool bAppendStr = false,
250 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
251 : : static void GetStringFromRange(
252 : : ::rtl::OUString& rString,
253 : : const ::com::sun::star::table::CellRangeAddress& rRange,
254 : : const ScDocument* pDocument,
255 : : formula::FormulaGrammar::AddressConvention eConv,
256 : : sal_Unicode cSeperator = ' ',
257 : : sal_Bool bAppendStr = false,
258 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
259 : : static void GetStringFromRangeList(
260 : : ::rtl::OUString& rString,
261 : : const ::com::sun::star::uno::Sequence< ::com::sun::star::table::CellRangeAddress >& rRangeSeq,
262 : : const ScDocument* pDocument,
263 : : formula::FormulaGrammar::AddressConvention eConv,
264 : : sal_Unicode cSeperator = ' ',
265 : : sal_uInt16 nFormatFlags = (SCA_VALID | SCA_TAB_3D) );
266 : :
267 : : // XML Range to Calc Range
268 : : static void GetStringFromXMLRangeString(
269 : : ::rtl::OUString& rString,
270 : : const ::rtl::OUString& rXMLRange,
271 : : ScDocument* pDoc );
272 : :
273 : : // String to RangeData core
274 : : static ScRangeData* GetRangeDataFromString(const rtl::OUString& rString, const SCTAB nTab, const ScDocument* pDoc);
275 : : };
276 : :
277 : : //------------------------------------------------------------------------
278 : :
279 : : class ScArea
280 : : {
281 : : public:
282 : : ScArea( SCTAB tab = 0,
283 : : SCCOL colStart = 0,
284 : : SCROW rowStart = 0,
285 : : SCCOL colEnd = 0,
286 : : SCROW rowEnd = 0 );
287 : :
288 : : ScArea( const ScArea& r );
289 : :
290 : : ScArea& operator= ( const ScArea& r );
291 : : sal_Bool operator== ( const ScArea& r ) const;
292 : : sal_Bool operator!= ( const ScArea& r ) const { return !( operator==(r) ); }
293 : :
294 : : public:
295 : : SCTAB nTab;
296 : : SCCOL nColStart;
297 : : SCROW nRowStart;
298 : : SCCOL nColEnd;
299 : : SCROW nRowEnd;
300 : : };
301 : :
302 : : //
303 : : // returns areas with reference and all db-areas
304 : : //
305 : :
306 : : class SC_DLLPUBLIC ScAreaNameIterator
307 : : {
308 : : private:
309 : : ScRangeName* pRangeName;
310 : : ScDBCollection* pDBCollection;
311 : : ScRangeName::const_iterator maRNPos;
312 : : ScRangeName::const_iterator maRNEnd;
313 : : ScDBCollection::NamedDBs::const_iterator maDBPos;
314 : : ScDBCollection::NamedDBs::const_iterator maDBEnd;
315 : : bool bFirstPass;
316 : :
317 : : public:
318 : : ScAreaNameIterator( ScDocument* pDoc );
319 : 0 : ~ScAreaNameIterator() {}
320 : :
321 : : bool Next( rtl::OUString& rName, ScRange& rRange );
322 : : bool Next( String& rName, ScRange& rRange );
323 : 0 : bool WasDBName() const { return !bFirstPass; }
324 : : };
325 : :
326 : :
327 : : #endif // SC_RANGEUTL_HXX
328 : :
329 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|