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