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