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_cui.hxx" 26 27 #include <algorithm> 28 #include <ucbhelper/content.hxx> 29 #include <vos/mutex.hxx> 30 #include <vcl/svapp.hxx> 31 #include <vcl/msgbox.hxx> 32 #include <avmedia/mediawindow.hxx> 33 #include <unotools/pathoptions.hxx> 34 #include <sfx2/opengrf.hxx> 35 #include <svtools/filter.hxx> 36 #include <svx/gallery1.hxx> 37 #include <svx/galtheme.hxx> 38 #include "cuigaldlg.hxx" 39 #include "helpid.hrc" 40 #include <unotools/syslocale.hxx> 41 #include <cppuhelper/implbase1.hxx> 42 #include <com/sun/star/uno/Reference.hxx> 43 #include <com/sun/star/lang/XInitialization.hpp> 44 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 45 #include <comphelper/processfactory.hxx> 46 #include <com/sun/star/sdbc/XResultSet.hpp> 47 #include <com/sun/star/sdbc/XRow.hpp> 48 #include <com/sun/star/ucb/XContentAccess.hpp> 49 #include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp> 50 #include <sfx2/sfxuno.hxx> 51 #include "dialmgr.hxx" 52 #include "gallery.hrc" 53 #include <svx/dialogs.hrc> 54 #include <svx/dialmgr.hxx> 55 56 57 // -------------- 58 // - Namespaces - 59 // -------------- 60 61 using namespace ::ucbhelper; 62 using namespace ::rtl; 63 using namespace ::cppu; 64 using namespace ::com::sun::star::lang; 65 using namespace ::com::sun::star::sdbc; 66 using namespace ::com::sun::star::ucb; 67 using namespace ::com::sun::star::ui::dialogs; 68 using namespace ::com::sun::star::uno; 69 70 71 // ----------- 72 // - Defines - 73 // ----------- 74 75 #define MAXPATH 1024 76 77 // ---------------- 78 // - SearchThread - 79 // ---------------- 80 81 SearchThread::SearchThread( SearchProgress* pProgess, 82 TPGalleryThemeProperties* pBrowser, 83 const INetURLObject& rStartURL ) : 84 mpProgress ( pProgess ), 85 mpBrowser ( pBrowser ), 86 maStartURL ( rStartURL ) 87 { 88 } 89 90 // ------------------------------------------------------------------------ 91 92 SearchThread::~SearchThread() 93 { 94 } 95 96 // ------------------------------------------------------------------------ 97 98 void SAL_CALL SearchThread::run() 99 { 100 const String aFileType( mpBrowser->aCbbFileType.GetText() ); 101 102 if( aFileType.Len() ) 103 { 104 const sal_uInt16 nFileNumber = mpBrowser->aCbbFileType.GetEntryPos( aFileType ); 105 sal_uInt16 nBeginFormat, nEndFormat; 106 ::std::vector< String > aFormats; 107 108 if( !nFileNumber || ( nFileNumber >= mpBrowser->aCbbFileType.GetEntryCount() ) ) 109 { 110 nBeginFormat = 1; 111 nEndFormat = mpBrowser->aCbbFileType.GetEntryCount() - 1; 112 } 113 else 114 nBeginFormat = nEndFormat = nFileNumber; 115 116 for( sal_uInt16 i = nBeginFormat; i <= nEndFormat; ++i ) 117 aFormats.push_back( ( (FilterEntry*) mpBrowser->aFilterEntryList.GetObject( i ) )->aFilterName.ToLowerAscii() ); 118 119 ImplSearch( maStartURL, aFormats, mpBrowser->bSearchRecursive ); 120 } 121 } 122 123 // ------------------------------------------------------------------------ 124 125 void SAL_CALL SearchThread::onTerminated() 126 { 127 Application::PostUserEvent( LINK( mpProgress, SearchProgress, CleanUpHdl ) ); 128 } 129 130 // ------------------------------------------------------------------------ 131 132 void SearchThread::ImplSearch( const INetURLObject& rStartURL, 133 const ::std::vector< String >& rFormats, 134 sal_Bool bRecursive ) 135 { 136 { 137 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 138 139 mpProgress->SetDirectory( rStartURL ); 140 mpProgress->Sync(); 141 } 142 143 try 144 { 145 ::com::sun::star::uno::Reference< XCommandEnvironment > xEnv; 146 Content aCnt( rStartURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); 147 Sequence< OUString > aProps( 2 ); 148 149 aProps.getArray()[ 0 ] = OUString::createFromAscii( "IsFolder" ); 150 aProps.getArray()[ 1 ] = OUString::createFromAscii( "IsDocument" ); 151 ::com::sun::star::uno::Reference< XResultSet > xResultSet( 152 aCnt.createCursor( aProps, INCLUDE_FOLDERS_AND_DOCUMENTS ) ); 153 154 if( xResultSet.is() ) 155 { 156 ::com::sun::star::uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY_THROW ); 157 ::com::sun::star::uno::Reference< XRow > xRow( xResultSet, UNO_QUERY_THROW ); 158 159 while( xResultSet->next() && schedule() ) 160 { 161 INetURLObject aFoundURL( xContentAccess->queryContentIdentifierString() ); 162 DBG_ASSERT( aFoundURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 163 164 sal_Bool bFolder = xRow->getBoolean( 1 ); // property "IsFolder" 165 if ( xRow->wasNull() ) 166 bFolder = sal_False; 167 168 if( bRecursive && bFolder ) 169 ImplSearch( aFoundURL, rFormats, sal_True ); 170 else 171 { 172 sal_Bool bDocument = xRow->getBoolean( 2 ); // property "IsDocument" 173 if ( xRow->wasNull() ) 174 bDocument = sal_False; 175 176 if( bDocument ) 177 { 178 GraphicDescriptor aDesc( aFoundURL ); 179 String aFileName; 180 181 if( ( aDesc.Detect() && 182 ::std::find( rFormats.begin(), 183 rFormats.end(), 184 aDesc.GetImportFormatShortName( 185 aDesc.GetFileFormat() ).ToLowerAscii() ) 186 != rFormats.end() ) || 187 ::std::find( rFormats.begin(), 188 rFormats.end(), 189 String(aFoundURL.GetExtension().toAsciiLowerCase()) ) 190 != rFormats.end() ) 191 { 192 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 193 194 mpBrowser->aFoundList.Insert( 195 new String( aFoundURL.GetMainURL( INetURLObject::NO_DECODE ) ), 196 LIST_APPEND ); 197 mpBrowser->aLbxFound.InsertEntry( 198 GetReducedString( aFoundURL, 50 ), 199 (sal_uInt16) mpBrowser->aFoundList.Count() - 1 ); 200 } 201 } 202 } 203 } 204 } 205 } 206 catch( const ContentCreationException& ) 207 { 208 } 209 catch( const ::com::sun::star::uno::RuntimeException& ) 210 { 211 } 212 catch( const ::com::sun::star::uno::Exception& ) 213 { 214 } 215 } 216 217 // ------------------ 218 // - SearchProgress - 219 // ------------------ 220 221 SearchProgress::SearchProgress( Window* pParent, const INetURLObject& rStartURL ) : 222 ModalDialog ( pParent, CUI_RES(RID_SVXDLG_GALLERY_SEARCH_PROGRESS ) ), 223 aFtSearchDir ( this, CUI_RES( FT_SEARCH_DIR ) ), 224 aFLSearchDir ( this, CUI_RES( FL_SEARCH_DIR ) ), 225 aFtSearchType ( this, CUI_RES( FT_SEARCH_TYPE ) ), 226 aFLSearchType ( this, CUI_RES( FL_SEARCH_TYPE ) ), 227 aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), 228 maSearchThread ( this, (TPGalleryThemeProperties*) pParent, rStartURL ) 229 { 230 FreeResource(); 231 aBtnCancel.SetClickHdl( LINK( this, SearchProgress, ClickCancelBtn ) ); 232 } 233 234 // ------------------------------------------------------------------------ 235 236 void SearchProgress::Terminate() 237 { 238 maSearchThread.terminate(); 239 } 240 241 // ------------------------------------------------------------------------ 242 243 IMPL_LINK( SearchProgress, ClickCancelBtn, void*, EMPTYARG ) 244 { 245 Terminate(); 246 return 0L; 247 } 248 249 // ------------------------------------------------------------------------ 250 251 IMPL_LINK( SearchProgress, CleanUpHdl, void*, EMPTYARG ) 252 { 253 EndDialog( RET_OK ); 254 delete this; 255 return 0L; 256 } 257 258 // ------------------------------------------------------------------------ 259 260 short SearchProgress::Execute() 261 { 262 DBG_ERROR( "SearchProgress cannot be executed via Dialog::Execute!\n" 263 "It creates a thread that will call back to VCL apartment => deadlock!\n" 264 "Use Dialog::StartExecuteModal to execute the dialog!" ); 265 return RET_CANCEL; 266 } 267 268 // ------------------------------------------------------------------------ 269 270 void SearchProgress::StartExecuteModal( const Link& rEndDialogHdl ) 271 { 272 maSearchThread.create(); 273 ModalDialog::StartExecuteModal( rEndDialogHdl ); 274 } 275 276 // -------------- 277 // - TakeThread - 278 // -------------- 279 280 TakeThread::TakeThread( TakeProgress* pProgess, TPGalleryThemeProperties* pBrowser, List& rTakenList ) : 281 mpProgress ( pProgess ), 282 mpBrowser ( pBrowser ), 283 mrTakenList ( rTakenList ) 284 { 285 } 286 287 // ------------------------------------------------------------------------ 288 289 TakeThread::~TakeThread() 290 { 291 } 292 293 // ------------------------------------------------------------------------ 294 295 void SAL_CALL TakeThread::run() 296 { 297 String aName; 298 INetURLObject aURL; 299 sal_uInt16 nEntries; 300 GalleryTheme* pThm = mpBrowser->GetXChgData()->pTheme; 301 sal_uInt16 nPos; 302 GalleryProgress* pStatusProgress; 303 304 { 305 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 306 pStatusProgress = new GalleryProgress; 307 nEntries = mpBrowser->bTakeAll ? mpBrowser->aLbxFound.GetEntryCount() : mpBrowser->aLbxFound.GetSelectEntryCount(); 308 pThm->LockBroadcaster(); 309 } 310 311 for( sal_uInt16 i = 0; i < nEntries && schedule(); i++ ) 312 { 313 // kompletten Filenamen aus FoundList holen 314 if( mpBrowser->bTakeAll ) 315 aURL = INetURLObject(*mpBrowser->aFoundList.GetObject( nPos = i )); 316 else 317 aURL = INetURLObject(*mpBrowser->aFoundList.GetObject( nPos = mpBrowser->aLbxFound.GetSelectEntryPos( i ) )); 318 319 // Position in Taken-Liste uebernehmen 320 mrTakenList.Insert( (void*) (sal_uLong)nPos, LIST_APPEND ); 321 322 { 323 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 324 325 mpProgress->SetFile( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ); 326 pStatusProgress->Update( i, nEntries - 1 ); 327 mpProgress->Sync(); 328 pThm->InsertURL( aURL ); 329 } 330 } 331 332 { 333 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 334 335 pThm->UnlockBroadcaster(); 336 delete pStatusProgress; 337 } 338 } 339 340 // ------------------------------------------------------------------------ 341 342 void SAL_CALL TakeThread::onTerminated() 343 { 344 Application::PostUserEvent( LINK( mpProgress, TakeProgress, CleanUpHdl ) ); 345 } 346 347 // ---------------- 348 // - TakeProgress - 349 // ---------------- 350 351 TakeProgress::TakeProgress( Window* pWindow ) : 352 ModalDialog ( pWindow, CUI_RES( RID_SVXDLG_GALLERY_TAKE_PROGRESS ) ), 353 aFtTakeFile ( this, CUI_RES( FT_TAKE_FILE ) ), 354 aFLTakeProgress( this, CUI_RES( FL_TAKE_PROGRESS ) ), 355 aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), 356 maTakeThread ( this, (TPGalleryThemeProperties*) pWindow, maTakenList ) 357 358 { 359 FreeResource(); 360 aBtnCancel.SetClickHdl( LINK( this, TakeProgress, ClickCancelBtn ) ); 361 } 362 363 // ------------------------------------------------------------------------ 364 365 366 void TakeProgress::Terminate() 367 { 368 maTakeThread.terminate(); 369 } 370 371 // ------------------------------------------------------------------------ 372 373 IMPL_LINK( TakeProgress, ClickCancelBtn, void*, EMPTYARG ) 374 { 375 Terminate(); 376 return 0L; 377 } 378 379 // ------------------------------------------------------------------------ 380 381 IMPL_LINK( TakeProgress, CleanUpHdl, void*, EMPTYARG ) 382 { 383 TPGalleryThemeProperties* mpBrowser = (TPGalleryThemeProperties*) GetParent(); 384 ::std::bit_vector aRemoveEntries( mpBrowser->aFoundList.Count(), false ); 385 ::std::vector< String > aRemainingVector; 386 sal_uInt32 i, nCount; 387 388 GetParent()->EnterWait(); 389 mpBrowser->aLbxFound.SetUpdateMode( sal_False ); 390 mpBrowser->aLbxFound.SetNoSelection(); 391 392 // mark all taken positions in aRemoveEntries 393 for( i = 0UL, nCount = maTakenList.Count(); i < nCount; ++i ) 394 aRemoveEntries[ (sal_uLong) maTakenList.GetObject( i ) ] = true; 395 396 maTakenList.Clear(); 397 398 // refill found list 399 for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i ) 400 if( !aRemoveEntries[ i ] ) 401 aRemainingVector.push_back( *mpBrowser->aFoundList.GetObject( i ) ); 402 403 for( String* pStr = mpBrowser->aFoundList.First(); pStr; pStr = mpBrowser->aFoundList.Next() ) 404 delete pStr; 405 406 mpBrowser->aFoundList.Clear(); 407 408 for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i ) 409 mpBrowser->aFoundList.Insert( new String( aRemainingVector[ i ] ), LIST_APPEND ); 410 411 aRemainingVector.clear(); 412 413 // refill list box 414 for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i ) 415 if( !aRemoveEntries[ i ] ) 416 aRemainingVector.push_back( mpBrowser->aLbxFound.GetEntry( (sal_uInt16) i ) ); 417 418 mpBrowser->aLbxFound.Clear(); 419 420 for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i ) 421 mpBrowser->aLbxFound.InsertEntry( aRemainingVector[ i ] ); 422 423 aRemainingVector.clear(); 424 425 mpBrowser->aLbxFound.SetUpdateMode( sal_True ); 426 mpBrowser->SelectFoundHdl( NULL ); 427 GetParent()->LeaveWait(); 428 429 EndDialog( RET_OK ); 430 delete this; 431 return 0L; 432 } 433 434 // ------------------------------------------------------------------------ 435 436 short TakeProgress::Execute() 437 { 438 DBG_ERROR( "TakeProgress cannot be executed via Dialog::Execute!\n" 439 "It creates a thread that will call back to VCL apartment => deadlock!\n" 440 "Use Dialog::StartExecuteModal to execute the dialog!" ); 441 return RET_CANCEL; 442 } 443 444 // ------------------------------------------------------------------------ 445 446 void TakeProgress::StartExecuteModal( const Link& rEndDialogHdl ) 447 { 448 maTakeThread.create(); 449 ModalDialog::StartExecuteModal( rEndDialogHdl ); 450 } 451 452 // --------------------- 453 // - ActualizeProgress - 454 // --------------------- 455 456 ActualizeProgress::ActualizeProgress( Window* pWindow, GalleryTheme* pThm ) : 457 ModalDialog ( pWindow, CUI_RES( RID_SVXDLG_GALLERY_ACTUALIZE_PROGRESS ) ), 458 aFtActualizeFile ( this, CUI_RES( FT_ACTUALIZE_FILE ) ), 459 aFLActualizeProgress ( this, CUI_RES( FL_ACTUALIZE_PROGRESS ) ), 460 aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), 461 pTheme ( pThm ) 462 { 463 FreeResource(); 464 aBtnCancel.SetClickHdl( LINK( this, ActualizeProgress, ClickCancelBtn ) ); 465 } 466 467 // ------------------------------------------------------------------------ 468 469 short ActualizeProgress::Execute() 470 { 471 short nRet; 472 473 pTimer = new Timer; 474 475 if ( pTimer ) 476 { 477 pTimer->SetTimeoutHdl( LINK( this, ActualizeProgress, TimeoutHdl ) ); 478 pTimer->SetTimeout( 500 ); 479 pTimer->Start(); 480 } 481 482 nRet = ModalDialog::Execute(); 483 484 return nRet; 485 } 486 487 // ------------------------------------------------------------------------ 488 489 IMPL_LINK( ActualizeProgress, ClickCancelBtn, void*, EMPTYARG ) 490 { 491 pTheme->AbortActualize(); 492 EndDialog( RET_OK ); 493 494 return 0L; 495 } 496 497 // ------------------------------------------------------------------------ 498 499 IMPL_LINK( ActualizeProgress, TimeoutHdl, Timer*, _pTimer ) 500 { 501 if ( _pTimer ) 502 { 503 _pTimer->Stop(); 504 delete _pTimer; 505 } 506 507 pTheme->Actualize( LINK( this, ActualizeProgress, ActualizeHdl ), &aStatusProgress ); 508 ClickCancelBtn( NULL ); 509 510 return 0; 511 } 512 513 // ------------------------------------------------------------------------ 514 515 IMPL_LINK( ActualizeProgress, ActualizeHdl, INetURLObject*, pURL ) 516 { 517 for( long i = 0; i < 128; i++ ) 518 Application::Reschedule(); 519 520 Flush(); 521 Sync(); 522 523 if( pURL ) 524 { 525 aFtActualizeFile.SetText( GetReducedString( *pURL, 30 ) ); 526 aFtActualizeFile.Flush(); 527 aFtActualizeFile.Sync(); 528 } 529 530 return 0; 531 } 532 533 // --------------- 534 // - TitleDialog - 535 // --------------- 536 537 TitleDialog::TitleDialog( Window* pParent, const String& rOldTitle ) : 538 ModalDialog ( pParent, CUI_RES( RID_SVXDLG_GALLERY_TITLE ) ), 539 maOk ( this, CUI_RES( BTN_OK ) ), 540 maCancel ( this, CUI_RES( BTN_CANCEL ) ), 541 maHelp ( this, CUI_RES( BTN_HELP ) ), 542 maFL ( this, CUI_RES( FL_TITLE ) ), 543 maEdit ( this, CUI_RES( EDT_TITLE ) ) 544 { 545 FreeResource(); 546 maEdit.SetText( rOldTitle ); 547 maEdit.GrabFocus(); 548 } 549 550 // ------------------- 551 // - GalleryIdDialog - 552 // ------------------- 553 554 GalleryIdDialog::GalleryIdDialog( Window* pParent, GalleryTheme* _pThm ) : 555 ModalDialog ( pParent, CUI_RES( RID_SVXDLG_GALLERY_THEMEID ) ), 556 aBtnOk ( this, CUI_RES( BTN_OK ) ), 557 aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), 558 aFLId ( this, CUI_RES( FL_ID ) ), 559 aLbResName ( this, CUI_RES( LB_RESNAME ) ), 560 pThm ( _pThm ) 561 { 562 FreeResource(); 563 564 aLbResName.InsertEntry( String( RTL_CONSTASCII_USTRINGPARAM( "!!! No Id !!!" ) ) ); 565 566 GalleryTheme::InsertAllThemes( aLbResName ); 567 568 aLbResName.SelectEntryPos( (sal_uInt16) pThm->GetId() ); 569 aLbResName.GrabFocus(); 570 571 aBtnOk.SetClickHdl( LINK( this, GalleryIdDialog, ClickOkHdl ) ); 572 } 573 574 // ----------------------------------------------------------------------------- 575 576 IMPL_LINK( GalleryIdDialog, ClickOkHdl, void*, EMPTYARG ) 577 { 578 Gallery* pGal = pThm->GetParent(); 579 const sal_uLong nId = GetId(); 580 sal_Bool bDifferentThemeExists = sal_False; 581 582 for( sal_uLong i = 0, nCount = pGal->GetThemeCount(); i < nCount && !bDifferentThemeExists; i++ ) 583 { 584 const GalleryThemeEntry* pInfo = pGal->GetThemeInfo( i ); 585 586 if( ( pInfo->GetId() == nId ) && ( pInfo->GetThemeName() != pThm->GetName() ) ) 587 { 588 String aStr( CUI_RES( RID_SVXSTR_GALLERY_ID_EXISTS ) ); 589 590 aStr += String( RTL_CONSTASCII_USTRINGPARAM( " (" ) ); 591 aStr += pInfo->GetThemeName(); 592 aStr += ')'; 593 594 InfoBox aBox( this, aStr ); 595 aBox.Execute(); 596 aLbResName.GrabFocus(); 597 bDifferentThemeExists = sal_True; 598 } 599 } 600 601 if( !bDifferentThemeExists ) 602 EndDialog( RET_OK ); 603 604 return 0L; 605 } 606 607 608 // -------------------------- 609 // - GalleryThemeProperties - 610 // -------------------------- 611 612 GalleryThemeProperties::GalleryThemeProperties( Window* pParent, ExchangeData* _pData, SfxItemSet* pItemSet ) : 613 SfxTabDialog ( pParent, CUI_RES( RID_SVXTABDLG_GALLERYTHEME ), pItemSet ), 614 pData ( _pData ) 615 { 616 FreeResource(); 617 618 AddTabPage( RID_SVXTABPAGE_GALLERY_GENERAL, TPGalleryThemeGeneral::Create, 0 ); 619 AddTabPage( RID_SVXTABPAGE_GALLERYTHEME_FILES, TPGalleryThemeProperties::Create, 0 ); 620 621 if( pData->pTheme->IsReadOnly() ) 622 RemoveTabPage( RID_SVXTABPAGE_GALLERYTHEME_FILES ); 623 624 String aText( GetText() ); 625 626 aText += pData->pTheme->GetName(); 627 628 if( pData->pTheme->IsReadOnly() ) 629 aText += String( CUI_RES( RID_SVXSTR_GALLERY_READONLY ) ); 630 631 SetText( aText ); 632 } 633 634 // ------------------------------------------------------------------------ 635 636 void GalleryThemeProperties::PageCreated( sal_uInt16 nId, SfxTabPage &rPage ) 637 { 638 if( RID_SVXTABPAGE_GALLERY_GENERAL == nId ) 639 ( (TPGalleryThemeGeneral&) rPage ).SetXChgData( pData ); 640 else 641 ( (TPGalleryThemeProperties&) rPage ).SetXChgData( pData ); 642 } 643 644 // ------------------------- 645 // - TPGalleryThemeGeneral - 646 // ------------------------- 647 648 TPGalleryThemeGeneral::TPGalleryThemeGeneral( Window* pParent, const SfxItemSet& rSet ) : 649 SfxTabPage ( pParent, CUI_RES( RID_SVXTABPAGE_GALLERY_GENERAL ), rSet ), 650 aFiMSImage ( this, CUI_RES( FI_MS_IMAGE ) ), 651 aEdtMSName ( this, CUI_RES( EDT_MS_NAME ) ), 652 aFlMSGeneralFirst ( this, CUI_RES( FL_MS_GENERAL_FIRST ) ), 653 aFtMSType ( this, CUI_RES( FT_MS_TYPE ) ), 654 aFtMSShowType ( this, CUI_RES( FT_MS_SHOW_TYPE ) ), 655 aFtMSPath ( this, CUI_RES( FT_MS_PATH ) ), 656 aFtMSShowPath ( this, CUI_RES( FT_MS_SHOW_PATH ) ), 657 aFtMSContent ( this, CUI_RES( FT_MS_CONTENT ) ), 658 aFtMSShowContent ( this, CUI_RES( FT_MS_SHOW_CONTENT ) ), 659 aFlMSGeneralSecond ( this, CUI_RES( FL_MS_GENERAL_SECOND ) ), 660 aFtMSChangeDate ( this, CUI_RES( FT_MS_CHANGEDATE ) ), 661 aFtMSShowChangeDate ( this, CUI_RES( FT_MS_SHOW_CHANGEDATE ) ) 662 { 663 FreeResource(); 664 665 String aAccName(SVX_RES(RID_SVXSTR_GALLERY_THEMENAME)); 666 aEdtMSName.SetAccessibleName(aAccName); 667 aFiMSImage.SetAccessibleName(aAccName); 668 aEdtMSName.SetAccessibleRelationLabeledBy( &aFiMSImage ); 669 } 670 671 // ------------------------------------------------------------------------ 672 673 void TPGalleryThemeGeneral::SetXChgData( ExchangeData* _pData ) 674 { 675 pData = _pData; 676 677 GalleryTheme* pThm = pData->pTheme; 678 String aOutStr( String::CreateFromInt32( pThm->GetObjectCount() ) ); 679 String aObjStr( CUI_RES( RID_SVXSTR_GALLERYPROPS_OBJECT ) ); 680 String aAccess; 681 String aType( SVX_RES( RID_SVXSTR_GALLERYPROPS_GALTHEME ) ); 682 sal_Bool bReadOnly = pThm->IsReadOnly() && !pThm->IsImported(); 683 684 aEdtMSName.SetHelpId( HID_GALLERY_EDIT_MSNAME ); 685 aEdtMSName.SetText( pThm->GetName() ); 686 aEdtMSName.SetReadOnly( bReadOnly ); 687 688 if( bReadOnly ) 689 aEdtMSName.Disable(); 690 else 691 aEdtMSName.Enable(); 692 693 if( pThm->IsReadOnly() ) 694 aType += String( CUI_RES( RID_SVXSTR_GALLERY_READONLY ) ); 695 696 aFtMSShowType.SetText( aType ); 697 aFtMSShowPath.SetText( pThm->GetSdgURL().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ); 698 699 // Ein- oder Mehrzahl? 700 if ( 1 == pThm->GetObjectCount() ) 701 aObjStr = aObjStr.GetToken( 0 ); 702 else 703 aObjStr = aObjStr.GetToken( 1 ); 704 705 aOutStr += ' '; 706 aOutStr += aObjStr; 707 708 aFtMSShowContent.SetText( aOutStr ); 709 710 // get locale wrapper (singleton) 711 const LocaleDataWrapper& aLocaleData = SvtSysLocale().GetLocaleData(); 712 713 // ChangeDate/Time 714 aAccess = aLocaleData.getDate( pData->aThemeChangeDate ); 715 aAccess += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) ); 716 aAccess += aLocaleData.getTime( pData->aThemeChangeTime ); 717 aFtMSShowChangeDate.SetText( aAccess ); 718 719 // Image setzen 720 sal_uInt16 nId; 721 722 if( pThm->IsImported() ) 723 nId = RID_SVXBMP_THEME_IMPORTED_BIG; 724 else if( pThm->IsReadOnly() ) 725 nId = RID_SVXBMP_THEME_READONLY_BIG; 726 else if( pThm->IsDefault() ) 727 nId = RID_SVXBMP_THEME_DEFAULT_BIG; 728 else 729 nId = RID_SVXBMP_THEME_NORMAL_BIG; 730 731 aFiMSImage.SetImage( Image( Bitmap( CUI_RES( nId ) ), COL_LIGHTMAGENTA ) ); 732 } 733 734 // ------------------------------------------------------------------------ 735 736 sal_Bool TPGalleryThemeGeneral::FillItemSet( SfxItemSet& /*rSet*/ ) 737 { 738 pData->aEditedTitle = aEdtMSName.GetText(); 739 return sal_True; 740 } 741 742 // ------------------------------------------------------------------------ 743 744 SfxTabPage* TPGalleryThemeGeneral::Create( Window* pParent, const SfxItemSet& rSet ) 745 { 746 return new TPGalleryThemeGeneral( pParent, rSet ); 747 } 748 749 // ---------------------------- 750 // - TPGalleryThemeProperties - 751 // ---------------------------- 752 753 TPGalleryThemeProperties::TPGalleryThemeProperties( Window* pWindow, const SfxItemSet& rSet ) : 754 SfxTabPage ( pWindow, CUI_RES( RID_SVXTABPAGE_GALLERYTHEME_FILES ), rSet ), 755 aFtFileType ( this, CUI_RES(FT_FILETYPE ) ), 756 aCbbFileType ( this, CUI_RES(CBB_FILETYPE ) ), 757 aLbxFound ( this, CUI_RES(LBX_FOUND ) ), 758 aBtnSearch ( this, CUI_RES(BTN_SEARCH ) ), 759 aBtnTake ( this, CUI_RES(BTN_TAKE ) ), 760 aBtnTakeAll ( this, CUI_RES(BTN_TAKEALL ) ), 761 aCbxPreview ( this, CUI_RES(CBX_PREVIEW ) ), 762 aWndPreview ( this, CUI_RES( WND_BRSPRV ) ), 763 nCurFilterPos (0), 764 nFirstExtFilterPos (0), 765 bEntriesFound (sal_False), 766 bInputAllowed (sal_True), 767 bSearchRecursive (sal_False), 768 xDialogListener ( new ::svt::DialogClosedListener() ) 769 { 770 FreeResource(); 771 772 xDialogListener->SetDialogClosedLink( LINK( this, TPGalleryThemeProperties, DialogClosedHdl ) ); 773 aLbxFound.SetAccessibleName(String(SVX_RES(RID_SVXSTR_GALLERY_FILESFOUND))); 774 aWndPreview.SetAccessibleName(aCbxPreview.GetText()); 775 aLbxFound.SetAccessibleRelationLabeledBy(&aLbxFound); 776 } 777 778 // ------------------------------------------------------------------------ 779 780 void TPGalleryThemeProperties::SetXChgData( ExchangeData* _pData ) 781 { 782 pData = _pData; 783 784 aPreviewTimer.SetTimeoutHdl( LINK( this, TPGalleryThemeProperties, PreviewTimerHdl ) ); 785 aPreviewTimer.SetTimeout( 500 ); 786 aBtnSearch.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickSearchHdl)); 787 aBtnTake.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeHdl)); 788 aBtnTakeAll.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeAllHdl)); 789 aCbxPreview.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl)); 790 aCbbFileType.SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl)); 791 aCbbFileType.EnableDDAutoWidth( sal_False ); 792 aLbxFound.SetDoubleClickHdl(LINK(this, TPGalleryThemeProperties, DClickFoundHdl)); 793 aLbxFound.SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); 794 aLbxFound.InsertEntry(String(CUI_RES(RID_SVXSTR_GALLERY_NOFILES))); 795 aLbxFound.Show(); 796 797 FillFilterList(); 798 799 aBtnTake.Enable(); 800 aBtnTakeAll.Disable(); 801 aCbxPreview.Disable(); 802 } 803 804 // ------------------------------------------------------------------------ 805 806 void TPGalleryThemeProperties::StartSearchFiles( const String& _rFolderURL, short _nDlgResult ) 807 { 808 if ( RET_OK == _nDlgResult ) 809 { 810 aURL = INetURLObject( _rFolderURL ); 811 bSearchRecursive = sal_True; // UI choice no longer possible, windows file picker allows no user controls 812 SearchFiles(); 813 } 814 815 nCurFilterPos = aCbbFileType.GetEntryPos( aCbbFileType.GetText() ); 816 } 817 818 // ------------------------------------------------------------------------ 819 820 TPGalleryThemeProperties::~TPGalleryThemeProperties() 821 { 822 xMediaPlayer.clear(); 823 xDialogListener.clear(); 824 825 for( String* pStr = aFoundList.First(); pStr; pStr = aFoundList.Next() ) 826 delete pStr; 827 828 for( void* pEntry = aFilterEntryList.First(); pEntry; pEntry = aFilterEntryList.Next() ) 829 delete (FilterEntry*) pEntry; 830 } 831 832 // ------------------------------------------------------------------------ 833 834 SfxTabPage* TPGalleryThemeProperties::Create( Window* pParent, const SfxItemSet& rSet ) 835 { 836 return new TPGalleryThemeProperties( pParent, rSet ); 837 } 838 839 // ------------------------------------------------------------------------ 840 841 ::rtl::OUString TPGalleryThemeProperties::addExtension( const ::rtl::OUString& _rDisplayText, const ::rtl::OUString& _rExtension ) 842 { 843 ::rtl::OUString sAllFilter( RTL_CONSTASCII_USTRINGPARAM( "(*.*)" ) ); 844 ::rtl::OUString sOpenBracket( RTL_CONSTASCII_USTRINGPARAM( " (" ) ); 845 ::rtl::OUString sCloseBracket( RTL_CONSTASCII_USTRINGPARAM( ")" ) ); 846 ::rtl::OUString sRet = _rDisplayText; 847 848 if ( sRet.indexOf( sAllFilter ) == -1 ) 849 { 850 String sExt = _rExtension; 851 sRet += sOpenBracket; 852 sRet += sExt; 853 sRet += sCloseBracket; 854 } 855 return sRet; 856 } 857 858 // ------------------------------------------------------------------------ 859 860 void TPGalleryThemeProperties::FillFilterList() 861 { 862 GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter(); 863 String aExt; 864 String aName; 865 FilterEntry* pFilterEntry; 866 FilterEntry* pTestEntry; 867 sal_uInt16 i, nKeyCount; 868 sal_Bool bInList; 869 870 // graphic filters 871 for( i = 0, nKeyCount = pFilter->GetImportFormatCount(); i < nKeyCount; i++ ) 872 { 873 aExt = pFilter->GetImportFormatShortName( i ); 874 aName = pFilter->GetImportFormatName( i ); 875 pTestEntry = (FilterEntry*) aFilterEntryList.First(); 876 bInList = sal_False; 877 878 String aExtensions; 879 int j = 0; 880 String sWildcard; 881 while( sal_True ) 882 { 883 sWildcard = pFilter->GetImportWildcard( i, j++ ); 884 if ( !sWildcard.Len() ) 885 break; 886 if ( aExtensions.Search( sWildcard ) == STRING_NOTFOUND ) 887 { 888 if ( aExtensions.Len() ) 889 aExtensions += sal_Unicode(';'); 890 aExtensions += sWildcard; 891 } 892 } 893 aName = addExtension( aName, aExtensions ); 894 895 while( pTestEntry ) 896 { 897 if ( pTestEntry->aFilterName == aExt ) 898 { 899 bInList = sal_True; 900 break; 901 } 902 pTestEntry = (FilterEntry*) aFilterEntryList.Next(); 903 } 904 if ( !bInList ) 905 { 906 pFilterEntry = new FilterEntry; 907 pFilterEntry->aFilterName = aExt; 908 aFilterEntryList.Insert( pFilterEntry, aCbbFileType.InsertEntry( aName ) ); 909 } 910 } 911 912 // media filters 913 static const ::rtl::OUString aWildcard( RTL_CONSTASCII_USTRINGPARAM( "*." ) ); 914 ::avmedia::FilterNameVector aFilters; 915 const ::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( ";" ) ); 916 ::rtl::OUString aAllTypes; 917 918 ::avmedia::MediaWindow::getMediaFilters( aFilters ); 919 920 for( unsigned long l = 0; l < aFilters.size(); ++l ) 921 { 922 for( sal_Int32 nIndex = 0; nIndex >= 0; ) 923 { 924 ::rtl::OUString aFilterWildcard( aWildcard ); 925 926 pFilterEntry = new FilterEntry; 927 pFilterEntry->aFilterName = aFilters[ l ].second.getToken( 0, ';', nIndex ); 928 nFirstExtFilterPos = aCbbFileType.InsertEntry( addExtension( aFilters[ l ].first, 929 aFilterWildcard += pFilterEntry->aFilterName ) ); 930 aFilterEntryList.Insert( pFilterEntry, nFirstExtFilterPos ); 931 } 932 } 933 934 // 'All' filters 935 String aExtensions; 936 937 // graphic filters 938 for ( i = 0; i < nKeyCount; ++i ) 939 { 940 int j = 0; 941 String sWildcard; 942 while( sal_True ) 943 { 944 sWildcard = pFilter->GetImportWildcard( i, j++ ); 945 if ( !sWildcard.Len() ) 946 break; 947 if ( aExtensions.Search( sWildcard ) == STRING_NOTFOUND ) 948 { 949 if ( aExtensions.Len() ) 950 aExtensions += sal_Unicode( ';' ); 951 952 aExtensions += sWildcard; 953 } 954 } 955 } 956 957 // media filters 958 for( unsigned long k = 0; k < aFilters.size(); ++k ) 959 { 960 for( sal_Int32 nIndex = 0; nIndex >= 0; ) 961 { 962 if ( aExtensions.Len() ) 963 aExtensions += sal_Unicode( ';' ); 964 ( aExtensions += String( aWildcard ) ) += String( aFilters[ k ].second.getToken( 0, ';', nIndex ) ); 965 } 966 } 967 968 #if defined(WNT) 969 if ( aExtensions.Len() > 240 ) 970 aExtensions = DEFINE_CONST_UNICODE( "*.*" ); 971 #endif 972 973 pFilterEntry = new FilterEntry; 974 pFilterEntry->aFilterName = String( CUI_RES( RID_SVXSTR_GALLERY_ALLFILES ) ); 975 pFilterEntry->aFilterName = addExtension( pFilterEntry->aFilterName, aExtensions ); 976 aFilterEntryList.Insert(pFilterEntry, aCbbFileType. InsertEntry( pFilterEntry->aFilterName, 0 ) ); 977 978 aCbbFileType.SetText( pFilterEntry->aFilterName ); 979 } 980 981 // ------------------------------------------------------------------------ 982 983 IMPL_LINK( TPGalleryThemeProperties, SelectFileTypeHdl, void *, EMPTYARG ) 984 { 985 String aText( aCbbFileType.GetText() ); 986 987 if( bInputAllowed && ( aLastFilterName != aText ) ) 988 { 989 aLastFilterName = aText; 990 991 if( QueryBox( this, WB_YES_NO, String( CUI_RES( RID_SVXSTR_GALLERY_SEARCH ) ) ).Execute() == RET_YES ) 992 SearchFiles(); 993 } 994 995 return 0L; 996 } 997 998 // ------------------------------------------------------------------------ 999 1000 void TPGalleryThemeProperties::SearchFiles() 1001 { 1002 SearchProgress* pProgress = new SearchProgress( this, aURL ); 1003 1004 for( String* pStr = aFoundList.First(); pStr; pStr = aFoundList.Next() ) 1005 delete pStr; 1006 1007 aFoundList.Clear(); 1008 aLbxFound.Clear(); 1009 1010 pProgress->SetFileType( aCbbFileType.GetText() ); 1011 pProgress->SetDirectory( rtl::OUString() ); 1012 pProgress->Update(); 1013 1014 pProgress->StartExecuteModal( LINK( this, TPGalleryThemeProperties, EndSearchProgressHdl ) ); 1015 } 1016 1017 // ------------------------------------------------------------------------ 1018 1019 IMPL_LINK( TPGalleryThemeProperties, ClickCloseBrowserHdl, void *, EMPTYARG ) 1020 { 1021 if( bInputAllowed ) 1022 aPreviewTimer.Stop(); 1023 1024 return 0L; 1025 } 1026 1027 // ------------------------------------------------------------------------ 1028 1029 IMPL_LINK( TPGalleryThemeProperties, ClickSearchHdl, void *, EMPTYARG ) 1030 { 1031 if( bInputAllowed ) 1032 { 1033 try 1034 { 1035 // setup folder picker 1036 ::com::sun::star::uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 1037 if( xMgr.is() ) 1038 { 1039 xFolderPicker = ::com::sun::star::uno::Reference< XFolderPicker >( 1040 xMgr->createInstance( OUString::createFromAscii( "com.sun.star.ui.dialogs.FolderPicker" )), UNO_QUERY ); 1041 1042 if ( xFolderPicker.is() ) 1043 { 1044 String aDlgPathName( SvtPathOptions().GetGraphicPath() ); 1045 xFolderPicker->setDisplayDirectory(aDlgPathName); 1046 1047 aPreviewTimer.Stop(); 1048 1049 ::com::sun::star::uno::Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY ); 1050 if ( xAsyncDlg.is() ) 1051 xAsyncDlg->startExecuteModal( xDialogListener.get() ); 1052 else 1053 { 1054 if( xFolderPicker->execute() == RET_OK ) 1055 { 1056 aURL = INetURLObject( xFolderPicker->getDirectory() ); 1057 bSearchRecursive = sal_True; // UI choice no longer possible, windows file picker allows no user controls 1058 SearchFiles(); 1059 } 1060 1061 nCurFilterPos = aCbbFileType.GetEntryPos( aCbbFileType.GetText() ); 1062 } 1063 } 1064 } 1065 } 1066 catch(IllegalArgumentException) 1067 { 1068 #ifdef DBG_UTIL 1069 DBG_ERROR( "Folder picker failed with illegal arguments" ); 1070 #endif 1071 } 1072 } 1073 1074 return 0L; 1075 } 1076 1077 // ------------------------------------------------------------------------ 1078 1079 void TPGalleryThemeProperties::TakeFiles() 1080 { 1081 if( aLbxFound.GetSelectEntryCount() || ( bTakeAll && bEntriesFound ) ) 1082 { 1083 TakeProgress* pTakeProgress = new TakeProgress( this ); 1084 pTakeProgress->Update(); 1085 1086 pTakeProgress->StartExecuteModal( 1087 Link() /* no postprocessing needed, pTakeProgress 1088 will be deleted in TakeProgress::CleanupHdl */ ); 1089 } 1090 } 1091 1092 // ------------------------------------------------------------------------ 1093 1094 IMPL_LINK( TPGalleryThemeProperties, ClickPreviewHdl, void *, EMPTYARG ) 1095 { 1096 if ( bInputAllowed ) 1097 { 1098 aPreviewTimer.Stop(); 1099 aPreviewString.Erase(); 1100 1101 if( !aCbxPreview.IsChecked() ) 1102 { 1103 xMediaPlayer.clear(); 1104 aWndPreview.SetGraphic( Graphic() ); 1105 aWndPreview.Invalidate(); 1106 } 1107 else 1108 DoPreview(); 1109 } 1110 1111 return 0; 1112 } 1113 1114 // ------------------------------------------------------------------------ 1115 1116 void TPGalleryThemeProperties::DoPreview() 1117 { 1118 String aString( aLbxFound.GetSelectEntry() ); 1119 1120 if( aString != aPreviewString ) 1121 { 1122 INetURLObject _aURL( *aFoundList.GetObject( aLbxFound.GetEntryPos( aString ) ) ); 1123 bInputAllowed = sal_False; 1124 1125 if ( !aWndPreview.SetGraphic( _aURL ) ) 1126 { 1127 GetParent()->LeaveWait(); 1128 ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTSPATH ); 1129 GetParent()->EnterWait(); 1130 } 1131 else if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) ) 1132 { 1133 xMediaPlayer = ::avmedia::MediaWindow::createPlayer( _aURL.GetMainURL( INetURLObject::NO_DECODE ) ); 1134 if( xMediaPlayer.is() ) 1135 xMediaPlayer->start(); 1136 } 1137 1138 bInputAllowed = sal_True; 1139 aPreviewString = aString; 1140 } 1141 } 1142 1143 // ------------------------------------------------------------------------ 1144 1145 IMPL_LINK( TPGalleryThemeProperties, ClickTakeHdl, void*, EMPTYARG ) 1146 { 1147 if( bInputAllowed ) 1148 { 1149 aPreviewTimer.Stop(); 1150 1151 if( !aLbxFound.GetSelectEntryCount() || !bEntriesFound ) 1152 { 1153 SvxOpenGraphicDialog aDlg(String( RTL_CONSTASCII_USTRINGPARAM( "Gallery" ) ) ); 1154 aDlg.EnableLink(sal_False); 1155 aDlg.AsLink(sal_False); 1156 1157 if( !aDlg.Execute() ) 1158 pData->pTheme->InsertURL( INetURLObject( aDlg.GetPath() ) ); 1159 } 1160 else 1161 { 1162 bTakeAll = sal_False; 1163 TakeFiles(); 1164 } 1165 } 1166 1167 return 0L; 1168 } 1169 1170 // ------------------------------------------------------------------------ 1171 1172 IMPL_LINK( TPGalleryThemeProperties, ClickTakeAllHdl, void *, EMPTYARG ) 1173 { 1174 if( bInputAllowed ) 1175 { 1176 aPreviewTimer.Stop(); 1177 bTakeAll = sal_True; 1178 TakeFiles(); 1179 } 1180 1181 return 0L; 1182 } 1183 1184 // ------------------------------------------------------------------------ 1185 1186 IMPL_LINK( TPGalleryThemeProperties, SelectFoundHdl, void *, EMPTYARG ) 1187 { 1188 if( bInputAllowed ) 1189 { 1190 sal_Bool bPreviewPossible = sal_False; 1191 1192 aPreviewTimer.Stop(); 1193 1194 if( bEntriesFound ) 1195 { 1196 if( aLbxFound.GetSelectEntryCount() == 1 ) 1197 { 1198 aCbxPreview.Enable(); 1199 bPreviewPossible = sal_True; 1200 } 1201 else 1202 aCbxPreview.Disable(); 1203 1204 if( aFoundList.Count() ) 1205 aBtnTakeAll.Enable(); 1206 else 1207 aBtnTakeAll.Disable(); 1208 } 1209 1210 if( bPreviewPossible && aCbxPreview.IsChecked() ) 1211 aPreviewTimer.Start(); 1212 } 1213 1214 return 0; 1215 } 1216 1217 // ------------------------------------------------------------------------ 1218 1219 IMPL_LINK( TPGalleryThemeProperties, DClickFoundHdl, void *, EMPTYARG ) 1220 { 1221 if( bInputAllowed ) 1222 { 1223 aPreviewTimer.Stop(); 1224 1225 return (aLbxFound.GetSelectEntryCount() == 1 && bEntriesFound) ? 1226 ClickTakeHdl(NULL) : 0; 1227 } 1228 else 1229 return 0; 1230 } 1231 1232 // ------------------------------------------------------------------------ 1233 1234 IMPL_LINK( TPGalleryThemeProperties, PreviewTimerHdl, void *, EMPTYARG ) 1235 { 1236 aPreviewTimer.Stop(); 1237 DoPreview(); 1238 return 0L; 1239 } 1240 1241 // ------------------------------------------------------------------------ 1242 1243 IMPL_LINK( TPGalleryThemeProperties, EndSearchProgressHdl, SearchProgress *, EMPTYARG ) 1244 { 1245 if( aFoundList.Count() ) 1246 { 1247 aLbxFound.SelectEntryPos( 0 ); 1248 aBtnTakeAll.Enable(); 1249 aCbxPreview.Enable(); 1250 bEntriesFound = sal_True; 1251 } 1252 else 1253 { 1254 aLbxFound.InsertEntry( String( CUI_RES( RID_SVXSTR_GALLERY_NOFILES ) ) ); 1255 aBtnTakeAll.Disable(); 1256 aCbxPreview.Disable(); 1257 bEntriesFound = sal_False; 1258 } 1259 return 0L; 1260 } 1261 1262 // ------------------------------------------------------------------------ 1263 1264 IMPL_LINK( TPGalleryThemeProperties, DialogClosedHdl, ::com::sun::star::ui::dialogs::DialogClosedEvent*, pEvt ) 1265 { 1266 DBG_ASSERT( xFolderPicker.is() == sal_True, "TPGalleryThemeProperties::DialogClosedHdl(): no folder picker" ); 1267 1268 String sURL = String( xFolderPicker->getDirectory() ); 1269 StartSearchFiles( sURL, pEvt->DialogResult ); 1270 1271 return 0L; 1272 } 1273 1274