xref: /trunk/main/sc/source/core/data/global2.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*b3f79822SAndrew Rist  * distributed with this work for additional information
6*b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17*b3f79822SAndrew Rist  * specific language governing permissions and limitations
18*b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*b3f79822SAndrew Rist  *************************************************************/
21*b3f79822SAndrew Rist 
22*b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <sfx2/docfile.hxx>
32cdf0e10cSrcweir #include <sfx2/objsh.hxx>
33cdf0e10cSrcweir #include <unotools/textsearch.hxx>
34cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
35cdf0e10cSrcweir #include <unotools/useroptions.hxx>
36cdf0e10cSrcweir #include <tools/urlobj.hxx>
37cdf0e10cSrcweir #include <unotools/charclass.hxx>
38cdf0e10cSrcweir #include <stdlib.h>
39cdf0e10cSrcweir #include <ctype.h>
40cdf0e10cSrcweir #include <unotools/syslocale.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include "global.hxx"
43cdf0e10cSrcweir #include "rangeutl.hxx"
44cdf0e10cSrcweir #include "rechead.hxx"
45cdf0e10cSrcweir #include "compiler.hxx"
46cdf0e10cSrcweir #include "paramisc.hxx"
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include "sc.hrc"
49cdf0e10cSrcweir #include "globstr.hrc"
50cdf0e10cSrcweir 
51cdf0e10cSrcweir using ::std::vector;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // -----------------------------------------------------------------------
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 
58cdf0e10cSrcweir //------------------------------------------------------------------------
59cdf0e10cSrcweir // struct ScImportParam:
60cdf0e10cSrcweir 
ScImportParam()61cdf0e10cSrcweir ScImportParam::ScImportParam() :
62cdf0e10cSrcweir     nCol1(0),
63cdf0e10cSrcweir     nRow1(0),
64cdf0e10cSrcweir     nCol2(0),
65cdf0e10cSrcweir     nRow2(0),
66cdf0e10cSrcweir     bImport(sal_False),
67cdf0e10cSrcweir     bNative(sal_False),
68cdf0e10cSrcweir     bSql(sal_True),
69cdf0e10cSrcweir     nType(ScDbTable)
70cdf0e10cSrcweir {
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
ScImportParam(const ScImportParam & r)73cdf0e10cSrcweir ScImportParam::ScImportParam( const ScImportParam& r ) :
74cdf0e10cSrcweir     nCol1       (r.nCol1),
75cdf0e10cSrcweir     nRow1       (r.nRow1),
76cdf0e10cSrcweir     nCol2       (r.nCol2),
77cdf0e10cSrcweir     nRow2       (r.nRow2),
78cdf0e10cSrcweir     bImport     (r.bImport),
79cdf0e10cSrcweir     aDBName     (r.aDBName),
80cdf0e10cSrcweir     aStatement  (r.aStatement),
81cdf0e10cSrcweir     bNative     (r.bNative),
82cdf0e10cSrcweir     bSql        (r.bSql),
83cdf0e10cSrcweir     nType       (r.nType)
84cdf0e10cSrcweir {
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
~ScImportParam()87cdf0e10cSrcweir ScImportParam::~ScImportParam()
88cdf0e10cSrcweir {
89cdf0e10cSrcweir }
90cdf0e10cSrcweir 
91cdf0e10cSrcweir //UNUSED2009-05 void ScImportParam::Clear()
92cdf0e10cSrcweir //UNUSED2009-05 {
93cdf0e10cSrcweir //UNUSED2009-05     nCol1 = nCol2 = 0;
94cdf0e10cSrcweir //UNUSED2009-05     nRow1 = nRow2 = 0;
95cdf0e10cSrcweir //UNUSED2009-05     bImport = sal_False;
96cdf0e10cSrcweir //UNUSED2009-05     bNative = sal_False;
97cdf0e10cSrcweir //UNUSED2009-05     bSql = sal_True;
98cdf0e10cSrcweir //UNUSED2009-05     nType = ScDbTable;
99cdf0e10cSrcweir //UNUSED2009-05     aDBName.Erase();
100cdf0e10cSrcweir //UNUSED2009-05     aStatement.Erase();
101cdf0e10cSrcweir //UNUSED2009-05 }
102cdf0e10cSrcweir 
operator =(const ScImportParam & r)103cdf0e10cSrcweir ScImportParam& ScImportParam::operator=( const ScImportParam& r )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     nCol1           = r.nCol1;
106cdf0e10cSrcweir     nRow1           = r.nRow1;
107cdf0e10cSrcweir     nCol2           = r.nCol2;
108cdf0e10cSrcweir     nRow2           = r.nRow2;
109cdf0e10cSrcweir     bImport         = r.bImport;
110cdf0e10cSrcweir     aDBName         = r.aDBName;
111cdf0e10cSrcweir     aStatement      = r.aStatement;
112cdf0e10cSrcweir     bNative         = r.bNative;
113cdf0e10cSrcweir     bSql            = r.bSql;
114cdf0e10cSrcweir     nType           = r.nType;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     return *this;
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
operator ==(const ScImportParam & rOther) const119cdf0e10cSrcweir sal_Bool ScImportParam::operator==( const ScImportParam& rOther ) const
120cdf0e10cSrcweir {
121cdf0e10cSrcweir     return( nCol1       == rOther.nCol1 &&
122cdf0e10cSrcweir             nRow1       == rOther.nRow1 &&
123cdf0e10cSrcweir             nCol2       == rOther.nCol2 &&
124cdf0e10cSrcweir             nRow2       == rOther.nRow2 &&
125cdf0e10cSrcweir             bImport     == rOther.bImport &&
126cdf0e10cSrcweir             aDBName     == rOther.aDBName &&
127cdf0e10cSrcweir             aStatement  == rOther.aStatement &&
128cdf0e10cSrcweir             bNative     == rOther.bNative &&
129cdf0e10cSrcweir             bSql        == rOther.bSql &&
130cdf0e10cSrcweir             nType       == rOther.nType );
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     //! nQuerySh und pConnection sind gleich ?
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 
136cdf0e10cSrcweir //------------------------------------------------------------------------
137cdf0e10cSrcweir // struct ScQueryParam:
138cdf0e10cSrcweir 
ScQueryEntry()139cdf0e10cSrcweir ScQueryEntry::ScQueryEntry() :
140cdf0e10cSrcweir     bDoQuery(sal_False),
141cdf0e10cSrcweir     bQueryByString(sal_False),
142cdf0e10cSrcweir     bQueryByDate(false),
143cdf0e10cSrcweir     nField(0),
144cdf0e10cSrcweir     eOp(SC_EQUAL),
145cdf0e10cSrcweir     eConnect(SC_AND),
146cdf0e10cSrcweir     pStr(new String),
147cdf0e10cSrcweir     nVal(0.0),
148cdf0e10cSrcweir     pSearchParam(NULL),
149cdf0e10cSrcweir     pSearchText(NULL)
150cdf0e10cSrcweir {
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
ScQueryEntry(const ScQueryEntry & r)153cdf0e10cSrcweir ScQueryEntry::ScQueryEntry(const ScQueryEntry& r) :
154cdf0e10cSrcweir     bDoQuery(r.bDoQuery),
155cdf0e10cSrcweir     bQueryByString(r.bQueryByString),
156cdf0e10cSrcweir     bQueryByDate(r.bQueryByDate),
157cdf0e10cSrcweir     nField(r.nField),
158cdf0e10cSrcweir     eOp(r.eOp),
159cdf0e10cSrcweir     eConnect(r.eConnect),
160cdf0e10cSrcweir     pStr(new String(*r.pStr)),
161cdf0e10cSrcweir     nVal(r.nVal),
162cdf0e10cSrcweir     pSearchParam(NULL),
163cdf0e10cSrcweir     pSearchText(NULL)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
~ScQueryEntry()167cdf0e10cSrcweir ScQueryEntry::~ScQueryEntry()
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     delete pStr;
170cdf0e10cSrcweir     if ( pSearchParam )
171cdf0e10cSrcweir     {
172cdf0e10cSrcweir         delete pSearchParam;
173cdf0e10cSrcweir         delete pSearchText;
174cdf0e10cSrcweir     }
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
operator =(const ScQueryEntry & r)177cdf0e10cSrcweir ScQueryEntry& ScQueryEntry::operator=( const ScQueryEntry& r )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir     bDoQuery        = r.bDoQuery;
180cdf0e10cSrcweir     bQueryByString  = r.bQueryByString;
181cdf0e10cSrcweir     bQueryByDate    = r.bQueryByDate;
182cdf0e10cSrcweir     eOp             = r.eOp;
183cdf0e10cSrcweir     eConnect        = r.eConnect;
184cdf0e10cSrcweir     nField          = r.nField;
185cdf0e10cSrcweir     nVal            = r.nVal;
186cdf0e10cSrcweir     *pStr           = *r.pStr;
187cdf0e10cSrcweir     if ( pSearchParam )
188cdf0e10cSrcweir     {
189cdf0e10cSrcweir         delete pSearchParam;
190cdf0e10cSrcweir         delete pSearchText;
191cdf0e10cSrcweir     }
192cdf0e10cSrcweir     pSearchParam    = NULL;
193cdf0e10cSrcweir     pSearchText     = NULL;
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     return *this;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
Clear()198cdf0e10cSrcweir void ScQueryEntry::Clear()
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     bDoQuery        = sal_False;
201cdf0e10cSrcweir     bQueryByString  = sal_False;
202cdf0e10cSrcweir     bQueryByDate    = false;
203cdf0e10cSrcweir     eOp             = SC_EQUAL;
204cdf0e10cSrcweir     eConnect        = SC_AND;
205cdf0e10cSrcweir     nField          = 0;
206cdf0e10cSrcweir     nVal            = 0.0;
207cdf0e10cSrcweir     pStr->Erase();
208cdf0e10cSrcweir     if ( pSearchParam )
209cdf0e10cSrcweir     {
210cdf0e10cSrcweir         delete pSearchParam;
211cdf0e10cSrcweir         delete pSearchText;
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir     pSearchParam    = NULL;
214cdf0e10cSrcweir     pSearchText     = NULL;
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
operator ==(const ScQueryEntry & r) const217cdf0e10cSrcweir sal_Bool ScQueryEntry::operator==( const ScQueryEntry& r ) const
218cdf0e10cSrcweir {
219cdf0e10cSrcweir     return bDoQuery         == r.bDoQuery
220cdf0e10cSrcweir         && bQueryByString   == r.bQueryByString
221cdf0e10cSrcweir         && bQueryByDate     == r.bQueryByDate
222cdf0e10cSrcweir         && eOp              == r.eOp
223cdf0e10cSrcweir         && eConnect         == r.eConnect
224cdf0e10cSrcweir         && nField           == r.nField
225cdf0e10cSrcweir         && nVal             == r.nVal
226cdf0e10cSrcweir         && *pStr            == *r.pStr;
227cdf0e10cSrcweir     //! pSearchParam und pSearchText nicht vergleichen
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
GetSearchTextPtr(sal_Bool bCaseSens)230cdf0e10cSrcweir utl::TextSearch* ScQueryEntry::GetSearchTextPtr( sal_Bool bCaseSens )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir     if ( !pSearchParam )
233cdf0e10cSrcweir     {
234cdf0e10cSrcweir         pSearchParam = new utl::SearchParam( *pStr, utl::SearchParam::SRCH_REGEXP,
235cdf0e10cSrcweir             bCaseSens, sal_False, sal_False );
236cdf0e10cSrcweir         pSearchText = new utl::TextSearch( *pSearchParam, *ScGlobal::pCharClass );
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir     return pSearchText;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir //------------------------------------------------------------------------
242cdf0e10cSrcweir // struct ScSubTotalParam:
243cdf0e10cSrcweir 
ScSubTotalParam()244cdf0e10cSrcweir ScSubTotalParam::ScSubTotalParam()
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     for ( sal_uInt16 i=0; i<MAXSUBTOTAL; i++ )
247cdf0e10cSrcweir     {
248cdf0e10cSrcweir         nSubTotals[i] = 0;
249cdf0e10cSrcweir         pSubTotals[i] = NULL;
250cdf0e10cSrcweir         pFunctions[i] = NULL;
251cdf0e10cSrcweir     }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     Clear();
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir //------------------------------------------------------------------------
257cdf0e10cSrcweir 
ScSubTotalParam(const ScSubTotalParam & r)258cdf0e10cSrcweir ScSubTotalParam::ScSubTotalParam( const ScSubTotalParam& r ) :
259cdf0e10cSrcweir         nCol1(r.nCol1),nRow1(r.nRow1),nCol2(r.nCol2),nRow2(r.nRow2),
260cdf0e10cSrcweir         bRemoveOnly(r.bRemoveOnly),bReplace(r.bReplace),bPagebreak(r.bPagebreak),bCaseSens(r.bCaseSens),
261cdf0e10cSrcweir         bDoSort(r.bDoSort),bAscending(r.bAscending),bUserDef(r.bUserDef),nUserIndex(r.nUserIndex),
262cdf0e10cSrcweir         bIncludePattern(r.bIncludePattern)
263cdf0e10cSrcweir {
264cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
265cdf0e10cSrcweir     {
266cdf0e10cSrcweir         bGroupActive[i] = r.bGroupActive[i];
267cdf0e10cSrcweir         nField[i]       = r.nField[i];
268cdf0e10cSrcweir 
269cdf0e10cSrcweir         if ( (r.nSubTotals[i] > 0) && r.pSubTotals[i] && r.pFunctions[i] )
270cdf0e10cSrcweir         {
271cdf0e10cSrcweir             nSubTotals[i] = r.nSubTotals[i];
272cdf0e10cSrcweir             pSubTotals[i] = new SCCOL   [r.nSubTotals[i]];
273cdf0e10cSrcweir             pFunctions[i] = new ScSubTotalFunc  [r.nSubTotals[i]];
274cdf0e10cSrcweir 
275cdf0e10cSrcweir             for (SCCOL j=0; j<r.nSubTotals[i]; j++)
276cdf0e10cSrcweir             {
277cdf0e10cSrcweir                 pSubTotals[i][j] = r.pSubTotals[i][j];
278cdf0e10cSrcweir                 pFunctions[i][j] = r.pFunctions[i][j];
279cdf0e10cSrcweir             }
280cdf0e10cSrcweir         }
281cdf0e10cSrcweir         else
282cdf0e10cSrcweir         {
283cdf0e10cSrcweir             nSubTotals[i] = 0;
284cdf0e10cSrcweir             pSubTotals[i] = NULL;
285cdf0e10cSrcweir             pFunctions[i] = NULL;
286cdf0e10cSrcweir         }
287cdf0e10cSrcweir     }
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir //------------------------------------------------------------------------
291cdf0e10cSrcweir 
Clear()292cdf0e10cSrcweir void ScSubTotalParam::Clear()
293cdf0e10cSrcweir {
294cdf0e10cSrcweir     nCol1=nCol2= 0;
295cdf0e10cSrcweir     nRow1=nRow2 = 0;
296cdf0e10cSrcweir     nUserIndex = 0;
297cdf0e10cSrcweir     bPagebreak=bCaseSens=bUserDef=bIncludePattern=bRemoveOnly = sal_False;
298cdf0e10cSrcweir     bAscending=bReplace=bDoSort = sal_True;
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         bGroupActive[i] = sal_False;
303cdf0e10cSrcweir         nField[i]       = 0;
304cdf0e10cSrcweir 
305cdf0e10cSrcweir         if ( (nSubTotals[i] > 0) && pSubTotals[i] && pFunctions[i] )
306cdf0e10cSrcweir         {
307cdf0e10cSrcweir             for ( SCCOL j=0; j<nSubTotals[i]; j++ ) {
308cdf0e10cSrcweir                 pSubTotals[i][j] = 0;
309cdf0e10cSrcweir                 pFunctions[i][j] = SUBTOTAL_FUNC_NONE;
310cdf0e10cSrcweir             }
311cdf0e10cSrcweir         }
312cdf0e10cSrcweir     }
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
315cdf0e10cSrcweir //------------------------------------------------------------------------
316cdf0e10cSrcweir 
operator =(const ScSubTotalParam & r)317cdf0e10cSrcweir ScSubTotalParam& ScSubTotalParam::operator=( const ScSubTotalParam& r )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     nCol1           = r.nCol1;
320cdf0e10cSrcweir     nRow1           = r.nRow1;
321cdf0e10cSrcweir     nCol2           = r.nCol2;
322cdf0e10cSrcweir     nRow2           = r.nRow2;
323cdf0e10cSrcweir     bRemoveOnly     = r.bRemoveOnly;
324cdf0e10cSrcweir     bReplace        = r.bReplace;
325cdf0e10cSrcweir     bPagebreak      = r.bPagebreak;
326cdf0e10cSrcweir     bCaseSens       = r.bCaseSens;
327cdf0e10cSrcweir     bDoSort         = r.bDoSort;
328cdf0e10cSrcweir     bAscending      = r.bAscending;
329cdf0e10cSrcweir     bUserDef        = r.bUserDef;
330cdf0e10cSrcweir     nUserIndex      = r.nUserIndex;
331cdf0e10cSrcweir     bIncludePattern = r.bIncludePattern;
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         bGroupActive[i] = r.bGroupActive[i];
336cdf0e10cSrcweir         nField[i]       = r.nField[i];
337cdf0e10cSrcweir         nSubTotals[i]   = r.nSubTotals[i];
338cdf0e10cSrcweir 
339cdf0e10cSrcweir         if ( pSubTotals[i] ) delete [] pSubTotals[i];
340cdf0e10cSrcweir         if ( pFunctions[i] ) delete [] pFunctions[i];
341cdf0e10cSrcweir 
342cdf0e10cSrcweir         if ( r.nSubTotals[i] > 0 )
343cdf0e10cSrcweir         {
344cdf0e10cSrcweir             pSubTotals[i] = new SCCOL   [r.nSubTotals[i]];
345cdf0e10cSrcweir             pFunctions[i] = new ScSubTotalFunc  [r.nSubTotals[i]];
346cdf0e10cSrcweir 
347cdf0e10cSrcweir             for (SCCOL j=0; j<r.nSubTotals[i]; j++)
348cdf0e10cSrcweir             {
349cdf0e10cSrcweir                 pSubTotals[i][j] = r.pSubTotals[i][j];
350cdf0e10cSrcweir                 pFunctions[i][j] = r.pFunctions[i][j];
351cdf0e10cSrcweir             }
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir         else
354cdf0e10cSrcweir         {
355cdf0e10cSrcweir             nSubTotals[i] = 0;
356cdf0e10cSrcweir             pSubTotals[i] = NULL;
357cdf0e10cSrcweir             pFunctions[i] = NULL;
358cdf0e10cSrcweir         }
359cdf0e10cSrcweir     }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir     return *this;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir //------------------------------------------------------------------------
365cdf0e10cSrcweir 
operator ==(const ScSubTotalParam & rOther) const366cdf0e10cSrcweir sal_Bool ScSubTotalParam::operator==( const ScSubTotalParam& rOther ) const
367cdf0e10cSrcweir {
368cdf0e10cSrcweir     sal_Bool bEqual =   (nCol1          == rOther.nCol1)
369cdf0e10cSrcweir                  && (nRow1          == rOther.nRow1)
370cdf0e10cSrcweir                  && (nCol2          == rOther.nCol2)
371cdf0e10cSrcweir                  && (nRow2          == rOther.nRow2)
372cdf0e10cSrcweir                  && (bRemoveOnly    == rOther.bRemoveOnly)
373cdf0e10cSrcweir                  && (bReplace       == rOther.bReplace)
374cdf0e10cSrcweir                  && (bPagebreak     == rOther.bPagebreak)
375cdf0e10cSrcweir                  && (bDoSort        == rOther.bDoSort)
376cdf0e10cSrcweir                  && (bCaseSens      == rOther.bCaseSens)
377cdf0e10cSrcweir                  && (bAscending     == rOther.bAscending)
378cdf0e10cSrcweir                  && (bUserDef       == rOther.bUserDef)
379cdf0e10cSrcweir                  && (nUserIndex     == rOther.nUserIndex)
380cdf0e10cSrcweir                  && (bIncludePattern== rOther.bIncludePattern);
381cdf0e10cSrcweir 
382cdf0e10cSrcweir     if ( bEqual )
383cdf0e10cSrcweir     {
384cdf0e10cSrcweir         bEqual = sal_True;
385cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<MAXSUBTOTAL && bEqual; i++ )
386cdf0e10cSrcweir         {
387cdf0e10cSrcweir             bEqual =   (bGroupActive[i] == rOther.bGroupActive[i])
388cdf0e10cSrcweir                     && (nField[i]       == rOther.nField[i])
389cdf0e10cSrcweir                     && (nSubTotals[i]   == rOther.nSubTotals[i]);
390cdf0e10cSrcweir 
391cdf0e10cSrcweir             if ( bEqual && (nSubTotals[i] > 0) )
392cdf0e10cSrcweir             {
393cdf0e10cSrcweir                 bEqual = (pSubTotals != NULL) && (pFunctions != NULL);
394cdf0e10cSrcweir 
395cdf0e10cSrcweir                 for (SCCOL j=0; (j<nSubTotals[i]) && bEqual; j++)
396cdf0e10cSrcweir                 {
397cdf0e10cSrcweir                     bEqual =   bEqual
398cdf0e10cSrcweir                             && (pSubTotals[i][j] == rOther.pSubTotals[i][j])
399cdf0e10cSrcweir                             && (pFunctions[i][j] == rOther.pFunctions[i][j]);
400cdf0e10cSrcweir                 }
401cdf0e10cSrcweir             }
402cdf0e10cSrcweir         }
403cdf0e10cSrcweir     }
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     return bEqual;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir //------------------------------------------------------------------------
409cdf0e10cSrcweir 
SetSubTotals(sal_uInt16 nGroup,const SCCOL * ptrSubTotals,const ScSubTotalFunc * ptrFunctions,sal_uInt16 nCount)410cdf0e10cSrcweir void ScSubTotalParam::SetSubTotals( sal_uInt16                  nGroup,
411cdf0e10cSrcweir                                     const SCCOL*            ptrSubTotals,
412cdf0e10cSrcweir                                     const ScSubTotalFunc*   ptrFunctions,
413cdf0e10cSrcweir                                     sal_uInt16                  nCount )
414cdf0e10cSrcweir {
415cdf0e10cSrcweir     DBG_ASSERT( (nGroup <= MAXSUBTOTAL),
416cdf0e10cSrcweir                 "ScSubTotalParam::SetSubTotals(): nGroup > MAXSUBTOTAL!" );
417cdf0e10cSrcweir     DBG_ASSERT( ptrSubTotals,
418cdf0e10cSrcweir                 "ScSubTotalParam::SetSubTotals(): ptrSubTotals == NULL!" );
419cdf0e10cSrcweir     DBG_ASSERT( ptrFunctions,
420cdf0e10cSrcweir                 "ScSubTotalParam::SetSubTotals(): ptrFunctions == NULL!" );
421cdf0e10cSrcweir     DBG_ASSERT( (nCount > 0),
422cdf0e10cSrcweir                 "ScSubTotalParam::SetSubTotals(): nCount <= 0!" );
423cdf0e10cSrcweir 
424cdf0e10cSrcweir     if ( ptrSubTotals && ptrFunctions && (nCount > 0) && (nGroup <= MAXSUBTOTAL) )
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         // 0 wird als 1 aufgefasst, sonst zum Array-Index dekrementieren
427cdf0e10cSrcweir         if (nGroup != 0)
428cdf0e10cSrcweir             nGroup--;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir         delete [] pSubTotals[nGroup];
431cdf0e10cSrcweir         delete [] pFunctions[nGroup];
432cdf0e10cSrcweir 
433cdf0e10cSrcweir         pSubTotals[nGroup] = new SCCOL      [nCount];
434cdf0e10cSrcweir         pFunctions[nGroup] = new ScSubTotalFunc [nCount];
435cdf0e10cSrcweir         nSubTotals[nGroup] = static_cast<SCCOL>(nCount);
436cdf0e10cSrcweir 
437cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<nCount; i++ )
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir             pSubTotals[nGroup][i] = ptrSubTotals[i];
440cdf0e10cSrcweir             pFunctions[nGroup][i] = ptrFunctions[i];
441cdf0e10cSrcweir         }
442cdf0e10cSrcweir     }
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir //------------------------------------------------------------------------
446cdf0e10cSrcweir // struct ScConsolidateParam:
447cdf0e10cSrcweir 
ScConsolidateParam()448cdf0e10cSrcweir ScConsolidateParam::ScConsolidateParam() :
449cdf0e10cSrcweir     ppDataAreas( NULL )
450cdf0e10cSrcweir {
451cdf0e10cSrcweir     Clear();
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
454cdf0e10cSrcweir //------------------------------------------------------------------------
455cdf0e10cSrcweir 
ScConsolidateParam(const ScConsolidateParam & r)456cdf0e10cSrcweir ScConsolidateParam::ScConsolidateParam( const ScConsolidateParam& r ) :
457cdf0e10cSrcweir         nCol(r.nCol),nRow(r.nRow),nTab(r.nTab),
458cdf0e10cSrcweir         eFunction(r.eFunction),nDataAreaCount(0),
459cdf0e10cSrcweir         ppDataAreas( NULL ),
460cdf0e10cSrcweir         bByCol(r.bByCol),bByRow(r.bByRow),bReferenceData(r.bReferenceData)
461cdf0e10cSrcweir {
462cdf0e10cSrcweir     if ( r.nDataAreaCount > 0 )
463cdf0e10cSrcweir     {
464cdf0e10cSrcweir         nDataAreaCount = r.nDataAreaCount;
465cdf0e10cSrcweir         ppDataAreas = new ScArea*[nDataAreaCount];
466cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<nDataAreaCount; i++ )
467cdf0e10cSrcweir             ppDataAreas[i] = new ScArea( *(r.ppDataAreas[i]) );
468cdf0e10cSrcweir     }
469cdf0e10cSrcweir }
470cdf0e10cSrcweir 
471cdf0e10cSrcweir //------------------------------------------------------------------------
472cdf0e10cSrcweir 
~ScConsolidateParam()473cdf0e10cSrcweir __EXPORT ScConsolidateParam::~ScConsolidateParam()
474cdf0e10cSrcweir {
475cdf0e10cSrcweir     ClearDataAreas();
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //------------------------------------------------------------------------
479cdf0e10cSrcweir 
ClearDataAreas()480cdf0e10cSrcweir void __EXPORT ScConsolidateParam::ClearDataAreas()
481cdf0e10cSrcweir {
482cdf0e10cSrcweir     if ( ppDataAreas )
483cdf0e10cSrcweir     {
484cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<nDataAreaCount; i++ )
485cdf0e10cSrcweir             delete ppDataAreas[i];
486cdf0e10cSrcweir         delete [] ppDataAreas;
487cdf0e10cSrcweir         ppDataAreas = NULL;
488cdf0e10cSrcweir     }
489cdf0e10cSrcweir     nDataAreaCount = 0;
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir //------------------------------------------------------------------------
493cdf0e10cSrcweir 
Clear()494cdf0e10cSrcweir void __EXPORT ScConsolidateParam::Clear()
495cdf0e10cSrcweir {
496cdf0e10cSrcweir     ClearDataAreas();
497cdf0e10cSrcweir 
498cdf0e10cSrcweir     nCol = 0;
499cdf0e10cSrcweir     nRow = 0;
500cdf0e10cSrcweir     nTab = 0;
501cdf0e10cSrcweir     bByCol = bByRow = bReferenceData    = sal_False;
502cdf0e10cSrcweir     eFunction                           = SUBTOTAL_FUNC_SUM;
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir //------------------------------------------------------------------------
506cdf0e10cSrcweir 
operator =(const ScConsolidateParam & r)507cdf0e10cSrcweir ScConsolidateParam& __EXPORT ScConsolidateParam::operator=( const ScConsolidateParam& r )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir     nCol            = r.nCol;
510cdf0e10cSrcweir     nRow            = r.nRow;
511cdf0e10cSrcweir     nTab            = r.nTab;
512cdf0e10cSrcweir     bByCol          = r.bByCol;
513cdf0e10cSrcweir     bByRow          = r.bByRow;
514cdf0e10cSrcweir     bReferenceData  = r.bReferenceData;
515cdf0e10cSrcweir     eFunction       = r.eFunction;
516cdf0e10cSrcweir     SetAreas( r.ppDataAreas, r.nDataAreaCount );
517cdf0e10cSrcweir 
518cdf0e10cSrcweir     return *this;
519cdf0e10cSrcweir }
520cdf0e10cSrcweir 
521cdf0e10cSrcweir //------------------------------------------------------------------------
522cdf0e10cSrcweir 
operator ==(const ScConsolidateParam & r) const523cdf0e10cSrcweir sal_Bool __EXPORT ScConsolidateParam::operator==( const ScConsolidateParam& r ) const
524cdf0e10cSrcweir {
525cdf0e10cSrcweir     sal_Bool bEqual =   (nCol           == r.nCol)
526cdf0e10cSrcweir                  && (nRow           == r.nRow)
527cdf0e10cSrcweir                  && (nTab           == r.nTab)
528cdf0e10cSrcweir                  && (bByCol         == r.bByCol)
529cdf0e10cSrcweir                  && (bByRow         == r.bByRow)
530cdf0e10cSrcweir                  && (bReferenceData == r.bReferenceData)
531cdf0e10cSrcweir                  && (nDataAreaCount == r.nDataAreaCount)
532cdf0e10cSrcweir                  && (eFunction      == r.eFunction);
533cdf0e10cSrcweir 
534cdf0e10cSrcweir     if ( nDataAreaCount == 0 )
535cdf0e10cSrcweir         bEqual = bEqual && (ppDataAreas == NULL) && (r.ppDataAreas == NULL);
536cdf0e10cSrcweir     else
537cdf0e10cSrcweir         bEqual = bEqual && (ppDataAreas != NULL) && (r.ppDataAreas != NULL);
538cdf0e10cSrcweir 
539cdf0e10cSrcweir     if ( bEqual && (nDataAreaCount > 0) )
540cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<nDataAreaCount && bEqual; i++ )
541cdf0e10cSrcweir             bEqual = *(ppDataAreas[i]) == *(r.ppDataAreas[i]);
542cdf0e10cSrcweir 
543cdf0e10cSrcweir     return bEqual;
544cdf0e10cSrcweir }
545cdf0e10cSrcweir 
546cdf0e10cSrcweir //------------------------------------------------------------------------
547cdf0e10cSrcweir 
SetAreas(ScArea * const * ppAreas,sal_uInt16 nCount)548cdf0e10cSrcweir void __EXPORT ScConsolidateParam::SetAreas( ScArea* const* ppAreas, sal_uInt16 nCount )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     ClearDataAreas();
551cdf0e10cSrcweir     if ( ppAreas && nCount > 0 )
552cdf0e10cSrcweir     {
553cdf0e10cSrcweir         ppDataAreas = new ScArea*[nCount];
554cdf0e10cSrcweir         for ( sal_uInt16 i=0; i<nCount; i++ )
555cdf0e10cSrcweir             ppDataAreas[i] = new ScArea( *(ppAreas[i]) );
556cdf0e10cSrcweir         nDataAreaCount = nCount;
557cdf0e10cSrcweir     }
558cdf0e10cSrcweir }
559cdf0e10cSrcweir 
560cdf0e10cSrcweir //------------------------------------------------------------------------
561cdf0e10cSrcweir // struct ScSolveParam
562cdf0e10cSrcweir 
ScSolveParam()563cdf0e10cSrcweir ScSolveParam::ScSolveParam()
564cdf0e10cSrcweir     :   pStrTargetVal( NULL )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir //------------------------------------------------------------------------
569cdf0e10cSrcweir 
ScSolveParam(const ScSolveParam & r)570cdf0e10cSrcweir ScSolveParam::ScSolveParam( const ScSolveParam& r )
571cdf0e10cSrcweir     :   aRefFormulaCell ( r.aRefFormulaCell ),
572cdf0e10cSrcweir         aRefVariableCell( r.aRefVariableCell ),
573cdf0e10cSrcweir         pStrTargetVal   ( r.pStrTargetVal
574cdf0e10cSrcweir                             ? new String(*r.pStrTargetVal)
575cdf0e10cSrcweir                             : NULL )
576cdf0e10cSrcweir {
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir //------------------------------------------------------------------------
580cdf0e10cSrcweir 
ScSolveParam(const ScAddress & rFormulaCell,const ScAddress & rVariableCell,const String & rTargetValStr)581cdf0e10cSrcweir ScSolveParam::ScSolveParam( const ScAddress& rFormulaCell,
582cdf0e10cSrcweir                             const ScAddress& rVariableCell,
583cdf0e10cSrcweir                             const String&   rTargetValStr )
584cdf0e10cSrcweir     :   aRefFormulaCell ( rFormulaCell ),
585cdf0e10cSrcweir         aRefVariableCell( rVariableCell ),
586cdf0e10cSrcweir         pStrTargetVal   ( new String(rTargetValStr) )
587cdf0e10cSrcweir {
588cdf0e10cSrcweir }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir //------------------------------------------------------------------------
591cdf0e10cSrcweir 
~ScSolveParam()592cdf0e10cSrcweir ScSolveParam::~ScSolveParam()
593cdf0e10cSrcweir {
594cdf0e10cSrcweir     delete pStrTargetVal;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir 
597cdf0e10cSrcweir //------------------------------------------------------------------------
598cdf0e10cSrcweir 
operator =(const ScSolveParam & r)599cdf0e10cSrcweir ScSolveParam& __EXPORT ScSolveParam::operator=( const ScSolveParam& r )
600cdf0e10cSrcweir {
601cdf0e10cSrcweir     delete pStrTargetVal;
602cdf0e10cSrcweir 
603cdf0e10cSrcweir     aRefFormulaCell  = r.aRefFormulaCell;
604cdf0e10cSrcweir     aRefVariableCell = r.aRefVariableCell;
605cdf0e10cSrcweir     pStrTargetVal    = r.pStrTargetVal
606cdf0e10cSrcweir                             ? new String(*r.pStrTargetVal)
607cdf0e10cSrcweir                             : NULL;
608cdf0e10cSrcweir     return *this;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir //------------------------------------------------------------------------
612cdf0e10cSrcweir 
operator ==(const ScSolveParam & r) const613cdf0e10cSrcweir sal_Bool ScSolveParam::operator==( const ScSolveParam& r ) const
614cdf0e10cSrcweir {
615cdf0e10cSrcweir     sal_Bool bEqual =   (aRefFormulaCell  == r.aRefFormulaCell)
616cdf0e10cSrcweir                  && (aRefVariableCell == r.aRefVariableCell);
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     if ( bEqual )
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         if ( !pStrTargetVal && !r.pStrTargetVal )
621cdf0e10cSrcweir             bEqual = sal_True;
622cdf0e10cSrcweir         else if ( !pStrTargetVal || !r.pStrTargetVal )
623cdf0e10cSrcweir             bEqual = sal_False;
624cdf0e10cSrcweir         else if ( pStrTargetVal && r.pStrTargetVal )
625cdf0e10cSrcweir             bEqual = ( *pStrTargetVal == *(r.pStrTargetVal) );
626cdf0e10cSrcweir     }
627cdf0e10cSrcweir 
628cdf0e10cSrcweir     return bEqual;
629cdf0e10cSrcweir }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 
632cdf0e10cSrcweir //------------------------------------------------------------------------
633cdf0e10cSrcweir // struct ScTabOpParam
634cdf0e10cSrcweir 
ScTabOpParam(const ScTabOpParam & r)635cdf0e10cSrcweir ScTabOpParam::ScTabOpParam( const ScTabOpParam& r )
636cdf0e10cSrcweir     :   aRefFormulaCell ( r.aRefFormulaCell ),
637cdf0e10cSrcweir         aRefFormulaEnd  ( r.aRefFormulaEnd ),
638cdf0e10cSrcweir         aRefRowCell     ( r.aRefRowCell ),
639cdf0e10cSrcweir         aRefColCell     ( r.aRefColCell ),
640cdf0e10cSrcweir         nMode           ( r.nMode )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir //------------------------------------------------------------------------
645cdf0e10cSrcweir 
ScTabOpParam(const ScRefAddress & rFormulaCell,const ScRefAddress & rFormulaEnd,const ScRefAddress & rRowCell,const ScRefAddress & rColCell,sal_uInt8 nMd)646cdf0e10cSrcweir ScTabOpParam::ScTabOpParam( const ScRefAddress& rFormulaCell,
647cdf0e10cSrcweir                             const ScRefAddress& rFormulaEnd,
648cdf0e10cSrcweir                             const ScRefAddress& rRowCell,
649cdf0e10cSrcweir                             const ScRefAddress& rColCell,
650cdf0e10cSrcweir                                   sal_uInt8      nMd)
651cdf0e10cSrcweir     :   aRefFormulaCell ( rFormulaCell ),
652cdf0e10cSrcweir         aRefFormulaEnd  ( rFormulaEnd ),
653cdf0e10cSrcweir         aRefRowCell     ( rRowCell ),
654cdf0e10cSrcweir         aRefColCell     ( rColCell ),
655cdf0e10cSrcweir         nMode           ( nMd )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir //------------------------------------------------------------------------
660cdf0e10cSrcweir 
operator =(const ScTabOpParam & r)661cdf0e10cSrcweir ScTabOpParam& ScTabOpParam::operator=( const ScTabOpParam& r )
662cdf0e10cSrcweir {
663cdf0e10cSrcweir     aRefFormulaCell  = r.aRefFormulaCell;
664cdf0e10cSrcweir     aRefFormulaEnd   = r.aRefFormulaEnd;
665cdf0e10cSrcweir     aRefRowCell      = r.aRefRowCell;
666cdf0e10cSrcweir     aRefColCell      = r.aRefColCell;
667cdf0e10cSrcweir     nMode            = r.nMode;
668cdf0e10cSrcweir     return *this;
669cdf0e10cSrcweir }
670cdf0e10cSrcweir 
671cdf0e10cSrcweir //------------------------------------------------------------------------
672cdf0e10cSrcweir 
operator ==(const ScTabOpParam & r) const673cdf0e10cSrcweir sal_Bool __EXPORT ScTabOpParam::operator==( const ScTabOpParam& r ) const
674cdf0e10cSrcweir {
675cdf0e10cSrcweir     return (        (aRefFormulaCell == r.aRefFormulaCell)
676cdf0e10cSrcweir                  && (aRefFormulaEnd  == r.aRefFormulaEnd)
677cdf0e10cSrcweir                  && (aRefRowCell     == r.aRefRowCell)
678cdf0e10cSrcweir                  && (aRefColCell     == r.aRefColCell)
679cdf0e10cSrcweir                  && (nMode           == r.nMode) );
680cdf0e10cSrcweir }
681cdf0e10cSrcweir 
GetAbsDocName(const String & rFileName,SfxObjectShell * pShell)682cdf0e10cSrcweir String ScGlobal::GetAbsDocName( const String& rFileName,
683cdf0e10cSrcweir                                 SfxObjectShell* pShell )
684cdf0e10cSrcweir {
685cdf0e10cSrcweir     String aAbsName;
686cdf0e10cSrcweir     if ( !pShell->HasName() )
687cdf0e10cSrcweir     {   // maybe relative to document path working directory
688cdf0e10cSrcweir         INetURLObject aObj;
689cdf0e10cSrcweir         SvtPathOptions aPathOpt;
690cdf0e10cSrcweir         aObj.SetSmartURL( aPathOpt.GetWorkPath() );
691cdf0e10cSrcweir         aObj.setFinalSlash();       // it IS a path
692cdf0e10cSrcweir         bool bWasAbs = true;
693cdf0e10cSrcweir         aAbsName = aObj.smartRel2Abs( rFileName, bWasAbs ).GetMainURL(INetURLObject::NO_DECODE);
694cdf0e10cSrcweir         //  returned string must be encoded because it's used directly to create SfxMedium
695cdf0e10cSrcweir     }
696cdf0e10cSrcweir     else
697cdf0e10cSrcweir     {
698cdf0e10cSrcweir         const SfxMedium* pMedium = pShell->GetMedium();
699cdf0e10cSrcweir         if ( pMedium )
700cdf0e10cSrcweir         {
701cdf0e10cSrcweir             bool bWasAbs = true;
702cdf0e10cSrcweir             aAbsName = pMedium->GetURLObject().smartRel2Abs( rFileName, bWasAbs ).GetMainURL(INetURLObject::NO_DECODE);
703cdf0e10cSrcweir         }
704cdf0e10cSrcweir         else
705cdf0e10cSrcweir         {   // This can't happen, but ...
706cdf0e10cSrcweir             // just to be sure to have the same encoding
707cdf0e10cSrcweir             INetURLObject aObj;
708cdf0e10cSrcweir             aObj.SetSmartURL( aAbsName );
709cdf0e10cSrcweir             aAbsName = aObj.GetMainURL(INetURLObject::NO_DECODE);
710cdf0e10cSrcweir         }
711cdf0e10cSrcweir     }
712cdf0e10cSrcweir     return aAbsName;
713cdf0e10cSrcweir }
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 
GetDocTabName(const String & rFileName,const String & rTabName)716cdf0e10cSrcweir String ScGlobal::GetDocTabName( const String& rFileName,
717cdf0e10cSrcweir                                 const String& rTabName )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir     String aDocTab( '\'' );
720cdf0e10cSrcweir     aDocTab += rFileName;
721cdf0e10cSrcweir     xub_StrLen nPos = 1;
722cdf0e10cSrcweir     while( (nPos = aDocTab.Search( '\'', nPos ))
723cdf0e10cSrcweir             != STRING_NOTFOUND )
724cdf0e10cSrcweir     {   // escape Quotes
725cdf0e10cSrcweir         aDocTab.Insert( '\\', nPos );
726cdf0e10cSrcweir         nPos += 2;
727cdf0e10cSrcweir     }
728cdf0e10cSrcweir     aDocTab += '\'';
729cdf0e10cSrcweir     aDocTab += SC_COMPILER_FILE_TAB_SEP;
730cdf0e10cSrcweir     aDocTab += rTabName;    // "'Doc'#Tab"
731cdf0e10cSrcweir     return aDocTab;
732cdf0e10cSrcweir }
733