LibreOffice Module sc (master) 1
filtuno.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
21#include <tools/urlobj.hxx>
22#include <vcl/svapp.hxx>
25#include <osl/diagnose.h>
26
27#include <filtuno.hxx>
28#include <miscuno.hxx>
29#include <scdll.hxx>
30#include <imoptdlg.hxx>
31#include <asciiopt.hxx>
32#include <docsh.hxx>
33#include <globstr.hrc>
34#include <scresid.hxx>
35
36#include <scabstdlg.hxx>
37#include <i18nlangtag/lang.h>
38
39#include <optutil.hxx>
40#include <com/sun/star/uno/Any.hxx>
41#include <com/sun/star/uno/Sequence.hxx>
44#include <memory>
45
46using namespace com::sun::star;
47using namespace com::sun::star::uno;
48using namespace connectivity::dbase;
49
50constexpr OUStringLiteral SCFILTEROPTIONSOBJ_SERVICE = u"com.sun.star.ui.dialogs.FilterOptionsDialog";
51constexpr OUStringLiteral SCFILTEROPTIONSOBJ_IMPLNAME = u"com.sun.star.comp.Calc.FilterOptionsDialog";
52
54
55constexpr OUStringLiteral SC_UNONAME_FILENAME = u"URL";
56constexpr OUStringLiteral SC_UNONAME_FILTERNAME = u"FilterName";
57constexpr OUStringLiteral SC_UNONAME_FILTEROPTIONS = u"FilterOptions";
58constexpr OUStringLiteral SC_UNONAME_INPUTSTREAM = u"InputStream";
59
60constexpr OUStringLiteral DBF_CHAR_SET = u"CharSet";
61constexpr OUStringLiteral DBF_SEP_PATH_IMPORT = u"Office.Calc/Dialogs/DBFImport";
62constexpr OUStringLiteral DBF_SEP_PATH_EXPORT = u"Office.Calc/Dialogs/DBFExport";
63
64namespace
65{
66
67 enum class charsetSource
68 {
69 charset_from_file,
70 charset_from_user_setting,
71 charset_default
72 };
73
74 charsetSource load_CharSet(rtl_TextEncoding &nCharSet, bool bExport, SvStream* dbf_Stream)
75 {
76 if (dbf_Stream && dbfReadCharset(nCharSet, dbf_Stream))
77 {
78 return charsetSource::charset_from_file;
79 }
80
81 Sequence<Any> aValues;
82 const Any *pProperties;
85
86 aValues = aItem.GetProperties( aNames );
87 pProperties = aValues.getConstArray();
88
89 if( pProperties[0].hasValue() )
90 {
91 sal_Int32 nChar = 0;
92 pProperties[0] >>= nChar;
93 if( nChar >= 0)
94 {
95 nCharSet = static_cast<rtl_TextEncoding>(nChar);
96 return charsetSource::charset_from_user_setting;
97 }
98 }
99
100 // Default choice
101 nCharSet = RTL_TEXTENCODING_IBM_850;
102 return charsetSource::charset_default;
103 }
104
105 void save_CharSet( rtl_TextEncoding nCharSet, bool bExport )
106 {
107 Sequence<Any> aValues;
108 Any *pProperties;
111
112 aValues = aItem.GetProperties( aNames );
113 pProperties = aValues.getArray();
114 pProperties[0] <<= static_cast<sal_Int32>(nCharSet);
115
116 aItem.PutProperties(aNames, aValues);
117 }
118}
119
121 bExport( false )
122{
123}
124
126{
127}
128
129extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
130Calc_FilterOptionsDialog_get_implementation(css::uno::XComponentContext*, css::uno::Sequence<css::uno::Any> const &)
131{
132 SolarMutexGuard aGuard;
133 ScDLL::Init();
134 return cppu::acquire(new ScFilterOptionsObj);
135}
136
137// XPropertyAccess
138
139uno::Sequence<beans::PropertyValue> SAL_CALL ScFilterOptionsObj::getPropertyValues()
140{
143 });
144}
145
146void SAL_CALL ScFilterOptionsObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& aProps )
147{
148 for (const beans::PropertyValue& rProp : aProps)
149 {
150 OUString aPropName(rProp.Name);
151
153 rProp.Value >>= aFileName;
154 else if ( aPropName == SC_UNONAME_FILTERNAME )
155 rProp.Value >>= aFilterName;
157 rProp.Value >>= aFilterOptions;
158 else if ( aPropName == SC_UNONAME_INPUTSTREAM )
159 rProp.Value >>= xInputStream;
160 }
161}
162
163// XExecutableDialog
164
165void SAL_CALL ScFilterOptionsObj::setTitle( const OUString& /* aTitle */ )
166{
167 // not used
168}
169
170sal_Int16 SAL_CALL ScFilterOptionsObj::execute()
171{
172 sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL;
173
174 OUString aFilterString( aFilterName );
175
177
178 if ( !bExport && aFilterString == ScDocShell::GetAsciiFilterName() )
179 {
180 // ascii import is special...
181
183 // tdf#132421 - don't URL encode filename for the import ASCII dialog title
184 OUString aPrivDatName(aURL.GetLastName(INetURLObject::DecodeMechanism::Unambiguous));
185 std::unique_ptr<SvStream> pInStream;
186 if ( xInputStream.is() )
188
190 pInStream.get(), SC_IMPORTFILE));
191 if ( pDlg->Execute() == RET_OK )
192 {
193 ScAsciiOptions aOptions;
194 pDlg->GetOptions( aOptions );
195 pDlg->SaveParameters();
196 aFilterOptions = aOptions.WriteToString();
197 nRet = ui::dialogs::ExecutableDialogResults::OK;
198 }
199 }
200 else if ( aFilterString == ScDocShell::GetWebQueryFilterName() || aFilterString == ScDocShell::GetHtmlFilterName() )
201 {
202 if (bExport)
203 nRet = ui::dialogs::ExecutableDialogResults::OK; // export HTML without dialog
204 else
205 {
206 // HTML import.
209
210 if (pDlg->Execute() == RET_OK)
211 {
212 LanguageType eLang = pDlg->GetLanguageType();
213 OUStringBuffer aBuf;
214
215 aBuf.append(static_cast<sal_Int32>(static_cast<sal_uInt16>(eLang)));
216 aBuf.append(' ');
217 aBuf.append(pDlg->IsDateConversionSet() ? u'1' : u'0');
218 aFilterOptions = aBuf.makeStringAndClear();
219 nRet = ui::dialogs::ExecutableDialogResults::OK;
220 }
221 }
222 }
223 else
224 {
225 bool bDBEnc = false;
226 bool bAscii = false;
227 bool skipDialog = false;
228
229 sal_Unicode const cStrDel = '"';
230 sal_Unicode cAsciiDel = ';';
231 rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
232
233 OUString aTitle;
234 bool bIncludeBOM = false;
235
236 if ( aFilterString == ScDocShell::GetAsciiFilterName() )
237 {
238 // ascii export (import is handled above)
239
241 OUString aExt(aURL.getExtension());
242 if (aExt.equalsIgnoreAsciiCase("CSV"))
243 cAsciiDel = ',';
244 else
245 cAsciiDel = '\t';
246
247 aTitle = ScResId( STR_EXPORT_ASCII );
248 bAscii = true;
249
250 ScAsciiOptions aOptions;
252 bIncludeBOM = aOptions.GetIncludeBOM();
253 }
254 else if ( aFilterString == ScDocShell::GetLotusFilterName() )
255 {
256 // lotus is only imported
257 OSL_ENSURE( !bExport, "Filter Options for Lotus Export is not implemented" );
258
259 aTitle = ScResId( STR_IMPORT_LOTUS );
260 eEncoding = RTL_TEXTENCODING_IBM_437;
261 }
262 else if ( aFilterString == ScDocShell::GetDBaseFilterName() )
263 {
264 if ( bExport )
265 {
266 // dBase export
267 aTitle = ScResId( STR_EXPORT_DBF );
268 }
269 else
270 {
271 // dBase import
272 aTitle = ScResId( STR_IMPORT_DBF );
273 }
274
275 std::unique_ptr<SvStream> pInStream;
276 if ( xInputStream.is() )
278 switch(load_CharSet( eEncoding, bExport, pInStream.get()))
279 {
280 case charsetSource::charset_from_file:
281 skipDialog = true;
282 break;
283 case charsetSource::charset_from_user_setting:
284 case charsetSource::charset_default:
285 break;
286 }
287 bDBEnc = true;
288 // pInStream goes out of scope, the stream is automatically closed
289 }
290 else if ( aFilterString == ScDocShell::GetDifFilterName() )
291 {
292 if ( bExport )
293 {
294 // DIF export
295 aTitle = ScResId( STR_EXPORT_DIF );
296 }
297 else
298 {
299 // DIF import
300 aTitle = ScResId( STR_IMPORT_DIF );
301 }
302 // common for DIF import/export
303 eEncoding = RTL_TEXTENCODING_MS_1252;
304 }
305
306 ScImportOptions aOptions( cAsciiDel, cStrDel, eEncoding);
307 aOptions.bIncludeBOM = bIncludeBOM;
308 if(skipDialog)
309 {
310 // TODO: check we are not missing some of the stuff that ScImportOptionsDlg::GetImportOptions
311 // (file sc/source/ui/dbgui/scuiimoptdlg.cxx) does
312 // that is, if the dialog sets options that are not selected by the user (!)
313 // then we are missing them here.
314 // Then we may need to rip them out of the dialog.
315 // Or we actually change the dialog to not display if skipDialog==true
316 // in that case, add an argument skipDialog to CreateScImportOptionsDlg
317 nRet = ui::dialogs::ExecutableDialogResults::OK;
318 }
319 else
320 {
322 bAscii, &aOptions, &aTitle,
323 bDBEnc, !bExport));
324 if ( pDlg->Execute() == RET_OK )
325 {
326 pDlg->SaveImportOptions();
327 pDlg->GetImportOptions( aOptions );
328 save_CharSet( aOptions.eCharSet, bExport );
329 nRet = ui::dialogs::ExecutableDialogResults::OK;
330 }
331 }
332 if (nRet == ui::dialogs::ExecutableDialogResults::OK)
333 {
334 if ( bAscii )
335 aFilterOptions = aOptions.BuildString();
336 else
337 aFilterOptions = aOptions.aStrFont;
338 }
339 }
340
341 xInputStream.clear(); // don't hold the stream longer than necessary
342
343 return nRet;
344}
345
346// XImporter
347
348void SAL_CALL ScFilterOptionsObj::setTargetDocument( const uno::Reference<lang::XComponent>& /* xDoc */ )
349{
350 bExport = false;
351}
352
353// XExporter
354
355void SAL_CALL ScFilterOptionsObj::setSourceDocument( const uno::Reference<lang::XComponent>& /* xDoc */ )
356{
357 bExport = true;
358}
359
360// XInitialization
361
362void SAL_CALL ScFilterOptionsObj::initialize(const uno::Sequence<uno::Any>& rArguments)
363{
365 if (aProperties.has("ParentWindow"))
366 aProperties.get("ParentWindow") >>= xDialogParent;
367}
368
369/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
PropertiesInfo aProperties
@ SC_IMPORTFILE
Definition: asciiopt.hxx:110
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
virtual VclPtr< AbstractScImportOptionsDlg > CreateScImportOptionsDlg(weld::Window *pParent, bool bAscii, const ScImportOptions *pOptions, const OUString *pStrTitle, bool bOnlyDbtoolsEncodings, bool bImport=true)=0
virtual VclPtr< AbstractScTextImportOptionsDlg > CreateScTextImportOptionsDlg(weld::Window *pParent)=0
static SC_DLLPUBLIC ScAbstractDialogFactory * Create()
Definition: scabstdlg.cxx:37
virtual VclPtr< AbstractScImportAsciiDlg > CreateScImportAsciiDlg(weld::Window *pParent, const OUString &aDatName, SvStream *pInStream, ScImportAsciiCall eCall)=0
void ReadFromString(std::u16string_view rString)
Definition: asciiopt.cxx:89
bool GetIncludeBOM() const
Definition: asciiopt.hxx:67
OUString WriteToString() const
Definition: asciiopt.cxx:211
static SC_DLLPUBLIC void Init()
DLL-init/exit-code must be linked to the DLL only.
Definition: scdll.cxx:100
static OUString GetHtmlFilterName()
Definition: docsh.cxx:2863
static OUString GetDifFilterName()
Definition: docsh.cxx:2888
static OUString GetLotusFilterName()
Definition: docsh.cxx:2878
static OUString GetAsciiFilterName()
Definition: docsh.cxx:2873
static OUString GetWebQueryFilterName()
Definition: docsh.cxx:2868
static OUString GetDBaseFilterName()
Definition: docsh.cxx:2883
css::uno::Reference< css::awt::XWindow > xDialogParent
Definition: filtuno.hxx:46
virtual ~ScFilterOptionsObj() override
Definition: filtuno.cxx:125
virtual void SAL_CALL setSourceDocument(const css::uno::Reference< css::lang::XComponent > &xDoc) override
Definition: filtuno.cxx:355
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &rArguments) override
Definition: filtuno.cxx:362
virtual void SAL_CALL setTitle(const OUString &aTitle) override
Definition: filtuno.cxx:165
OUString aFileName
Definition: filtuno.hxx:42
virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getPropertyValues() override
Definition: filtuno.cxx:139
virtual void SAL_CALL setTargetDocument(const css::uno::Reference< css::lang::XComponent > &xDoc) override
Definition: filtuno.cxx:348
virtual sal_Int16 SAL_CALL execute() override
Definition: filtuno.cxx:170
OUString aFilterOptions
Definition: filtuno.hxx:44
virtual void SAL_CALL setPropertyValues(const css::uno::Sequence< css::beans::PropertyValue > &aProps) override
Definition: filtuno.cxx:146
css::uno::Reference< css::io::XInputStream > xInputStream
Definition: filtuno.hxx:45
OUString aFilterName
Definition: filtuno.hxx:43
OUString BuildString() const
Definition: imoptdlg.cxx:103
OUString aStrFont
Definition: imoptdlg.hxx:46
rtl_TextEncoding eCharSet
Definition: imoptdlg.hxx:47
void PutProperties(const css::uno::Sequence< OUString > &rNames, const css::uno::Sequence< css::uno::Any > &rValues)
Definition: optutil.hxx:55
css::uno::Sequence< css::uno::Any > GetProperties(const css::uno::Sequence< OUString > &rNames)
Definition: optutil.hxx:53
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
URL aURL
float u
constexpr OUStringLiteral DBF_SEP_PATH_IMPORT
Definition: filtuno.cxx:61
constexpr OUStringLiteral SC_UNONAME_FILTERNAME
Definition: filtuno.cxx:56
constexpr OUStringLiteral SCFILTEROPTIONSOBJ_IMPLNAME
Definition: filtuno.cxx:51
constexpr OUStringLiteral DBF_CHAR_SET
Definition: filtuno.cxx:60
constexpr OUStringLiteral SC_UNONAME_FILTEROPTIONS
Definition: filtuno.cxx:57
constexpr OUStringLiteral SC_UNONAME_INPUTSTREAM
Definition: filtuno.cxx:58
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * Calc_FilterOptionsDialog_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
Definition: filtuno.cxx:130
constexpr OUStringLiteral DBF_SEP_PATH_EXPORT
Definition: filtuno.cxx:62
constexpr OUStringLiteral SC_UNONAME_FILENAME
Definition: filtuno.cxx:55
constexpr OUStringLiteral SCFILTEROPTIONSOBJ_SERVICE
Definition: filtuno.cxx:50
aBuf
#define SC_SIMPLE_SERVICE_INFO(ClassName, ClassNameAscii, ServiceAscii)
Definition: miscuno.hxx:63
css::uno::Sequence< css::beans::PropertyValue > InitPropertySequence(::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit)
bool dbfReadCharset(rtl_TextEncoding &nCharSet, SvStream *dbf_Stream)
OUString aPropName
OUString FilterName
OUString ScResId(TranslateId aId)
Definition: scdll.cxx:90
sal_uInt16 sal_Unicode
RET_OK