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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_fpicker.hxx" 26 27 //------------------------------------------------------------------------ 28 // includes 29 //------------------------------------------------------------------------ 30 31 #ifdef _MSC_VER 32 #pragma warning (disable:4917) 33 #endif 34 35 #include "VistaFilePicker.hxx" 36 #include "WinFileOpenImpl.hxx" 37 #include "..\misc\WinImplHelper.hxx" 38 #include "shared.hxx" 39 40 #include <com/sun/star/lang/DisposedException.hpp> 41 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> 42 #include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp> 43 #include <com/sun/star/ui/dialogs/XFilePickerListener.hpp> 44 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 45 46 #include <cppuhelper/interfacecontainer.h> 47 #include <comphelper/configurationhelper.hxx> 48 #include <osl/diagnose.h> 49 #include <osl/mutex.hxx> 50 #include <osl/file.hxx> 51 #include <tchar.h> 52 53 #ifdef _MSC_VER 54 #pragma warning (push, 1) 55 #endif 56 #include <shlobj.h> 57 #ifdef _MSC_VER 58 #pragma warning (pop) 59 #endif 60 61 //------------------------------------------------------------------------ 62 // namespace directives 63 //------------------------------------------------------------------------ 64 65 namespace css = ::com::sun::star; 66 67 namespace fpicker{ 68 namespace win32{ 69 namespace vista{ 70 71 //------------------------------------------------------------------------ 72 // defines 73 //------------------------------------------------------------------------ 74 75 #define FILE_PICKER_DLL_NAME TEXT("fps.dll") 76 77 //------------------------------------------------------------------------ 78 // helper functions 79 //------------------------------------------------------------------------ 80 81 namespace 82 { 83 // controling event notifications 84 const bool STARTUP_SUSPENDED = true; 85 const bool STARTUP_ALIVE = false; 86 87 css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker_getSupportedServiceNames() 88 { 89 css::uno::Sequence< ::rtl::OUString > aRet(2); 90 aRet[0] = ::rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker"); 91 aRet[1] = ::rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker"); 92 return aRet; 93 } 94 } 95 96 //----------------------------------------------------------------------------------------- 97 #define ENABLE_LOGGING 98 99 #define LOGFILE_VISTA "c:\\temp\\vistafiledialog.log" 100 101 #ifdef ENABLE_LOGGING 102 103 #define LOG_FILE(PARAM_MESSAGE) \ 104 { \ 105 FILE* pFile = fopen(LOGFILE_VISTA, "a"); \ 106 fprintf(pFile, PARAM_MESSAGE); \ 107 fclose(pFile); \ 108 } 109 110 #define LOG_FILE_1_PARAM(PARAM_MESSAGE, PARAM_1) \ 111 { \ 112 FILE* pFile = fopen(LOGFILE_VISTA, "a"); \ 113 fprintf(pFile, PARAM_MESSAGE, PARAM_1); \ 114 fclose(pFile); \ 115 } 116 117 #define LOG_FILE_2_PARAM(PARAM_MESSAGE, PARAM_1, PARAM_2) \ 118 { \ 119 FILE* pFile = fopen(LOGFILE_VISTA, "a"); \ 120 fprintf(pFile, PARAM_MESSAGE, PARAM_1, PARAM_2); \ 121 fclose(pFile); \ 122 } 123 124 #else 125 126 #define LOG_FILE(PARAM_MESSAGE) 127 #define LOG_FILE_1_PARAM(PARAM_MESSAGE, PARAM_1) 128 #define LOG_FILE_2_PARAM(PARAM_MESSAGE, PARAM_1, PARAM_2) 129 130 #endif 131 132 //----------------------------------------------------------------------------------------- 133 #define VISTAFILEDIALOG_CHECKED_COMCALL(PARAM_CODE, PARAM_LOGMESSAGE, PARAM_ERRORMESSAGE) \ 134 { \ 135 HRESULT aResult; \ 136 VISTAFILEDIALOG_CHECKED_COMCALL_WITH_RETURN(aResult, PARAM_CODE, PARAM_LOGMESSAGE, PARAM_ERRORMESSAGE) \ 137 } 138 139 //----------------------------------------------------------------------------------------- 140 #define VISTAFILEDIALOG_CHECKED_COMCALL_WITH_RETURN(RETURN_HR, PARAM_CODE, PARAM_LOGMESSAGE, PARAM_ERRORMESSAGE) \ 141 { \ 142 LOG_FILE(PARAM_LOGMESSAGE) \ 143 RETURN_HR = PARAM_CODE; \ 144 if ( FAILED(RETURN_HR) ) \ 145 { \ 146 LOG_FILE_1_PARAM("will throw exception for checked COM call:\n%s", PARAM_ERRORMESSAGE) \ 147 throw css::uno::RuntimeException( \ 148 ::rtl::OUString::createFromAscii(PARAM_ERRORMESSAGE), \ 149 css::uno::Reference< css::ui::dialogs::XFilePicker >()); \ 150 } \ 151 } 152 153 154 155 //----------------------------------------------------------------------------------------- 156 VistaFilePicker::VistaFilePicker(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR) 157 : TVistaFilePickerBase (m_aMutex ) 158 , m_xSMGR (xSMGR ) 159 , m_rDialog (new VistaFilePickerImpl()) 160 , m_aAsyncExecute (m_rDialog ) 161 , m_nFilePickerThreadId (0 ) 162 , m_bInitialized (false ) 163 { 164 } 165 166 //----------------------------------------------------------------------------------------- 167 VistaFilePicker::~VistaFilePicker() 168 { 169 } 170 171 //------------------------------------------------------------------------------------ 172 void SAL_CALL VistaFilePicker::addFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener) 173 throw(css::uno::RuntimeException) 174 { 175 RequestRef rRequest(new Request()); 176 rRequest->setRequest (VistaFilePickerImpl::E_ADD_PICKER_LISTENER); 177 rRequest->setArgument(PROP_PICKER_LISTENER, xListener); 178 179 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 180 } 181 182 //----------------------------------------------------------------------------------------- 183 void SAL_CALL VistaFilePicker::removeFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener ) 184 throw(css::uno::RuntimeException) 185 { 186 RequestRef rRequest(new Request()); 187 rRequest->setRequest (VistaFilePickerImpl::E_REMOVE_PICKER_LISTENER); 188 rRequest->setArgument(PROP_PICKER_LISTENER, xListener); 189 190 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 191 } 192 193 // ------------------------------------------------- 194 void SAL_CALL VistaFilePicker::disposing(const css::lang::EventObject& /*aEvent*/) 195 throw(css::uno::RuntimeException) 196 { 197 } 198 199 //------------------------------------------------------------------------------------ 200 void SAL_CALL VistaFilePicker::setMultiSelectionMode(::sal_Bool bMode) 201 throw(css::uno::RuntimeException) 202 { 203 RequestRef rRequest(new Request()); 204 rRequest->setRequest (VistaFilePickerImpl::E_SET_MULTISELECTION_MODE); 205 rRequest->setArgument(PROP_MULTISELECTION_MODE, bMode); 206 207 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 208 } 209 210 //----------------------------------------------------------------------------------------- 211 void SAL_CALL VistaFilePicker::setTitle(const ::rtl::OUString& sTitle) 212 throw(css::uno::RuntimeException) 213 { 214 RequestRef rRequest(new Request()); 215 rRequest->setRequest (VistaFilePickerImpl::E_SET_TITLE); 216 rRequest->setArgument(PROP_TITLE, sTitle); 217 218 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 219 } 220 221 //----------------------------------------------------------------------------------------- 222 void SAL_CALL VistaFilePicker::appendFilter(const ::rtl::OUString& sTitle , 223 const ::rtl::OUString& sFilter) 224 throw(css::lang::IllegalArgumentException, 225 css::uno::RuntimeException ) 226 { 227 RequestRef rRequest(new Request()); 228 rRequest->setRequest (VistaFilePickerImpl::E_APPEND_FILTER); 229 rRequest->setArgument(PROP_FILTER_TITLE, sTitle ); 230 rRequest->setArgument(PROP_FILTER_VALUE, sFilter); 231 232 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 233 } 234 235 //----------------------------------------------------------------------------------------- 236 void SAL_CALL VistaFilePicker::setCurrentFilter(const ::rtl::OUString& sTitle) 237 throw(css::lang::IllegalArgumentException, 238 css::uno::RuntimeException ) 239 { 240 RequestRef rRequest(new Request()); 241 rRequest->setRequest (VistaFilePickerImpl::E_SET_CURRENT_FILTER); 242 rRequest->setArgument(PROP_FILTER_TITLE, sTitle); 243 244 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 245 } 246 247 //----------------------------------------------------------------------------------------- 248 ::rtl::OUString SAL_CALL VistaFilePicker::getCurrentFilter() 249 throw(css::uno::RuntimeException) 250 { 251 RequestRef rRequest(new Request()); 252 rRequest->setRequest (VistaFilePickerImpl::E_GET_CURRENT_FILTER); 253 254 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); 255 256 const ::rtl::OUString sTitle = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, ::rtl::OUString()); 257 return sTitle; 258 } 259 260 //----------------------------------------------------------------------------------------- 261 void SAL_CALL VistaFilePicker::appendFilterGroup(const ::rtl::OUString& /*sGroupTitle*/, 262 const css::uno::Sequence< css::beans::StringPair >& rFilters ) 263 throw (css::lang::IllegalArgumentException, 264 css::uno::RuntimeException ) 265 { 266 RequestRef rRequest(new Request()); 267 rRequest->setRequest (VistaFilePickerImpl::E_APPEND_FILTERGROUP); 268 rRequest->setArgument(PROP_FILTER_GROUP, rFilters); 269 270 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 271 } 272 273 //----------------------------------------------------------------------------------------- 274 void SAL_CALL VistaFilePicker::setDefaultName(const ::rtl::OUString& sName ) 275 throw(css::uno::RuntimeException) 276 { 277 RequestRef rRequest(new Request()); 278 rRequest->setRequest (VistaFilePickerImpl::E_SET_DEFAULT_NAME); 279 rRequest->setArgument(PROP_FILENAME, sName); 280 281 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 282 } 283 284 //----------------------------------------------------------------------------------------- 285 void SAL_CALL VistaFilePicker::setDisplayDirectory(const ::rtl::OUString& sDirectory) 286 throw (css::lang::IllegalArgumentException, 287 css::uno::RuntimeException ) 288 { 289 const ::rtl::OUString aPackage( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Common/")); 290 const ::rtl::OUString aRelPath( RTL_CONSTASCII_USTRINGPARAM("Path/Info")); 291 const ::rtl::OUString aKey( RTL_CONSTASCII_USTRINGPARAM("WorkPathChanged")); 292 293 css::uno::Any aValue = ::comphelper::ConfigurationHelper::readDirectKey( 294 m_xSMGR, aPackage, aRelPath, aKey, ::comphelper::ConfigurationHelper::E_READONLY); 295 296 bool bChanged(false); 297 if (( aValue >>= bChanged ) && bChanged ) 298 { 299 ::comphelper::ConfigurationHelper::writeDirectKey( 300 m_xSMGR, aPackage, aRelPath, aKey, css::uno::makeAny(false), ::comphelper::ConfigurationHelper::E_STANDARD); 301 } 302 303 RequestRef rRequest(new Request()); 304 rRequest->setRequest (VistaFilePickerImpl::E_SET_DIRECTORY); 305 rRequest->setArgument(PROP_DIRECTORY, sDirectory); 306 rRequest->setArgument(PROP_FORCE, bChanged); 307 308 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 309 } 310 311 //----------------------------------------------------------------------------------------- 312 ::rtl::OUString SAL_CALL VistaFilePicker::getDisplayDirectory() 313 throw(css::uno::RuntimeException) 314 { 315 RequestRef rRequest(new Request()); 316 rRequest->setRequest (VistaFilePickerImpl::E_GET_DIRECTORY); 317 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 318 const ::rtl::OUString sDirectory = rRequest->getArgumentOrDefault(PROP_FILENAME, ::rtl::OUString()); 319 320 return sDirectory; 321 } 322 323 //----------------------------------------------------------------------------------------- 324 // @deprecated cant be supported any longer ... see IDL description for further details 325 css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker::getFiles() 326 throw(css::uno::RuntimeException) 327 { 328 RequestRef rRequest(new Request()); 329 rRequest->setRequest (VistaFilePickerImpl::E_GET_SELECTED_FILES); 330 331 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); 332 333 const css::uno::Sequence< ::rtl::OUString > lFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES, css::uno::Sequence< ::rtl::OUString >()); 334 m_lLastFiles = lFiles; 335 return lFiles; 336 } 337 338 //----------------------------------------------------------------------------------------- 339 css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker::getSelectedFiles() 340 throw(css::uno::RuntimeException) 341 { 342 RequestRef rRequest(new Request()); 343 rRequest->setRequest (VistaFilePickerImpl::E_GET_SELECTED_FILES); 344 345 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); 346 347 const css::uno::Sequence< ::rtl::OUString > lFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES, css::uno::Sequence< ::rtl::OUString >()); 348 m_lLastFiles = lFiles; 349 return lFiles; 350 } 351 352 //----------------------------------------------------------------------------------------- 353 ::sal_Int16 SAL_CALL VistaFilePicker::execute() 354 throw(css::uno::RuntimeException) 355 { 356 bool bInitialized(false); 357 { 358 osl::MutexGuard aGuard(m_aMutex); 359 bInitialized = m_bInitialized; 360 } 361 362 if ( !bInitialized ) 363 { 364 sal_Int16 nTemplateDescription = css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE; 365 css::uno::Sequence < css::uno::Any > aInitArguments(1); 366 aInitArguments[0] <<= nTemplateDescription; 367 initialize(aInitArguments); 368 } 369 370 RequestRef rRequest(new Request()); 371 rRequest->setRequest (VistaFilePickerImpl::E_SHOW_DIALOG_MODAL); 372 373 // if we want to show a modal window, the calling thread needs to process messages 374 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::PROCESS_MESSAGES); 375 376 const ::sal_Bool bOK = rRequest->getArgumentOrDefault(PROP_DIALOG_SHOW_RESULT, (::sal_Bool)sal_False ); 377 m_lLastFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES , css::uno::Sequence< ::rtl::OUString >()); 378 379 ::sal_Int16 nResult = css::ui::dialogs::ExecutableDialogResults::CANCEL; 380 if (bOK) 381 nResult = css::ui::dialogs::ExecutableDialogResults::OK; 382 return nResult; 383 } 384 385 //------------------------------------------------------------------------------------ 386 // XFilePicker functions 387 //------------------------------------------------------------------------------------ 388 389 void SAL_CALL VistaFilePicker::setValue( ::sal_Int16 nControlId , 390 ::sal_Int16 nControlAction, 391 const css::uno::Any& aValue ) 392 throw(css::uno::RuntimeException) 393 { 394 RequestRef rRequest(new Request()); 395 rRequest->setRequest (VistaFilePickerImpl::E_SET_CONTROL_VALUE); 396 rRequest->setArgument(PROP_CONTROL_ID , nControlId ); 397 rRequest->setArgument(PROP_CONTROL_ACTION, nControlAction); 398 rRequest->setArgument(PROP_CONTROL_VALUE , aValue ); 399 400 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 401 } 402 403 //----------------------------------------------------------------------------------------- 404 // 405 //----------------------------------------------------------------------------------------- 406 407 css::uno::Any SAL_CALL VistaFilePicker::getValue(::sal_Int16 nControlId , 408 ::sal_Int16 nControlAction) 409 throw(css::uno::RuntimeException) 410 { 411 RequestRef rRequest(new Request()); 412 rRequest->setRequest (VistaFilePickerImpl::E_GET_CONTROL_VALUE); 413 rRequest->setArgument(PROP_CONTROL_ID , nControlId ); 414 rRequest->setArgument(PROP_CONTROL_ACTION, nControlAction); 415 416 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); 417 const css::uno::Any aValue = rRequest->getArgumentOrDefault(PROP_CONTROL_VALUE, css::uno::Any()); 418 return aValue; 419 } 420 421 //----------------------------------------------------------------------------------------- 422 // 423 //----------------------------------------------------------------------------------------- 424 425 void SAL_CALL VistaFilePicker::enableControl(::sal_Int16 nControlId, 426 ::sal_Bool bEnable ) 427 throw(css::uno::RuntimeException) 428 { 429 RequestRef rRequest(new Request()); 430 rRequest->setRequest (VistaFilePickerImpl::E_ENABLE_CONTROL); 431 rRequest->setArgument(PROP_CONTROL_ID , nControlId); 432 rRequest->setArgument(PROP_CONTROL_ENABLE, bEnable ); 433 434 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 435 } 436 437 //----------------------------------------------------------------------------------------- 438 // 439 //----------------------------------------------------------------------------------------- 440 441 void SAL_CALL VistaFilePicker::setLabel( ::sal_Int16 nControlId, 442 const ::rtl::OUString& sLabel ) 443 throw (css::uno::RuntimeException) 444 { 445 RequestRef rRequest(new Request()); 446 rRequest->setRequest (VistaFilePickerImpl::E_SET_CONTROL_LABEL); 447 rRequest->setArgument(PROP_CONTROL_ID , nControlId); 448 rRequest->setArgument(PROP_CONTROL_LABEL, sLabel ); 449 450 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 451 } 452 453 //----------------------------------------------------------------------------------------- 454 // 455 //----------------------------------------------------------------------------------------- 456 457 ::rtl::OUString SAL_CALL VistaFilePicker::getLabel(::sal_Int16 nControlId) 458 throw (css::uno::RuntimeException) 459 { 460 RequestRef rRequest(new Request()); 461 rRequest->setRequest (VistaFilePickerImpl::E_GET_CONTROL_LABEL); 462 rRequest->setArgument(PROP_CONTROL_ID, nControlId); 463 464 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); 465 const ::rtl::OUString sLabel = rRequest->getArgumentOrDefault(PROP_CONTROL_LABEL, ::rtl::OUString()); 466 return sLabel; 467 } 468 469 //------------------------------------------------------------------------------------ 470 // 471 //------------------------------------------------------------------------------------ 472 473 css::uno::Sequence< ::sal_Int16 > SAL_CALL VistaFilePicker::getSupportedImageFormats() 474 throw (css::uno::RuntimeException) 475 { 476 return css::uno::Sequence< sal_Int16 >(); 477 } 478 479 //------------------------------------------------------------------------------------ 480 // 481 //------------------------------------------------------------------------------------ 482 483 sal_Int32 SAL_CALL VistaFilePicker::getTargetColorDepth() 484 throw (css::uno::RuntimeException) 485 { 486 return 0; 487 } 488 489 //------------------------------------------------------------------------------------ 490 // 491 //------------------------------------------------------------------------------------ 492 493 sal_Int32 SAL_CALL VistaFilePicker::getAvailableWidth() 494 throw (css::uno::RuntimeException) 495 { 496 return 0; 497 } 498 499 //------------------------------------------------------------------------------------ 500 // 501 //------------------------------------------------------------------------------------ 502 503 sal_Int32 SAL_CALL VistaFilePicker::getAvailableHeight() 504 throw (css::uno::RuntimeException) 505 { 506 return 0; 507 } 508 509 //------------------------------------------------------------------------------------ 510 // 511 //------------------------------------------------------------------------------------ 512 513 void SAL_CALL VistaFilePicker::setImage( sal_Int16 /*nImageFormat*/, 514 const css::uno::Any& /*aImage */) 515 throw (css::lang::IllegalArgumentException, 516 css::uno::RuntimeException ) 517 { 518 } 519 520 //------------------------------------------------------------------------------------ 521 // 522 //------------------------------------------------------------------------------------ 523 524 sal_Bool SAL_CALL VistaFilePicker::setShowState(sal_Bool /*bShowState*/) 525 throw (css::uno::RuntimeException) 526 { 527 return sal_False; 528 } 529 530 //------------------------------------------------------------------------------------ 531 // 532 //------------------------------------------------------------------------------------ 533 534 sal_Bool SAL_CALL VistaFilePicker::getShowState() 535 throw (css::uno::RuntimeException) 536 { 537 return sal_False; 538 } 539 540 //------------------------------------------------------------------------------------ 541 // 542 //------------------------------------------------------------------------------------ 543 544 void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::Any >& lArguments) 545 throw(css::uno::Exception , 546 css::uno::RuntimeException) 547 { 548 /* 549 // called twice ? 550 if (m_pDlg) 551 throw css::uno::Exception( 552 ::rtl::OUString::createFromAscii( "XInitialization::initialize() called twice." ), 553 static_cast< css::ui::dialogs::XFilePicker* >( this )); 554 */ 555 556 if (lArguments.getLength() < 1) 557 throw css::lang::IllegalArgumentException( 558 ::rtl::OUString::createFromAscii( "XInitialization::initialize() called without arguments." ), 559 static_cast< css::ui::dialogs::XFilePicker2* >( this ), 560 1); 561 562 sal_Int32 nTemplate = -1; 563 lArguments[0] >>= nTemplate; 564 565 ::sal_Bool bFileOpenDialog = sal_True; 566 ::sal_Int32 nFeatures = 0; 567 568 switch(nTemplate) 569 { 570 case css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE : 571 { 572 bFileOpenDialog = sal_True; 573 } 574 break; 575 576 case css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE : 577 { 578 bFileOpenDialog = sal_False; 579 } 580 break; 581 582 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD : 583 { 584 bFileOpenDialog = sal_False; 585 nFeatures |= FEATURE_AUTOEXTENSION; 586 nFeatures |= FEATURE_PASSWORD; 587 } 588 break; 589 590 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS : 591 { 592 bFileOpenDialog = sal_False; 593 nFeatures |= FEATURE_AUTOEXTENSION; 594 nFeatures |= FEATURE_PASSWORD; 595 nFeatures |= FEATURE_FILTEROPTIONS; 596 } 597 break; 598 599 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION : 600 { 601 bFileOpenDialog = sal_False; 602 nFeatures |= FEATURE_AUTOEXTENSION; 603 nFeatures |= FEATURE_SELECTION; 604 } 605 break; 606 607 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE : 608 { 609 bFileOpenDialog = sal_False; 610 nFeatures |= FEATURE_AUTOEXTENSION; 611 nFeatures |= FEATURE_TEMPLATE; 612 } 613 break; 614 615 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE : 616 { 617 bFileOpenDialog = sal_True; 618 nFeatures |= FEATURE_LINK; 619 nFeatures |= FEATURE_PREVIEW; 620 nFeatures |= FEATURE_IMAGETEMPLATE; 621 } 622 break; 623 624 case css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY : 625 { 626 bFileOpenDialog = sal_True; 627 nFeatures |= FEATURE_PLAY; 628 } 629 break; 630 631 case css::ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION : 632 { 633 bFileOpenDialog = sal_True; 634 nFeatures |= FEATURE_READONLY; 635 nFeatures |= FEATURE_VERSION; 636 } 637 break; 638 639 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW : 640 { 641 bFileOpenDialog = sal_True; 642 nFeatures |= FEATURE_LINK; 643 nFeatures |= FEATURE_PREVIEW; 644 } 645 break; 646 647 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION : 648 { 649 bFileOpenDialog = sal_False; 650 nFeatures |= FEATURE_AUTOEXTENSION; 651 } 652 break; 653 } 654 655 RequestRef rRequest(new Request()); 656 if (bFileOpenDialog) 657 rRequest->setRequest (VistaFilePickerImpl::E_CREATE_OPEN_DIALOG); 658 else 659 rRequest->setRequest (VistaFilePickerImpl::E_CREATE_SAVE_DIALOG); 660 rRequest->setArgument(PROP_FEATURES, nFeatures); 661 rRequest->setArgument(PROP_TEMPLATE_DESCR, nTemplate); 662 if ( ! m_aAsyncExecute.isRunning()) 663 m_aAsyncExecute.create(); 664 m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); 665 666 { 667 osl::MutexGuard aGuard(m_aMutex); 668 m_bInitialized = true; 669 } 670 } 671 672 //------------------------------------------------------------------------------------ 673 // 674 //------------------------------------------------------------------------------------ 675 676 void SAL_CALL VistaFilePicker::cancel() 677 throw(css::uno::RuntimeException) 678 { 679 } 680 681 // ------------------------------------------------- 682 // XServiceInfo 683 // ------------------------------------------------- 684 685 ::rtl::OUString SAL_CALL VistaFilePicker::getImplementationName() 686 throw(css::uno::RuntimeException) 687 { 688 return ::rtl::OUString::createFromAscii("com.sun.star.comp.fpicker.VistaFileDialog"); 689 } 690 691 // ------------------------------------------------- 692 // XServiceInfo 693 // ------------------------------------------------- 694 695 sal_Bool SAL_CALL VistaFilePicker::supportsService(const ::rtl::OUString& sServiceName) 696 throw(css::uno::RuntimeException ) 697 { 698 css::uno::Sequence< ::rtl::OUString > lSupportedServicesNames = VistaFilePicker_getSupportedServiceNames(); 699 700 for (sal_Int32 n = lSupportedServicesNames.getLength(); n--;) 701 if (lSupportedServicesNames[n].compareTo(sServiceName) == 0) 702 return sal_True; 703 704 return sal_False; 705 } 706 707 // ------------------------------------------------- 708 // XServiceInfo 709 // ------------------------------------------------- 710 711 css::uno::Sequence< ::rtl::OUString > SAL_CALL VistaFilePicker::getSupportedServiceNames() 712 throw(css::uno::RuntimeException) 713 { 714 return VistaFilePicker_getSupportedServiceNames(); 715 } 716 717 } // namespace vista 718 } // namespace win32 719 } // namespace fpicker 720