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 <comphelper/processfactory.hxx>
23 : #include <comphelper/string.hxx>
24 : #include <osl/thread.h>
25 : #include <tools/vcompat.hxx>
26 : #include <ucbhelper/content.hxx>
27 : #include <unotools/ucbstreamhelper.hxx>
28 : #include <unotools/pathoptions.hxx>
29 : #include <sfx2/docfile.hxx>
30 : #include "svx/gallery.hxx"
31 : #include "gallery.hrc"
32 : #include "svx/galmisc.hxx"
33 : #include "svx/galtheme.hxx"
34 : #include "svx/gallery1.hxx"
35 : #include <com/sun/star/sdbc/XResultSet.hpp>
36 : #include <com/sun/star/ucb/XContentAccess.hpp>
37 :
38 : // - Namespaces -
39 :
40 : using namespace ::rtl;
41 : using namespace ::com::sun::star;
42 :
43 : // - GalleryThemeEntry -
44 :
45 0 : static bool FileExists( const INetURLObject &rURL, const rtl::OUString &rExt )
46 : {
47 0 : INetURLObject aURL( rURL );
48 0 : aURL.setExtension( rExt );
49 0 : return FileExists( aURL );
50 : }
51 :
52 0 : GalleryThemeEntry::GalleryThemeEntry( bool bCreateUniqueURL,
53 : const INetURLObject& rBaseURL, const OUString& rName,
54 : bool _bReadOnly, bool _bNewFile,
55 : sal_uInt32 _nId, bool _bThemeNameFromResource ) :
56 : nId ( _nId ),
57 : bReadOnly ( _bReadOnly ),
58 0 : bThemeNameFromResource ( _bThemeNameFromResource )
59 : {
60 0 : INetURLObject aURL( rBaseURL );
61 : DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
62 :
63 0 : if (bCreateUniqueURL)
64 : {
65 0 : INetURLObject aBaseNoCase( ImplGetURLIgnoreCase( rBaseURL ) );
66 0 : aURL = aBaseNoCase;
67 : static sal_Int32 nIdx = 0;
68 0 : while( FileExists( aURL, "thm" ) )
69 : { // create new URLs
70 0 : nIdx++;
71 0 : aURL = aBaseNoCase;
72 0 : aURL.setName( aURL.getName() + OUString::number(nIdx));
73 0 : }
74 : }
75 :
76 0 : aURL.setExtension( "thm" );
77 0 : aThmURL = ImplGetURLIgnoreCase( aURL );
78 :
79 0 : aURL.setExtension( "sdg" );
80 0 : aSdgURL = ImplGetURLIgnoreCase( aURL );
81 :
82 0 : aURL.setExtension( "sdv" );
83 0 : aSdvURL = ImplGetURLIgnoreCase( aURL );
84 :
85 0 : aURL.setExtension( "str" );
86 0 : aStrURL = ImplGetURLIgnoreCase( aURL );
87 :
88 0 : SetModified( _bNewFile );
89 :
90 0 : aName = ReadStrFromIni( "name" );
91 :
92 : // This is awful - we shouldn't use these resources if we
93 : // possibly can avoid them
94 0 : if( aName.isEmpty() && nId && bThemeNameFromResource )
95 0 : aName = GAL_RESSTR( RID_GALLERYSTR_THEME_START + (sal_uInt16) nId );
96 :
97 0 : if( aName.isEmpty() )
98 0 : aName = rName;
99 0 : }
100 :
101 0 : INetURLObject GalleryThemeEntry::ImplGetURLIgnoreCase( const INetURLObject& rURL ) const
102 : {
103 0 : INetURLObject aURL( rURL );
104 :
105 : // check original file name
106 0 : if( !FileExists( aURL ) )
107 : {
108 : // check upper case file name
109 0 : aURL.setName( aURL.getName().toAsciiUpperCase() );
110 :
111 0 : if(!FileExists( aURL ) )
112 : {
113 : // check lower case file name
114 0 : aURL.setName( aURL.getName().toAsciiLowerCase() );
115 : }
116 : }
117 :
118 0 : return aURL;
119 : }
120 :
121 0 : void GalleryThemeEntry::SetName( const OUString& rNewName )
122 : {
123 0 : if( aName != rNewName )
124 : {
125 0 : aName = rNewName;
126 0 : SetModified( true );
127 0 : bThemeNameFromResource = false;
128 : }
129 0 : }
130 :
131 0 : void GalleryThemeEntry::SetId( sal_uInt32 nNewId, bool bResetThemeName )
132 : {
133 0 : nId = nNewId;
134 0 : SetModified( true );
135 0 : bThemeNameFromResource = ( nId && bResetThemeName );
136 0 : }
137 :
138 : // - GalleryThemeCacheEntry -
139 :
140 : class GalleryThemeCacheEntry
141 : {
142 : private:
143 :
144 : const GalleryThemeEntry* mpThemeEntry;
145 : GalleryTheme* mpTheme;
146 :
147 : public:
148 :
149 0 : GalleryThemeCacheEntry( const GalleryThemeEntry* pThemeEntry, GalleryTheme* pTheme ) :
150 0 : mpThemeEntry( pThemeEntry ), mpTheme( pTheme ) {}
151 0 : ~GalleryThemeCacheEntry() { delete mpTheme; }
152 :
153 0 : const GalleryThemeEntry* GetThemeEntry() const { return mpThemeEntry; }
154 0 : GalleryTheme* GetTheme() const { return mpTheme; }
155 : };
156 :
157 : // - Gallery -
158 :
159 0 : Gallery::Gallery( const OUString& rMultiPath )
160 0 : : nReadTextEncoding ( osl_getThreadTextEncoding() )
161 0 : , bMultiPath ( false )
162 : {
163 0 : ImplLoad( rMultiPath );
164 0 : }
165 :
166 0 : Gallery::~Gallery()
167 : {
168 : // erase theme list
169 0 : for ( size_t i = 0, n = aThemeList.size(); i < n; ++i )
170 0 : delete aThemeList[ i ];
171 0 : aThemeList.clear();
172 0 : }
173 :
174 0 : Gallery* Gallery::GetGalleryInstance()
175 : {
176 : static Gallery* pGallery = NULL;
177 :
178 0 : if( !pGallery )
179 : {
180 0 : ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
181 0 : if( !pGallery )
182 : {
183 0 : pGallery = new Gallery( SvtPathOptions().GetGalleryPath() );
184 0 : }
185 : }
186 :
187 0 : return pGallery;
188 : }
189 :
190 0 : void Gallery::ImplLoad( const OUString& rMultiPath )
191 : {
192 0 : const sal_Int32 nTokenCount = comphelper::string::getTokenCount(rMultiPath, ';');
193 : bool bIsReadOnlyDir;
194 :
195 0 : bMultiPath = ( nTokenCount > 0 );
196 :
197 0 : INetURLObject aCurURL(SvtPathOptions().GetConfigPath());
198 0 : ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
199 :
200 0 : if( !bIsReadOnlyDir )
201 0 : aUserURL = aCurURL;
202 :
203 0 : if( bMultiPath )
204 : {
205 0 : aRelURL = INetURLObject( comphelper::string::getToken(rMultiPath, 0, ';') );
206 :
207 0 : for( sal_Int32 i = 0; i < nTokenCount; ++i )
208 : {
209 0 : aCurURL = INetURLObject(comphelper::string::getToken(rMultiPath, i, ';'));
210 :
211 0 : ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
212 :
213 0 : if( !bIsReadOnlyDir )
214 0 : aUserURL = aCurURL;
215 : }
216 : }
217 : else
218 0 : aRelURL = INetURLObject( rMultiPath );
219 :
220 : DBG_ASSERT( aUserURL.GetProtocol() != INET_PROT_NOT_VALID, "no writable Gallery user directory available" );
221 0 : DBG_ASSERT( aRelURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
222 0 : }
223 :
224 0 : void Gallery::ImplLoadSubDirs( const INetURLObject& rBaseURL, bool& rbDirIsReadOnly )
225 : {
226 0 : rbDirIsReadOnly = false;
227 :
228 : try
229 : {
230 0 : uno::Reference< ucb::XCommandEnvironment > xEnv;
231 0 : ::ucbhelper::Content aCnt( rBaseURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
232 :
233 0 : uno::Sequence< OUString > aProps( 1 );
234 0 : aProps.getArray()[ 0 ] = "Url";
235 :
236 0 : uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
237 :
238 : try
239 : {
240 : // check readonlyness the very hard way
241 0 : INetURLObject aTestURL( rBaseURL );
242 0 : OUString aTestFile( "cdefghij.klm" );
243 :
244 0 : aTestURL.Append( aTestFile );
245 0 : SvStream* pTestStm = ::utl::UcbStreamHelper::CreateStream( aTestURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
246 :
247 0 : if( pTestStm )
248 : {
249 0 : pTestStm->WriteInt32( sal_Int32(1) );
250 :
251 0 : if( pTestStm->GetError() )
252 0 : rbDirIsReadOnly = true;
253 :
254 0 : delete pTestStm;
255 0 : KillFile( aTestURL );
256 : }
257 : else
258 0 : rbDirIsReadOnly = true;
259 : }
260 0 : catch( const ucb::ContentCreationException& )
261 : {
262 : }
263 0 : catch( const uno::RuntimeException& )
264 : {
265 : }
266 0 : catch( const uno::Exception& )
267 : {
268 : }
269 :
270 0 : if( xResultSet.is() )
271 : {
272 0 : uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
273 :
274 0 : if( xContentAccess.is() )
275 : {
276 0 : static const OUString s_sTitle("Title");
277 0 : static const OUString s_sIsReadOnly("IsReadOnly");
278 0 : static const OUString s_sSDG_EXT("sdg");
279 0 : static const OUString s_sSDV_EXT("sdv");
280 :
281 0 : while( xResultSet->next() )
282 : {
283 0 : INetURLObject aThmURL( xContentAccess->queryContentIdentifierString() );
284 :
285 0 : if(aThmURL.GetExtension().equalsIgnoreAsciiCase("thm"))
286 : {
287 0 : INetURLObject aSdgURL( aThmURL); aSdgURL.SetExtension( s_sSDG_EXT );
288 0 : INetURLObject aSdvURL( aThmURL ); aSdvURL.SetExtension( s_sSDV_EXT );
289 0 : OUString aTitle;
290 0 : sal_Bool bReadOnly = sal_False;
291 :
292 : try
293 : {
294 0 : ::ucbhelper::Content aThmCnt( aThmURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
295 0 : ::ucbhelper::Content aSdgCnt( aSdgURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
296 0 : ::ucbhelper::Content aSdvCnt( aSdvURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
297 :
298 : try
299 : {
300 0 : aThmCnt.getPropertyValue( s_sTitle ) >>= aTitle;
301 : }
302 0 : catch( const uno::RuntimeException& )
303 : {
304 : }
305 0 : catch( const uno::Exception& )
306 : {
307 : }
308 :
309 0 : if( !aTitle.isEmpty() )
310 : {
311 : try
312 : {
313 0 : aThmCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
314 : }
315 0 : catch( const uno::RuntimeException& )
316 : {
317 : }
318 0 : catch( const uno::Exception& )
319 : {
320 : }
321 :
322 0 : if( !bReadOnly )
323 : {
324 : try
325 : {
326 0 : aSdgCnt.getPropertyValue( s_sTitle ) >>= aTitle;
327 : }
328 0 : catch( const ::com::sun::star::uno::RuntimeException& )
329 : {
330 : }
331 0 : catch( const ::com::sun::star::uno::Exception& )
332 : {
333 : }
334 :
335 0 : if( !aTitle.isEmpty() )
336 : {
337 : try
338 : {
339 0 : aSdgCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
340 : }
341 0 : catch( const uno::RuntimeException& )
342 : {
343 : }
344 0 : catch( const uno::Exception& )
345 : {
346 : }
347 : }
348 : }
349 :
350 0 : if( !bReadOnly )
351 : {
352 : try
353 : {
354 0 : aSdvCnt.getPropertyValue( s_sTitle ) >>= aTitle;
355 : }
356 0 : catch( const ::com::sun::star::uno::RuntimeException& )
357 : {
358 : }
359 0 : catch( const ::com::sun::star::uno::Exception& )
360 : {
361 : }
362 :
363 0 : if( !aTitle.isEmpty() )
364 : {
365 : try
366 : {
367 0 : aSdvCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
368 : }
369 0 : catch( const uno::RuntimeException& )
370 : {
371 : }
372 0 : catch( const uno::Exception& )
373 : {
374 : }
375 : }
376 : }
377 :
378 0 : GalleryThemeEntry* pEntry = GalleryTheme::CreateThemeEntry( aThmURL, rbDirIsReadOnly || bReadOnly );
379 :
380 0 : if( pEntry )
381 0 : aThemeList.push_back( pEntry );
382 0 : }
383 : }
384 0 : catch( const ucb::ContentCreationException& )
385 : {
386 : }
387 0 : catch( const uno::RuntimeException& )
388 : {
389 : }
390 0 : catch( const uno::Exception& )
391 : {
392 0 : }
393 : }
394 0 : }
395 0 : }
396 0 : }
397 : }
398 0 : catch( const ucb::ContentCreationException& )
399 : {
400 : }
401 0 : catch( const uno::RuntimeException& )
402 : {
403 : }
404 0 : catch( const uno::Exception& )
405 : {
406 : }
407 0 : }
408 :
409 0 : GalleryThemeEntry* Gallery::ImplGetThemeEntry( const OUString& rThemeName )
410 : {
411 0 : GalleryThemeEntry* pFound = NULL;
412 :
413 0 : if( !rThemeName.isEmpty() )
414 : {
415 0 : for ( size_t i = 0, n = aThemeList.size(); i < n && !pFound; ++i )
416 0 : if( rThemeName == aThemeList[ i ]->GetThemeName() )
417 0 : pFound = aThemeList[ i ];
418 : }
419 :
420 0 : return pFound;
421 : }
422 :
423 0 : OUString Gallery::GetThemeName( sal_uIntPtr nThemeId ) const
424 : {
425 0 : GalleryThemeEntry* pFound = NULL;
426 :
427 0 : for ( size_t i = 0, n = aThemeList.size(); i < n && !pFound; ++i )
428 : {
429 0 : GalleryThemeEntry* pEntry = aThemeList[ i ];
430 0 : if( nThemeId == pEntry->GetId() )
431 0 : pFound = pEntry;
432 : }
433 :
434 : // try fallback, if no entry was found
435 0 : if( !pFound )
436 : {
437 0 : OString aFallback;
438 :
439 0 : switch( nThemeId )
440 : {
441 : case( GALLERY_THEME_3D ):
442 0 : aFallback = "3D";
443 0 : break;
444 : case( GALLERY_THEME_BULLETS ):
445 0 : aFallback = "Bullets";
446 0 : break;
447 : case( GALLERY_THEME_HOMEPAGE ):
448 0 : aFallback = "Homepage";
449 0 : break;
450 : case( GALLERY_THEME_POWERPOINT ):
451 0 : aFallback = "private://gallery/hidden/imgppt";
452 0 : break;
453 : case( GALLERY_THEME_FONTWORK ):
454 0 : aFallback = "private://gallery/hidden/fontwork";
455 0 : break;
456 : case( GALLERY_THEME_FONTWORK_VERTICAL ):
457 0 : aFallback = "private://gallery/hidden/fontworkvertical";
458 0 : break;
459 : case( GALLERY_THEME_SOUNDS ):
460 0 : aFallback = "Sounds";
461 0 : break;
462 : case( RID_GALLERYSTR_THEME_ARROWS ):
463 0 : aFallback = "Arrows";
464 0 : break;
465 : case( RID_GALLERYSTR_THEME_COMPUTERS ):
466 0 : aFallback = "Computers";
467 0 : break;
468 : case( RID_GALLERYSTR_THEME_DIAGRAMS ):
469 0 : aFallback = "Diagrams";
470 0 : break;
471 : case( RID_GALLERYSTR_THEME_EDUCATION ):
472 0 : aFallback = "Education";
473 0 : break;
474 : case( RID_GALLERYSTR_THEME_ENVIRONMENT ):
475 0 : aFallback = "Environment";
476 0 : break;
477 : case( RID_GALLERYSTR_THEME_FINANCE ):
478 0 : aFallback = "Finance";
479 0 : break;
480 : case( RID_GALLERYSTR_THEME_PEOPLE ):
481 0 : aFallback = "People";
482 0 : break;
483 : case( RID_GALLERYSTR_THEME_SYMBOLS ):
484 0 : aFallback = "Symbols";
485 0 : break;
486 : case( RID_GALLERYSTR_THEME_TRANSPORT ):
487 0 : aFallback = "Transport";
488 0 : break;
489 : case( RID_GALLERYSTR_THEME_TXTSHAPES ):
490 0 : aFallback = "Textshapes";
491 0 : break;
492 : default:
493 0 : break;
494 : }
495 :
496 0 : pFound = const_cast<Gallery*>(this)->ImplGetThemeEntry(OStringToOUString(aFallback, RTL_TEXTENCODING_ASCII_US));
497 : }
498 :
499 0 : return( pFound ? pFound->GetThemeName() : OUString() );
500 : }
501 :
502 0 : bool Gallery::HasTheme( const OUString& rThemeName )
503 : {
504 0 : return( ImplGetThemeEntry( rThemeName ) != NULL );
505 : }
506 :
507 0 : bool Gallery::CreateTheme( const OUString& rThemeName )
508 : {
509 0 : bool bRet = false;
510 :
511 0 : if( !HasTheme( rThemeName ) && ( GetUserURL().GetProtocol() != INET_PROT_NOT_VALID ) )
512 : {
513 0 : INetURLObject aURL( GetUserURL() );
514 0 : aURL.Append( rThemeName );
515 : GalleryThemeEntry* pNewEntry = new GalleryThemeEntry(
516 : true, aURL, rThemeName,
517 0 : false, true, 0, false );
518 :
519 0 : aThemeList.push_back( pNewEntry );
520 0 : delete( new GalleryTheme( this, pNewEntry ) );
521 0 : Broadcast( GalleryHint( GALLERY_HINT_THEME_CREATED, rThemeName ) );
522 0 : bRet = true;
523 : }
524 :
525 0 : return bRet;
526 : }
527 :
528 0 : bool Gallery::RenameTheme( const OUString& rOldName, const OUString& rNewName )
529 : {
530 0 : GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rOldName );
531 0 : bool bRet = false;
532 :
533 : // check if the new theme name is already present
534 0 : if( pThemeEntry && !HasTheme( rNewName ) && !pThemeEntry->IsReadOnly() )
535 : {
536 0 : SfxListener aListener;
537 0 : GalleryTheme* pThm = AcquireTheme( rOldName, aListener );
538 :
539 0 : if( pThm )
540 : {
541 0 : const OUString aOldName( rOldName );
542 :
543 0 : pThemeEntry->SetName( rNewName );
544 0 : pThm->ImplWrite();
545 :
546 0 : Broadcast( GalleryHint( GALLERY_HINT_THEME_RENAMED, aOldName, pThm->GetName() ) );
547 0 : ReleaseTheme( pThm, aListener );
548 0 : bRet = true;
549 0 : }
550 : }
551 :
552 0 : return bRet;
553 : }
554 :
555 0 : bool Gallery::RemoveTheme( const OUString& rThemeName )
556 : {
557 0 : GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName );
558 0 : bool bRet = false;
559 :
560 0 : if( pThemeEntry && !pThemeEntry->IsReadOnly() )
561 : {
562 0 : Broadcast( GalleryHint( GALLERY_HINT_CLOSE_THEME, rThemeName ) );
563 :
564 0 : SfxListener aListener;
565 0 : GalleryTheme* pThm = AcquireTheme( rThemeName, aListener );
566 :
567 0 : if( pThm )
568 : {
569 0 : INetURLObject aThmURL( pThm->GetThmURL() );
570 0 : INetURLObject aSdgURL( pThm->GetSdgURL() );
571 0 : INetURLObject aSdvURL( pThm->GetSdvURL() );
572 0 : INetURLObject aStrURL( pThm->GetSdvURL() );
573 :
574 0 : ReleaseTheme( pThm, aListener );
575 :
576 0 : KillFile( aThmURL );
577 0 : KillFile( aSdgURL );
578 0 : KillFile( aSdvURL );
579 0 : KillFile( aStrURL );
580 : }
581 :
582 0 : for ( GalleryThemeList::iterator it = aThemeList.begin(); it != aThemeList.end(); ++it )
583 : {
584 0 : if ( pThemeEntry == *it ) {
585 0 : delete pThemeEntry;
586 0 : aThemeList.erase( it );
587 0 : break;
588 : }
589 : }
590 :
591 0 : Broadcast( GalleryHint( GALLERY_HINT_THEME_REMOVED, rThemeName ) );
592 :
593 0 : bRet = true;
594 : }
595 :
596 0 : return bRet;
597 : }
598 :
599 0 : GalleryTheme* Gallery::ImplGetCachedTheme( const GalleryThemeEntry* pThemeEntry )
600 : {
601 0 : GalleryTheme* pTheme = NULL;
602 :
603 0 : if( pThemeEntry )
604 : {
605 0 : for (GalleryCacheThemeList::const_iterator it = aThemeCache.begin(); it != aThemeCache.end(); ++it)
606 : {
607 0 : if (pThemeEntry == (*it)->GetThemeEntry())
608 : {
609 0 : pTheme = (*it)->GetTheme();
610 0 : break;
611 : }
612 : }
613 :
614 0 : if( !pTheme )
615 : {
616 0 : INetURLObject aURL = pThemeEntry->GetThmURL();
617 :
618 : DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
619 :
620 0 : if( FileExists( aURL ) )
621 : {
622 0 : SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
623 :
624 0 : if( pIStm )
625 : {
626 0 : pTheme = new GalleryTheme( this, (GalleryThemeEntry*) pThemeEntry );
627 0 : ReadGalleryTheme( *pIStm, *pTheme );
628 :
629 0 : if( pIStm->GetError() )
630 : {
631 0 : delete pTheme, pTheme = NULL;
632 : }
633 :
634 0 : delete pIStm;
635 : }
636 : }
637 :
638 0 : if( pTheme )
639 0 : aThemeCache.push_back( new GalleryThemeCacheEntry( pThemeEntry, pTheme ));
640 : }
641 : }
642 :
643 0 : return pTheme;
644 : }
645 :
646 0 : void Gallery::ImplDeleteCachedTheme( GalleryTheme* pTheme )
647 : {
648 0 : for (GalleryCacheThemeList::iterator it = aThemeCache.begin(); it != aThemeCache.end(); ++it)
649 : {
650 0 : if (pTheme == (*it)->GetTheme())
651 : {
652 0 : delete *it;
653 0 : aThemeCache.erase(it);
654 0 : break;
655 : }
656 : }
657 0 : }
658 :
659 0 : GalleryTheme* Gallery::AcquireTheme( const OUString& rThemeName, SfxListener& rListener )
660 : {
661 0 : GalleryTheme* pTheme = NULL;
662 0 : GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName );
663 :
664 0 : if( pThemeEntry && ( ( pTheme = ImplGetCachedTheme( pThemeEntry ) ) != NULL ) )
665 0 : rListener.StartListening( *pTheme );
666 :
667 0 : return pTheme;
668 : }
669 :
670 0 : void Gallery::ReleaseTheme( GalleryTheme* pTheme, SfxListener& rListener )
671 : {
672 0 : if( pTheme )
673 : {
674 0 : rListener.EndListening( *pTheme );
675 :
676 0 : if( !pTheme->HasListeners() )
677 0 : ImplDeleteCachedTheme( pTheme );
678 : }
679 0 : }
680 :
681 0 : bool GalleryThemeEntry::IsDefault() const
682 : {
683 0 : return ( nId > 0 ) && ( nId != ( RID_GALLERYSTR_THEME_MYTHEME - RID_GALLERYSTR_THEME_START ) );
684 : }
685 :
686 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|