xref: /AOO41X/main/cui/source/dialogs/cuigaldlg.cxx (revision 2ee96f1cdb99d49425d866b1ec4c5567f37285e6)
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 
SearchThread(SearchProgress * pProgess,TPGalleryThemeProperties * pBrowser,const INetURLObject & rStartURL)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 
~SearchThread()92 SearchThread::~SearchThread()
93 {
94 }
95 
96 // ------------------------------------------------------------------------
97 
run()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 
onTerminated()125 void SAL_CALL SearchThread::onTerminated()
126 {
127     Application::PostUserEvent( LINK( mpProgress, SearchProgress, CleanUpHdl ) );
128 }
129 
130 // ------------------------------------------------------------------------
131 
ImplSearch(const INetURLObject & rStartURL,const::std::vector<String> & rFormats,sal_Bool bRecursive)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 
SearchProgress(Window * pParent,const INetURLObject & rStartURL)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 
Terminate()236 void SearchProgress::Terminate()
237 {
238     maSearchThread.terminate();
239 }
240 
241 // ------------------------------------------------------------------------
242 
IMPL_LINK(SearchProgress,ClickCancelBtn,void *,EMPTYARG)243 IMPL_LINK( SearchProgress, ClickCancelBtn, void*, EMPTYARG )
244 {
245     Terminate();
246     return 0L;
247 }
248 
249 // ------------------------------------------------------------------------
250 
IMPL_LINK(SearchProgress,CleanUpHdl,void *,EMPTYARG)251 IMPL_LINK( SearchProgress, CleanUpHdl, void*, EMPTYARG )
252 {
253     EndDialog( RET_OK );
254     delete this;
255     return 0L;
256 }
257 
258 // ------------------------------------------------------------------------
259 
Execute()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 
StartExecuteModal(const Link & rEndDialogHdl)270 void SearchProgress::StartExecuteModal( const Link& rEndDialogHdl )
271 {
272     maSearchThread.create();
273     ModalDialog::StartExecuteModal( rEndDialogHdl );
274 }
275 
276 // --------------
277 // - TakeThread -
278 // --------------
279 
TakeThread(TakeProgress * pProgess,TPGalleryThemeProperties * pBrowser,List & rTakenList)280 TakeThread::TakeThread( TakeProgress* pProgess, TPGalleryThemeProperties* pBrowser, List& rTakenList ) :
281         mpProgress  ( pProgess ),
282         mpBrowser   ( pBrowser ),
283         mrTakenList ( rTakenList )
284 {
285 }
286 
287 // ------------------------------------------------------------------------
288 
~TakeThread()289 TakeThread::~TakeThread()
290 {
291 }
292 
293 // ------------------------------------------------------------------------
294 
run()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 
onTerminated()342 void SAL_CALL TakeThread::onTerminated()
343 {
344     Application::PostUserEvent( LINK( mpProgress, TakeProgress, CleanUpHdl ) );
345 }
346 
347 // ----------------
348 // - TakeProgress -
349 // ----------------
350 
TakeProgress(Window * pWindow)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 
Terminate()366 void TakeProgress::Terminate()
367 {
368     maTakeThread.terminate();
369 }
370 
371 // ------------------------------------------------------------------------
372 
IMPL_LINK(TakeProgress,ClickCancelBtn,void *,EMPTYARG)373 IMPL_LINK( TakeProgress, ClickCancelBtn, void*, EMPTYARG )
374 {
375     Terminate();
376     return 0L;
377 }
378 
379 // ------------------------------------------------------------------------
380 
IMPL_LINK(TakeProgress,CleanUpHdl,void *,EMPTYARG)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 
Execute()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 
StartExecuteModal(const Link & rEndDialogHdl)446 void TakeProgress::StartExecuteModal( const Link& rEndDialogHdl )
447 {
448     maTakeThread.create();
449     ModalDialog::StartExecuteModal( rEndDialogHdl );
450 }
451 
452 // ---------------------
453 // - ActualizeProgress -
454 // ---------------------
455 
ActualizeProgress(Window * pWindow,GalleryTheme * pThm)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 
Execute()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 
IMPL_LINK(ActualizeProgress,ClickCancelBtn,void *,EMPTYARG)489 IMPL_LINK( ActualizeProgress, ClickCancelBtn, void*, EMPTYARG )
490 {
491     pTheme->AbortActualize();
492     EndDialog( RET_OK );
493 
494     return 0L;
495 }
496 
497 // ------------------------------------------------------------------------
498 
IMPL_LINK(ActualizeProgress,TimeoutHdl,Timer *,_pTimer)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 
IMPL_LINK(ActualizeProgress,ActualizeHdl,INetURLObject *,pURL)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 
TitleDialog(Window * pParent,const String & rOldTitle)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 
GalleryIdDialog(Window * pParent,GalleryTheme * _pThm)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 
IMPL_LINK(GalleryIdDialog,ClickOkHdl,void *,EMPTYARG)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 
GalleryThemeProperties(Window * pParent,ExchangeData * _pData,SfxItemSet * pItemSet)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 
PageCreated(sal_uInt16 nId,SfxTabPage & rPage)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 
TPGalleryThemeGeneral(Window * pParent,const SfxItemSet & rSet)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 
SetXChgData(ExchangeData * _pData)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 
FillItemSet(SfxItemSet &)736 sal_Bool TPGalleryThemeGeneral::FillItemSet( SfxItemSet& /*rSet*/ )
737 {
738     pData->aEditedTitle = aEdtMSName.GetText();
739     return sal_True;
740 }
741 
742 // ------------------------------------------------------------------------
743 
Create(Window * pParent,const SfxItemSet & rSet)744 SfxTabPage* TPGalleryThemeGeneral::Create( Window* pParent, const SfxItemSet& rSet )
745 {
746     return new TPGalleryThemeGeneral( pParent, rSet );
747 }
748 
749 // ----------------------------
750 // - TPGalleryThemeProperties -
751 // ----------------------------
752 
TPGalleryThemeProperties(Window * pWindow,const SfxItemSet & rSet)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 
SetXChgData(ExchangeData * _pData)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 
StartSearchFiles(const String & _rFolderURL,short _nDlgResult)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 
~TPGalleryThemeProperties()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 
Create(Window * pParent,const SfxItemSet & rSet)834 SfxTabPage* TPGalleryThemeProperties::Create( Window* pParent, const SfxItemSet& rSet )
835 {
836     return new TPGalleryThemeProperties( pParent, rSet );
837 }
838 
839 // ------------------------------------------------------------------------
840 
addExtension(const::rtl::OUString & _rDisplayText,const::rtl::OUString & _rExtension)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 
FillFilterList()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 
IMPL_LINK(TPGalleryThemeProperties,SelectFileTypeHdl,void *,EMPTYARG)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 
SearchFiles()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 
IMPL_LINK(TPGalleryThemeProperties,ClickCloseBrowserHdl,void *,EMPTYARG)1019 IMPL_LINK( TPGalleryThemeProperties, ClickCloseBrowserHdl, void *, EMPTYARG )
1020 {
1021     if( bInputAllowed )
1022         aPreviewTimer.Stop();
1023 
1024     return 0L;
1025 }
1026 
1027 // ------------------------------------------------------------------------
1028 
IMPL_LINK(TPGalleryThemeProperties,ClickSearchHdl,void *,EMPTYARG)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 
TakeFiles()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 
IMPL_LINK(TPGalleryThemeProperties,ClickPreviewHdl,void *,EMPTYARG)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 
DoPreview()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 
IMPL_LINK(TPGalleryThemeProperties,ClickTakeHdl,void *,EMPTYARG)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 
IMPL_LINK(TPGalleryThemeProperties,ClickTakeAllHdl,void *,EMPTYARG)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 
IMPL_LINK(TPGalleryThemeProperties,SelectFoundHdl,void *,EMPTYARG)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 
IMPL_LINK(TPGalleryThemeProperties,DClickFoundHdl,void *,EMPTYARG)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 
IMPL_LINK(TPGalleryThemeProperties,PreviewTimerHdl,void *,EMPTYARG)1234 IMPL_LINK( TPGalleryThemeProperties, PreviewTimerHdl, void *, EMPTYARG )
1235 {
1236     aPreviewTimer.Stop();
1237     DoPreview();
1238     return 0L;
1239 }
1240 
1241 // ------------------------------------------------------------------------
1242 
IMPL_LINK(TPGalleryThemeProperties,EndSearchProgressHdl,SearchProgress *,EMPTYARG)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 
IMPL_LINK(TPGalleryThemeProperties,DialogClosedHdl,::com::sun::star::ui::dialogs::DialogClosedEvent *,pEvt)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