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 // controlling event notifications 90 const bool STARTUP_SUSPENDED = true; 91 const bool STARTUP_ALIVE = false; 92 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 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 109 QString toQString(const rtl::OUString& s) 110 { 111 return QString::fromUtf16(s.getStr(), s.getLength()); 112 } 113 114 ////////////////////////////////////////////////////////////////////////// 115 // KDE4FilePicker 116 ////////////////////////////////////////////////////////////////////////// 117 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 142 KDE4FilePicker::~KDE4FilePicker() 143 { 144 delete _resMgr; 145 delete _dialog; 146 } 147 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 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 162 void SAL_CALL KDE4FilePicker::setTitle( const rtl::OUString &title ) 163 throw( uno::RuntimeException ) 164 { 165 _dialog->setCaption(toQString(title)); 166 } 167 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 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 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 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 216 rtl::OUString SAL_CALL KDE4FilePicker::getDisplayDirectory() 217 throw( uno::RuntimeException ) 218 { 219 QString dir = _dialog->baseUrl().url(); 220 return toOUString(dir); 221 } 222 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 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 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 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 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 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 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 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 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 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 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 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 695 void SAL_CALL KDE4FilePicker::cancel() 696 throw ( uno::RuntimeException ) 697 { 698 699 } 700 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 712 rtl::OUString SAL_CALL KDE4FilePicker::getImplementationName() 713 throw( uno::RuntimeException ) 714 { 715 return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME ); 716 } 717 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 732 uno::Sequence< ::rtl::OUString > SAL_CALL KDE4FilePicker::getSupportedServiceNames() 733 throw( uno::RuntimeException ) 734 { 735 return FilePicker_getSupportedServiceNames(); 736 } 737