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