xref: /trunk/main/sc/source/core/tool/dbcolect.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include "dbcolect.hxx"
32cdf0e10cSrcweir #include "global.hxx"
33cdf0e10cSrcweir #include "refupdat.hxx"
34cdf0e10cSrcweir #include "rechead.hxx"
35cdf0e10cSrcweir #include "document.hxx"
36cdf0e10cSrcweir #include "queryparam.hxx"
37cdf0e10cSrcweir #include "globstr.hrc"
38cdf0e10cSrcweir 
3957b4fa3cSWang Lei #define SC_DBNAME_UNNAMED "__Anonymous_Sheet_DB__"
40cdf0e10cSrcweir 
41cdf0e10cSrcweir //---------------------------------------------------------------------------------------
42cdf0e10cSrcweir 
ScDBData(const String & rName,SCTAB nTab,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,sal_Bool bByR,sal_Bool bHasH)43cdf0e10cSrcweir ScDBData::ScDBData( const String& rName,
44cdf0e10cSrcweir                     SCTAB nTab,
45cdf0e10cSrcweir                     SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
46cdf0e10cSrcweir                     sal_Bool bByR, sal_Bool bHasH) :
47cdf0e10cSrcweir     aName       (rName),
48cdf0e10cSrcweir     nTable      (nTab),
49cdf0e10cSrcweir     nStartCol   (nCol1),
50cdf0e10cSrcweir     nStartRow   (nRow1),
51cdf0e10cSrcweir     nEndCol     (nCol2),
52cdf0e10cSrcweir     nEndRow     (nRow2),
53cdf0e10cSrcweir     bByRow      (bByR),
54cdf0e10cSrcweir     bHasHeader  (bHasH),
55cdf0e10cSrcweir     bDoSize     (sal_False),
56cdf0e10cSrcweir     bKeepFmt    (sal_False),
57cdf0e10cSrcweir     bStripData  (sal_False),
58cdf0e10cSrcweir     bIsAdvanced (sal_False),
59cdf0e10cSrcweir     bDBSelection(sal_False),
60cdf0e10cSrcweir     nIndex      (0),
61cdf0e10cSrcweir     bAutoFilter (sal_False),
62cdf0e10cSrcweir     bModified   (sal_False)
63cdf0e10cSrcweir {
64cdf0e10cSrcweir     sal_uInt16 i;
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     ScSortParam aSortParam;
67cdf0e10cSrcweir     ScQueryParam aQueryParam;
68cdf0e10cSrcweir     ScSubTotalParam aSubTotalParam;
69cdf0e10cSrcweir     ScImportParam aImportParam;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     for (i=0; i<MAXQUERY; i++)
72cdf0e10cSrcweir         pQueryStr[i] = new String;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
75cdf0e10cSrcweir     {
76cdf0e10cSrcweir         nSubTotals[i] = 0;
77cdf0e10cSrcweir         pSubTotals[i] = NULL;
78cdf0e10cSrcweir         pFunctions[i] = NULL;
79cdf0e10cSrcweir     }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     SetSortParam( aSortParam );
82cdf0e10cSrcweir     SetQueryParam( aQueryParam );
83cdf0e10cSrcweir     SetSubTotalParam( aSubTotalParam );
84cdf0e10cSrcweir     SetImportParam( aImportParam );
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
ScDBData(const ScDBData & rData)87cdf0e10cSrcweir ScDBData::ScDBData( const ScDBData& rData ) :
88cdf0e10cSrcweir     ScDataObject(),
89cdf0e10cSrcweir     ScRefreshTimer      ( rData ),
90cdf0e10cSrcweir     aName               (rData.aName),
91cdf0e10cSrcweir     nTable              (rData.nTable),
92cdf0e10cSrcweir     nStartCol           (rData.nStartCol),
93cdf0e10cSrcweir     nStartRow           (rData.nStartRow),
94cdf0e10cSrcweir     nEndCol             (rData.nEndCol),
95cdf0e10cSrcweir     nEndRow             (rData.nEndRow),
96cdf0e10cSrcweir     bByRow              (rData.bByRow),
97cdf0e10cSrcweir     bHasHeader          (rData.bHasHeader),
98cdf0e10cSrcweir     bDoSize             (rData.bDoSize),
99cdf0e10cSrcweir     bKeepFmt            (rData.bKeepFmt),
100cdf0e10cSrcweir     bStripData          (rData.bStripData),
101cdf0e10cSrcweir     bSortCaseSens       (rData.bSortCaseSens),
102cdf0e10cSrcweir     bIncludePattern     (rData.bIncludePattern),
103cdf0e10cSrcweir     bSortInplace        (rData.bSortInplace),
104cdf0e10cSrcweir     bSortUserDef        (rData.bSortUserDef),
105cdf0e10cSrcweir     nSortUserIndex      (rData.nSortUserIndex),
106cdf0e10cSrcweir     nSortDestTab        (rData.nSortDestTab),
107cdf0e10cSrcweir     nSortDestCol        (rData.nSortDestCol),
108cdf0e10cSrcweir     nSortDestRow        (rData.nSortDestRow),
109cdf0e10cSrcweir     aSortLocale         (rData.aSortLocale),
110cdf0e10cSrcweir     aSortAlgorithm      (rData.aSortAlgorithm),
111cdf0e10cSrcweir     bQueryInplace       (rData.bQueryInplace),
112cdf0e10cSrcweir     bQueryCaseSens      (rData.bQueryCaseSens),
113cdf0e10cSrcweir     bQueryRegExp        (rData.bQueryRegExp),
114cdf0e10cSrcweir     bQueryDuplicate     (rData.bQueryDuplicate),
115cdf0e10cSrcweir     nQueryDestTab       (rData.nQueryDestTab),
116cdf0e10cSrcweir     nQueryDestCol       (rData.nQueryDestCol),
117cdf0e10cSrcweir     nQueryDestRow       (rData.nQueryDestRow),
118cdf0e10cSrcweir     bIsAdvanced         (rData.bIsAdvanced),
119cdf0e10cSrcweir     aAdvSource          (rData.aAdvSource),
120cdf0e10cSrcweir     bSubRemoveOnly      (rData.bSubRemoveOnly),
121cdf0e10cSrcweir     bSubReplace         (rData.bSubReplace),
122cdf0e10cSrcweir     bSubPagebreak       (rData.bSubPagebreak),
123cdf0e10cSrcweir     bSubCaseSens        (rData.bSubCaseSens),
124cdf0e10cSrcweir     bSubDoSort          (rData.bSubDoSort),
125cdf0e10cSrcweir     bSubAscending       (rData.bSubAscending),
126cdf0e10cSrcweir     bSubIncludePattern  (rData.bSubIncludePattern),
127cdf0e10cSrcweir     bSubUserDef         (rData.bSubUserDef),
128cdf0e10cSrcweir     nSubUserIndex       (rData.nSubUserIndex),
129cdf0e10cSrcweir     bDBImport           (rData.bDBImport),
130cdf0e10cSrcweir     aDBName             (rData.aDBName),
131cdf0e10cSrcweir     aDBStatement        (rData.aDBStatement),
132cdf0e10cSrcweir     bDBNative           (rData.bDBNative),
133cdf0e10cSrcweir     bDBSelection        (rData.bDBSelection),
134cdf0e10cSrcweir     bDBSql              (rData.bDBSql),
135cdf0e10cSrcweir     nDBType             (rData.nDBType),
136cdf0e10cSrcweir     nIndex              (rData.nIndex),
137cdf0e10cSrcweir     bAutoFilter         (rData.bAutoFilter),
138cdf0e10cSrcweir     bModified           (rData.bModified)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     sal_uInt16 i;
141cdf0e10cSrcweir     sal_uInt16 j;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     for (i=0; i<MAXSORT; i++)
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         bDoSort[i]      = rData.bDoSort[i];
146cdf0e10cSrcweir         nSortField[i]   = rData.nSortField[i];
147cdf0e10cSrcweir         bAscending[i]   = rData.bAscending[i];
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir     for (i=0; i<MAXQUERY; i++)
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         bDoQuery[i]         = rData.bDoQuery[i];
152cdf0e10cSrcweir         nQueryField[i]      = rData.nQueryField[i];
153cdf0e10cSrcweir         eQueryOp[i]         = rData.eQueryOp[i];
154cdf0e10cSrcweir         bQueryByString[i]   = rData.bQueryByString[i];
155cdf0e10cSrcweir         bQueryByDate[i]     = rData.bQueryByDate[i];
156cdf0e10cSrcweir         pQueryStr[i]        = new String( *(rData.pQueryStr[i]) );
157cdf0e10cSrcweir         nQueryVal[i]        = rData.nQueryVal[i];
158cdf0e10cSrcweir         eQueryConnect[i]    = rData.eQueryConnect[i];
159cdf0e10cSrcweir     }
160cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
161cdf0e10cSrcweir     {
162cdf0e10cSrcweir         bDoSubTotal[i]      = rData.bDoSubTotal[i];
163cdf0e10cSrcweir         nSubField[i]        = rData.nSubField[i];
164cdf0e10cSrcweir 
165cdf0e10cSrcweir         SCCOL nCount    = rData.nSubTotals[i];
166cdf0e10cSrcweir         nSubTotals[i]   = nCount;
167cdf0e10cSrcweir         pFunctions[i]   = nCount > 0 ? new ScSubTotalFunc [nCount] : NULL;
168cdf0e10cSrcweir         pSubTotals[i]   = nCount > 0 ? new SCCOL          [nCount] : NULL;
169cdf0e10cSrcweir 
170cdf0e10cSrcweir         for (j=0; j<nCount; j++)
171cdf0e10cSrcweir         {
172cdf0e10cSrcweir             pSubTotals[i][j] = rData.pSubTotals[i][j];
173cdf0e10cSrcweir             pFunctions[i][j] = rData.pFunctions[i][j];
174cdf0e10cSrcweir         }
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
operator =(const ScDBData & rData)178cdf0e10cSrcweir ScDBData& ScDBData::operator= (const ScDBData& rData)
179cdf0e10cSrcweir {
180cdf0e10cSrcweir     sal_uInt16 i;
181cdf0e10cSrcweir     sal_uInt16 j;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     ScRefreshTimer::operator=( rData );
184cdf0e10cSrcweir     aName               = rData.aName;
185cdf0e10cSrcweir     nTable              = rData.nTable;
186cdf0e10cSrcweir     nStartCol           = rData.nStartCol;
187cdf0e10cSrcweir     nStartRow           = rData.nStartRow;
188cdf0e10cSrcweir     nEndCol             = rData.nEndCol;
189cdf0e10cSrcweir     nEndRow             = rData.nEndRow;
190cdf0e10cSrcweir     bByRow              = rData.bByRow;
191cdf0e10cSrcweir     bHasHeader          = rData.bHasHeader;
192cdf0e10cSrcweir     bDoSize             = rData.bDoSize;
193cdf0e10cSrcweir     bKeepFmt            = rData.bKeepFmt;
194cdf0e10cSrcweir     bStripData          = rData.bStripData;
195cdf0e10cSrcweir     bSortCaseSens       = rData.bSortCaseSens;
196cdf0e10cSrcweir     bIncludePattern     = rData.bIncludePattern;
197cdf0e10cSrcweir     bSortInplace        = rData.bSortInplace;
198cdf0e10cSrcweir     nSortDestTab        = rData.nSortDestTab;
199cdf0e10cSrcweir     nSortDestCol        = rData.nSortDestCol;
200cdf0e10cSrcweir     nSortDestRow        = rData.nSortDestRow;
201cdf0e10cSrcweir     bSortUserDef        = rData.bSortUserDef;
202cdf0e10cSrcweir     nSortUserIndex      = rData.nSortUserIndex;
203cdf0e10cSrcweir     aSortLocale         = rData.aSortLocale;
204cdf0e10cSrcweir     aSortAlgorithm      = rData.aSortAlgorithm;
205cdf0e10cSrcweir     bQueryInplace       = rData.bQueryInplace;
206cdf0e10cSrcweir     bQueryCaseSens      = rData.bQueryCaseSens;
207cdf0e10cSrcweir     bQueryRegExp        = rData.bQueryRegExp;
208cdf0e10cSrcweir     bQueryDuplicate     = rData.bQueryDuplicate;
209cdf0e10cSrcweir     nQueryDestTab       = rData.nQueryDestTab;
210cdf0e10cSrcweir     nQueryDestCol       = rData.nQueryDestCol;
211cdf0e10cSrcweir     nQueryDestRow       = rData.nQueryDestRow;
212cdf0e10cSrcweir     bIsAdvanced         = rData.bIsAdvanced;
213cdf0e10cSrcweir     aAdvSource          = rData.aAdvSource;
214cdf0e10cSrcweir     bSubRemoveOnly      = rData.bSubRemoveOnly;
215cdf0e10cSrcweir     bSubReplace         = rData.bSubReplace;
216cdf0e10cSrcweir     bSubPagebreak       = rData.bSubPagebreak;
217cdf0e10cSrcweir     bSubCaseSens        = rData.bSubCaseSens;
218cdf0e10cSrcweir     bSubDoSort          = rData.bSubDoSort;
219cdf0e10cSrcweir     bSubAscending       = rData.bSubAscending;
220cdf0e10cSrcweir     bSubIncludePattern  = rData.bSubIncludePattern;
221cdf0e10cSrcweir     bSubUserDef         = rData.bSubUserDef;
222cdf0e10cSrcweir     nSubUserIndex       = rData.nSubUserIndex;
223cdf0e10cSrcweir     bDBImport           = rData.bDBImport;
224cdf0e10cSrcweir     aDBName             = rData.aDBName;
225cdf0e10cSrcweir     aDBStatement        = rData.aDBStatement;
226cdf0e10cSrcweir     bDBNative           = rData.bDBNative;
227cdf0e10cSrcweir     bDBSelection        = rData.bDBSelection;
228cdf0e10cSrcweir     bDBSql              = rData.bDBSql;
229cdf0e10cSrcweir     nDBType             = rData.nDBType;
230cdf0e10cSrcweir     nIndex              = rData.nIndex;
231cdf0e10cSrcweir     bAutoFilter         = rData.bAutoFilter;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     for (i=0; i<MAXSORT; i++)
234cdf0e10cSrcweir     {
235cdf0e10cSrcweir         bDoSort[i]      = rData.bDoSort[i];
236cdf0e10cSrcweir         nSortField[i]   = rData.nSortField[i];
237cdf0e10cSrcweir         bAscending[i]   = rData.bAscending[i];
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir     for (i=0; i<MAXQUERY; i++)
240cdf0e10cSrcweir     {
241cdf0e10cSrcweir         bDoQuery[i]         = rData.bDoQuery[i];
242cdf0e10cSrcweir         nQueryField[i]      = rData.nQueryField[i];
243cdf0e10cSrcweir         eQueryOp[i]         = rData.eQueryOp[i];
244cdf0e10cSrcweir         bQueryByString[i]   = rData.bQueryByString[i];
245cdf0e10cSrcweir         bQueryByDate[i]     = rData.bQueryByDate[i];
246cdf0e10cSrcweir         *pQueryStr[i]       = *rData.pQueryStr[i];
247cdf0e10cSrcweir         nQueryVal[i]        = rData.nQueryVal[i];
248cdf0e10cSrcweir         eQueryConnect[i]    = rData.eQueryConnect[i];
249cdf0e10cSrcweir     }
250cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         bDoSubTotal[i]      = rData.bDoSubTotal[i];
253cdf0e10cSrcweir         nSubField[i]        = rData.nSubField[i];
254cdf0e10cSrcweir         SCCOL nCount    = rData.nSubTotals[i];
255cdf0e10cSrcweir         nSubTotals[i]   = nCount;
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         delete[] pSubTotals[i];
258cdf0e10cSrcweir         delete[] pFunctions[i];
259cdf0e10cSrcweir 
260cdf0e10cSrcweir         pSubTotals[i] = nCount > 0 ? new SCCOL          [nCount] : NULL;
261cdf0e10cSrcweir         pFunctions[i] = nCount > 0 ? new ScSubTotalFunc [nCount] : NULL;
262cdf0e10cSrcweir         for (j=0; j<nCount; j++)
263cdf0e10cSrcweir         {
264cdf0e10cSrcweir             pSubTotals[i][j] = rData.pSubTotals[i][j];
265cdf0e10cSrcweir             pFunctions[i][j] = rData.pFunctions[i][j];
266cdf0e10cSrcweir         }
267cdf0e10cSrcweir     }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir     return *this;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
operator ==(const ScDBData & rData) const272cdf0e10cSrcweir sal_Bool ScDBData::operator== (const ScDBData& rData) const
273cdf0e10cSrcweir {
274cdf0e10cSrcweir     //  Daten, die nicht in den Params sind
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     if ( nTable     != rData.nTable     ||
277cdf0e10cSrcweir          bDoSize    != rData.bDoSize    ||
278cdf0e10cSrcweir          bKeepFmt   != rData.bKeepFmt   ||
279cdf0e10cSrcweir          bIsAdvanced!= rData.bIsAdvanced||
280cdf0e10cSrcweir          bStripData != rData.bStripData ||
281cdf0e10cSrcweir //       SAB: I think this should be here, but I don't want to break something
282cdf0e10cSrcweir //         bAutoFilter!= rData.bAutoFilter||
283cdf0e10cSrcweir          ScRefreshTimer::operator!=( rData )
284cdf0e10cSrcweir         )
285cdf0e10cSrcweir         return sal_False;
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     if ( bIsAdvanced && aAdvSource != rData.aAdvSource )
288cdf0e10cSrcweir         return sal_False;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     ScSortParam aSort1, aSort2;
291cdf0e10cSrcweir     GetSortParam(aSort1);
292cdf0e10cSrcweir     rData.GetSortParam(aSort2);
293cdf0e10cSrcweir     if (!(aSort1 == aSort2))
294cdf0e10cSrcweir         return sal_False;
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     ScQueryParam aQuery1, aQuery2;
297cdf0e10cSrcweir     GetQueryParam(aQuery1);
298cdf0e10cSrcweir     rData.GetQueryParam(aQuery2);
299cdf0e10cSrcweir     if (!(aQuery1 == aQuery2))
300cdf0e10cSrcweir         return sal_False;
301cdf0e10cSrcweir 
302cdf0e10cSrcweir     ScSubTotalParam aSubTotal1, aSubTotal2;
303cdf0e10cSrcweir     GetSubTotalParam(aSubTotal1);
304cdf0e10cSrcweir     rData.GetSubTotalParam(aSubTotal2);
305cdf0e10cSrcweir     if (!(aSubTotal1 == aSubTotal2))
306cdf0e10cSrcweir         return sal_False;
307cdf0e10cSrcweir 
308cdf0e10cSrcweir     ScImportParam aImport1, aImport2;
309cdf0e10cSrcweir     GetImportParam(aImport1);
310cdf0e10cSrcweir     rData.GetImportParam(aImport2);
311cdf0e10cSrcweir     if (!(aImport1 == aImport2))
312cdf0e10cSrcweir         return sal_False;
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     return sal_True;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
~ScDBData()317cdf0e10cSrcweir ScDBData::~ScDBData()
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     StopRefreshTimer();
320cdf0e10cSrcweir     sal_uInt16 i;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     for (i=0; i<MAXQUERY; i++)
323cdf0e10cSrcweir         delete pQueryStr[i];
324cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
325cdf0e10cSrcweir     {
326cdf0e10cSrcweir         delete[] pSubTotals[i];
327cdf0e10cSrcweir         delete[] pFunctions[i];
328cdf0e10cSrcweir     }
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
331cdf0e10cSrcweir //UNUSED2008-05  sal_Bool ScDBData::IsBeyond(SCROW nMaxRow) const
332cdf0e10cSrcweir //UNUSED2008-05  {
333cdf0e10cSrcweir //UNUSED2008-05      return ( nStartRow > nMaxRow ||
334cdf0e10cSrcweir //UNUSED2008-05               nEndRow > nMaxRow ||
335cdf0e10cSrcweir //UNUSED2008-05               nQueryDestRow > nMaxRow );
336cdf0e10cSrcweir //UNUSED2008-05  }
337cdf0e10cSrcweir 
GetSourceString() const338cdf0e10cSrcweir String ScDBData::GetSourceString() const
339cdf0e10cSrcweir {
340cdf0e10cSrcweir     String aVal;
341cdf0e10cSrcweir     if (bDBImport)
342cdf0e10cSrcweir     {
343cdf0e10cSrcweir         aVal = aDBName;
344cdf0e10cSrcweir         aVal += '/';
345cdf0e10cSrcweir         aVal += aDBStatement;
346cdf0e10cSrcweir     }
347cdf0e10cSrcweir     return aVal;
348cdf0e10cSrcweir }
349cdf0e10cSrcweir 
GetOperations() const350cdf0e10cSrcweir String ScDBData::GetOperations() const
351cdf0e10cSrcweir {
352cdf0e10cSrcweir     String aVal;
353cdf0e10cSrcweir     if (bDoQuery[0])
354cdf0e10cSrcweir         aVal = ScGlobal::GetRscString(STR_OPERATION_FILTER);
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     if (bDoSort[0])
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         if (aVal.Len())
359cdf0e10cSrcweir             aVal.AppendAscii( RTL_CONSTASCII_STRINGPARAM(", ") );
360cdf0e10cSrcweir         aVal += ScGlobal::GetRscString(STR_OPERATION_SORT);
361cdf0e10cSrcweir     }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir     if (bDoSubTotal[0] && !bSubRemoveOnly)
364cdf0e10cSrcweir     {
365cdf0e10cSrcweir         if (aVal.Len())
366cdf0e10cSrcweir             aVal.AppendAscii( RTL_CONSTASCII_STRINGPARAM(", ") );
367cdf0e10cSrcweir         aVal += ScGlobal::GetRscString(STR_OPERATION_SUBTOTAL);
368cdf0e10cSrcweir     }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     if (!aVal.Len())
371cdf0e10cSrcweir         aVal = ScGlobal::GetRscString(STR_OPERATION_NONE);
372cdf0e10cSrcweir 
373cdf0e10cSrcweir     return aVal;
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
GetArea(SCTAB & rTab,SCCOL & rCol1,SCROW & rRow1,SCCOL & rCol2,SCROW & rRow2) const376cdf0e10cSrcweir void ScDBData::GetArea(SCTAB& rTab, SCCOL& rCol1, SCROW& rRow1, SCCOL& rCol2, SCROW& rRow2) const
377cdf0e10cSrcweir {
378cdf0e10cSrcweir     rTab  = nTable;
379cdf0e10cSrcweir     rCol1 = nStartCol;
380cdf0e10cSrcweir     rRow1 = nStartRow;
381cdf0e10cSrcweir     rCol2 = nEndCol;
382cdf0e10cSrcweir     rRow2 = nEndRow;
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
GetArea(ScRange & rRange) const385cdf0e10cSrcweir void ScDBData::GetArea(ScRange& rRange) const
386cdf0e10cSrcweir {
387cdf0e10cSrcweir     rRange = ScRange( nStartCol,nStartRow,nTable, nEndCol,nEndRow,nTable );
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
SetArea(SCTAB nTab,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2)390cdf0e10cSrcweir void ScDBData::SetArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
391cdf0e10cSrcweir {
392cdf0e10cSrcweir     nTable  = nTab;
393cdf0e10cSrcweir     nStartCol = nCol1;
394cdf0e10cSrcweir     nStartRow = nRow1;
395cdf0e10cSrcweir     nEndCol   = nCol2;
396cdf0e10cSrcweir     nEndRow   = nRow2;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
MoveTo(SCTAB nTab,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2)399cdf0e10cSrcweir void ScDBData::MoveTo(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
400cdf0e10cSrcweir {
401cdf0e10cSrcweir     sal_uInt16 i;
402cdf0e10cSrcweir     long nDifX = ((long) nCol1) - ((long) nStartCol);
403cdf0e10cSrcweir     long nDifY = ((long) nRow1) - ((long) nStartRow);
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     long nSortDif = bByRow ? nDifX : nDifY;
406cdf0e10cSrcweir     long nSortEnd = bByRow ? static_cast<long>(nCol2) : static_cast<long>(nRow2);
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     for (i=0; i<MAXSORT; i++)
409cdf0e10cSrcweir     {
410cdf0e10cSrcweir         nSortField[i] += nSortDif;
411cdf0e10cSrcweir         if (nSortField[i] > nSortEnd)
412cdf0e10cSrcweir         {
413cdf0e10cSrcweir             nSortField[i] = 0;
414cdf0e10cSrcweir             bDoSort[i]    = sal_False;
415cdf0e10cSrcweir         }
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir     for (i=0; i<MAXQUERY; i++)
418cdf0e10cSrcweir     {
419cdf0e10cSrcweir         nQueryField[i] += nDifX;
420cdf0e10cSrcweir         if (nQueryField[i] > nCol2)
421cdf0e10cSrcweir         {
422cdf0e10cSrcweir             nQueryField[i] = 0;
423cdf0e10cSrcweir             bDoQuery[i]    = sal_False;
424cdf0e10cSrcweir         }
425cdf0e10cSrcweir     }
426cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
427cdf0e10cSrcweir     {
428cdf0e10cSrcweir         nSubField[i] = sal::static_int_cast<SCCOL>( nSubField[i] + nDifX );
429cdf0e10cSrcweir         if (nSubField[i] > nCol2)
430cdf0e10cSrcweir         {
431cdf0e10cSrcweir             nSubField[i]   = 0;
432cdf0e10cSrcweir             bDoSubTotal[i] = sal_False;
433cdf0e10cSrcweir         }
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     SetArea( nTab, nCol1, nRow1, nCol2, nRow2 );
437cdf0e10cSrcweir }
438cdf0e10cSrcweir 
GetSortParam(ScSortParam & rSortParam) const439cdf0e10cSrcweir void ScDBData::GetSortParam( ScSortParam& rSortParam ) const
440cdf0e10cSrcweir {
441cdf0e10cSrcweir     rSortParam.nCol1 = nStartCol;
442cdf0e10cSrcweir     rSortParam.nRow1 = nStartRow;
443cdf0e10cSrcweir     rSortParam.nCol2 = nEndCol;
444cdf0e10cSrcweir     rSortParam.nRow2 = nEndRow;
445cdf0e10cSrcweir     rSortParam.bByRow = bByRow;
446cdf0e10cSrcweir     rSortParam.bHasHeader = bHasHeader;
447cdf0e10cSrcweir     rSortParam.bCaseSens = bSortCaseSens;
448cdf0e10cSrcweir     rSortParam.bInplace = bSortInplace;
449cdf0e10cSrcweir     rSortParam.nDestTab = nSortDestTab;
450cdf0e10cSrcweir     rSortParam.nDestCol = nSortDestCol;
451cdf0e10cSrcweir     rSortParam.nDestRow = nSortDestRow;
452cdf0e10cSrcweir     rSortParam.bIncludePattern = bIncludePattern;
453cdf0e10cSrcweir     rSortParam.bUserDef = bSortUserDef;
454cdf0e10cSrcweir     rSortParam.nUserIndex = nSortUserIndex;
455cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXSORT; i++)
456cdf0e10cSrcweir     {
457cdf0e10cSrcweir         rSortParam.bDoSort[i]    = bDoSort[i];
458cdf0e10cSrcweir         rSortParam.nField[i]     = nSortField[i];
459cdf0e10cSrcweir         rSortParam.bAscending[i] = bAscending[i];
460cdf0e10cSrcweir     }
461cdf0e10cSrcweir     rSortParam.aCollatorLocale = aSortLocale;
462cdf0e10cSrcweir     rSortParam.aCollatorAlgorithm = aSortAlgorithm;
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
SetSortParam(const ScSortParam & rSortParam)465cdf0e10cSrcweir void ScDBData::SetSortParam( const ScSortParam& rSortParam )
466cdf0e10cSrcweir {
467cdf0e10cSrcweir     bSortCaseSens = rSortParam.bCaseSens;
468cdf0e10cSrcweir     bIncludePattern = rSortParam.bIncludePattern;
469cdf0e10cSrcweir     bSortInplace = rSortParam.bInplace;
470cdf0e10cSrcweir     nSortDestTab = rSortParam.nDestTab;
471cdf0e10cSrcweir     nSortDestCol = rSortParam.nDestCol;
472cdf0e10cSrcweir     nSortDestRow = rSortParam.nDestRow;
473cdf0e10cSrcweir     bSortUserDef = rSortParam.bUserDef;
474cdf0e10cSrcweir     nSortUserIndex = rSortParam.nUserIndex;
475cdf0e10cSrcweir     for (sal_uInt16 i=0; i<MAXSORT; i++)
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         bDoSort[i]    = rSortParam.bDoSort[i];
478cdf0e10cSrcweir         nSortField[i] = rSortParam.nField[i];
479cdf0e10cSrcweir         bAscending[i] = rSortParam.bAscending[i];
480cdf0e10cSrcweir     }
481cdf0e10cSrcweir     aSortLocale = rSortParam.aCollatorLocale;
482cdf0e10cSrcweir     aSortAlgorithm = rSortParam.aCollatorAlgorithm;
483cdf0e10cSrcweir 
484cdf0e10cSrcweir     //#98317#; set the orientation
485cdf0e10cSrcweir     bByRow = rSortParam.bByRow;
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
GetQueryParam(ScQueryParam & rQueryParam) const488cdf0e10cSrcweir void ScDBData::GetQueryParam( ScQueryParam& rQueryParam ) const
489cdf0e10cSrcweir {
490cdf0e10cSrcweir     rQueryParam.nCol1 = nStartCol;
491cdf0e10cSrcweir     rQueryParam.nRow1 = nStartRow;
492cdf0e10cSrcweir     rQueryParam.nCol2 = nEndCol;
493cdf0e10cSrcweir     rQueryParam.nRow2 = nEndRow;
494cdf0e10cSrcweir     rQueryParam.nTab  = nTable;
495cdf0e10cSrcweir     rQueryParam.bByRow = bByRow;
496cdf0e10cSrcweir     rQueryParam.bHasHeader = bHasHeader;
497cdf0e10cSrcweir     rQueryParam.bInplace = bQueryInplace;
498cdf0e10cSrcweir     rQueryParam.bCaseSens = bQueryCaseSens;
499cdf0e10cSrcweir     rQueryParam.bRegExp = bQueryRegExp;
500cdf0e10cSrcweir     rQueryParam.bDuplicate = bQueryDuplicate;
501cdf0e10cSrcweir     rQueryParam.nDestTab = nQueryDestTab;
502cdf0e10cSrcweir     rQueryParam.nDestCol = nQueryDestCol;
503cdf0e10cSrcweir     rQueryParam.nDestRow = nQueryDestRow;
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     rQueryParam.Resize( MAXQUERY );
506cdf0e10cSrcweir     for (SCSIZE i=0; i<MAXQUERY; i++)
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir         ScQueryEntry& rEntry = rQueryParam.GetEntry(i);
509cdf0e10cSrcweir 
510cdf0e10cSrcweir         rEntry.bDoQuery = bDoQuery[i];
511cdf0e10cSrcweir         rEntry.nField = nQueryField[i];
512cdf0e10cSrcweir         rEntry.eOp = eQueryOp[i];
513cdf0e10cSrcweir         rEntry.bQueryByString = bQueryByString[i];
514cdf0e10cSrcweir         rEntry.bQueryByDate = bQueryByDate[i];
515cdf0e10cSrcweir         *rEntry.pStr = *pQueryStr[i];
516cdf0e10cSrcweir         rEntry.nVal = nQueryVal[i];
517cdf0e10cSrcweir         rEntry.eConnect = eQueryConnect[i];
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir }
520cdf0e10cSrcweir 
SetQueryParam(const ScQueryParam & rQueryParam)521cdf0e10cSrcweir void ScDBData::SetQueryParam(const ScQueryParam& rQueryParam)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     DBG_ASSERT( rQueryParam.GetEntryCount() <= MAXQUERY ||
524cdf0e10cSrcweir                 !rQueryParam.GetEntry(MAXQUERY).bDoQuery,
525cdf0e10cSrcweir                 "zuviele Eintraege bei ScDBData::SetQueryParam" );
526cdf0e10cSrcweir 
527cdf0e10cSrcweir     //  set bIsAdvanced to sal_False for everything that is not from the
528cdf0e10cSrcweir     //  advanced filter dialog
529cdf0e10cSrcweir     bIsAdvanced = sal_False;
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     bQueryInplace = rQueryParam.bInplace;
532cdf0e10cSrcweir     bQueryCaseSens = rQueryParam.bCaseSens;
533cdf0e10cSrcweir     bQueryRegExp = rQueryParam.bRegExp;
534cdf0e10cSrcweir     bQueryDuplicate = rQueryParam.bDuplicate;
535cdf0e10cSrcweir     nQueryDestTab = rQueryParam.nDestTab;
536cdf0e10cSrcweir     nQueryDestCol = rQueryParam.nDestCol;
537cdf0e10cSrcweir     nQueryDestRow = rQueryParam.nDestRow;
538cdf0e10cSrcweir     for (SCSIZE i=0; i<MAXQUERY; i++)
539cdf0e10cSrcweir     {
540cdf0e10cSrcweir         ScQueryEntry& rEntry = rQueryParam.GetEntry(i);
541cdf0e10cSrcweir 
542cdf0e10cSrcweir         bDoQuery[i] = rEntry.bDoQuery;
543cdf0e10cSrcweir         nQueryField[i] = rEntry.nField;
544cdf0e10cSrcweir         eQueryOp[i] = rEntry.eOp;
545cdf0e10cSrcweir         bQueryByString[i] = rEntry.bQueryByString;
546cdf0e10cSrcweir         bQueryByDate[i] = rEntry.bQueryByDate;
547cdf0e10cSrcweir         *pQueryStr[i] = *rEntry.pStr;
548cdf0e10cSrcweir         nQueryVal[i] = rEntry.nVal;
549cdf0e10cSrcweir         eQueryConnect[i] = rEntry.eConnect;
550cdf0e10cSrcweir     }
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
SetAdvancedQuerySource(const ScRange * pSource)553cdf0e10cSrcweir void ScDBData::SetAdvancedQuerySource(const ScRange* pSource)
554cdf0e10cSrcweir {
555cdf0e10cSrcweir     if (pSource)
556cdf0e10cSrcweir     {
557cdf0e10cSrcweir         aAdvSource = *pSource;
558cdf0e10cSrcweir         bIsAdvanced = sal_True;
559cdf0e10cSrcweir     }
560cdf0e10cSrcweir     else
561cdf0e10cSrcweir         bIsAdvanced = sal_False;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir 
GetAdvancedQuerySource(ScRange & rSource) const564cdf0e10cSrcweir sal_Bool ScDBData::GetAdvancedQuerySource(ScRange& rSource) const
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     rSource = aAdvSource;
567cdf0e10cSrcweir     return bIsAdvanced;
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
GetSubTotalParam(ScSubTotalParam & rSubTotalParam) const570cdf0e10cSrcweir void ScDBData::GetSubTotalParam(ScSubTotalParam& rSubTotalParam) const
571cdf0e10cSrcweir {
572cdf0e10cSrcweir     sal_uInt16 i;
573cdf0e10cSrcweir     sal_uInt16 j;
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     rSubTotalParam.nCol1 = nStartCol;
576cdf0e10cSrcweir     rSubTotalParam.nRow1 = nStartRow;
577cdf0e10cSrcweir     rSubTotalParam.nCol2 = nEndCol;
578cdf0e10cSrcweir     rSubTotalParam.nRow2 = nEndRow;
579cdf0e10cSrcweir 
580cdf0e10cSrcweir     rSubTotalParam.bRemoveOnly      = bSubRemoveOnly;
581cdf0e10cSrcweir     rSubTotalParam.bReplace         = bSubReplace;
582cdf0e10cSrcweir     rSubTotalParam.bPagebreak       = bSubPagebreak;
583cdf0e10cSrcweir     rSubTotalParam.bCaseSens        = bSubCaseSens;
584cdf0e10cSrcweir     rSubTotalParam.bDoSort          = bSubDoSort;
585cdf0e10cSrcweir     rSubTotalParam.bAscending       = bSubAscending;
586cdf0e10cSrcweir     rSubTotalParam.bIncludePattern  = bSubIncludePattern;
587cdf0e10cSrcweir     rSubTotalParam.bUserDef         = bSubUserDef;
588cdf0e10cSrcweir     rSubTotalParam.nUserIndex       = nSubUserIndex;
589cdf0e10cSrcweir 
590cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         rSubTotalParam.bGroupActive[i]  = bDoSubTotal[i];
593cdf0e10cSrcweir         rSubTotalParam.nField[i]        = nSubField[i];
594cdf0e10cSrcweir         SCCOL nCount = nSubTotals[i];
595cdf0e10cSrcweir 
596cdf0e10cSrcweir         rSubTotalParam.nSubTotals[i] = nCount;
597cdf0e10cSrcweir         delete[] rSubTotalParam.pSubTotals[i];
598cdf0e10cSrcweir         delete[] rSubTotalParam.pFunctions[i];
599cdf0e10cSrcweir         rSubTotalParam.pSubTotals[i] = nCount > 0 ? new SCCOL[nCount] : NULL;
600cdf0e10cSrcweir         rSubTotalParam.pFunctions[i] = nCount > 0 ? new ScSubTotalFunc[nCount]
601cdf0e10cSrcweir                                               : NULL;
602cdf0e10cSrcweir         for (j=0; j<nCount; j++)
603cdf0e10cSrcweir         {
604cdf0e10cSrcweir             rSubTotalParam.pSubTotals[i][j] = pSubTotals[i][j];
605cdf0e10cSrcweir             rSubTotalParam.pFunctions[i][j] = pFunctions[i][j];
606cdf0e10cSrcweir         }
607cdf0e10cSrcweir     }
608cdf0e10cSrcweir }
609cdf0e10cSrcweir 
SetSubTotalParam(const ScSubTotalParam & rSubTotalParam)610cdf0e10cSrcweir void ScDBData::SetSubTotalParam(const ScSubTotalParam& rSubTotalParam)
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     sal_uInt16 i;
613cdf0e10cSrcweir     sal_uInt16 j;
614cdf0e10cSrcweir 
615cdf0e10cSrcweir     bSubRemoveOnly      = rSubTotalParam.bRemoveOnly;
616cdf0e10cSrcweir     bSubReplace         = rSubTotalParam.bReplace;
617cdf0e10cSrcweir     bSubPagebreak       = rSubTotalParam.bPagebreak;
618cdf0e10cSrcweir     bSubCaseSens        = rSubTotalParam.bCaseSens;
619cdf0e10cSrcweir     bSubDoSort          = rSubTotalParam.bDoSort;
620cdf0e10cSrcweir     bSubAscending       = rSubTotalParam.bAscending;
621cdf0e10cSrcweir     bSubIncludePattern  = rSubTotalParam.bIncludePattern;
622cdf0e10cSrcweir     bSubUserDef         = rSubTotalParam.bUserDef;
623cdf0e10cSrcweir     nSubUserIndex       = rSubTotalParam.nUserIndex;
624cdf0e10cSrcweir 
625cdf0e10cSrcweir     for (i=0; i<MAXSUBTOTAL; i++)
626cdf0e10cSrcweir     {
627cdf0e10cSrcweir         bDoSubTotal[i]  = rSubTotalParam.bGroupActive[i];
628cdf0e10cSrcweir         nSubField[i]    = rSubTotalParam.nField[i];
629cdf0e10cSrcweir         SCCOL nCount = rSubTotalParam.nSubTotals[i];
630cdf0e10cSrcweir 
631cdf0e10cSrcweir         nSubTotals[i] = nCount;
632cdf0e10cSrcweir         delete[] pSubTotals[i];
633cdf0e10cSrcweir         delete[] pFunctions[i];
634cdf0e10cSrcweir         pSubTotals[i] = nCount > 0 ? new SCCOL          [nCount] : NULL;
635cdf0e10cSrcweir         pFunctions[i] = nCount > 0 ? new ScSubTotalFunc [nCount] : NULL;
636cdf0e10cSrcweir         for (j=0; j<nCount; j++)
637cdf0e10cSrcweir         {
638cdf0e10cSrcweir             pSubTotals[i][j] = rSubTotalParam.pSubTotals[i][j];
639cdf0e10cSrcweir             pFunctions[i][j] = rSubTotalParam.pFunctions[i][j];
640cdf0e10cSrcweir         }
641cdf0e10cSrcweir     }
642cdf0e10cSrcweir }
643cdf0e10cSrcweir 
GetImportParam(ScImportParam & rImportParam) const644cdf0e10cSrcweir void ScDBData::GetImportParam(ScImportParam& rImportParam) const
645cdf0e10cSrcweir {
646cdf0e10cSrcweir     rImportParam.nCol1 = nStartCol;
647cdf0e10cSrcweir     rImportParam.nRow1 = nStartRow;
648cdf0e10cSrcweir     rImportParam.nCol2 = nEndCol;
649cdf0e10cSrcweir     rImportParam.nRow2 = nEndRow;
650cdf0e10cSrcweir 
651cdf0e10cSrcweir     rImportParam.bImport    = bDBImport;
652cdf0e10cSrcweir     rImportParam.aDBName    = aDBName;
653cdf0e10cSrcweir     rImportParam.aStatement = aDBStatement;
654cdf0e10cSrcweir     rImportParam.bNative    = bDBNative;
655cdf0e10cSrcweir     rImportParam.bSql       = bDBSql;
656cdf0e10cSrcweir     rImportParam.nType      = nDBType;
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
SetImportParam(const ScImportParam & rImportParam)659cdf0e10cSrcweir void ScDBData::SetImportParam(const ScImportParam& rImportParam)
660cdf0e10cSrcweir {
661cdf0e10cSrcweir     bDBImport       = rImportParam.bImport;
662cdf0e10cSrcweir     aDBName         = rImportParam.aDBName;
663cdf0e10cSrcweir     aDBStatement    = rImportParam.aStatement;
664cdf0e10cSrcweir     bDBNative       = rImportParam.bNative;
665cdf0e10cSrcweir     bDBSql          = rImportParam.bSql;
666cdf0e10cSrcweir     nDBType         = rImportParam.nType;
667cdf0e10cSrcweir }
668cdf0e10cSrcweir 
IsDBAtCursor(SCCOL nCol,SCROW nRow,SCTAB nTab,sal_Bool bStartOnly) const669cdf0e10cSrcweir sal_Bool ScDBData::IsDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const
670cdf0e10cSrcweir {
671cdf0e10cSrcweir     if (nTab == nTable)
672cdf0e10cSrcweir     {
673cdf0e10cSrcweir         if ( bStartOnly )
674cdf0e10cSrcweir             return ( nCol == nStartCol && nRow == nStartRow );
675cdf0e10cSrcweir         else
676cdf0e10cSrcweir             return ( nCol >= nStartCol && nCol <= nEndCol &&
677cdf0e10cSrcweir                      nRow >= nStartRow && nRow <= nEndRow );
678cdf0e10cSrcweir     }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     return sal_False;
681cdf0e10cSrcweir }
682cdf0e10cSrcweir 
IsDBAtArea(SCTAB nTab,SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2) const683cdf0e10cSrcweir sal_Bool ScDBData::IsDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
684cdf0e10cSrcweir {
685cdf0e10cSrcweir     return (sal_Bool)((nTab == nTable)
686cdf0e10cSrcweir                     && (nCol1 == nStartCol) && (nRow1 == nStartRow)
687cdf0e10cSrcweir                     && (nCol2 == nEndCol) && (nRow2 == nEndRow));
688cdf0e10cSrcweir }
689cdf0e10cSrcweir 
Clone() const690cdf0e10cSrcweir ScDataObject*   ScDBData::Clone() const
691cdf0e10cSrcweir {
692cdf0e10cSrcweir     return new ScDBData(*this);
693cdf0e10cSrcweir }
694*22407013SOliver-Rainer Wittmann 
695*22407013SOliver-Rainer Wittmann 
IsInternalUnnamed() const696*22407013SOliver-Rainer Wittmann bool ScDBData::IsInternalUnnamed() const
69757b4fa3cSWang Lei {
698*22407013SOliver-Rainer Wittmann     return GetName() == ScGlobal::GetRscString( STR_DB_NONAME );
699*22407013SOliver-Rainer Wittmann }
700*22407013SOliver-Rainer Wittmann 
IsInternalForAutoFilter() const701*22407013SOliver-Rainer Wittmann bool ScDBData::IsInternalForAutoFilter() const
702*22407013SOliver-Rainer Wittmann {
703*22407013SOliver-Rainer Wittmann     const String aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
704*22407013SOliver-Rainer Wittmann     const String aBeginName = aName.Copy( 0, aNoName.Len() );
705*22407013SOliver-Rainer Wittmann     return aBeginName == aNoName;
70657b4fa3cSWang Lei }
707cdf0e10cSrcweir 
708cdf0e10cSrcweir //---------------------------------------------------------------------------------------
709cdf0e10cSrcweir //  Compare zum Sortieren
710cdf0e10cSrcweir 
Compare(ScDataObject * pKey1,ScDataObject * pKey2) const711cdf0e10cSrcweir short ScDBCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const
712cdf0e10cSrcweir {
713cdf0e10cSrcweir     const String& rStr1 = ((ScDBData*)pKey1)->GetName();
714cdf0e10cSrcweir     const String& rStr2 = ((ScDBData*)pKey2)->GetName();
715cdf0e10cSrcweir     return (short) ScGlobal::GetpTransliteration()->compareString( rStr1, rStr2 );
716cdf0e10cSrcweir }
717cdf0e10cSrcweir 
718cdf0e10cSrcweir //  IsEqual - alles gleich
719cdf0e10cSrcweir 
IsEqual(ScDataObject * pKey1,ScDataObject * pKey2) const720cdf0e10cSrcweir sal_Bool ScDBCollection::IsEqual(ScDataObject* pKey1, ScDataObject* pKey2) const
721cdf0e10cSrcweir {
722cdf0e10cSrcweir     return *(ScDBData*)pKey1 == *(ScDBData*)pKey2;
723cdf0e10cSrcweir }
724cdf0e10cSrcweir 
GetDBAtCursor(SCCOL nCol,SCROW nRow,SCTAB nTab,sal_Bool bStartOnly) const725cdf0e10cSrcweir ScDBData* ScDBCollection::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool bStartOnly) const
726cdf0e10cSrcweir {
727*22407013SOliver-Rainer Wittmann     ScDBData* pInternalDBData = NULL;
728cdf0e10cSrcweir     if (pItems)
729cdf0e10cSrcweir     {
730cdf0e10cSrcweir 
731cdf0e10cSrcweir         for (sal_uInt16 i = 0; i < nCount; i++)
732cdf0e10cSrcweir             if (((ScDBData*)pItems[i])->IsDBAtCursor(nCol, nRow, nTab, bStartOnly))
733cdf0e10cSrcweir             {
734cdf0e10cSrcweir                 ScDBData* pDB = (ScDBData*)pItems[i];
735*22407013SOliver-Rainer Wittmann                 if ( pDB->IsInternalUnnamed()
736*22407013SOliver-Rainer Wittmann                      || pDB->IsInternalForAutoFilter() )
737*22407013SOliver-Rainer Wittmann                 {
738*22407013SOliver-Rainer Wittmann                     pInternalDBData = pDB;
739*22407013SOliver-Rainer Wittmann                 }
740cdf0e10cSrcweir                 else
741*22407013SOliver-Rainer Wittmann                 {
742cdf0e10cSrcweir                     return pDB;
743cdf0e10cSrcweir                 }
744cdf0e10cSrcweir             }
745*22407013SOliver-Rainer Wittmann     }
746*22407013SOliver-Rainer Wittmann     return pInternalDBData;
747cdf0e10cSrcweir }
748cdf0e10cSrcweir 
GetDBAtArea(const SCTAB nTab,const SCCOL nCol1,const SCROW nRow1,const SCCOL nCol2,const SCROW nRow2) const749*22407013SOliver-Rainer Wittmann ScDBData* ScDBCollection::GetDBAtArea(
750*22407013SOliver-Rainer Wittmann     const SCTAB nTab,
751*22407013SOliver-Rainer Wittmann     const SCCOL nCol1,
752*22407013SOliver-Rainer Wittmann     const SCROW nRow1,
753*22407013SOliver-Rainer Wittmann     const SCCOL nCol2,
754*22407013SOliver-Rainer Wittmann     const SCROW nRow2 ) const
755cdf0e10cSrcweir {
756*22407013SOliver-Rainer Wittmann     ScDBData* pInternalDBData = NULL;
757cdf0e10cSrcweir     if (pItems)
758cdf0e10cSrcweir     {
759cdf0e10cSrcweir         for (sal_uInt16 i = 0; i < nCount; i++)
760cdf0e10cSrcweir             if (((ScDBData*)pItems[i])->IsDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2))
761cdf0e10cSrcweir             {
762cdf0e10cSrcweir                 ScDBData* pDB = (ScDBData*)pItems[i];
763*22407013SOliver-Rainer Wittmann                 if ( pDB->IsInternalUnnamed()
764*22407013SOliver-Rainer Wittmann                      || pDB->IsInternalForAutoFilter() )
765*22407013SOliver-Rainer Wittmann                     pInternalDBData = pDB;
766cdf0e10cSrcweir                 else
767cdf0e10cSrcweir                     return pDB;
768cdf0e10cSrcweir             }
769cdf0e10cSrcweir     }
770*22407013SOliver-Rainer Wittmann     return pInternalDBData;
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
GetFilterDBAtTable(SCTAB nTab) const773cdf0e10cSrcweir ScDBData* ScDBCollection::GetFilterDBAtTable(SCTAB nTab) const
774cdf0e10cSrcweir {
775cdf0e10cSrcweir     ScDBData* pDataEmpty = NULL;
776cdf0e10cSrcweir     if (pItems)
777cdf0e10cSrcweir     {
778cdf0e10cSrcweir         for (sal_uInt16 i = 0; i < nCount; i++)
779cdf0e10cSrcweir         {
780cdf0e10cSrcweir             ScDBData* pDBTemp = (ScDBData*)pItems[i];
781cdf0e10cSrcweir             if ( pDBTemp->nTable == nTab )
782cdf0e10cSrcweir             {
783cdf0e10cSrcweir                 sal_Bool bFilter = pDBTemp->HasAutoFilter() || pDBTemp->HasQueryParam();
784cdf0e10cSrcweir 
785cdf0e10cSrcweir                 if ( bFilter )
786cdf0e10cSrcweir                     return pDBTemp;
787cdf0e10cSrcweir             }
788cdf0e10cSrcweir         }
789cdf0e10cSrcweir     }
790cdf0e10cSrcweir 
791cdf0e10cSrcweir     return pDataEmpty;
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
SearchName(const String & rName,sal_uInt16 & rIndex) const794cdf0e10cSrcweir sal_Bool ScDBCollection::SearchName( const String& rName, sal_uInt16& rIndex ) const
795cdf0e10cSrcweir {
796cdf0e10cSrcweir     ScDBData aDataObj( rName, 0,0,0,0,0 );
797cdf0e10cSrcweir     return Search( &aDataObj, rIndex );
798cdf0e10cSrcweir }
799cdf0e10cSrcweir 
DeleteOnTab(SCTAB nTab)800cdf0e10cSrcweir void ScDBCollection::DeleteOnTab( SCTAB nTab )
801cdf0e10cSrcweir {
802cdf0e10cSrcweir     sal_uInt16 nPos = 0;
803cdf0e10cSrcweir     while ( nPos < nCount )
804cdf0e10cSrcweir     {
805cdf0e10cSrcweir         // look for output positions on the deleted sheet
806cdf0e10cSrcweir 
807cdf0e10cSrcweir         SCCOL nEntryCol1, nEntryCol2;
808cdf0e10cSrcweir         SCROW nEntryRow1, nEntryRow2;
809cdf0e10cSrcweir         SCTAB nEntryTab;
810cdf0e10cSrcweir         static_cast<const ScDBData*>(At(nPos))->GetArea( nEntryTab, nEntryCol1, nEntryRow1, nEntryCol2, nEntryRow2 );
811cdf0e10cSrcweir         if ( nEntryTab == nTab )
812cdf0e10cSrcweir             AtFree(nPos);
813cdf0e10cSrcweir         else
814cdf0e10cSrcweir             ++nPos;
815cdf0e10cSrcweir     }
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
UpdateReference(UpdateRefMode eUpdateRefMode,SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,SCsCOL nDx,SCsROW nDy,SCsTAB nDz)818cdf0e10cSrcweir void ScDBCollection::UpdateReference(UpdateRefMode eUpdateRefMode,
819cdf0e10cSrcweir                                 SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
820cdf0e10cSrcweir                                 SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
821cdf0e10cSrcweir                                 SCsCOL nDx, SCsROW nDy, SCsTAB nDz )
822cdf0e10cSrcweir {
823cdf0e10cSrcweir     for (sal_uInt16 i=0; i<nCount; i++)
824cdf0e10cSrcweir     {
825cdf0e10cSrcweir         SCCOL theCol1;
826cdf0e10cSrcweir         SCROW theRow1;
827cdf0e10cSrcweir         SCTAB theTab1;
828cdf0e10cSrcweir         SCCOL theCol2;
829cdf0e10cSrcweir         SCROW theRow2;
830cdf0e10cSrcweir         SCTAB theTab2;
831cdf0e10cSrcweir         ((ScDBData*)pItems[i])->GetArea( theTab1, theCol1, theRow1, theCol2, theRow2 );
832cdf0e10cSrcweir         theTab2 = theTab1;
833cdf0e10cSrcweir 
834cdf0e10cSrcweir         sal_Bool bDoUpdate = ScRefUpdate::Update( pDoc, eUpdateRefMode,
835cdf0e10cSrcweir                                                 nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
836cdf0e10cSrcweir                                                 theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) != UR_NOTHING;
837cdf0e10cSrcweir         if (bDoUpdate)
838cdf0e10cSrcweir             ((ScDBData*)pItems[i])->MoveTo( theTab1, theCol1, theRow1, theCol2, theRow2 );
839cdf0e10cSrcweir 
840cdf0e10cSrcweir         ScRange aAdvSource;
841cdf0e10cSrcweir         if ( ((ScDBData*)pItems[i])->GetAdvancedQuerySource(aAdvSource) )
842cdf0e10cSrcweir         {
843cdf0e10cSrcweir             aAdvSource.GetVars( theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 );
844cdf0e10cSrcweir             if ( ScRefUpdate::Update( pDoc, eUpdateRefMode,
845cdf0e10cSrcweir                                         nCol1,nRow1,nTab1, nCol2,nRow2,nTab2, nDx,nDy,nDz,
846cdf0e10cSrcweir                                         theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) )
847cdf0e10cSrcweir             {
848cdf0e10cSrcweir                 aAdvSource.aStart.Set( theCol1,theRow1,theTab1 );
849cdf0e10cSrcweir                 aAdvSource.aEnd.Set( theCol2,theRow2,theTab2 );
850cdf0e10cSrcweir                 ((ScDBData*)pItems[i])->SetAdvancedQuerySource( &aAdvSource );
851cdf0e10cSrcweir 
852cdf0e10cSrcweir                 bDoUpdate = sal_True;       // DBData is modified
853cdf0e10cSrcweir             }
854cdf0e10cSrcweir         }
855cdf0e10cSrcweir 
856cdf0e10cSrcweir         ((ScDBData*)pItems[i])->SetModified(bDoUpdate);
857cdf0e10cSrcweir 
858cdf0e10cSrcweir         //!     Testen, ob mitten aus dem Bereich geloescht/eingefuegt wurde !!!
859cdf0e10cSrcweir     }
860cdf0e10cSrcweir }
861cdf0e10cSrcweir 
862cdf0e10cSrcweir 
UpdateMoveTab(SCTAB nOldPos,SCTAB nNewPos)863cdf0e10cSrcweir void ScDBCollection::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos )
864cdf0e10cSrcweir {
865cdf0e10cSrcweir     //  wenn nOldPos vor nNewPos liegt, ist nNewPos schon angepasst
866cdf0e10cSrcweir 
867cdf0e10cSrcweir     for (sal_uInt16 i=0; i<nCount; i++)
868cdf0e10cSrcweir     {
869cdf0e10cSrcweir         ScRange aRange;
870cdf0e10cSrcweir         ScDBData* pData = (ScDBData*)pItems[i];
871cdf0e10cSrcweir         pData->GetArea( aRange );
872cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();               // hat nur eine Tabelle
873cdf0e10cSrcweir 
874cdf0e10cSrcweir         //  anpassen wie die aktuelle Tabelle bei ScTablesHint (tabvwsh5.cxx)
875cdf0e10cSrcweir 
876cdf0e10cSrcweir         if ( nTab == nOldPos )                          // verschobene Tabelle
877cdf0e10cSrcweir             nTab = nNewPos;
878cdf0e10cSrcweir         else if ( nOldPos < nNewPos )                   // nach hinten verschoben
879cdf0e10cSrcweir         {
880cdf0e10cSrcweir             if ( nTab > nOldPos && nTab <= nNewPos )    // nachrueckender Bereich
881cdf0e10cSrcweir                 --nTab;
882cdf0e10cSrcweir         }
883cdf0e10cSrcweir         else                                            // nach vorne verschoben
884cdf0e10cSrcweir         {
885cdf0e10cSrcweir             if ( nTab >= nNewPos && nTab < nOldPos )    // nachrueckender Bereich
886cdf0e10cSrcweir                 ++nTab;
887cdf0e10cSrcweir         }
888cdf0e10cSrcweir 
889cdf0e10cSrcweir         sal_Bool bChanged = ( nTab != aRange.aStart.Tab() );
890cdf0e10cSrcweir         if (bChanged)
891cdf0e10cSrcweir             pData->SetArea( nTab, aRange.aStart.Col(), aRange.aStart.Row(),
892cdf0e10cSrcweir                                     aRange.aEnd.Col(),aRange.aEnd .Row() );
893cdf0e10cSrcweir 
894cdf0e10cSrcweir         //  MoveTo ist nicht noetig, wenn nur die Tabelle geaendert ist
895cdf0e10cSrcweir 
896cdf0e10cSrcweir         pData->SetModified(bChanged);
897cdf0e10cSrcweir     }
898cdf0e10cSrcweir }
899cdf0e10cSrcweir 
900cdf0e10cSrcweir 
FindIndex(sal_uInt16 nIndex)901cdf0e10cSrcweir ScDBData* ScDBCollection::FindIndex(sal_uInt16 nIndex)
902cdf0e10cSrcweir {
903cdf0e10cSrcweir     sal_uInt16 i = 0;
904cdf0e10cSrcweir     while (i < nCount)
905cdf0e10cSrcweir     {
906cdf0e10cSrcweir         if ((*this)[i]->GetIndex() == nIndex)
907cdf0e10cSrcweir             return (*this)[i];
908cdf0e10cSrcweir         i++;
909cdf0e10cSrcweir     }
910cdf0e10cSrcweir     return NULL;
911cdf0e10cSrcweir }
912cdf0e10cSrcweir 
Insert(ScDataObject * pScDataObject)913cdf0e10cSrcweir sal_Bool ScDBCollection::Insert(ScDataObject* pScDataObject)
914cdf0e10cSrcweir {
915cdf0e10cSrcweir     ScDBData* pData = (ScDBData*) pScDataObject;
916cdf0e10cSrcweir     if (!pData->GetIndex())     // schon gesetzt?
917cdf0e10cSrcweir         pData->SetIndex(nEntryIndex++);
918cdf0e10cSrcweir     sal_Bool bInserted = ScSortedCollection::Insert(pScDataObject);
919cdf0e10cSrcweir     if ( bInserted && pData->HasImportParam() && !pData->HasImportSelection() )
920cdf0e10cSrcweir     {
921cdf0e10cSrcweir         pData->SetRefreshHandler( GetRefreshHandler() );
922cdf0e10cSrcweir         pData->SetRefreshControl( pDoc->GetRefreshTimerControlAddress() );
923cdf0e10cSrcweir     }
924cdf0e10cSrcweir     return bInserted;
925cdf0e10cSrcweir }
926cdf0e10cSrcweir 
GetNewDefaultDBName()92757b4fa3cSWang Lei String ScDBCollection::GetNewDefaultDBName()
92857b4fa3cSWang Lei {
92957b4fa3cSWang Lei     String  aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
93057b4fa3cSWang Lei     String  aNewName;
93157b4fa3cSWang Lei     unsigned short  nDummy;
93257b4fa3cSWang Lei     int     i = 1;
93357b4fa3cSWang Lei     do
93457b4fa3cSWang Lei     {
93557b4fa3cSWang Lei         aNewName = aNoName;
93657b4fa3cSWang Lei         aNewName += String::CreateFromInt32( i++ );
93757b4fa3cSWang Lei     }while(SearchName(aNewName,nDummy));
93857b4fa3cSWang Lei     return  aNewName;
93957b4fa3cSWang Lei }
940