LCOV - code coverage report
Current view: top level - svx/source/gallery2 - gallery1.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 184 290 63.4 %
Date: 2015-06-13 12:38:46 Functions: 22 28 78.6 %
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          27 : 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          27 :         bThemeNameFromResource  ( _bThemeNameFromResource )
      68             : {
      69          27 :     INetURLObject aURL( rBaseURL );
      70             :     DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
      71             : 
      72          27 :     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          27 :     aURL.setExtension( "thm" );
      86          27 :     aThmURL = ImplGetURLIgnoreCase( aURL );
      87             : 
      88          27 :     aURL.setExtension( "sdg" );
      89          27 :     aSdgURL = ImplGetURLIgnoreCase( aURL );
      90             : 
      91          27 :     aURL.setExtension( "sdv" );
      92          27 :     aSdvURL = ImplGetURLIgnoreCase( aURL );
      93             : 
      94          27 :     aURL.setExtension( "str" );
      95          27 :     aStrURL = ImplGetURLIgnoreCase( aURL );
      96             : 
      97          27 :     SetModified( _bNewFile );
      98             : 
      99          27 :     aName = ReadStrFromIni( "name" );
     100             : 
     101             :     // This is awful - we shouldn't use these resources if we
     102             :     // possibly can avoid them
     103          27 :     if( aName.isEmpty() && nId && bThemeNameFromResource )
     104           5 :         aName = GAL_RESSTR( RID_GALLERYSTR_THEME_START + (sal_uInt16) nId );
     105             : 
     106          27 :     if( aName.isEmpty() )
     107          11 :         aName = rName;
     108          27 : }
     109             : 
     110         119 : INetURLObject GalleryThemeEntry::ImplGetURLIgnoreCase( const INetURLObject& rURL )
     111             : {
     112         119 :     INetURLObject   aURL( rURL );
     113             : 
     114             :     // check original file name
     115         119 :     if( !FileExists( aURL ) )
     116             :     {
     117             :         // check upper case file name
     118          60 :         aURL.setName( aURL.getName().toAsciiUpperCase() );
     119             : 
     120          60 :         if(!FileExists( aURL ) )
     121             :         {
     122             :             // check lower case file name
     123          60 :             aURL.setName( aURL.getName().toAsciiLowerCase() );
     124             :         }
     125             :     }
     126             : 
     127         119 :     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          12 : Gallery::Gallery( const OUString& rMultiPath )
     169          12 : :       nReadTextEncoding   ( osl_getThreadTextEncoding() )
     170          24 : ,       bMultiPath          ( false )
     171             : {
     172          12 :     ImplLoad( rMultiPath );
     173          12 : }
     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           1 : Gallery* Gallery::GetGalleryInstance()
     184             : {
     185             :     static Gallery* pGallery = NULL;
     186             : 
     187           1 :     if( !pGallery )
     188             :     {
     189           1 :         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
     190           1 :         if( !pGallery )
     191             :         {
     192           1 :             pGallery = new Gallery( SvtPathOptions().GetGalleryPath() );
     193           1 :         }
     194             :     }
     195             : 
     196           1 :     return pGallery;
     197             : }
     198             : 
     199          12 : void Gallery::ImplLoad( const OUString& rMultiPath )
     200             : {
     201          12 :     const sal_Int32 nTokenCount = comphelper::string::getTokenCount(rMultiPath, ';');
     202             :     bool            bIsReadOnlyDir;
     203             : 
     204          12 :     bMultiPath = ( nTokenCount > 0 );
     205             : 
     206          12 :     INetURLObject aCurURL(SvtPathOptions().GetConfigPath());
     207          12 :     ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
     208             : 
     209          12 :     if( !bIsReadOnlyDir )
     210          11 :         aUserURL = aCurURL;
     211             : 
     212          12 :     if( bMultiPath )
     213             :     {
     214          12 :         aRelURL = INetURLObject( rMultiPath.getToken(0, ';') );
     215             : 
     216          25 :         for( sal_Int32 i = 0; i < nTokenCount; ++i )
     217             :         {
     218          13 :             aCurURL = INetURLObject(rMultiPath.getToken(i, ';'));
     219             : 
     220          13 :             ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
     221             : 
     222          13 :             if( !bIsReadOnlyDir )
     223          13 :                 aUserURL = aCurURL;
     224             :         }
     225             :     }
     226             :     else
     227           0 :         aRelURL = INetURLObject( rMultiPath );
     228             : 
     229             :     DBG_ASSERT( aUserURL.GetProtocol() != INetProtocol::NotValid, "no writable Gallery user directory available" );
     230          12 :     DBG_ASSERT( aRelURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
     231          12 : }
     232             : 
     233          25 : void Gallery::ImplLoadSubDirs( const INetURLObject& rBaseURL, bool& rbDirIsReadOnly )
     234             : {
     235          25 :     rbDirIsReadOnly = false;
     236             : 
     237             :     try
     238             :     {
     239          25 :         uno::Reference< ucb::XCommandEnvironment > xEnv;
     240          50 :         ::ucbhelper::Content                       aCnt( rBaseURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
     241             : 
     242          50 :         uno::Sequence< OUString > aProps( 1 );
     243          25 :         aProps.getArray()[ 0 ] = "Url";
     244             : 
     245          49 :         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() == INetProtocol::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          24 :             INetURLObject   aTestURL( rBaseURL );
     260          48 :             OUString        aTestFile( "cdefghij.klm" );
     261             : 
     262          24 :             aTestURL.Append( aTestFile );
     263          48 :             boost::scoped_ptr<SvStream> pTestStm(::utl::UcbStreamHelper::CreateStream( aTestURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::WRITE ));
     264             : 
     265          24 :             if( pTestStm )
     266             :             {
     267          24 :                 pTestStm->WriteInt32( sal_Int32(1) );
     268             : 
     269          24 :                 if( pTestStm->GetError() )
     270           1 :                     rbDirIsReadOnly = true;
     271             : 
     272          24 :                 pTestStm.reset();
     273          24 :                 KillFile( aTestURL );
     274             :             }
     275             :             else
     276          24 :                 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          24 :         if( xResultSet.is() )
     289             :         {
     290          24 :             uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
     291             : 
     292          24 :             if( xContentAccess.is() )
     293             :             {
     294             :                 static const char s_sTitle[] = "Title";
     295             :                 static const char s_sIsReadOnly[] = "IsReadOnly";
     296             :                 static const char s_sSDG_EXT[] = "sdg";
     297             :                 static const char s_sSDV_EXT[] = "sdv";
     298             : 
     299         196 :                 while( xResultSet->next() )
     300             :                 {
     301         148 :                     INetURLObject aThmURL( xContentAccess->queryContentIdentifierString() );
     302             : 
     303         148 :                     if(aThmURL.GetExtension().equalsIgnoreAsciiCase("thm"))
     304             :                     {
     305          16 :                         INetURLObject   aSdgURL( aThmURL); aSdgURL.SetExtension( s_sSDG_EXT );
     306          32 :                         INetURLObject   aSdvURL( aThmURL ); aSdvURL.SetExtension( s_sSDV_EXT );
     307          32 :                         OUString        aTitle;
     308             : 
     309             :                         try
     310             :                         {
     311          16 :                             ::ucbhelper::Content aThmCnt( aThmURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
     312          32 :                             ::ucbhelper::Content aSdgCnt( aSdgURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
     313          32 :                             ::ucbhelper::Content aSdvCnt( aSdvURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv, comphelper::getProcessComponentContext() );
     314             : 
     315             :                             try
     316             :                             {
     317          16 :                                 aThmCnt.getPropertyValue( s_sTitle ) >>= aTitle;
     318             :                             }
     319           0 :                             catch( const uno::RuntimeException& )
     320             :                             {
     321             :                             }
     322           0 :                             catch( const uno::Exception& )
     323             :                             {
     324             :                             }
     325             : 
     326          16 :                             if( !aTitle.isEmpty() )
     327             :                             {
     328          16 :                                 bool bReadOnly = false;
     329             : 
     330             :                                 try
     331             :                                 {
     332          16 :                                     aThmCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
     333             :                                 }
     334           0 :                                 catch( const uno::RuntimeException& )
     335             :                                 {
     336             :                                 }
     337           0 :                                 catch( const uno::Exception& )
     338             :                                 {
     339             :                                 }
     340             : 
     341          16 :                                 if( !bReadOnly )
     342             :                                 {
     343             :                                     try
     344             :                                     {
     345          16 :                                         aSdgCnt.getPropertyValue( s_sTitle ) >>= aTitle;
     346             :                                     }
     347           0 :                                     catch( const ::com::sun::star::uno::RuntimeException& )
     348             :                                     {
     349             :                                     }
     350           0 :                                     catch( const ::com::sun::star::uno::Exception& )
     351             :                                     {
     352             :                                     }
     353             : 
     354          16 :                                     if( !aTitle.isEmpty() )
     355             :                                     {
     356             :                                         try
     357             :                                         {
     358          16 :                                             aSdgCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
     359             :                                         }
     360           0 :                                         catch( const uno::RuntimeException& )
     361             :                                         {
     362             :                                         }
     363           0 :                                         catch( const uno::Exception& )
     364             :                                         {
     365             :                                         }
     366             :                                     }
     367             :                                 }
     368             : 
     369          16 :                                 if( !bReadOnly )
     370             :                                 {
     371             :                                     try
     372             :                                     {
     373          16 :                                         aSdvCnt.getPropertyValue( s_sTitle ) >>= aTitle;
     374             :                                     }
     375           0 :                                     catch( const ::com::sun::star::uno::RuntimeException& )
     376             :                                     {
     377             :                                     }
     378           0 :                                     catch( const ::com::sun::star::uno::Exception& )
     379             :                                     {
     380             :                                     }
     381             : 
     382          16 :                                     if( !aTitle.isEmpty() )
     383             :                                     {
     384             :                                         try
     385             :                                         {
     386          16 :                                             aSdvCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
     387             :                                         }
     388           0 :                                         catch( const uno::RuntimeException& )
     389             :                                         {
     390             :                                         }
     391           0 :                                         catch( const uno::Exception& )
     392             :                                         {
     393             :                                         }
     394             :                                     }
     395             :                                 }
     396             : 
     397          16 :                                 GalleryThemeEntry* pEntry = GalleryTheme::CreateThemeEntry( aThmURL, rbDirIsReadOnly || bReadOnly );
     398             : 
     399          16 :                                 if( pEntry )
     400          16 :                                     aThemeList.push_back( pEntry );
     401          16 :                             }
     402             :                         }
     403           0 :                         catch( const ucb::ContentCreationException& )
     404             :                         {
     405             :                         }
     406           0 :                         catch( const uno::RuntimeException& )
     407             :                         {
     408             :                         }
     409           0 :                         catch( const uno::Exception& )
     410             :                         {
     411          16 :                         }
     412             :                     }
     413         148 :                 }
     414          24 :             }
     415          25 :         }
     416             :     }
     417           0 :     catch( const ucb::ContentCreationException& )
     418             :     {
     419             :     }
     420           0 :     catch( const uno::RuntimeException& )
     421             :     {
     422             :     }
     423           1 :     catch( const uno::Exception& )
     424             :     {
     425             :     }
     426          25 : }
     427             : 
     428          33 : GalleryThemeEntry* Gallery::ImplGetThemeEntry( const OUString& rThemeName )
     429             : {
     430          33 :     GalleryThemeEntry* pFound = NULL;
     431             : 
     432          33 :     if( !rThemeName.isEmpty() )
     433             :     {
     434          44 :         for ( size_t i = 0, n = aThemeList.size(); i < n && !pFound; ++i )
     435          11 :             if( rThemeName == aThemeList[ i ]->GetThemeName() )
     436          11 :                 pFound = aThemeList[ i ];
     437             :     }
     438             : 
     439          33 :     return pFound;
     440             : }
     441             : 
     442           0 : OUString Gallery::GetThemeName( sal_uIntPtr nThemeId ) const
     443             : {
     444           0 :     GalleryThemeEntry* pFound = NULL;
     445             : 
     446           0 :     for ( size_t i = 0, n = aThemeList.size(); i < n && !pFound; ++i )
     447             :     {
     448           0 :         GalleryThemeEntry* pEntry = aThemeList[ i ];
     449           0 :         if( nThemeId == pEntry->GetId() )
     450           0 :             pFound = pEntry;
     451             :     }
     452             : 
     453             :     // try fallback, if no entry was found
     454           0 :     if( !pFound )
     455             :     {
     456           0 :         OUString aFallback;
     457             : 
     458           0 :         switch( nThemeId )
     459             :         {
     460             :             case( GALLERY_THEME_3D ):
     461           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_3D);
     462           0 :                 break;
     463             :             case( GALLERY_THEME_BULLETS ):
     464           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_BULLETS);
     465           0 :                 break;
     466             :             case( GALLERY_THEME_HOMEPAGE ):
     467           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_HOMEPAGE);
     468           0 :                 break;
     469             :             case( GALLERY_THEME_POWERPOINT ):
     470           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_POWERPOINT);
     471           0 :                 break;
     472             :             case( GALLERY_THEME_FONTWORK ):
     473           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_FONTWORK);
     474           0 :                 break;
     475             :             case( GALLERY_THEME_FONTWORK_VERTICAL ):
     476           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_FONTWORK_VERTICAL);
     477           0 :                 break;
     478             :             case( GALLERY_THEME_SOUNDS ):
     479           0 :                 aFallback = GAL_RESSTR(RID_GALLERYSTR_THEME_SOUNDS);
     480           0 :                 break;
     481             :             case( RID_GALLERYSTR_THEME_ARROWS ):
     482             :             case( RID_GALLERYSTR_THEME_COMPUTERS ):
     483             :             case( RID_GALLERYSTR_THEME_DIAGRAMS ):
     484             :             case( RID_GALLERYSTR_THEME_EDUCATION ):
     485             :             case( RID_GALLERYSTR_THEME_ENVIRONMENT ):
     486             :             case( RID_GALLERYSTR_THEME_FINANCE ):
     487             :             case( RID_GALLERYSTR_THEME_PEOPLE ):
     488             :             case( RID_GALLERYSTR_THEME_SYMBOLS ):
     489             :             case( RID_GALLERYSTR_THEME_TRANSPORT ):
     490             :             case( RID_GALLERYSTR_THEME_TXTSHAPES ):
     491           0 :                 aFallback = GAL_RESSTR(static_cast<sal_uInt32>(nThemeId));
     492           0 :                 break;
     493             :             default:
     494           0 :                 break;
     495             :         }
     496             : 
     497           0 :         pFound = const_cast<Gallery*>(this)->ImplGetThemeEntry(aFallback);
     498             :     }
     499             : 
     500           0 :     return( pFound ? pFound->GetThemeName() : OUString() );
     501             : }
     502             : 
     503          22 : bool Gallery::HasTheme( const OUString& rThemeName )
     504             : {
     505          22 :     return( ImplGetThemeEntry( rThemeName ) != NULL );
     506             : }
     507             : 
     508          11 : bool Gallery::CreateTheme( const OUString& rThemeName )
     509             : {
     510          11 :     bool bRet = false;
     511             : 
     512          11 :     if( !HasTheme( rThemeName ) && ( GetUserURL().GetProtocol() != INetProtocol::NotValid ) )
     513             :     {
     514          11 :         INetURLObject aURL( GetUserURL() );
     515          11 :         aURL.Append( rThemeName );
     516             :         GalleryThemeEntry* pNewEntry = new GalleryThemeEntry(
     517             :                 true, aURL, rThemeName,
     518          11 :                 false, true, 0, false );
     519             : 
     520          11 :         aThemeList.push_back( pNewEntry );
     521          11 :         delete( new GalleryTheme( this, pNewEntry ) );
     522          11 :         Broadcast( GalleryHint( GalleryHintType::THEME_CREATED, rThemeName ) );
     523          11 :         bRet = true;
     524             :     }
     525             : 
     526          11 :     return bRet;
     527             : }
     528             : 
     529           0 : bool Gallery::RenameTheme( const OUString& rOldName, const OUString& rNewName )
     530             : {
     531           0 :     GalleryThemeEntry*      pThemeEntry = ImplGetThemeEntry( rOldName );
     532           0 :     bool                    bRet = false;
     533             : 
     534             :     // check if the new theme name is already present
     535           0 :     if( pThemeEntry && !HasTheme( rNewName ) && !pThemeEntry->IsReadOnly() )
     536             :     {
     537           0 :         SfxListener   aListener;
     538           0 :         GalleryTheme* pThm = AcquireTheme( rOldName, aListener );
     539             : 
     540           0 :         if( pThm )
     541             :         {
     542           0 :             const OUString aOldName( rOldName );
     543             : 
     544           0 :             pThemeEntry->SetName( rNewName );
     545           0 :             pThm->ImplWrite();
     546             : 
     547           0 :             Broadcast( GalleryHint( GalleryHintType::THEME_RENAMED, aOldName, pThm->GetName() ) );
     548           0 :             ReleaseTheme( pThm, aListener );
     549           0 :             bRet = true;
     550           0 :         }
     551             :     }
     552             : 
     553           0 :     return bRet;
     554             : }
     555             : 
     556           0 : bool Gallery::RemoveTheme( const OUString& rThemeName )
     557             : {
     558           0 :     GalleryThemeEntry*  pThemeEntry = ImplGetThemeEntry( rThemeName );
     559           0 :     bool                bRet = false;
     560             : 
     561           0 :     if( pThemeEntry && !pThemeEntry->IsReadOnly() )
     562             :     {
     563           0 :         Broadcast( GalleryHint( GalleryHintType::CLOSE_THEME, rThemeName ) );
     564             : 
     565           0 :         SfxListener     aListener;
     566           0 :         GalleryTheme*   pThm = AcquireTheme( rThemeName, aListener );
     567             : 
     568           0 :         if( pThm )
     569             :         {
     570           0 :             INetURLObject   aThmURL( pThm->GetThmURL() );
     571           0 :             INetURLObject   aSdgURL( pThm->GetSdgURL() );
     572           0 :             INetURLObject   aSdvURL( pThm->GetSdvURL() );
     573           0 :             INetURLObject   aStrURL( pThm->GetSdvURL() );
     574             : 
     575           0 :             ReleaseTheme( pThm, aListener );
     576             : 
     577           0 :             KillFile( aThmURL );
     578           0 :             KillFile( aSdgURL );
     579           0 :             KillFile( aSdvURL );
     580           0 :             KillFile( aStrURL );
     581             :         }
     582             : 
     583           0 :         for ( GalleryThemeList::iterator it = aThemeList.begin(); it != aThemeList.end(); ++it )
     584             :         {
     585           0 :             if ( pThemeEntry == *it ) {
     586           0 :                 delete pThemeEntry;
     587           0 :                 aThemeList.erase( it );
     588           0 :                 break;
     589             :             }
     590             :         }
     591             : 
     592           0 :         Broadcast( GalleryHint( GalleryHintType::THEME_REMOVED, rThemeName ) );
     593             : 
     594           0 :         bRet = true;
     595             :     }
     596             : 
     597           0 :     return bRet;
     598             : }
     599             : 
     600          11 : GalleryTheme* Gallery::ImplGetCachedTheme(const GalleryThemeEntry* pThemeEntry)
     601             : {
     602          11 :     GalleryTheme* pTheme = NULL;
     603             : 
     604          11 :     if( pThemeEntry )
     605             :     {
     606          11 :         for (GalleryCacheThemeList::const_iterator it = aThemeCache.begin(); it != aThemeCache.end(); ++it)
     607             :         {
     608           0 :             if (pThemeEntry == (*it)->GetThemeEntry())
     609             :             {
     610           0 :                 pTheme = (*it)->GetTheme();
     611           0 :                 break;
     612             :             }
     613             :         }
     614             : 
     615          11 :         if( !pTheme )
     616             :         {
     617          11 :             INetURLObject aURL = pThemeEntry->GetThmURL();
     618             : 
     619             :             DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
     620             : 
     621          11 :             if( FileExists( aURL ) )
     622             :             {
     623          11 :                 boost::scoped_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), StreamMode::READ ));
     624             : 
     625          11 :                 if( pIStm )
     626             :                 {
     627             :                     try
     628             :                     {
     629          11 :                         pTheme = new GalleryTheme( this, const_cast<GalleryThemeEntry*>(pThemeEntry) );
     630          11 :                         ReadGalleryTheme( *pIStm, *pTheme );
     631             : 
     632          11 :                         if( pIStm->GetError() )
     633             :                         {
     634           0 :                             delete pTheme, pTheme = NULL;
     635             :                         }
     636             :                     }
     637           0 :                     catch (const css::ucb::ContentCreationException&)
     638             :                     {
     639             :                     }
     640          11 :                 }
     641             :             }
     642             : 
     643          11 :             if( pTheme )
     644          11 :                 aThemeCache.push_back( new GalleryThemeCacheEntry( pThemeEntry, pTheme ));
     645             :         }
     646             :     }
     647             : 
     648          11 :     return pTheme;
     649             : }
     650             : 
     651          11 : void Gallery::ImplDeleteCachedTheme( GalleryTheme* pTheme )
     652             : {
     653          11 :     for (GalleryCacheThemeList::iterator it = aThemeCache.begin(); it != aThemeCache.end(); ++it)
     654             :     {
     655          11 :         if (pTheme == (*it)->GetTheme())
     656             :         {
     657          11 :             delete *it;
     658          11 :             aThemeCache.erase(it);
     659          11 :             break;
     660             :         }
     661             :     }
     662          11 : }
     663             : 
     664          11 : GalleryTheme* Gallery::AcquireTheme( const OUString& rThemeName, SfxListener& rListener )
     665             : {
     666          11 :     GalleryTheme*           pTheme = NULL;
     667          11 :     GalleryThemeEntry*      pThemeEntry = ImplGetThemeEntry( rThemeName );
     668             : 
     669          11 :     if( pThemeEntry && ( ( pTheme = ImplGetCachedTheme( pThemeEntry ) ) != NULL ) )
     670          11 :         rListener.StartListening( *pTheme );
     671             : 
     672          11 :     return pTheme;
     673             : }
     674             : 
     675          11 : void Gallery::ReleaseTheme( GalleryTheme* pTheme, SfxListener& rListener )
     676             : {
     677          11 :     if( pTheme )
     678             :     {
     679          11 :         rListener.EndListening( *pTheme );
     680             : 
     681          11 :         if( !pTheme->HasListeners() )
     682          11 :             ImplDeleteCachedTheme( pTheme );
     683             :     }
     684          11 : }
     685             : 
     686           0 : bool GalleryThemeEntry::IsDefault() const
     687             : {
     688           0 :     return ( nId > 0 ) && ( nId != ( RID_GALLERYSTR_THEME_MYTHEME - RID_GALLERYSTR_THEME_START ) );
     689         435 : }
     690             : 
     691             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11