xref: /aoo42x/main/sc/source/core/tool/dbcolect.cxx (revision 0deba7fb)
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