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 ) );
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() != INET_PROT_NOT_VALID, "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 : mpBrowser->aFoundList.push_back(
180 : aFoundURL.GetMainURL( INetURLObject::NO_DECODE )
181 0 : );
182 : 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 :
219 :
220 0 : void SearchProgress::Terminate()
221 : {
222 0 : if (maSearchThread.is())
223 0 : maSearchThread->terminate();
224 0 : }
225 :
226 :
227 :
228 0 : IMPL_LINK_NOARG(SearchProgress, ClickCancelBtn)
229 : {
230 0 : Terminate();
231 0 : return 0L;
232 : }
233 :
234 :
235 :
236 0 : IMPL_LINK_NOARG(SearchProgress, CleanUpHdl)
237 : {
238 0 : if (maSearchThread.is())
239 0 : maSearchThread->join();
240 :
241 0 : EndDialog( RET_OK );
242 :
243 0 : delete this;
244 0 : return 0L;
245 : }
246 :
247 :
248 :
249 0 : short SearchProgress::Execute()
250 : {
251 : OSL_FAIL( "SearchProgress cannot be executed via Dialog::Execute!\n"
252 : "It creates a thread that will call back to VCL apartment => deadlock!\n"
253 : "Use Dialog::StartExecuteModal to execute the dialog!" );
254 0 : return RET_CANCEL;
255 : }
256 :
257 :
258 :
259 0 : void SearchProgress::StartExecuteModal( const Link& rEndDialogHdl )
260 : {
261 : assert(!maSearchThread.is());
262 0 : maSearchThread = new SearchThread(
263 0 : this, static_cast< TPGalleryThemeProperties * >(parent_), startUrl_);
264 0 : maSearchThread->launch();
265 0 : ModalDialog::StartExecuteModal( rEndDialogHdl );
266 0 : }
267 :
268 :
269 : // - TakeThread -
270 :
271 :
272 0 : TakeThread::TakeThread(
273 : TakeProgress* pProgess,
274 : TPGalleryThemeProperties* pBrowser,
275 : TokenList_impl& rTakenList
276 : ) :
277 : Thread ( "cuiTakeThread" ),
278 : mpProgress ( pProgess ),
279 : mpBrowser ( pBrowser ),
280 0 : mrTakenList ( rTakenList )
281 : {
282 0 : }
283 :
284 :
285 :
286 0 : TakeThread::~TakeThread()
287 : {
288 0 : }
289 :
290 :
291 :
292 0 : void TakeThread::execute()
293 : {
294 0 : INetURLObject aURL;
295 : sal_uInt16 nEntries;
296 0 : GalleryTheme* pThm = mpBrowser->GetXChgData()->pTheme;
297 : sal_uInt16 nPos;
298 : GalleryProgress* pStatusProgress;
299 :
300 : {
301 0 : SolarMutexGuard aGuard;
302 0 : pStatusProgress = new GalleryProgress;
303 0 : nEntries = mpBrowser->bTakeAll ? mpBrowser->m_pLbxFound->GetEntryCount() : mpBrowser->m_pLbxFound->GetSelectEntryCount();
304 0 : pThm->LockBroadcaster();
305 : }
306 :
307 0 : for( sal_uInt16 i = 0; i < nEntries && schedule(); i++ )
308 : {
309 0 : if( mpBrowser->bTakeAll )
310 0 : aURL = INetURLObject( mpBrowser->aFoundList[ nPos = i ] );
311 : else
312 0 : aURL = INetURLObject( mpBrowser->aFoundList[ nPos = mpBrowser->m_pLbxFound->GetSelectEntryPos( i ) ]);
313 :
314 0 : mrTakenList.push_back( (sal_uLong)nPos );
315 :
316 : {
317 0 : SolarMutexGuard aGuard;
318 :
319 0 : mpProgress->SetFile( aURL );
320 0 : pStatusProgress->Update( i, nEntries - 1 );
321 0 : mpProgress->Sync();
322 0 : pThm->InsertURL( aURL );
323 : }
324 : }
325 :
326 : {
327 0 : SolarMutexGuard aGuard;
328 :
329 0 : pThm->UnlockBroadcaster();
330 0 : delete pStatusProgress;
331 : }
332 :
333 0 : Application::PostUserEvent( LINK( mpProgress, TakeProgress, CleanUpHdl ) );
334 0 : }
335 :
336 : // - TakeProgress -
337 0 : TakeProgress::TakeProgress(vcl::Window* pWindow)
338 : : ModalDialog(pWindow, "GalleryApplyProgress",
339 : "cui/ui/galleryapplyprogress.ui")
340 0 : , window_(pWindow)
341 : {
342 0 : get(m_pFtTakeFile, "file");
343 0 : get(m_pBtnCancel, "cancel");
344 :
345 0 : m_pBtnCancel->SetClickHdl( LINK( this, TakeProgress, ClickCancelBtn ) );
346 0 : }
347 :
348 0 : void TakeProgress::Terminate()
349 : {
350 0 : if (maTakeThread.is())
351 0 : maTakeThread->terminate();
352 0 : }
353 :
354 0 : IMPL_LINK_NOARG(TakeProgress, ClickCancelBtn)
355 : {
356 0 : Terminate();
357 0 : return 0L;
358 : }
359 :
360 0 : IMPL_LINK_NOARG(TakeProgress, CleanUpHdl)
361 : {
362 0 : if (maTakeThread.is())
363 0 : maTakeThread->join();
364 :
365 0 : TPGalleryThemeProperties* mpBrowser = static_cast<TPGalleryThemeProperties*>( GetParent() );
366 0 : ::std::vector<bool, std::allocator<bool> > aRemoveEntries( mpBrowser->aFoundList.size(), false );
367 0 : ::std::vector< OUString > aRemainingVector;
368 : sal_uInt32 i, nCount;
369 :
370 0 : GetParent()->EnterWait();
371 0 : mpBrowser->m_pLbxFound->SetUpdateMode( false );
372 0 : mpBrowser->m_pLbxFound->SetNoSelection();
373 :
374 : // mark all taken positions in aRemoveEntries
375 0 : for( i = 0, nCount = maTakenList.size(); i < nCount; ++i )
376 0 : aRemoveEntries[ maTakenList[ i ] ] = true;
377 0 : maTakenList.clear();
378 :
379 : // refill found list
380 0 : for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i )
381 0 : if( !aRemoveEntries[ i ] )
382 0 : aRemainingVector.push_back( mpBrowser->aFoundList[i] );
383 :
384 0 : mpBrowser->aFoundList.clear();
385 :
386 0 : for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i )
387 0 : mpBrowser->aFoundList.push_back( aRemainingVector[ i ] );
388 :
389 0 : aRemainingVector.clear();
390 :
391 : // refill list box
392 0 : for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i )
393 0 : if( !aRemoveEntries[ i ] )
394 0 : aRemainingVector.push_back( mpBrowser->m_pLbxFound->GetEntry( (sal_uInt16) i ) );
395 :
396 0 : mpBrowser->m_pLbxFound->Clear();
397 :
398 0 : for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i )
399 0 : mpBrowser->m_pLbxFound->InsertEntry( aRemainingVector[ i ] );
400 :
401 0 : aRemainingVector.clear();
402 :
403 0 : mpBrowser->m_pLbxFound->SetUpdateMode( true );
404 0 : mpBrowser->SelectFoundHdl( NULL );
405 0 : GetParent()->LeaveWait();
406 :
407 0 : EndDialog( RET_OK );
408 0 : delete this;
409 0 : return 0L;
410 : }
411 :
412 :
413 :
414 0 : short TakeProgress::Execute()
415 : {
416 : OSL_FAIL( "TakeProgress cannot be executed via Dialog::Execute!\n"
417 : "It creates a thread that will call back to VCL apartment => deadlock!\n"
418 : "Use Dialog::StartExecuteModal to execute the dialog!" );
419 0 : return RET_CANCEL;
420 : }
421 :
422 :
423 :
424 0 : void TakeProgress::StartExecuteModal( const Link& rEndDialogHdl )
425 : {
426 : assert(!maTakeThread.is());
427 0 : maTakeThread = new TakeThread(
428 0 : this, static_cast< TPGalleryThemeProperties * >(window_), maTakenList);
429 0 : maTakeThread->launch();
430 0 : ModalDialog::StartExecuteModal( rEndDialogHdl );
431 0 : }
432 :
433 :
434 : // - ActualizeProgress -
435 0 : ActualizeProgress::ActualizeProgress(vcl::Window* pWindow, GalleryTheme* pThm)
436 : : ModalDialog(pWindow, "GalleryUpdateProgress",
437 : "cui/ui/galleryupdateprogress.ui")
438 : , pTimer(NULL)
439 0 : , pTheme(pThm)
440 : {
441 0 : get(m_pFtActualizeFile, "file");
442 0 : get(m_pBtnCancel, "cancel");
443 0 : m_pBtnCancel->SetClickHdl( LINK( this, ActualizeProgress, ClickCancelBtn ) );
444 0 : }
445 :
446 0 : short ActualizeProgress::Execute()
447 : {
448 : short nRet;
449 :
450 0 : pTimer = new Timer;
451 :
452 0 : if ( pTimer )
453 : {
454 0 : pTimer->SetTimeoutHdl( LINK( this, ActualizeProgress, TimeoutHdl ) );
455 0 : pTimer->SetTimeout( 500 );
456 0 : pTimer->Start();
457 : }
458 :
459 0 : nRet = ModalDialog::Execute();
460 :
461 0 : return nRet;
462 : }
463 :
464 :
465 :
466 0 : IMPL_LINK_NOARG(ActualizeProgress, ClickCancelBtn)
467 : {
468 0 : pTheme->AbortActualize();
469 0 : EndDialog( RET_OK );
470 :
471 0 : return 0L;
472 : }
473 :
474 :
475 :
476 0 : IMPL_LINK( ActualizeProgress, TimeoutHdl, Timer*, _pTimer )
477 : {
478 0 : if ( _pTimer )
479 : {
480 0 : _pTimer->Stop();
481 0 : delete _pTimer;
482 : }
483 :
484 0 : pTheme->Actualize( LINK( this, ActualizeProgress, ActualizeHdl ), &aStatusProgress );
485 0 : ClickCancelBtn( NULL );
486 :
487 0 : return 0;
488 : }
489 :
490 :
491 :
492 0 : IMPL_LINK( ActualizeProgress, ActualizeHdl, INetURLObject*, pURL )
493 : {
494 0 : for( long i = 0; i < 128; i++ )
495 0 : Application::Reschedule();
496 :
497 0 : Flush();
498 0 : Sync();
499 :
500 0 : if( pURL )
501 : {
502 0 : m_pFtActualizeFile->SetText( GetReducedString( *pURL, 30 ) );
503 0 : m_pFtActualizeFile->Flush();
504 0 : m_pFtActualizeFile->Sync();
505 : }
506 :
507 0 : return 0;
508 : }
509 :
510 0 : TitleDialog::TitleDialog(vcl::Window* pParent, const OUString& rOldTitle)
511 0 : : ModalDialog(pParent, "GalleryTitleDialog", "cui/ui/gallerytitledialog.ui")
512 : {
513 0 : get(m_pEdit, "entry");
514 0 : m_pEdit->SetText( rOldTitle );
515 0 : m_pEdit->GrabFocus();
516 0 : }
517 :
518 :
519 : // - GalleryIdDialog -
520 :
521 :
522 0 : GalleryIdDialog::GalleryIdDialog( vcl::Window* pParent, GalleryTheme* _pThm )
523 : : ModalDialog(pParent, "GalleryThemeIDDialog", "cui/ui/gallerythemeiddialog.ui")
524 0 : , pThm(_pThm )
525 : {
526 0 : get(m_pBtnOk, "ok");
527 0 : get(m_pLbResName, "entry");
528 :
529 0 : m_pLbResName->InsertEntry( OUString( "!!! No Id !!!" ) );
530 :
531 0 : GalleryTheme::InsertAllThemes(*m_pLbResName);
532 :
533 0 : m_pLbResName->SelectEntryPos( (sal_uInt16) pThm->GetId() );
534 0 : m_pLbResName->GrabFocus();
535 :
536 0 : m_pBtnOk->SetClickHdl( LINK( this, GalleryIdDialog, ClickOkHdl ) );
537 0 : }
538 :
539 :
540 :
541 0 : IMPL_LINK_NOARG(GalleryIdDialog, ClickOkHdl)
542 : {
543 0 : Gallery* pGal = pThm->GetParent();
544 0 : const sal_uLong nId = GetId();
545 0 : bool bDifferentThemeExists = false;
546 :
547 0 : for( sal_uLong i = 0, nCount = pGal->GetThemeCount(); i < nCount && !bDifferentThemeExists; i++ )
548 : {
549 0 : const GalleryThemeEntry* pInfo = pGal->GetThemeInfo( i );
550 :
551 0 : if( ( pInfo->GetId() == nId ) && ( pInfo->GetThemeName() != pThm->GetName() ) )
552 : {
553 0 : OUString aStr( CUI_RES( RID_SVXSTR_GALLERY_ID_EXISTS ) );
554 :
555 0 : aStr += " (";
556 0 : aStr += pInfo->GetThemeName();
557 0 : aStr += ")";
558 :
559 0 : InfoBox aBox( this, aStr );
560 0 : aBox.Execute();
561 0 : m_pLbResName->GrabFocus();
562 0 : bDifferentThemeExists = true;
563 : }
564 : }
565 :
566 0 : if( !bDifferentThemeExists )
567 0 : EndDialog( RET_OK );
568 :
569 0 : return 0L;
570 : }
571 :
572 :
573 :
574 : // - GalleryThemeProperties -
575 :
576 :
577 0 : GalleryThemeProperties::GalleryThemeProperties(vcl::Window* pParent,
578 : ExchangeData* _pData, SfxItemSet* pItemSet)
579 : : SfxTabDialog( pParent, "GalleryThemeDialog",
580 : "cui/ui/gallerythemedialog.ui", pItemSet)
581 : , pData(_pData)
582 : , m_nGeneralPageId(0)
583 0 : , m_nFilesPageId(0)
584 : {
585 0 : m_nGeneralPageId = AddTabPage("general", TPGalleryThemeGeneral::Create, 0);
586 0 : m_nFilesPageId = AddTabPage("files", TPGalleryThemeProperties::Create, 0);
587 :
588 0 : if( pData->pTheme->IsReadOnly() )
589 0 : RemoveTabPage(m_nFilesPageId);
590 :
591 0 : OUString aText( GetText() );
592 :
593 0 : aText += pData->pTheme->GetName();
594 :
595 0 : if( pData->pTheme->IsReadOnly() )
596 0 : aText += CUI_RES( RID_SVXSTR_GALLERY_READONLY );
597 :
598 0 : SetText( aText );
599 0 : }
600 :
601 0 : void GalleryThemeProperties::PageCreated( sal_uInt16 nId, SfxTabPage &rPage )
602 : {
603 0 : if (nId == m_nGeneralPageId)
604 0 : static_cast<TPGalleryThemeGeneral&>( rPage ).SetXChgData( pData );
605 : else
606 0 : static_cast<TPGalleryThemeProperties&>( rPage ).SetXChgData( pData );
607 0 : }
608 :
609 : // - TPGalleryThemeGeneral -
610 0 : TPGalleryThemeGeneral::TPGalleryThemeGeneral(vcl::Window* pParent, const SfxItemSet& rSet)
611 : : SfxTabPage(pParent, "GalleryGeneralPage",
612 : "cui/ui/gallerygeneralpage.ui", &rSet)
613 0 : , pData(NULL)
614 : {
615 0 : get(m_pFiMSImage, "image");
616 0 : get(m_pEdtMSName, "name");
617 0 : get(m_pFtMSShowType, "type");
618 0 : get(m_pFtMSShowPath, "location");
619 0 : get(m_pFtMSShowContent, "contents");
620 0 : get(m_pFtMSShowChangeDate, "modified");
621 0 : }
622 :
623 0 : void TPGalleryThemeGeneral::SetXChgData( ExchangeData* _pData )
624 : {
625 0 : pData = _pData;
626 :
627 0 : GalleryTheme* pThm = pData->pTheme;
628 0 : OUString aOutStr( OUString::number(pThm->GetObjectCount()) );
629 0 : OUString aObjStr( CUI_RES( RID_SVXSTR_GALLERYPROPS_OBJECT ) );
630 0 : OUString aAccess;
631 0 : OUString aType( SVX_RES( RID_SVXSTR_GALLERYPROPS_GALTHEME ) );
632 0 : bool bReadOnly = pThm->IsReadOnly();
633 :
634 0 : m_pEdtMSName->SetText( pThm->GetName() );
635 0 : m_pEdtMSName->SetReadOnly( bReadOnly );
636 :
637 0 : if( bReadOnly )
638 0 : m_pEdtMSName->Disable();
639 : else
640 0 : m_pEdtMSName->Enable();
641 :
642 0 : if( pThm->IsReadOnly() )
643 0 : aType += CUI_RES( RID_SVXSTR_GALLERY_READONLY );
644 :
645 0 : m_pFtMSShowType->SetText( aType );
646 0 : m_pFtMSShowPath->SetText( pThm->GetSdgURL().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) );
647 :
648 : // singular or plural?
649 0 : if ( 1 == pThm->GetObjectCount() )
650 0 : aObjStr = aObjStr.getToken( 0, ';' );
651 : else
652 0 : aObjStr = aObjStr.getToken( 1, ';' );
653 :
654 0 : aOutStr += " " + aObjStr;
655 :
656 0 : m_pFtMSShowContent->SetText( aOutStr );
657 :
658 : // get locale wrapper (singleton)
659 0 : const SvtSysLocale aSysLocale;
660 0 : const LocaleDataWrapper& aLocaleData = aSysLocale.GetLocaleData();
661 :
662 : // ChangeDate/Time
663 0 : aAccess = aLocaleData.getDate( pData->aThemeChangeDate ) + ", " + aLocaleData.getTime( pData->aThemeChangeTime );
664 0 : m_pFtMSShowChangeDate->SetText( aAccess );
665 :
666 : // set image
667 : sal_uInt16 nId;
668 :
669 0 : if( pThm->IsReadOnly() )
670 0 : nId = RID_SVXBMP_THEME_READONLY_BIG;
671 0 : else if( pThm->IsDefault() )
672 0 : nId = RID_SVXBMP_THEME_DEFAULT_BIG;
673 : else
674 0 : nId = RID_SVXBMP_THEME_NORMAL_BIG;
675 :
676 0 : m_pFiMSImage->SetImage( Image( Bitmap( CUI_RES( nId ) ), COL_LIGHTMAGENTA ) );
677 0 : }
678 :
679 :
680 :
681 0 : bool TPGalleryThemeGeneral::FillItemSet( SfxItemSet* /*rSet*/ )
682 : {
683 0 : pData->aEditedTitle = m_pEdtMSName->GetText();
684 0 : return true;
685 : }
686 :
687 :
688 :
689 0 : SfxTabPage* TPGalleryThemeGeneral::Create( vcl::Window* pParent, const SfxItemSet* rSet )
690 : {
691 0 : return new TPGalleryThemeGeneral( pParent, *rSet );
692 : }
693 :
694 : // - TPGalleryThemeProperties -
695 0 : TPGalleryThemeProperties::TPGalleryThemeProperties( vcl::Window* pWindow, const SfxItemSet& rSet )
696 : : SfxTabPage(pWindow, "GalleryFilesPage", "cui/ui/galleryfilespage.ui", &rSet)
697 : , pData(NULL)
698 : , nCurFilterPos(0)
699 : , nFirstExtFilterPos(0)
700 : , bEntriesFound(false)
701 : , bInputAllowed(true)
702 : , bTakeAll(false)
703 : , bSearchRecursive(false)
704 0 : , xDialogListener(new ::svt::DialogClosedListener())
705 : {
706 0 : get(m_pCbbFileType, "filetype");
707 0 : get(m_pLbxFound, "files");
708 0 : Size aSize(LogicToPixel(Size(172, 156), MAP_APPFONT));
709 0 : m_pLbxFound->set_width_request(aSize.Width());
710 0 : m_pLbxFound->set_height_request(aSize.Height());
711 0 : m_pLbxFound->EnableMultiSelection(true);
712 0 : get(m_pBtnSearch, "findfiles");
713 0 : get(m_pBtnTake, "add");
714 0 : get(m_pBtnTakeAll, "addall");
715 0 : get(m_pCbxPreview, "preview");
716 0 : get(m_pWndPreview, "image");
717 :
718 0 : xDialogListener->SetDialogClosedLink( LINK( this, TPGalleryThemeProperties, DialogClosedHdl ) );
719 0 : }
720 :
721 0 : void TPGalleryThemeProperties::SetXChgData( ExchangeData* _pData )
722 : {
723 0 : pData = _pData;
724 :
725 0 : aPreviewTimer.SetTimeoutHdl( LINK( this, TPGalleryThemeProperties, PreviewTimerHdl ) );
726 0 : aPreviewTimer.SetTimeout( 500 );
727 0 : m_pBtnSearch->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickSearchHdl));
728 0 : m_pBtnTake->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeHdl));
729 0 : m_pBtnTakeAll->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeAllHdl));
730 0 : m_pCbxPreview->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl));
731 0 : m_pCbbFileType->SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl));
732 0 : m_pCbbFileType->EnableDDAutoWidth( false );
733 0 : m_pLbxFound->SetDoubleClickHdl(LINK(this, TPGalleryThemeProperties, DClickFoundHdl));
734 0 : m_pLbxFound->SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFoundHdl));
735 0 : m_pLbxFound->InsertEntry(OUString(CUI_RES(RID_SVXSTR_GALLERY_NOFILES)));
736 0 : m_pLbxFound->Show();
737 :
738 0 : FillFilterList();
739 :
740 0 : m_pBtnTake->Enable();
741 0 : m_pBtnTakeAll->Disable();
742 0 : m_pCbxPreview->Disable();
743 0 : }
744 :
745 :
746 :
747 0 : void TPGalleryThemeProperties::StartSearchFiles( const OUString& _rFolderURL, short _nDlgResult )
748 : {
749 0 : if ( RET_OK == _nDlgResult )
750 : {
751 0 : aURL = INetURLObject( _rFolderURL );
752 0 : bSearchRecursive = true; // UI choice no longer possible, windows file picker allows no user controls
753 0 : SearchFiles();
754 : }
755 :
756 0 : nCurFilterPos = m_pCbbFileType->GetEntryPos( m_pCbbFileType->GetText() );
757 0 : }
758 :
759 :
760 :
761 0 : TPGalleryThemeProperties::~TPGalleryThemeProperties()
762 : {
763 0 : xMediaPlayer.clear();
764 0 : xDialogListener.clear();
765 :
766 0 : for ( size_t i = 0, n = aFilterEntryList.size(); i < n; ++i ) {
767 0 : delete aFilterEntryList[ i ];
768 : }
769 0 : }
770 :
771 :
772 :
773 0 : SfxTabPage* TPGalleryThemeProperties::Create( vcl::Window* pParent, const SfxItemSet* rSet )
774 : {
775 0 : return new TPGalleryThemeProperties( pParent, *rSet );
776 : }
777 :
778 :
779 :
780 0 : OUString TPGalleryThemeProperties::addExtension( const OUString& _rDisplayText, const OUString& _rExtension )
781 : {
782 0 : OUString sAllFilter( "(*.*)" );
783 0 : OUString sOpenBracket( " (" );
784 0 : OUString sCloseBracket( ")" );
785 0 : OUString sRet = _rDisplayText;
786 :
787 0 : if ( sRet.indexOf( sAllFilter ) == -1 )
788 : {
789 0 : OUString sExt = _rExtension;
790 0 : sRet += sOpenBracket;
791 0 : sRet += sExt;
792 0 : sRet += sCloseBracket;
793 : }
794 0 : return sRet;
795 : }
796 :
797 :
798 :
799 0 : void TPGalleryThemeProperties::FillFilterList()
800 : {
801 0 : GraphicFilter &rFilter = GraphicFilter::GetGraphicFilter();
802 0 : OUString aExt;
803 0 : OUString aName;
804 : FilterEntry* pFilterEntry;
805 : FilterEntry* pTestEntry;
806 : sal_uInt16 i, nKeyCount;
807 : bool bInList;
808 :
809 : // graphic filters
810 0 : for( i = 0, nKeyCount = rFilter.GetImportFormatCount(); i < nKeyCount; i++ )
811 : {
812 0 : aExt = rFilter.GetImportFormatShortName( i );
813 0 : aName = rFilter.GetImportFormatName( i );
814 0 : size_t entryIndex = 0;
815 0 : pTestEntry = aFilterEntryList.empty() ? NULL : aFilterEntryList[ entryIndex ];
816 0 : bInList = false;
817 :
818 0 : OUString aExtensions;
819 0 : int j = 0;
820 0 : OUString sWildcard;
821 : while( true )
822 : {
823 0 : sWildcard = rFilter.GetImportWildcard( i, j++ );
824 0 : if ( sWildcard.isEmpty() )
825 0 : break;
826 0 : if ( aExtensions.indexOf( sWildcard ) == -1 )
827 : {
828 0 : if ( !aExtensions.isEmpty() )
829 0 : aExtensions += ";";
830 0 : aExtensions += sWildcard;
831 : }
832 : }
833 0 : aName = addExtension( aName, aExtensions );
834 :
835 0 : while( pTestEntry )
836 : {
837 0 : if ( pTestEntry->aFilterName == aExt )
838 : {
839 0 : bInList = true;
840 0 : break;
841 : }
842 0 : pTestEntry = ( ++entryIndex < aFilterEntryList.size() )
843 0 : ? aFilterEntryList[ entryIndex ] : NULL;
844 : }
845 0 : if ( !bInList )
846 : {
847 0 : pFilterEntry = new FilterEntry;
848 0 : pFilterEntry->aFilterName = aExt;
849 0 : size_t pos = m_pCbbFileType->InsertEntry( aName );
850 0 : if ( pos < aFilterEntryList.size() ) {
851 0 : aFilterEntryList.insert( aFilterEntryList.begin() + pos, pFilterEntry );
852 : } else {
853 0 : aFilterEntryList.push_back( pFilterEntry );
854 : }
855 : }
856 0 : }
857 :
858 : // media filters
859 0 : static const OUString aWildcard( "*." );
860 0 : ::avmedia::FilterNameVector aFilters;
861 0 : ::avmedia::MediaWindow::getMediaFilters( aFilters );
862 :
863 0 : for( unsigned long l = 0; l < aFilters.size(); ++l )
864 : {
865 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
866 : {
867 0 : OUString aFilterWildcard( aWildcard );
868 :
869 0 : pFilterEntry = new FilterEntry;
870 0 : pFilterEntry->aFilterName = aFilters[ l ].second.getToken( 0, ';', nIndex );
871 : nFirstExtFilterPos = m_pCbbFileType->InsertEntry(
872 : addExtension(
873 0 : aFilters[ l ].first,
874 0 : aFilterWildcard += pFilterEntry->aFilterName
875 : )
876 0 : );
877 0 : if ( nFirstExtFilterPos < aFilterEntryList.size() ) {
878 : aFilterEntryList.insert(
879 0 : aFilterEntryList.begin() + nFirstExtFilterPos,
880 : pFilterEntry
881 0 : );
882 : } else {
883 0 : aFilterEntryList.push_back( pFilterEntry );
884 : }
885 0 : }
886 : }
887 :
888 : // 'All' filters
889 0 : OUString aExtensions;
890 :
891 : // graphic filters
892 0 : for ( i = 0; i < nKeyCount; ++i )
893 : {
894 0 : int j = 0;
895 0 : OUString sWildcard;
896 : while( true )
897 : {
898 0 : sWildcard = rFilter.GetImportWildcard( i, j++ );
899 0 : if ( sWildcard.isEmpty() )
900 0 : break;
901 0 : if ( aExtensions.indexOf( sWildcard ) == -1 )
902 : {
903 0 : if ( !aExtensions.isEmpty() )
904 0 : aExtensions += ";";
905 :
906 0 : aExtensions += sWildcard;
907 : }
908 : }
909 0 : }
910 :
911 : // media filters
912 0 : for( unsigned long k = 0; k < aFilters.size(); ++k )
913 : {
914 0 : for( sal_Int32 nIndex = 0; nIndex >= 0; )
915 : {
916 0 : if ( !aExtensions.isEmpty() )
917 0 : aExtensions += ";";
918 0 : aExtensions += aWildcard + aFilters[ k ].second.getToken( 0, ';', nIndex );
919 : }
920 : }
921 :
922 : #if defined(WNT)
923 : if (aExtensions.getLength() > 240)
924 : aExtensions = "*.*";
925 : #endif
926 :
927 0 : pFilterEntry = new FilterEntry;
928 0 : pFilterEntry->aFilterName = CUI_RESSTR(RID_SVXSTR_GALLERY_ALLFILES);
929 0 : pFilterEntry->aFilterName = addExtension( pFilterEntry->aFilterName, aExtensions );
930 0 : size_t pos = m_pCbbFileType->InsertEntry( pFilterEntry->aFilterName, 0 );
931 0 : if ( pos < aFilterEntryList.size() ) {
932 0 : aFilterEntryList.insert( aFilterEntryList.begin() + pos, pFilterEntry );
933 : } else {
934 0 : aFilterEntryList.push_back( pFilterEntry );
935 : }
936 0 : m_pCbbFileType->SetText( pFilterEntry->aFilterName );
937 0 : }
938 :
939 :
940 :
941 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFileTypeHdl)
942 : {
943 0 : OUString aText( m_pCbbFileType->GetText() );
944 :
945 0 : if( bInputAllowed && ( aLastFilterName != aText ) )
946 : {
947 0 : aLastFilterName = aText;
948 :
949 0 : if( MessageDialog( this, "QueryUpdateFileListDialog","cui/ui/queryupdategalleryfilelistdialog.ui" ).Execute() == RET_YES )
950 0 : SearchFiles();
951 : }
952 :
953 0 : return 0L;
954 : }
955 :
956 :
957 :
958 0 : void TPGalleryThemeProperties::SearchFiles()
959 : {
960 0 : SearchProgress* pProgress = new SearchProgress( this, aURL );
961 :
962 0 : aFoundList.clear();
963 0 : m_pLbxFound->Clear();
964 :
965 0 : pProgress->SetFileType( m_pCbbFileType->GetText() );
966 0 : pProgress->SetDirectory( INetURLObject() );
967 0 : pProgress->Update();
968 :
969 0 : pProgress->StartExecuteModal( LINK( this, TPGalleryThemeProperties, EndSearchProgressHdl ) );
970 0 : }
971 :
972 :
973 :
974 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickSearchHdl)
975 : {
976 0 : if( bInputAllowed )
977 : {
978 : try
979 : {
980 : // setup folder picker
981 0 : com::sun::star::uno::Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
982 0 : xFolderPicker = FolderPicker::create(xContext);
983 :
984 0 : OUString aDlgPathName( SvtPathOptions().GetGraphicPath() );
985 0 : xFolderPicker->setDisplayDirectory(aDlgPathName);
986 :
987 0 : aPreviewTimer.Stop();
988 :
989 0 : com::sun::star::uno::Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY );
990 0 : if ( xAsyncDlg.is() )
991 0 : xAsyncDlg->startExecuteModal( xDialogListener.get() );
992 : else
993 : {
994 0 : if( xFolderPicker->execute() == RET_OK )
995 : {
996 0 : aURL = INetURLObject( xFolderPicker->getDirectory() );
997 0 : bSearchRecursive = true; // UI choice no longer possible, windows file picker allows no user controls
998 0 : SearchFiles();
999 : }
1000 :
1001 0 : nCurFilterPos = m_pCbbFileType->GetEntryPos( m_pCbbFileType->GetText() );
1002 0 : }
1003 : }
1004 0 : catch (const IllegalArgumentException&)
1005 : {
1006 : OSL_FAIL( "Folder picker failed with illegal arguments" );
1007 : }
1008 : }
1009 :
1010 0 : return 0L;
1011 : }
1012 :
1013 :
1014 :
1015 0 : void TPGalleryThemeProperties::TakeFiles()
1016 : {
1017 0 : if( m_pLbxFound->GetSelectEntryCount() || ( bTakeAll && bEntriesFound ) )
1018 : {
1019 0 : TakeProgress* pTakeProgress = new TakeProgress( this );
1020 0 : pTakeProgress->Update();
1021 :
1022 : pTakeProgress->StartExecuteModal(
1023 : Link() /* no postprocessing needed, pTakeProgress
1024 0 : will be deleted in TakeProgress::CleanupHdl */ );
1025 : }
1026 0 : }
1027 :
1028 :
1029 :
1030 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickPreviewHdl)
1031 : {
1032 0 : if ( bInputAllowed )
1033 : {
1034 0 : aPreviewTimer.Stop();
1035 0 : aPreviewString = "";
1036 :
1037 0 : if( !m_pCbxPreview->IsChecked() )
1038 : {
1039 0 : xMediaPlayer.clear();
1040 0 : m_pWndPreview->SetGraphic( Graphic() );
1041 0 : m_pWndPreview->Invalidate();
1042 : }
1043 : else
1044 0 : DoPreview();
1045 : }
1046 :
1047 0 : return 0;
1048 : }
1049 :
1050 :
1051 :
1052 0 : void TPGalleryThemeProperties::DoPreview()
1053 : {
1054 0 : OUString aString( m_pLbxFound->GetSelectEntry() );
1055 :
1056 0 : if( aString != aPreviewString )
1057 : {
1058 0 : INetURLObject _aURL( aFoundList[ m_pLbxFound->GetEntryPos( aString ) ] );
1059 0 : bInputAllowed = false;
1060 :
1061 0 : if ( !m_pWndPreview->SetGraphic( _aURL ) )
1062 : {
1063 0 : GetParent()->LeaveWait();
1064 0 : ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTSPATH );
1065 0 : GetParent()->EnterWait();
1066 : }
1067 0 : else if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), "" ) )
1068 : {
1069 0 : xMediaPlayer = ::avmedia::MediaWindow::createPlayer( _aURL.GetMainURL( INetURLObject::NO_DECODE ), "" );
1070 0 : if( xMediaPlayer.is() )
1071 0 : xMediaPlayer->start();
1072 : }
1073 :
1074 0 : bInputAllowed = true;
1075 0 : aPreviewString = aString;
1076 0 : }
1077 0 : }
1078 :
1079 :
1080 :
1081 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeHdl)
1082 : {
1083 0 : if( bInputAllowed )
1084 : {
1085 0 : aPreviewTimer.Stop();
1086 :
1087 0 : if( !m_pLbxFound->GetSelectEntryCount() || !bEntriesFound )
1088 : {
1089 0 : SvxOpenGraphicDialog aDlg("Gallery");
1090 0 : aDlg.EnableLink(false);
1091 0 : aDlg.AsLink(false);
1092 :
1093 0 : if( !aDlg.Execute() )
1094 0 : pData->pTheme->InsertURL( INetURLObject( aDlg.GetPath() ) );
1095 : }
1096 : else
1097 : {
1098 0 : bTakeAll = false;
1099 0 : TakeFiles();
1100 : }
1101 : }
1102 :
1103 0 : return 0L;
1104 : }
1105 :
1106 :
1107 :
1108 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeAllHdl)
1109 : {
1110 0 : if( bInputAllowed )
1111 : {
1112 0 : aPreviewTimer.Stop();
1113 0 : bTakeAll = true;
1114 0 : TakeFiles();
1115 : }
1116 :
1117 0 : return 0L;
1118 : }
1119 :
1120 :
1121 :
1122 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFoundHdl)
1123 : {
1124 0 : if( bInputAllowed )
1125 : {
1126 0 : bool bPreviewPossible = false;
1127 :
1128 0 : aPreviewTimer.Stop();
1129 :
1130 0 : if( bEntriesFound )
1131 : {
1132 0 : if( m_pLbxFound->GetSelectEntryCount() == 1 )
1133 : {
1134 0 : m_pCbxPreview->Enable();
1135 0 : bPreviewPossible = true;
1136 : }
1137 : else
1138 0 : m_pCbxPreview->Disable();
1139 :
1140 0 : if( !aFoundList.empty() )
1141 0 : m_pBtnTakeAll->Enable();
1142 : else
1143 0 : m_pBtnTakeAll->Disable();
1144 : }
1145 :
1146 0 : if( bPreviewPossible && m_pCbxPreview->IsChecked() )
1147 0 : aPreviewTimer.Start();
1148 : }
1149 :
1150 0 : return 0;
1151 : }
1152 :
1153 :
1154 :
1155 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, DClickFoundHdl)
1156 : {
1157 0 : if( bInputAllowed )
1158 : {
1159 0 : aPreviewTimer.Stop();
1160 :
1161 0 : return (m_pLbxFound->GetSelectEntryCount() == 1 && bEntriesFound) ?
1162 0 : ClickTakeHdl(NULL) : 0;
1163 : }
1164 : else
1165 0 : return 0;
1166 : }
1167 :
1168 :
1169 :
1170 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, PreviewTimerHdl)
1171 : {
1172 0 : aPreviewTimer.Stop();
1173 0 : DoPreview();
1174 0 : return 0L;
1175 : }
1176 :
1177 :
1178 :
1179 0 : IMPL_LINK_NOARG(TPGalleryThemeProperties, EndSearchProgressHdl)
1180 : {
1181 0 : if( !aFoundList.empty() )
1182 : {
1183 0 : m_pLbxFound->SelectEntryPos( 0 );
1184 0 : m_pBtnTakeAll->Enable();
1185 0 : m_pCbxPreview->Enable();
1186 0 : bEntriesFound = true;
1187 : }
1188 : else
1189 : {
1190 0 : m_pLbxFound->InsertEntry( OUString( CUI_RES( RID_SVXSTR_GALLERY_NOFILES ) ) );
1191 0 : m_pBtnTakeAll->Disable();
1192 0 : m_pCbxPreview->Disable();
1193 0 : bEntriesFound = false;
1194 : }
1195 0 : return 0L;
1196 : }
1197 :
1198 :
1199 :
1200 0 : IMPL_LINK( TPGalleryThemeProperties, DialogClosedHdl, ::com::sun::star::ui::dialogs::DialogClosedEvent*, pEvt )
1201 : {
1202 : DBG_ASSERT( xFolderPicker.is(), "TPGalleryThemeProperties::DialogClosedHdl(): no folder picker" );
1203 :
1204 0 : OUString sURL = xFolderPicker->getDirectory();
1205 0 : StartSearchFiles( sURL, pEvt->DialogResult );
1206 :
1207 0 : return 0L;
1208 0 : }
1209 :
1210 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|