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