xref: /trunk/main/fpicker/source/unx/kde4/KDE4FilePicker.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 //////////////////////////////////////////////////////////////////////////
25 // includes
26 //////////////////////////////////////////////////////////////////////////
27 
28 #include <com/sun/star/lang/DisposedException.hpp>
29 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30 #include <cppuhelper/interfacecontainer.h>
31 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
32 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
33 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
34 #include <com/sun/star/ui/dialogs/ControlActions.hpp>
35 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
36 
37 #include <svtools/svtools.hrc>
38 
39 #include <vos/mutex.hxx>
40 
41 #include <vcl/svapp.hxx>
42 #include <vcl/sysdata.hxx>
43 #include <vcl/syswin.hxx>
44 
45 #include "osl/file.h"
46 
47 #include "KDE4FilePicker.hxx"
48 #include "FPServiceInfo.hxx"
49 
50 /* ********* Hack, but needed because of conflicting types... */
51 #define Region QtXRegion
52 
53 //kde has an enum that uses this...OO does too
54 #undef SETTINGS_MOUSE
55 #undef SETTINGS_LOCALE
56 #undef SETTINGS_STYLE
57 
58 #include <kfiledialog.h>
59 #include <kwindowsystem.h>
60 #include <kapplication.h>
61 #include <kfilefiltercombo.h>
62 
63 #include <QWidget>
64 #include <QCheckBox>
65 #include <QGridLayout>
66 
67 #undef Region
68 
69 using namespace ::com::sun::star;
70 
71 using namespace ::com::sun::star::ui::dialogs;
72 using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
73 
74 using namespace ::com::sun::star;
75 using namespace ::com::sun::star::ui::dialogs;
76 using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
77 using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
78 using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
79 using namespace ::com::sun::star::lang;
80 using namespace ::com::sun::star::beans;
81 using namespace ::com::sun::star::uno;
82 
83 //////////////////////////////////////////////////////////////////////////
84 // helper functions
85 //////////////////////////////////////////////////////////////////////////
86 
87 #include <QDebug>
88 
89 namespace
90 {
91     // controlling event notifications
92     const bool STARTUP_SUSPENDED = true;
93     const bool STARTUP_ALIVE     = false;
94 
FilePicker_getSupportedServiceNames()95     uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
96     {
97         uno::Sequence<rtl::OUString> aRet(3);
98         aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker");
99         aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker");
100         aRet[2] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.KDE4FilePicker");
101         return aRet;
102     }
103 }
104 
toOUString(const QString & s)105 rtl::OUString toOUString(const QString& s)
106 {
107     // QString stores UTF16, just like OUString
108     return rtl::OUString(reinterpret_cast<const sal_Unicode*>(s.data()), s.length());
109 }
110 
toQString(const rtl::OUString & s)111 QString toQString(const rtl::OUString& s)
112 {
113     return QString::fromUtf16(s.getStr(), s.getLength());
114 }
115 
116 //////////////////////////////////////////////////////////////////////////
117 // KDE4FilePicker
118 //////////////////////////////////////////////////////////////////////////
119 
KDE4FilePicker(const uno::Reference<lang::XMultiServiceFactory> & xServiceMgr)120 KDE4FilePicker::KDE4FilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr )
121     : cppu::WeakComponentImplHelper8<
122           XFilterManager,
123           XFilterGroupManager,
124           XFilePickerControlAccess,
125           XFilePickerNotifier,
126 // TODO   XFilePreview,
127           lang::XInitialization,
128           util::XCancellable,
129           lang::XEventListener,
130           lang::XServiceInfo>( _helperMutex ),
131           m_xServiceMgr( xServiceMgr ),
132           _resMgr( CREATEVERSIONRESMGR( fps_office ) )
133 {
134     _extraControls = new QWidget();
135     _layout = new QGridLayout(_extraControls);
136 
137     _dialog = new KFileDialog(KUrl("~"), QString(""), 0, _extraControls);
138     _dialog->setMode(KFile::File | KFile::LocalOnly);
139 
140     //default mode
141     _dialog->setOperationMode(KFileDialog::Opening);
142 }
143 
~KDE4FilePicker()144 KDE4FilePicker::~KDE4FilePicker()
145 {
146     delete _resMgr;
147     delete _dialog;
148 }
149 
addFilePickerListener(const uno::Reference<XFilePickerListener> & xListener)150 void SAL_CALL KDE4FilePicker::addFilePickerListener( const uno::Reference<XFilePickerListener>& xListener )
151 {
152     ::vos::OGuard aGuard( Application::GetSolarMutex() );
153     m_xListener = xListener;
154 }
155 
removeFilePickerListener(const uno::Reference<XFilePickerListener> &)156 void SAL_CALL KDE4FilePicker::removeFilePickerListener( const uno::Reference<XFilePickerListener>& )
157 {
158     ::vos::OGuard aGuard( Application::GetSolarMutex() );
159     m_xListener.clear();
160 }
161 
setTitle(const rtl::OUString & title)162 void SAL_CALL KDE4FilePicker::setTitle( const rtl::OUString &title )
163 {
164     _dialog->setCaption(toQString(title));
165 }
166 
execute()167 sal_Int16 SAL_CALL KDE4FilePicker::execute()
168 {
169     //get the window id of the main OO window to set it for the dialog as a parent
170     Window *pParentWin = Application::GetDefDialogParent();
171     if ( pParentWin )
172     {
173         const SystemEnvData* pSysData = ((SystemWindow *)pParentWin)->GetSystemData();
174         if ( pSysData )
175         {
176             KWindowSystem::setMainWindow( _dialog, pSysData->aWindow); // unx only
177         }
178     }
179 
180     _dialog->clearFilter();
181     _dialog->setFilter(_filter);
182     _dialog->filterWidget()->setEditable(false);
183 
184     //block and wait for user input
185     if (_dialog->exec() == KFileDialog::Accepted)
186         return ExecutableDialogResults::OK;
187 
188     return ExecutableDialogResults::CANCEL;
189 }
190 
setMultiSelectionMode(sal_Bool multiSelect)191 void SAL_CALL KDE4FilePicker::setMultiSelectionMode( sal_Bool multiSelect )
192 {
193     if (multiSelect)
194         _dialog->setMode(KFile::Files | KFile::LocalOnly);
195     else
196         _dialog->setMode(KFile::File | KFile::LocalOnly);
197 }
198 
setDefaultName(const::rtl::OUString & name)199 void SAL_CALL KDE4FilePicker::setDefaultName( const ::rtl::OUString &name )
200 {
201     const QString url = toQString(name);
202     _dialog->setSelection(url);
203 }
204 
setDisplayDirectory(const rtl::OUString & dir)205 void SAL_CALL KDE4FilePicker::setDisplayDirectory( const rtl::OUString &dir )
206 {
207     const QString url = toQString(dir);
208     _dialog->setUrl(KUrl(url));
209 }
210 
getDisplayDirectory()211 rtl::OUString SAL_CALL KDE4FilePicker::getDisplayDirectory()
212 {
213     QString dir = _dialog->baseUrl().url();
214     return toOUString(dir);
215 }
216 
getFiles()217 uno::Sequence< ::rtl::OUString > SAL_CALL KDE4FilePicker::getFiles()
218 {
219     QStringList rawFiles = _dialog->selectedFiles();
220     QStringList files;
221 
222     // check if we need to add an extension
223     QString extension = "";
224     if ( _dialog->operationMode() == KFileDialog::Saving )
225     {
226         QCheckBox *cb = dynamic_cast<QCheckBox*> (
227             _customWidgets[ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ]);
228 
229         if (cb && cb->isChecked())
230         {
231             extension = _dialog->currentFilter(); // assuming filter value is like this *.ext
232             extension.replace("*","");
233         }
234     }
235 
236     // Workaround for the double click selection KDE4 bug
237     // kde file picker returns the file and directories for selectedFiles()
238     // when a file is double clicked
239     // make a true list of files
240     const QString dir = KUrl(rawFiles[0]).directory();
241 
242     bool singleFile = true;
243     if (rawFiles.size() > 1)
244     {
245         singleFile = false;
246         //for multi file sequences, oo expects the first param to be the directory
247         //can't treat all cases like multi file because in some instances (inserting image)
248         //oo WANTS only one entry in the final list
249         files.append(dir);
250     }
251 
252     for (sal_uInt16 i = 0; i < rawFiles.size(); ++i)
253     {
254         // if the raw file is not the base directory (see above kde bug)
255         // we add the file to list of avail files
256         if ((dir + "/") != ( rawFiles[i]))
257         {
258             QString filename = KUrl(rawFiles[i]).fileName();
259 
260             if (singleFile)
261                 filename.prepend(dir + "/");
262 
263             //prevent extension append if we already have one
264             if (filename.endsWith(extension))
265                 files.append(filename);
266             else
267                 files.append(filename + extension);
268         }
269     }
270 
271     // add all files and leading directory to outgoing OO sequence
272     uno::Sequence< ::rtl::OUString > seq(files.size());
273     for (int i = 0; i < files.size(); ++i)
274     {
275         rtl::OUString aFile(toOUString(files[i])), aURL;
276         osl_getFileURLFromSystemPath(aFile.pData, &aURL.pData );
277         seq[i] = aURL;
278     }
279 
280     return seq;
281 }
282 
appendFilter(const::rtl::OUString & title,const::rtl::OUString & filter)283 void SAL_CALL KDE4FilePicker::appendFilter( const ::rtl::OUString &title, const ::rtl::OUString &filter )
284 {
285     QString t = toQString(title);
286     QString f = toQString(filter);
287 
288     if (!_filter.isNull())
289         _filter.append("\n");
290 
291     //add to hash map for reverse lookup in getCurrentFilter
292     _filters.insert(f, t);
293 
294     // '/' meed to be escaped to else they are assumed to be mime types by kfiledialog
295     //see the docs
296     t.replace("/", "\\/");
297 
298     // openoffice gives us filters separated by ';' qt dialogs just want space separated
299     f.replace(";", " ");
300 
301     _filter.append(QString("%1|%2").arg(f).arg(t));
302 }
303 
setCurrentFilter(const rtl::OUString & title)304 void SAL_CALL KDE4FilePicker::setCurrentFilter( const rtl::OUString &title )
305 {
306     QString t = toQString(title);
307     t.replace("/", "\\/");
308     _dialog->filterWidget()->setCurrentFilter(t);
309 }
310 
getCurrentFilter()311 rtl::OUString SAL_CALL KDE4FilePicker::getCurrentFilter()
312 {
313     QString filter = _filters[_dialog->currentFilter()];
314 
315     //default if not found
316     if (filter.isNull())
317         filter = "ODF Text Document (.odt)";
318 
319     return toOUString(filter);
320 }
321 
appendFilterGroup(const rtl::OUString &,const uno::Sequence<beans::StringPair> & filters)322 void SAL_CALL KDE4FilePicker::appendFilterGroup( const rtl::OUString& , const uno::Sequence<beans::StringPair>& filters)
323 {
324     if (!_filter.isNull())
325         _filter.append(QString("\n"));
326 
327     const sal_uInt16 length = filters.getLength();
328     for (sal_uInt16 i = 0; i < length; ++i)
329     {
330         beans::StringPair aPair = filters[i];
331 
332         _filter.append(QString("%1|%2").arg(
333             toQString(aPair.Second).replace(";", " ")).arg(
334             toQString(aPair.First).replace("/","\\/")));
335 
336         if (i != length - 1)
337             _filter.append('\n');
338     }
339 }
340 
setValue(sal_Int16 controlId,sal_Int16,const uno::Any & value)341 void SAL_CALL KDE4FilePicker::setValue( sal_Int16 controlId, sal_Int16, const uno::Any &value )
342 {
343     QWidget* widget = _customWidgets[controlId];
344 
345     if (widget)
346     {
347         switch (controlId)
348         {
349             case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
350             case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
351             case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
352             case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
353             case ExtendedFilePickerElementIds::CHECKBOX_LINK:
354             case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
355             case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
356             {
357                 QCheckBox* cb = dynamic_cast<QCheckBox*>(widget);
358                 cb->setChecked(value.getValue());
359                 break;
360             }
361             case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
362             case ExtendedFilePickerElementIds::LISTBOX_VERSION:
363             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
364             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
365             case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
366             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
367             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
368             case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
369                 break;
370         }
371     }
372 }
373 
getValue(sal_Int16 controlId,sal_Int16)374 uno::Any SAL_CALL KDE4FilePicker::getValue( sal_Int16 controlId, sal_Int16 )
375 {
376     uno::Any res(false);
377 
378     QWidget* widget = _customWidgets[controlId];
379 
380     if (widget)
381     {
382         switch (controlId)
383         {
384             case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
385             case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
386             case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
387             case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
388             case ExtendedFilePickerElementIds::CHECKBOX_LINK:
389             case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
390             case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
391             {
392                 QCheckBox* cb = dynamic_cast<QCheckBox*>(widget);
393                 res = uno::Any(cb->isChecked());
394                 break;
395             }
396             case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
397             case ExtendedFilePickerElementIds::LISTBOX_VERSION:
398             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
399             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
400             case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
401             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
402             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
403             case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
404                 break;
405         }
406     }
407 
408     return res;
409 }
410 
enableControl(sal_Int16 controlId,sal_Bool enable)411 void SAL_CALL KDE4FilePicker::enableControl( sal_Int16 controlId, sal_Bool enable )
412 {
413     QWidget* widget = _customWidgets[controlId];
414 
415     if (widget)
416     {
417         widget->setEnabled(enable);
418     }
419 }
420 
setLabel(sal_Int16 controlId,const::rtl::OUString & label)421 void SAL_CALL KDE4FilePicker::setLabel( sal_Int16 controlId, const ::rtl::OUString &label )
422 {
423     QWidget* widget = _customWidgets[controlId];
424 
425     if (widget)
426     {
427         switch (controlId)
428         {
429             case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
430             case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
431             case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
432             case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
433             case ExtendedFilePickerElementIds::CHECKBOX_LINK:
434             case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
435             case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
436             {
437                 QCheckBox* cb = dynamic_cast<QCheckBox*>(widget);
438                 cb->setText(toQString(label));
439                 break;
440             }
441             case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
442             case ExtendedFilePickerElementIds::LISTBOX_VERSION:
443             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
444             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
445             case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
446             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
447             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
448             case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
449                 break;
450         }
451     }
452 }
453 
getLabel(sal_Int16 controlId)454 rtl::OUString SAL_CALL KDE4FilePicker::getLabel(sal_Int16 controlId)
455 {
456     QWidget* widget = _customWidgets[controlId];
457     QString label;
458 
459     if (widget)
460     {
461         switch (controlId)
462         {
463             case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
464             case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
465             case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
466             case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
467             case ExtendedFilePickerElementIds::CHECKBOX_LINK:
468             case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
469             case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
470             {
471                 QCheckBox* cb = dynamic_cast<QCheckBox*>(widget);
472                 label = cb->text();
473                 break;
474             }
475             case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
476             case ExtendedFilePickerElementIds::LISTBOX_VERSION:
477             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
478             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
479             case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
480             case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
481             case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
482             case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
483                 break;
484         }
485     }
486     return toOUString(label);
487 }
488 
addCustomControl(sal_Int16 controlId)489 void KDE4FilePicker::addCustomControl(sal_Int16 controlId)
490 {
491     QWidget* widget = 0;
492     sal_Int32 resId = -1;
493 
494     switch (controlId)
495     {
496         case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
497             resId = STR_SVT_FILEPICKER_AUTO_EXTENSION;
498             break;
499         case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
500             resId = STR_SVT_FILEPICKER_PASSWORD;
501             break;
502         case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
503             resId = STR_SVT_FILEPICKER_FILTER_OPTIONS;
504             break;
505         case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
506             resId = STR_SVT_FILEPICKER_READONLY;
507             break;
508         case ExtendedFilePickerElementIds::CHECKBOX_LINK:
509             resId = STR_SVT_FILEPICKER_INSERT_AS_LINK;
510             break;
511         case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
512             resId = STR_SVT_FILEPICKER_SHOW_PREVIEW;
513             break;
514         case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
515             resId = STR_SVT_FILEPICKER_SELECTION;
516             break;
517         case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
518             resId = STR_SVT_FILEPICKER_PLAY;
519             break;
520         case ExtendedFilePickerElementIds::LISTBOX_VERSION:
521             resId = STR_SVT_FILEPICKER_VERSION;
522             break;
523         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
524             resId = STR_SVT_FILEPICKER_TEMPLATES;
525             break;
526         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
527             resId = STR_SVT_FILEPICKER_IMAGE_TEMPLATE;
528             break;
529         case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
530         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
531         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
532         case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
533             break;
534     }
535 
536     switch (controlId)
537     {
538         case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION:
539         case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD:
540         case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS:
541         case ExtendedFilePickerElementIds::CHECKBOX_READONLY:
542         case ExtendedFilePickerElementIds::CHECKBOX_LINK:
543         case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
544         case ExtendedFilePickerElementIds::CHECKBOX_SELECTION:
545         {
546             QString label;
547 
548             if (_resMgr && resId != -1)
549             {
550                 rtl::OUString s = String(ResId( resId, *_resMgr ));
551                 label = toQString(s);
552                 label.replace("~", "&");
553             }
554 
555             widget = new QCheckBox(label, _extraControls);
556 
557             break;
558         }
559         case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
560         case ExtendedFilePickerElementIds::LISTBOX_VERSION:
561         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE:
562         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE:
563         case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL:
564         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL:
565         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL:
566         case ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR:
567             break;
568     }
569 
570     if (widget)
571     {
572         _layout->addWidget(widget);
573         _customWidgets.insert(controlId, widget);
574     }
575 }
576 
initialize(const uno::Sequence<uno::Any> & args)577 void SAL_CALL KDE4FilePicker::initialize( const uno::Sequence<uno::Any> &args )
578 {
579     _filter.clear();
580     _filters.clear();
581 
582     // parameter checking
583     uno::Any arg;
584     if (args.getLength() == 0)
585     {
586         throw lang::IllegalArgumentException(
587                 rtl::OUString::createFromAscii( "no arguments" ),
588                 static_cast< XFilePicker* >( this ), 1 );
589     }
590 
591     arg = args[0];
592 
593     if (( arg.getValueType() != ::getCppuType((sal_Int16*)0)) &&
594         ( arg.getValueType() != ::getCppuType((sal_Int8*)0)))
595     {
596         throw lang::IllegalArgumentException(
597                 rtl::OUString::createFromAscii( "invalid argument type" ),
598                 static_cast< XFilePicker* >( this ), 1 );
599     }
600 
601     sal_Int16 templateId = -1;
602     arg >>= templateId;
603 
604     //default is opening
605     KFileDialog::OperationMode operationMode = KFileDialog::Opening;
606 
607     switch ( templateId )
608     {
609         case FILEOPEN_SIMPLE:
610             break;
611 
612         case FILESAVE_SIMPLE:
613             operationMode = KFileDialog::Saving;
614             break;
615 
616         case FILESAVE_AUTOEXTENSION:
617             operationMode = KFileDialog::Saving;
618             //addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
619             break;
620 
621         case FILESAVE_AUTOEXTENSION_PASSWORD:
622         {
623             operationMode = KFileDialog::Saving;
624             //addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
625             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD );
626             break;
627         }
628         case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
629         {
630             operationMode = KFileDialog::Saving;
631             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
632             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD );
633             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS );
634             break;
635         }
636         case FILESAVE_AUTOEXTENSION_SELECTION:
637             operationMode = KFileDialog::Saving;
638             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
639             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_SELECTION );
640             break;
641 
642         case FILESAVE_AUTOEXTENSION_TEMPLATE:
643             operationMode = KFileDialog::Saving;
644             addCustomControl( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE );
645             break;
646 
647         case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
648             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_LINK );
649             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW );
650             addCustomControl( ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE );
651             break;
652 
653         case FILEOPEN_PLAY:
654             addCustomControl( ExtendedFilePickerElementIds::PUSHBUTTON_PLAY );
655             break;
656 
657         case FILEOPEN_READONLY_VERSION:
658             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_READONLY );
659             addCustomControl( ExtendedFilePickerElementIds::LISTBOX_VERSION );
660             break;
661 
662         case FILEOPEN_LINK_PREVIEW:
663             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_LINK );
664             addCustomControl( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW );
665             break;
666 
667         default:
668             throw lang::IllegalArgumentException(
669                     rtl::OUString::createFromAscii( "Unknown template" ),
670                     static_cast< XFilePicker* >( this ),
671                     1 );
672     }
673 
674     _dialog->setOperationMode(operationMode);
675     _dialog->setConfirmOverwrite(true);
676 }
677 
cancel()678 void SAL_CALL KDE4FilePicker::cancel()
679 {
680 
681 }
682 
disposing(const lang::EventObject & rEvent)683 void SAL_CALL KDE4FilePicker::disposing( const lang::EventObject &rEvent )
684 {
685     uno::Reference<XFilePickerListener> xFilePickerListener( rEvent.Source, uno::UNO_QUERY );
686 
687     if ( xFilePickerListener.is() )
688     {
689         removeFilePickerListener( xFilePickerListener );
690     }
691 }
692 
getImplementationName()693 rtl::OUString SAL_CALL KDE4FilePicker::getImplementationName()
694 {
695     return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME );
696 }
697 
supportsService(const rtl::OUString & ServiceName)698 sal_Bool SAL_CALL KDE4FilePicker::supportsService( const rtl::OUString& ServiceName )
699 {
700     uno::Sequence< ::rtl::OUString > SupportedServicesNames = FilePicker_getSupportedServiceNames();
701 
702     for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; )
703     {
704         if ( SupportedServicesNames[n].compareTo( ServiceName ) == 0 )
705             return sal_True;
706     }
707 
708     return sal_False;
709 }
710 
getSupportedServiceNames()711 uno::Sequence< ::rtl::OUString > SAL_CALL KDE4FilePicker::getSupportedServiceNames()
712 {
713     return FilePicker_getSupportedServiceNames();
714 }
715