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