xref: /trunk/main/sc/source/ui/unoobj/filtuno.cxx (revision b3f79822)
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_sc.hxx"
26 
27 
28 
29 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
30 #include <tools/urlobj.hxx>
31 #include <vcl/msgbox.hxx>
32 #include <unotools/ucbstreamhelper.hxx>
33 
34 #include "editutil.hxx"
35 #include "filtuno.hxx"
36 #include "miscuno.hxx"
37 #include "unoguard.hxx"
38 #include "scdll.hxx"
39 #include "imoptdlg.hxx"
40 #include "asciiopt.hxx"
41 #include "docsh.hxx"
42 #include "globstr.hrc"
43 
44 
45 #include "sc.hrc" //CHINA001
46 #include "scabstdlg.hxx" //CHINA001
47 #include "i18npool/lang.h"
48 
49 #include <memory>
50 
51 using namespace ::com::sun::star;
52 using ::rtl::OUStringBuffer;
53 
54 //------------------------------------------------------------------------
55 
56 #define SCFILTEROPTIONSOBJ_SERVICE		"com.sun.star.ui.dialogs.FilterOptionsDialog"
57 #define SCFILTEROPTIONSOBJ_IMPLNAME		"com.sun.star.comp.Calc.FilterOptionsDialog"
58 
SC_SIMPLE_SERVICE_INFO(ScFilterOptionsObj,SCFILTEROPTIONSOBJ_IMPLNAME,SCFILTEROPTIONSOBJ_SERVICE)59 SC_SIMPLE_SERVICE_INFO( ScFilterOptionsObj, SCFILTEROPTIONSOBJ_IMPLNAME, SCFILTEROPTIONSOBJ_SERVICE )
60 
61 #define SC_UNONAME_FILENAME         "URL"
62 #define SC_UNONAME_FILTERNAME		"FilterName"
63 #define SC_UNONAME_FILTEROPTIONS	"FilterOptions"
64 #define SC_UNONAME_INPUTSTREAM		"InputStream"
65 
66 //------------------------------------------------------------------------
67 
68 ScFilterOptionsObj::ScFilterOptionsObj() :
69 	bExport( sal_False )
70 {
71 }
72 
~ScFilterOptionsObj()73 ScFilterOptionsObj::~ScFilterOptionsObj()
74 {
75 }
76 
77 // stuff for exService_...
78 
ScFilterOptionsObj_CreateInstance(const uno::Reference<lang::XMultiServiceFactory> &)79 uno::Reference<uno::XInterface>	SAL_CALL ScFilterOptionsObj_CreateInstance(
80 						const uno::Reference<lang::XMultiServiceFactory>& )
81 {
82 	ScUnoGuard aGuard;
83 	ScDLL::Init();
84 	return (::cppu::OWeakObject*) new ScFilterOptionsObj;
85 }
86 
getImplementationName_Static()87 rtl::OUString ScFilterOptionsObj::getImplementationName_Static()
88 {
89 	return rtl::OUString::createFromAscii( SCFILTEROPTIONSOBJ_IMPLNAME );
90 }
91 
getSupportedServiceNames_Static()92 uno::Sequence<rtl::OUString> ScFilterOptionsObj::getSupportedServiceNames_Static()
93 {
94 	uno::Sequence<rtl::OUString> aRet(1);
95 	rtl::OUString* pArray = aRet.getArray();
96 	pArray[0] = rtl::OUString::createFromAscii( SCFILTEROPTIONSOBJ_SERVICE );
97 	return aRet;
98 }
99 
100 // XPropertyAccess
101 
getPropertyValues()102 uno::Sequence<beans::PropertyValue> SAL_CALL ScFilterOptionsObj::getPropertyValues() throw(uno::RuntimeException)
103 {
104 	uno::Sequence<beans::PropertyValue> aRet(1);
105 	beans::PropertyValue* pArray = aRet.getArray();
106 
107 	pArray[0].Name = rtl::OUString::createFromAscii( SC_UNONAME_FILTEROPTIONS );
108 	pArray[0].Value <<= aFilterOptions;
109 
110 	return aRet;
111 }
112 
setPropertyValues(const uno::Sequence<beans::PropertyValue> & aProps)113 void SAL_CALL ScFilterOptionsObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& aProps )
114 					throw(beans::UnknownPropertyException, beans::PropertyVetoException,
115 							lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
116 {
117 	const beans::PropertyValue* pPropArray = aProps.getConstArray();
118 	long nPropCount = aProps.getLength();
119 	for (long i = 0; i < nPropCount; i++)
120 	{
121 		const beans::PropertyValue& rProp = pPropArray[i];
122 		String aPropName(rProp.Name);
123 
124 		if ( aPropName.EqualsAscii( SC_UNONAME_FILENAME ) )
125 			rProp.Value >>= aFileName;
126 		else if ( aPropName.EqualsAscii( SC_UNONAME_FILTERNAME ) )
127 			rProp.Value >>= aFilterName;
128 		else if ( aPropName.EqualsAscii( SC_UNONAME_FILTEROPTIONS ) )
129 			rProp.Value >>= aFilterOptions;
130 		else if ( aPropName.EqualsAscii( SC_UNONAME_INPUTSTREAM ) )
131 			rProp.Value >>= xInputStream;
132 	}
133 }
134 
135 // XExecutableDialog
136 
setTitle(const::rtl::OUString &)137 void SAL_CALL ScFilterOptionsObj::setTitle( const ::rtl::OUString& /* aTitle */ ) throw(uno::RuntimeException)
138 {
139 	// not used
140 }
141 
execute()142 sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException)
143 {
144 	sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL;
145 
146 	String aFilterString( aFilterName );
147 
148     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
149     DBG_ASSERT(pFact, "ScAbstractFactory create fail!");
150 
151 	if ( !bExport && aFilterString == ScDocShell::GetAsciiFilterName() )
152 	{
153 		//	ascii import is special...
154 
155 		INetURLObject aURL( aFileName );
156 		String aExt(aURL.getExtension());
157 		String aPrivDatName(aURL.getName());
158 		sal_Unicode cAsciiDel;
159 		if (aExt.EqualsIgnoreCaseAscii("CSV"))
160 			cAsciiDel = ',';
161 		else
162 			cAsciiDel = '\t';
163 
164 		SvStream* pInStream = NULL;
165 		if ( xInputStream.is() )
166 			pInStream = utl::UcbStreamHelper::CreateStream( xInputStream );
167 
168 		//CHINA001 ScImportAsciiDlg* pDlg = new ScImportAsciiDlg( NULL, aPrivDatName, pInStream, cAsciiDel );
169 		AbstractScImportAsciiDlg* pDlg = pFact->CreateScImportAsciiDlg( NULL, aPrivDatName, pInStream, RID_SCDLG_ASCII, cAsciiDel);
170 		DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
171 		if ( pDlg->Execute() == RET_OK )
172         {
173             ScAsciiOptions aOptions;
174             pDlg->GetOptions( aOptions );
175             pDlg->SaveParameters();
176             aFilterOptions = aOptions.WriteToString();
177             nRet = ui::dialogs::ExecutableDialogResults::OK;
178         }
179 		delete pDlg;
180 		delete pInStream;
181 	}
182     else if ( aFilterString == ScDocShell::GetWebQueryFilterName() || aFilterString == ScDocShell::GetHtmlFilterName() )
183     {
184         if (bExport)
185             nRet = ui::dialogs::ExecutableDialogResults::OK;    // export HTML without dialog
186         else
187         {
188             // HTML import.
189             ::std::auto_ptr<AbstractScTextImportOptionsDlg> pDlg(
190                 pFact->CreateScTextImportOptionsDlg(NULL, RID_SCDLG_TEXT_IMPORT_OPTIONS));
191 
192             if (pDlg->Execute() == RET_OK)
193             {
194                 LanguageType eLang = pDlg->GetLanguageType();
195                 OUStringBuffer aBuf;
196 
197                 aBuf.append(String::CreateFromInt32(static_cast<sal_Int32>(eLang)));
198                 aBuf.append(sal_Unicode(' '));
199                 aBuf.append(pDlg->IsDateConversionSet() ? sal_Unicode('1') : sal_Unicode('0'));
200                 aFilterOptions = aBuf.makeStringAndClear();
201                 nRet = ui::dialogs::ExecutableDialogResults::OK;
202             }
203         }
204     }
205 	else
206 	{
207 		sal_Bool bMultiByte = sal_True;
208 		sal_Bool bDBEnc     = sal_False;
209 		sal_Bool bAscii     = sal_False;
210 
211 		sal_Unicode cStrDel = '"';
212 		sal_Unicode cAsciiDel = ';';
213 		rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
214 
215 		String aTitle;
216 
217 		if ( aFilterString == ScDocShell::GetAsciiFilterName() )
218 		{
219 			//	ascii export (import is handled above)
220 
221 			INetURLObject aURL( aFileName );
222 			String aExt(aURL.getExtension());
223 			if (aExt.EqualsIgnoreCaseAscii("CSV"))
224 				cAsciiDel = ',';
225 			else
226 				cAsciiDel = '\t';
227 
228 			aTitle = ScGlobal::GetRscString( STR_EXPORT_ASCII );
229 			bAscii = sal_True;
230 		}
231 		else if ( aFilterString == ScDocShell::GetLotusFilterName() )
232 		{
233 			//	lotus is only imported
234 			DBG_ASSERT( !bExport, "Filter Options for Lotus Export is not implemented" );
235 
236 			aTitle = ScGlobal::GetRscString( STR_IMPORT_LOTUS );
237 			eEncoding = RTL_TEXTENCODING_IBM_437;
238 		}
239 		else if ( aFilterString == ScDocShell::GetDBaseFilterName() )
240 		{
241 			if ( bExport )
242 			{
243 				//	dBase export
244 				aTitle = ScGlobal::GetRscString( STR_EXPORT_DBF );
245 			}
246 			else
247 			{
248 				//	dBase import
249 				aTitle = ScGlobal::GetRscString( STR_IMPORT_DBF );
250 			}
251 			// common for dBase import/export
252 			eEncoding = RTL_TEXTENCODING_IBM_850;
253 			bDBEnc = sal_True;
254 		}
255 		else if ( aFilterString == ScDocShell::GetDifFilterName() )
256 		{
257 			if ( bExport )
258 			{
259 				//	DIF export
260 				aTitle = ScGlobal::GetRscString( STR_EXPORT_DIF );
261 			}
262 			else
263 			{
264 				//	DIF import
265 				aTitle = ScGlobal::GetRscString( STR_IMPORT_DIF );
266 			}
267 			// common for DIF import/export
268 			eEncoding = RTL_TEXTENCODING_MS_1252;
269 		}
270 
271 		ScImportOptions aOptions( cAsciiDel, cStrDel, eEncoding);
272 //CHINA001		ScImportOptionsDlg* pDlg = new ScImportOptionsDlg( NULL, bAscii,
273 //CHINA001		&aOptions, &aTitle, bMultiByte, bDBEnc,
274 //CHINA001		!bExport );
275 //CHINA001
276 
277 		AbstractScImportOptionsDlg* pDlg = pFact->CreateScImportOptionsDlg( NULL, RID_SCDLG_IMPORTOPT,
278 																			bAscii, &aOptions, &aTitle, bMultiByte, bDBEnc,
279 																			!bExport);
280 		DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
281 		if ( pDlg->Execute() == RET_OK )
282 		{
283 			pDlg->GetImportOptions( aOptions );
284 			if ( bAscii )
285 				aFilterOptions = aOptions.BuildString();
286 			else
287 				aFilterOptions = aOptions.aStrFont;
288 			nRet = ui::dialogs::ExecutableDialogResults::OK;
289 		}
290 		delete pDlg;
291 	}
292 
293 	xInputStream.clear();	// don't hold the stream longer than necessary
294 
295 	return nRet;
296 }
297 
298 // XImporter
299 
setTargetDocument(const uno::Reference<lang::XComponent> &)300 void SAL_CALL ScFilterOptionsObj::setTargetDocument( const uno::Reference<lang::XComponent>& /* xDoc */ )
301 							throw(lang::IllegalArgumentException, uno::RuntimeException)
302 {
303 	bExport = sal_False;
304 }
305 
306 // XExporter
307 
setSourceDocument(const uno::Reference<lang::XComponent> &)308 void SAL_CALL ScFilterOptionsObj::setSourceDocument( const uno::Reference<lang::XComponent>& /* xDoc */ )
309 							throw(lang::IllegalArgumentException, uno::RuntimeException)
310 {
311 	bExport = sal_True;
312 }
313 
314