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