xref: /aoo41x/main/sc/source/ui/dbgui/asciiopt.cxx (revision b3f79822)
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
10*b3f79822SAndrew Rist  *
11*b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*b3f79822SAndrew Rist  *
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.
19*b3f79822SAndrew Rist  *
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 "global.hxx"
30cdf0e10cSrcweir #include "scresid.hxx"
31cdf0e10cSrcweir #include "impex.hxx"
32cdf0e10cSrcweir #include "asciiopt.hxx"
33cdf0e10cSrcweir #include "asciiopt.hrc"
34cdf0e10cSrcweir #include <tools/debug.hxx>
35cdf0e10cSrcweir #include <rtl/tencinfo.h>
36cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
37cdf0e10cSrcweir // ause
38cdf0e10cSrcweir #include "editutil.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // ============================================================================
41cdf0e10cSrcweir 
42cdf0e10cSrcweir static const sal_Char __FAR_DATA pStrFix[] = "FIX";
43cdf0e10cSrcweir static const sal_Char __FAR_DATA pStrMrg[] = "MRG";
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 
46cdf0e10cSrcweir // ============================================================================
47cdf0e10cSrcweir 
ScAsciiOptions()48cdf0e10cSrcweir ScAsciiOptions::ScAsciiOptions() :
49cdf0e10cSrcweir 	bFixedLen		( sal_False ),
50cdf0e10cSrcweir 	aFieldSeps		( ';' ),
51cdf0e10cSrcweir 	bMergeFieldSeps	( sal_False ),
52cdf0e10cSrcweir     bQuotedFieldAsText(false),
53cdf0e10cSrcweir     bDetectSpecialNumber(false),
54cdf0e10cSrcweir 	cTextSep		( cDefaultTextSep ),
55cdf0e10cSrcweir 	eCharSet		( gsl_getSystemTextEncoding() ),
56cdf0e10cSrcweir     eLang           ( LANGUAGE_SYSTEM ),
57cdf0e10cSrcweir 	bCharSetSystem	( sal_False ),
58cdf0e10cSrcweir 	nStartRow		( 1 ),
59cdf0e10cSrcweir 	nInfoCount		( 0 ),
60cdf0e10cSrcweir     pColStart       ( NULL ),
61cdf0e10cSrcweir 	pColFormat		( NULL )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir }
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 
ScAsciiOptions(const ScAsciiOptions & rOpt)66cdf0e10cSrcweir ScAsciiOptions::ScAsciiOptions(const ScAsciiOptions& rOpt) :
67cdf0e10cSrcweir 	bFixedLen		( rOpt.bFixedLen ),
68cdf0e10cSrcweir 	aFieldSeps		( rOpt.aFieldSeps ),
69cdf0e10cSrcweir 	bMergeFieldSeps	( rOpt.bMergeFieldSeps ),
70cdf0e10cSrcweir     bQuotedFieldAsText(rOpt.bQuotedFieldAsText),
71cdf0e10cSrcweir     bDetectSpecialNumber(rOpt.bDetectSpecialNumber),
72cdf0e10cSrcweir 	cTextSep		( rOpt.cTextSep ),
73cdf0e10cSrcweir 	eCharSet		( rOpt.eCharSet ),
74cdf0e10cSrcweir     eLang           ( rOpt.eLang ),
75cdf0e10cSrcweir 	bCharSetSystem	( rOpt.bCharSetSystem ),
76cdf0e10cSrcweir 	nStartRow		( rOpt.nStartRow ),
77cdf0e10cSrcweir 	nInfoCount		( rOpt.nInfoCount )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir 	if (nInfoCount)
80cdf0e10cSrcweir 	{
81cdf0e10cSrcweir 		pColStart = new xub_StrLen[nInfoCount];
82cdf0e10cSrcweir 		pColFormat = new sal_uInt8[nInfoCount];
83cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nInfoCount; i++)
84cdf0e10cSrcweir 		{
85cdf0e10cSrcweir 			pColStart[i] = rOpt.pColStart[i];
86cdf0e10cSrcweir 			pColFormat[i] = rOpt.pColFormat[i];
87cdf0e10cSrcweir 		}
88cdf0e10cSrcweir 	}
89cdf0e10cSrcweir 	else
90cdf0e10cSrcweir 	{
91cdf0e10cSrcweir 		pColStart = NULL;
92cdf0e10cSrcweir 		pColFormat = NULL;
93cdf0e10cSrcweir 	}
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
~ScAsciiOptions()97cdf0e10cSrcweir ScAsciiOptions::~ScAsciiOptions()
98cdf0e10cSrcweir {
99cdf0e10cSrcweir 	delete[] pColStart;
100cdf0e10cSrcweir 	delete[] pColFormat;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
SetColInfo(sal_uInt16 nCount,const xub_StrLen * pStart,const sal_uInt8 * pFormat)104cdf0e10cSrcweir void ScAsciiOptions::SetColInfo( sal_uInt16 nCount, const xub_StrLen* pStart, const sal_uInt8* pFormat )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	delete[] pColStart;
107cdf0e10cSrcweir 	delete[] pColFormat;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	nInfoCount = nCount;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	if (nInfoCount)
112cdf0e10cSrcweir 	{
113cdf0e10cSrcweir 		pColStart = new xub_StrLen[nInfoCount];
114cdf0e10cSrcweir 		pColFormat = new sal_uInt8[nInfoCount];
115cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nInfoCount; i++)
116cdf0e10cSrcweir 		{
117cdf0e10cSrcweir 			pColStart[i] = pStart[i];
118cdf0e10cSrcweir 			pColFormat[i] = pFormat[i];
119cdf0e10cSrcweir 		}
120cdf0e10cSrcweir 	}
121cdf0e10cSrcweir 	else
122cdf0e10cSrcweir 	{
123cdf0e10cSrcweir 		pColStart = NULL;
124cdf0e10cSrcweir 		pColFormat = NULL;
125cdf0e10cSrcweir 	}
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 
SetColumnInfo(const ScCsvExpDataVec & rDataVec)129cdf0e10cSrcweir void ScAsciiOptions::SetColumnInfo( const ScCsvExpDataVec& rDataVec )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	delete[] pColStart;
132cdf0e10cSrcweir     pColStart = NULL;
133cdf0e10cSrcweir 	delete[] pColFormat;
134cdf0e10cSrcweir     pColFormat = NULL;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     nInfoCount = static_cast< sal_uInt16 >( rDataVec.size() );
137cdf0e10cSrcweir     if( nInfoCount )
138cdf0e10cSrcweir 	{
139cdf0e10cSrcweir         pColStart = new xub_StrLen[ nInfoCount ];
140cdf0e10cSrcweir         pColFormat = new sal_uInt8[ nInfoCount ];
141cdf0e10cSrcweir         for( sal_uInt16 nIx = 0; nIx < nInfoCount; ++nIx )
142cdf0e10cSrcweir 		{
143cdf0e10cSrcweir             pColStart[ nIx ] = rDataVec[ nIx ].mnIndex;
144cdf0e10cSrcweir             pColFormat[ nIx ] = rDataVec[ nIx ].mnType;
145cdf0e10cSrcweir 		}
146cdf0e10cSrcweir 	}
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
operator =(const ScAsciiOptions & rCpy)150cdf0e10cSrcweir ScAsciiOptions&	ScAsciiOptions::operator=( const ScAsciiOptions& rCpy )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir 	SetColInfo( rCpy.nInfoCount, rCpy.pColStart, rCpy.pColFormat );
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 	bFixedLen		= rCpy.bFixedLen;
155cdf0e10cSrcweir 	aFieldSeps		= rCpy.aFieldSeps;
156cdf0e10cSrcweir 	bMergeFieldSeps	= rCpy.bMergeFieldSeps;
157cdf0e10cSrcweir     bQuotedFieldAsText = rCpy.bQuotedFieldAsText;
158cdf0e10cSrcweir 	cTextSep		= rCpy.cTextSep;
159cdf0e10cSrcweir 	eCharSet		= rCpy.eCharSet;
160cdf0e10cSrcweir 	bCharSetSystem	= rCpy.bCharSetSystem;
161cdf0e10cSrcweir 	nStartRow		= rCpy.nStartRow;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 	return *this;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 
operator ==(const ScAsciiOptions & rCmp) const167cdf0e10cSrcweir sal_Bool ScAsciiOptions::operator==( const ScAsciiOptions& rCmp ) const
168cdf0e10cSrcweir {
169cdf0e10cSrcweir 	if ( bFixedLen		 == rCmp.bFixedLen &&
170cdf0e10cSrcweir 		 aFieldSeps		 == rCmp.aFieldSeps &&
171cdf0e10cSrcweir 		 bMergeFieldSeps == rCmp.bMergeFieldSeps &&
172cdf0e10cSrcweir          bQuotedFieldAsText == rCmp.bQuotedFieldAsText &&
173cdf0e10cSrcweir 		 cTextSep		 == rCmp.cTextSep &&
174cdf0e10cSrcweir 		 eCharSet		 == rCmp.eCharSet &&
175cdf0e10cSrcweir 		 bCharSetSystem  == rCmp.bCharSetSystem &&
176cdf0e10cSrcweir 		 nStartRow		 == rCmp.nStartRow &&
177cdf0e10cSrcweir 		 nInfoCount		 == rCmp.nInfoCount )
178cdf0e10cSrcweir 	{
179cdf0e10cSrcweir 		DBG_ASSERT( !nInfoCount || (pColStart && pColFormat && rCmp.pColStart && rCmp.pColFormat),
180cdf0e10cSrcweir 					 "0-Zeiger in ScAsciiOptions" );
181cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nInfoCount; i++)
182cdf0e10cSrcweir 			if ( pColStart[i] != rCmp.pColStart[i] ||
183cdf0e10cSrcweir 				 pColFormat[i] != rCmp.pColFormat[i] )
184cdf0e10cSrcweir 				return sal_False;
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 		return sal_True;
187cdf0e10cSrcweir 	}
188cdf0e10cSrcweir 	return sal_False;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir //
192cdf0e10cSrcweir //	Der Options-String darf kein Semikolon mehr enthalten (wegen Pickliste)
193cdf0e10cSrcweir //	darum ab Version 336 Komma stattdessen
194cdf0e10cSrcweir //
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 
ReadFromString(const String & rString)197cdf0e10cSrcweir void ScAsciiOptions::ReadFromString( const String& rString )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir 	xub_StrLen nCount = rString.GetTokenCount(',');
200cdf0e10cSrcweir 	String aToken;
201cdf0e10cSrcweir 	xub_StrLen nSub;
202cdf0e10cSrcweir 	xub_StrLen i;
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 		//
205cdf0e10cSrcweir 		//	Feld-Trenner
206cdf0e10cSrcweir 		//
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	if ( nCount >= 1 )
209cdf0e10cSrcweir 	{
210cdf0e10cSrcweir 		bFixedLen = bMergeFieldSeps = sal_False;
211cdf0e10cSrcweir 		aFieldSeps.Erase();
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 		aToken = rString.GetToken(0,',');
214cdf0e10cSrcweir 		if ( aToken.EqualsAscii(pStrFix) )
215cdf0e10cSrcweir 			bFixedLen = sal_True;
216cdf0e10cSrcweir 		nSub = aToken.GetTokenCount('/');
217cdf0e10cSrcweir 		for ( i=0; i<nSub; i++ )
218cdf0e10cSrcweir 		{
219cdf0e10cSrcweir 			String aCode = aToken.GetToken( i, '/' );
220cdf0e10cSrcweir 			if ( aCode.EqualsAscii(pStrMrg) )
221cdf0e10cSrcweir 				bMergeFieldSeps = sal_True;
222cdf0e10cSrcweir 			else
223cdf0e10cSrcweir 			{
224cdf0e10cSrcweir 				sal_Int32 nVal = aCode.ToInt32();
225cdf0e10cSrcweir 				if ( nVal )
226cdf0e10cSrcweir 					aFieldSeps += (sal_Unicode) nVal;
227cdf0e10cSrcweir 			}
228cdf0e10cSrcweir 		}
229cdf0e10cSrcweir 	}
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 		//
232cdf0e10cSrcweir 		//	Text-Trenner
233cdf0e10cSrcweir 		//
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 	if ( nCount >= 2 )
236cdf0e10cSrcweir 	{
237cdf0e10cSrcweir 		aToken = rString.GetToken(1,',');
238cdf0e10cSrcweir 		sal_Int32 nVal = aToken.ToInt32();
239cdf0e10cSrcweir 		cTextSep = (sal_Unicode) nVal;
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 		//
243cdf0e10cSrcweir 		//	Zeichensatz
244cdf0e10cSrcweir 		//
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	if ( nCount >= 3 )
247cdf0e10cSrcweir 	{
248cdf0e10cSrcweir 		aToken = rString.GetToken(2,',');
249cdf0e10cSrcweir 		eCharSet = ScGlobal::GetCharsetValue( aToken );
250cdf0e10cSrcweir 	}
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 		//
253cdf0e10cSrcweir 		//	Startzeile
254cdf0e10cSrcweir 		//
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     if ( nCount >= 4 )
257cdf0e10cSrcweir 	{
258cdf0e10cSrcweir         aToken = rString.GetToken(3,',');
259cdf0e10cSrcweir 		nStartRow = aToken.ToInt32();
260cdf0e10cSrcweir 	}
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 		//
263cdf0e10cSrcweir 		//	Spalten-Infos
264cdf0e10cSrcweir 		//
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     if ( nCount >= 5 )
267cdf0e10cSrcweir 	{
268cdf0e10cSrcweir 		delete[] pColStart;
269cdf0e10cSrcweir 		delete[] pColFormat;
270cdf0e10cSrcweir 
271cdf0e10cSrcweir         aToken = rString.GetToken(4,',');
272cdf0e10cSrcweir 		nSub = aToken.GetTokenCount('/');
273cdf0e10cSrcweir 		nInfoCount = nSub / 2;
274cdf0e10cSrcweir 		if (nInfoCount)
275cdf0e10cSrcweir 		{
276cdf0e10cSrcweir 			pColStart = new xub_StrLen[nInfoCount];
277cdf0e10cSrcweir 			pColFormat = new sal_uInt8[nInfoCount];
278cdf0e10cSrcweir 			for (sal_uInt16 nInfo=0; nInfo<nInfoCount; nInfo++)
279cdf0e10cSrcweir 			{
280cdf0e10cSrcweir 				pColStart[nInfo]  = (xub_StrLen) aToken.GetToken( 2*nInfo, '/' ).ToInt32();
281cdf0e10cSrcweir 				pColFormat[nInfo] = (sal_uInt8) aToken.GetToken( 2*nInfo+1, '/' ).ToInt32();
282cdf0e10cSrcweir 			}
283cdf0e10cSrcweir 		}
284cdf0e10cSrcweir 		else
285cdf0e10cSrcweir 		{
286cdf0e10cSrcweir 			pColStart = NULL;
287cdf0e10cSrcweir 			pColFormat = NULL;
288cdf0e10cSrcweir 		}
289cdf0e10cSrcweir 	}
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     // Language
292cdf0e10cSrcweir     if (nCount >= 6)
293cdf0e10cSrcweir     {
294cdf0e10cSrcweir         aToken = rString.GetToken(5, ',');
295cdf0e10cSrcweir         eLang = static_cast<LanguageType>(aToken.ToInt32());
296cdf0e10cSrcweir     }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     // Import quoted field as text.
299cdf0e10cSrcweir     if (nCount >= 7)
300cdf0e10cSrcweir     {
301cdf0e10cSrcweir         aToken = rString.GetToken(6, ',');
302cdf0e10cSrcweir         bQuotedFieldAsText = aToken.EqualsAscii("true") ? true : false;
303cdf0e10cSrcweir     }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir     // Detect special nubmers.
306cdf0e10cSrcweir     if (nCount >= 8)
307cdf0e10cSrcweir     {
308cdf0e10cSrcweir         aToken = rString.GetToken(7, ',');
309cdf0e10cSrcweir         bDetectSpecialNumber = aToken.EqualsAscii("true") ? true : false;
310cdf0e10cSrcweir     }
311cdf0e10cSrcweir     else
312cdf0e10cSrcweir         bDetectSpecialNumber = sal_True;    // default of versions that didn't add the parameter
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     // 9th token is used for "Save as shown" in export options
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 
WriteToString() const318cdf0e10cSrcweir String ScAsciiOptions::WriteToString() const
319cdf0e10cSrcweir {
320cdf0e10cSrcweir 	String aOutStr;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 		//
323cdf0e10cSrcweir 		//	Feld-Trenner
324cdf0e10cSrcweir 		//
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 	if ( bFixedLen )
327cdf0e10cSrcweir 		aOutStr.AppendAscii(pStrFix);
328cdf0e10cSrcweir 	else if ( !aFieldSeps.Len() )
329cdf0e10cSrcweir 		aOutStr += '0';
330cdf0e10cSrcweir 	else
331cdf0e10cSrcweir 	{
332cdf0e10cSrcweir 		xub_StrLen nLen = aFieldSeps.Len();
333cdf0e10cSrcweir 		for (xub_StrLen i=0; i<nLen; i++)
334cdf0e10cSrcweir 		{
335cdf0e10cSrcweir 			if (i)
336cdf0e10cSrcweir 				aOutStr += '/';
337cdf0e10cSrcweir 			aOutStr += String::CreateFromInt32(aFieldSeps.GetChar(i));
338cdf0e10cSrcweir 		}
339cdf0e10cSrcweir 		if ( bMergeFieldSeps )
340cdf0e10cSrcweir 		{
341cdf0e10cSrcweir 			aOutStr += '/';
342cdf0e10cSrcweir 			aOutStr.AppendAscii(pStrMrg);
343cdf0e10cSrcweir 		}
344cdf0e10cSrcweir 	}
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 	aOutStr += ',';					// Token-Ende
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 		//
349cdf0e10cSrcweir 		//	Text-Trenner
350cdf0e10cSrcweir 		//
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	aOutStr += String::CreateFromInt32(cTextSep);
353cdf0e10cSrcweir 	aOutStr += ',';					// Token-Ende
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 		//
356cdf0e10cSrcweir 		//	Zeichensatz
357cdf0e10cSrcweir 		//
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 	if ( bCharSetSystem )			// force "SYSTEM"
360cdf0e10cSrcweir 		aOutStr += ScGlobal::GetCharsetString( RTL_TEXTENCODING_DONTKNOW );
361cdf0e10cSrcweir 	else
362cdf0e10cSrcweir 		aOutStr += ScGlobal::GetCharsetString( eCharSet );
363cdf0e10cSrcweir 	aOutStr += ',';					// Token-Ende
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 		//
366cdf0e10cSrcweir 		//	Startzeile
367cdf0e10cSrcweir 		//
368cdf0e10cSrcweir 
369cdf0e10cSrcweir 	aOutStr += String::CreateFromInt32(nStartRow);
370cdf0e10cSrcweir 	aOutStr += ',';					// Token-Ende
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 		//
373cdf0e10cSrcweir 		//	Spalten-Infos
374cdf0e10cSrcweir 		//
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 	DBG_ASSERT( !nInfoCount || (pColStart && pColFormat), "0-Zeiger in ScAsciiOptions" );
377cdf0e10cSrcweir 	for (sal_uInt16 nInfo=0; nInfo<nInfoCount; nInfo++)
378cdf0e10cSrcweir 	{
379cdf0e10cSrcweir 		if (nInfo)
380cdf0e10cSrcweir 			aOutStr += '/';
381cdf0e10cSrcweir 		aOutStr += String::CreateFromInt32(pColStart[nInfo]);
382cdf0e10cSrcweir 		aOutStr += '/';
383cdf0e10cSrcweir 		aOutStr += String::CreateFromInt32(pColFormat[nInfo]);
384cdf0e10cSrcweir 	}
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     // #i112025# the options string is used in macros and linked sheets,
387cdf0e10cSrcweir     // so new options must be added at the end, to remain compatible
388cdf0e10cSrcweir 
389cdf0e10cSrcweir     aOutStr += ',';
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     // Language
392cdf0e10cSrcweir     aOutStr += String::CreateFromInt32(eLang);
393cdf0e10cSrcweir     aOutStr += ',';
394cdf0e10cSrcweir 
395cdf0e10cSrcweir     // Import quoted field as text.
396cdf0e10cSrcweir     aOutStr += String::CreateFromAscii(bQuotedFieldAsText ? "true" : "false");
397cdf0e10cSrcweir     aOutStr += ',';
398cdf0e10cSrcweir 
399cdf0e10cSrcweir     // Detect special nubmers.
400cdf0e10cSrcweir     aOutStr += String::CreateFromAscii(bDetectSpecialNumber ? "true" : "false");
401cdf0e10cSrcweir 
402cdf0e10cSrcweir     // 9th token is used for "Save as shown" in export options
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 	return aOutStr;
405cdf0e10cSrcweir }
406cdf0e10cSrcweir 
407cdf0e10cSrcweir #if 0
408cdf0e10cSrcweir //	Code, um die Spalten-Liste aus einem Excel-kompatiblen String zu erzeugen:
409cdf0e10cSrcweir //	(im Moment nicht benutzt)
410cdf0e10cSrcweir 
411cdf0e10cSrcweir void ScAsciiOptions::InterpretColumnList( const String& rString )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir 	//	Eingabe ist 1-basiert, pColStart fuer FixedLen ist 0-basiert
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 	//	Kommas durch Semikolon ersetzen
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 	String aSemiStr = rString;
418cdf0e10cSrcweir 	sal_uInt16 nPos = 0;
419cdf0e10cSrcweir 	do
420cdf0e10cSrcweir 		nPos = aSemiStr.SearchAndReplace( ',', ';', nPos );
421cdf0e10cSrcweir 	while ( nPos != STRING_NOTFOUND );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 	//	Eintraege sortieren
424cdf0e10cSrcweir 
425cdf0e10cSrcweir 	sal_uInt16 nCount = aSemiStr.GetTokenCount();
426cdf0e10cSrcweir 	sal_uInt16* pTemp = new sal_uInt16[nCount+1];
427cdf0e10cSrcweir 	pTemp[0] = 1;									// erste Spalte faengt immer bei 1 an
428cdf0e10cSrcweir 	sal_uInt16 nFound = 1;
429cdf0e10cSrcweir 	sal_uInt16 i,j;
430cdf0e10cSrcweir 	for (i=0; i<nCount; i++)
431cdf0e10cSrcweir 	{
432cdf0e10cSrcweir 		sal_uInt16 nVal = (sal_uInt16) aSemiStr.GetToken(i);
433cdf0e10cSrcweir 		if (nVal)
434cdf0e10cSrcweir 		{
435cdf0e10cSrcweir 			sal_Bool bThere = sal_False;
436cdf0e10cSrcweir 			nPos = 0;
437cdf0e10cSrcweir 			for (j=0; j<nFound; j++)
438cdf0e10cSrcweir 			{
439cdf0e10cSrcweir 				if ( pTemp[j] == nVal )
440cdf0e10cSrcweir 					bThere = sal_True;
441cdf0e10cSrcweir 				else if ( pTemp[j] < nVal )
442cdf0e10cSrcweir 					nPos = j+1;
443cdf0e10cSrcweir 			}
444cdf0e10cSrcweir 			if ( !bThere )
445cdf0e10cSrcweir 			{
446cdf0e10cSrcweir 				if ( nPos < nFound )
447cdf0e10cSrcweir 					memmove( &pTemp[nPos+1], &pTemp[nPos], (nFound-nPos)*sizeof(sal_uInt16) );
448cdf0e10cSrcweir 				pTemp[nPos] = nVal;
449cdf0e10cSrcweir 				++nFound;
450cdf0e10cSrcweir 			}
451cdf0e10cSrcweir 		}
452cdf0e10cSrcweir 	}
453cdf0e10cSrcweir 
454cdf0e10cSrcweir 	//	Eintraege uebernehmen
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 	delete[] pColStart;
457cdf0e10cSrcweir 	delete[] pColFormat;
458cdf0e10cSrcweir 	nInfoCount = nFound;
459cdf0e10cSrcweir 	if (nInfoCount)
460cdf0e10cSrcweir 	{
461cdf0e10cSrcweir 		pColStart = new sal_uInt16[nInfoCount];
462cdf0e10cSrcweir 		pColFormat = new sal_uInt8[nInfoCount];
463cdf0e10cSrcweir 		for (i=0; i<nInfoCount; i++)
464cdf0e10cSrcweir 		{
465cdf0e10cSrcweir 			pColStart[i] = pTemp[i] - 1;
466cdf0e10cSrcweir 			pColFormat[i] = SC_COL_STANDARD;
467cdf0e10cSrcweir 		}
468cdf0e10cSrcweir 	}
469cdf0e10cSrcweir 	else
470cdf0e10cSrcweir 	{
471cdf0e10cSrcweir 		pColStart = NULL;
472cdf0e10cSrcweir 		pColFormat = NULL;
473cdf0e10cSrcweir 	}
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 	bFixedLen = sal_True;			// sonst macht's keinen Sinn
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	//	aufraeumen
478cdf0e10cSrcweir 
479cdf0e10cSrcweir 	delete[] pTemp;
480cdf0e10cSrcweir }
481cdf0e10cSrcweir #endif
482cdf0e10cSrcweir 
483