xref: /trunk/main/sc/source/ui/dbgui/scuiimoptdlg.cxx (revision a479921a)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scui.hxx"
26 
27 
28 
29 
30 #include "scuiimoptdlg.hxx"
31 #include "scresid.hxx"
32 #include "imoptdlg.hrc"
33 #include <rtl/tencinfo.h>
34 //========================================================================
35 // ScDelimiterTable
36 //========================================================================
37 
38 class ScDelimiterTable
39 {
40 public:
ScDelimiterTable(const String & rDelTab)41 		ScDelimiterTable( const String& rDelTab )
42 			:	theDelTab ( rDelTab ),
43 				cSep	  ( '\t' ),
44 				nCount	  ( rDelTab.GetTokenCount('\t') ),
45 				nIter	  ( 0 )
46 			{}
47 
48 	sal_uInt16	GetCode( const String& rDelimiter ) const;
49 	String	GetDelimiter( sal_Unicode nCode ) const;
50 
FirstDel()51 	String	FirstDel()	{ nIter = 0; return theDelTab.GetToken( nIter, cSep ); }
NextDel()52 	String	NextDel()	{ nIter +=2; return theDelTab.GetToken( nIter, cSep ); }
53 
54 private:
55 	const String		theDelTab;
56 	const sal_Unicode	cSep;
57 	const xub_StrLen	nCount;
58 	xub_StrLen			nIter;
59 };
60 
61 //------------------------------------------------------------------------
62 
GetCode(const String & rDel) const63 sal_uInt16 ScDelimiterTable::GetCode( const String& rDel ) const
64 {
65 	sal_Unicode nCode = 0;
66 	xub_StrLen i = 0;
67 
68 	if ( nCount >= 2 )
69 	{
70 		while ( i<nCount )
71 		{
72 			if ( rDel == theDelTab.GetToken( i, cSep ) )
73 			{
74 				nCode = (sal_Unicode) theDelTab.GetToken( i+1, cSep ).ToInt32();
75 				i     = nCount;
76 			}
77 			else
78 				i += 2;
79 		}
80 	}
81 
82 	return nCode;
83 }
84 
85 //------------------------------------------------------------------------
86 
GetDelimiter(sal_Unicode nCode) const87 String ScDelimiterTable::GetDelimiter( sal_Unicode nCode ) const
88 {
89 	String aStrDel;
90 	xub_StrLen i = 0;
91 
92 	if ( nCount >= 2 )
93 	{
94 		while ( i<nCount )
95 		{
96 			if ( nCode == (sal_Unicode) theDelTab.GetToken( i+1, cSep ).ToInt32() )
97 			{
98 				aStrDel = theDelTab.GetToken( i, cSep );
99 				i       = nCount;
100 			}
101 			else
102 				i += 2;
103 		}
104 	}
105 
106 	return aStrDel;
107 }
108 
109 //========================================================================
110 // ScImportOptionsDlg
111 //========================================================================
112 
ScImportOptionsDlg(Window * pParent,sal_Bool bAscii,const ScImportOptions * pOptions,const String * pStrTitle,sal_Bool bMultiByte,sal_Bool bOnlyDbtoolsEncodings,sal_Bool bImport)113 ScImportOptionsDlg::ScImportOptionsDlg(
114         Window*                 pParent,
115         sal_Bool                    bAscii,
116         const ScImportOptions*  pOptions,
117         const String*           pStrTitle,
118         sal_Bool                    bMultiByte,
119         sal_Bool                    bOnlyDbtoolsEncodings,
120         sal_Bool                    bImport )
121 
122 	:	ModalDialog	( pParent, ScResId( RID_SCDLG_IMPORTOPT ) ),
123         aFlFieldOpt ( this, ScResId( FL_FIELDOPT ) ),
124 		aFtFont		( this, ScResId( FT_FONT ) ),
125         aLbFont     ( this, ScResId( bAscii ? DDLB_FONT : LB_FONT ) ),
126 		aFtFieldSep	( this, ScResId( FT_FIELDSEP ) ),
127 		aEdFieldSep	( this, ScResId( ED_FIELDSEP ) ),
128 		aFtTextSep	( this, ScResId( FT_TEXTSEP ) ),
129 		aEdTextSep	( this, ScResId( ED_TEXTSEP ) ),
130         aCbQuoteAll ( this, ScResId( CB_QUOTEALL ) ),
131         aCbShown    ( this, ScResId( CB_SAVESHOWN ) ),
132         aCbFixed    ( this, ScResId( CB_FIXEDWIDTH ) ),
133 		aBtnOk		( this, ScResId( BTN_OK ) ),
134 		aBtnCancel	( this, ScResId( BTN_CANCEL ) ),
135         aBtnHelp	( this, ScResId( BTN_HELP ) )
136 {
137     String sFieldSep( ScResId( SCSTR_FIELDSEP ) );
138     sFieldSep.SearchAndReplaceAscii( "%TAB",   String(ScResId(SCSTR_FIELDSEP_TAB)) );
139     sFieldSep.SearchAndReplaceAscii( "%SPACE", String(ScResId(SCSTR_FIELDSEP_SPACE)) );
140 
141 	// im Ctor-Initializer nicht moeglich (MSC kann das nicht):
142 	pFieldSepTab = new ScDelimiterTable( sFieldSep );
143 	pTextSepTab  = new ScDelimiterTable( String(ScResId(SCSTR_TEXTSEP)) );
144 
145 	String aStr = pFieldSepTab->FirstDel();
146 	sal_Unicode nCode;
147 
148 	while ( aStr.Len() > 0 )
149 	{
150 		aEdFieldSep.InsertEntry( aStr );
151 		aStr = pFieldSepTab->NextDel();
152 	}
153 
154 	aStr = pTextSepTab->FirstDel();
155 
156 	while ( aStr.Len() > 0 )
157 	{
158 		aEdTextSep.InsertEntry( aStr );
159 		aStr = pTextSepTab->NextDel();
160 	}
161 
162 	aEdFieldSep.SetText( aEdFieldSep.GetEntry(0) );
163 	aEdTextSep.SetText( aEdTextSep.GetEntry(0) );
164 
165     if ( bOnlyDbtoolsEncodings )
166     {
167         // Even dBase export allows multibyte now
168         if ( bMultiByte )
169             aLbFont.FillFromDbTextEncodingMap( bImport );
170         else
171             aLbFont.FillFromDbTextEncodingMap( bImport, RTL_TEXTENCODING_INFO_MULTIBYTE );
172     }
173     else if ( !bAscii )
174     {   //!TODO: Unicode would need work in each filter
175 		if ( bMultiByte )
176             aLbFont.FillFromTextEncodingTable( bImport, RTL_TEXTENCODING_INFO_UNICODE );
177 		else
178 			aLbFont.FillFromTextEncodingTable( bImport, RTL_TEXTENCODING_INFO_UNICODE |
179                 RTL_TEXTENCODING_INFO_MULTIBYTE );
180 	}
181 	else
182 	{
183 		if ( pOptions )
184 		{
185 			nCode = pOptions->nFieldSepCode;
186 			aStr  = pFieldSepTab->GetDelimiter( nCode );
187 
188 			if ( !aStr.Len() )
189 				aEdFieldSep.SetText( String((sal_Unicode)nCode) );
190 			else
191 				aEdFieldSep.SetText( aStr );
192 
193 			nCode = pOptions->nTextSepCode;
194 			aStr  = pTextSepTab->GetDelimiter( nCode );
195 
196 			if ( !aStr.Len() )
197 				aEdTextSep.SetText( String((sal_Unicode)nCode) );
198 			else
199 				aEdTextSep.SetText( aStr );
200 		}
201 		// all encodings allowed, even Unicode
202 		aLbFont.FillFromTextEncodingTable( bImport );
203 	}
204 
205     if( bAscii )
206     {
207         Size aWinSize( GetSizePixel() );
208         aWinSize.Height() = aCbFixed.GetPosPixel().Y() + aCbFixed.GetSizePixel().Height();
209         Size aDiffSize( LogicToPixel( Size( 0, 6 ), MapMode( MAP_APPFONT ) ) );
210         aWinSize.Height() += aDiffSize.Height();
211         SetSizePixel( aWinSize );
212         aCbFixed.Show();
213         aCbFixed.SetClickHdl( LINK( this, ScImportOptionsDlg, FixedWidthHdl ) );
214         aCbFixed.Check( sal_False );
215         aCbShown.Show();
216         aCbShown.Check( sal_True );
217         aCbQuoteAll.Show();
218         aCbQuoteAll.Check( sal_False );
219     }
220     else
221     {
222         aFlFieldOpt.SetText( aFtFont.GetText() );
223 		aFtFieldSep.Hide();
224         aFtTextSep.Hide();
225         aFtFont.Hide();
226 		aEdFieldSep.Hide();
227         aEdTextSep.Hide();
228         aCbFixed.Hide();
229         aCbShown.Hide();
230         aCbQuoteAll.Hide();
231 		aLbFont.GrabFocus();
232         aLbFont.SetDoubleClickHdl( LINK( this, ScImportOptionsDlg, DoubleClickHdl ) );
233     }
234 
235 	aLbFont.SelectTextEncoding( pOptions ? pOptions->eCharSet :
236 		gsl_getSystemTextEncoding() );
237 
238 	// optionaler Titel:
239 	if ( pStrTitle )
240 		SetText( *pStrTitle );
241 
242 	FreeResource();
243 }
244 
245 //------------------------------------------------------------------------
246 
~ScImportOptionsDlg()247 __EXPORT ScImportOptionsDlg::~ScImportOptionsDlg()
248 {
249 	delete pFieldSepTab;
250 	delete pTextSepTab;
251 }
252 
253 //------------------------------------------------------------------------
254 
GetImportOptions(ScImportOptions & rOptions) const255 void ScImportOptionsDlg::GetImportOptions( ScImportOptions& rOptions ) const
256 {
257 	rOptions.SetTextEncoding( aLbFont.GetSelectTextEncoding() );
258 
259     if ( aCbFixed.IsVisible() )
260 	{
261 		rOptions.nFieldSepCode = GetCodeFromCombo( aEdFieldSep );
262 		rOptions.nTextSepCode  = GetCodeFromCombo( aEdTextSep );
263         rOptions.bFixedWidth = aCbFixed.IsChecked();
264         rOptions.bSaveAsShown = aCbShown.IsChecked();
265         rOptions.bQuoteAllText = aCbQuoteAll.IsChecked();
266 	}
267 }
268 
269 //------------------------------------------------------------------------
270 
GetCodeFromCombo(const ComboBox & rEd) const271 sal_uInt16 ScImportOptionsDlg::GetCodeFromCombo( const ComboBox& rEd ) const
272 {
273 	ScDelimiterTable* pTab;
274 	String  aStr( rEd.GetText() );
275 	sal_uInt16  nCode;
276 
277 	if ( &rEd == &aEdTextSep )
278 		pTab = pTextSepTab;
279 	else
280 		pTab = pFieldSepTab;
281 
282 	if ( !aStr.Len() )
283 	{
284 		nCode = 0;			// kein Trennzeichen
285 	}
286 	else
287 	{
288 		nCode = pTab->GetCode( aStr );
289 
290 		if ( nCode == 0 )
291 			nCode = (sal_uInt16)aStr.GetChar(0);
292 	}
293 
294 	return nCode;
295 }
296 
297 //------------------------------------------------------------------------
298 
IMPL_LINK(ScImportOptionsDlg,FixedWidthHdl,CheckBox *,pCheckBox)299 IMPL_LINK( ScImportOptionsDlg, FixedWidthHdl, CheckBox*, pCheckBox )
300 {
301     if( pCheckBox == &aCbFixed )
302     {
303         sal_Bool bEnable = !aCbFixed.IsChecked();
304         aFtFieldSep.Enable( bEnable );
305         aEdFieldSep.Enable( bEnable );
306         aFtTextSep.Enable( bEnable );
307         aEdTextSep.Enable( bEnable );
308         aCbShown.Enable( bEnable );
309         aCbQuoteAll.Enable( bEnable );
310     }
311     return 0;
312 }
313 
IMPL_LINK(ScImportOptionsDlg,DoubleClickHdl,ListBox *,pLb)314  IMPL_LINK( ScImportOptionsDlg, DoubleClickHdl, ListBox*, pLb )
315 {
316     if ( pLb == &aLbFont )
317     {
318         aBtnOk.Click();
319     }
320     return 0;
321 }
322