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
10b3f79822SAndrew Rist *
11b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12b3f79822SAndrew Rist *
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.
19b3f79822SAndrew Rist *
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
39*57b4fa3cSWang 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*57b4fa3cSWang Lei
695*57b4fa3cSWang Lei
IsInternalUnnamed() const696*57b4fa3cSWang Lei bool ScDBData::IsInternalUnnamed() const
697*57b4fa3cSWang Lei {
698*57b4fa3cSWang Lei return GetName() == ScGlobal::GetRscString( STR_DB_NONAME );
699*57b4fa3cSWang Lei }
700cdf0e10cSrcweir
IsInternalForAutoFilter() const701cdf0e10cSrcweir bool ScDBData::IsInternalForAutoFilter() const
702cdf0e10cSrcweir {
703cdf0e10cSrcweir const String aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
704cdf0e10cSrcweir const String aBeginName = aName.Copy( 0, aNoName.Len() );
705cdf0e10cSrcweir return aBeginName == aNoName;
706cdf0e10cSrcweir }
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 {
727cdf0e10cSrcweir ScDBData* pInternalDBData = NULL;
728*57b4fa3cSWang Lei 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];
735cdf0e10cSrcweir if ( pDB->IsInternalUnnamed()
736cdf0e10cSrcweir || pDB->IsInternalForAutoFilter() )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir pInternalDBData = pDB;
739cdf0e10cSrcweir }
740cdf0e10cSrcweir else
741cdf0e10cSrcweir {
742cdf0e10cSrcweir return pDB;
743cdf0e10cSrcweir }
744cdf0e10cSrcweir }
745cdf0e10cSrcweir }
746cdf0e10cSrcweir return pInternalDBData;
747*57b4fa3cSWang Lei }
748cdf0e10cSrcweir
GetDBAtArea(const SCTAB nTab,const SCCOL nCol1,const SCROW nRow1,const SCCOL nCol2,const SCROW nRow2) const749cdf0e10cSrcweir ScDBData* ScDBCollection::GetDBAtArea(
750cdf0e10cSrcweir const SCTAB nTab,
751cdf0e10cSrcweir const SCCOL nCol1,
752cdf0e10cSrcweir const SCROW nRow1,
753cdf0e10cSrcweir const SCCOL nCol2,
754cdf0e10cSrcweir const SCROW nRow2 ) const
755cdf0e10cSrcweir {
756cdf0e10cSrcweir 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];
763cdf0e10cSrcweir if ( pDB->IsInternalUnnamed()
764cdf0e10cSrcweir || pDB->IsInternalForAutoFilter() )
765cdf0e10cSrcweir pInternalDBData = pDB;
766cdf0e10cSrcweir else
767cdf0e10cSrcweir return pDB;
768cdf0e10cSrcweir }
769cdf0e10cSrcweir }
770cdf0e10cSrcweir 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 }
910*57b4fa3cSWang Lei return NULL;
911*57b4fa3cSWang Lei }
912*57b4fa3cSWang Lei
Insert(ScDataObject * pScDataObject)913*57b4fa3cSWang Lei sal_Bool ScDBCollection::Insert(ScDataObject* pScDataObject)
914*57b4fa3cSWang Lei {
915*57b4fa3cSWang Lei ScDBData* pData = (ScDBData*) pScDataObject;
916*57b4fa3cSWang Lei if (!pData->GetIndex()) // schon gesetzt?
917*57b4fa3cSWang Lei pData->SetIndex(nEntryIndex++);
918*57b4fa3cSWang Lei sal_Bool bInserted = ScSortedCollection::Insert(pScDataObject);
919*57b4fa3cSWang Lei if ( bInserted && pData->HasImportParam() && !pData->HasImportSelection() )
920*57b4fa3cSWang Lei {
921*57b4fa3cSWang Lei pData->SetRefreshHandler( GetRefreshHandler() );
922*57b4fa3cSWang Lei pData->SetRefreshControl( pDoc->GetRefreshTimerControlAddress() );
923*57b4fa3cSWang Lei }
924*57b4fa3cSWang Lei return bInserted;
925*57b4fa3cSWang Lei }
926*57b4fa3cSWang Lei
GetNewDefaultDBName()927*57b4fa3cSWang Lei String ScDBCollection::GetNewDefaultDBName()
928*57b4fa3cSWang Lei {
929cdf0e10cSrcweir String aNoName = String::CreateFromAscii(SC_DBNAME_UNNAMED);
930*57b4fa3cSWang Lei String aNewName;
931*57b4fa3cSWang Lei unsigned short nDummy;
932*57b4fa3cSWang Lei int i = 1;
933*57b4fa3cSWang Lei do
934*57b4fa3cSWang Lei {
935*57b4fa3cSWang Lei aNewName = aNoName;
936*57b4fa3cSWang Lei aNewName += String::CreateFromInt32( i++ );
937*57b4fa3cSWang Lei }while(SearchName(aNewName,nDummy));
938*57b4fa3cSWang Lei return aNewName;
939*57b4fa3cSWang Lei }
940*57b4fa3cSWang Lei