LCOV - code coverage report
Current view: top level - svx/source/gallery2 - gallery1.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 156 294 53.1 %
Date: 2014-11-03 Functions: 21 28 75.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10