1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_svx.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <tools/vcompat.hxx> 34*cdf0e10cSrcweir #include <ucbhelper/content.hxx> 35*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx> 36*cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 37*cdf0e10cSrcweir #include <sfx2/docfile.hxx> 38*cdf0e10cSrcweir #include "svx/gallery.hxx" 39*cdf0e10cSrcweir #include "gallery.hrc" 40*cdf0e10cSrcweir #include "svx/galmisc.hxx" 41*cdf0e10cSrcweir #include "svx/galtheme.hxx" 42*cdf0e10cSrcweir #include "svx/gallery1.hxx" 43*cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSet.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/ucb/XContentAccess.hpp> 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir // -------------- 49*cdf0e10cSrcweir // - Namespaces - 50*cdf0e10cSrcweir // -------------- 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir using namespace ::rtl; 53*cdf0e10cSrcweir using namespace ::com::sun::star; 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir // --------------------- 56*cdf0e10cSrcweir // - GalleryThemeEntry - 57*cdf0e10cSrcweir // --------------------- 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir GalleryThemeEntry::GalleryThemeEntry( const INetURLObject& rBaseURL, const String& rName, 60*cdf0e10cSrcweir sal_uInt32 _nFileNumber, sal_Bool _bReadOnly, sal_Bool _bImported, 61*cdf0e10cSrcweir sal_Bool _bNewFile, sal_uInt32 _nId, sal_Bool _bThemeNameFromResource ) : 62*cdf0e10cSrcweir nFileNumber ( _nFileNumber ), 63*cdf0e10cSrcweir nId ( _nId ), 64*cdf0e10cSrcweir bReadOnly ( _bReadOnly || _bImported ), 65*cdf0e10cSrcweir bImported ( _bImported ), 66*cdf0e10cSrcweir bThemeNameFromResource ( _bThemeNameFromResource ) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir INetURLObject aURL( rBaseURL ); 69*cdf0e10cSrcweir DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 70*cdf0e10cSrcweir String aFileName( String( RTL_CONSTASCII_USTRINGPARAM( "sg" ) ) ); 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir aURL.Append( ( aFileName += String::CreateFromInt32( nFileNumber ) ) += String( RTL_CONSTASCII_USTRINGPARAM( ".thm" ) ) ); 73*cdf0e10cSrcweir aThmURL = ImplGetURLIgnoreCase( aURL ); 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir aURL.setExtension( String( RTL_CONSTASCII_USTRINGPARAM( "sdg" ) ) ); 76*cdf0e10cSrcweir aSdgURL = ImplGetURLIgnoreCase( aURL ); 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir aURL.setExtension( String( RTL_CONSTASCII_USTRINGPARAM( "sdv" ) ) ); 79*cdf0e10cSrcweir aSdvURL = ImplGetURLIgnoreCase( aURL ); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir SetModified( _bNewFile ); 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir if( nId && bThemeNameFromResource ) 84*cdf0e10cSrcweir aName = String( GAL_RESID( RID_GALLERYSTR_THEME_START + (sal_uInt16) nId ) ); 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir if( !aName.Len() ) 87*cdf0e10cSrcweir aName = rName; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir INetURLObject GalleryThemeEntry::ImplGetURLIgnoreCase( const INetURLObject& rURL ) const 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir INetURLObject aURL( rURL ); 95*cdf0e10cSrcweir String aFileName; 96*cdf0e10cSrcweir sal_Bool bExists = sal_False; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir // check original file name 99*cdf0e10cSrcweir if( FileExists( aURL ) ) 100*cdf0e10cSrcweir bExists = sal_True; 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir // check upper case file name 104*cdf0e10cSrcweir aURL.setName( aURL.getName().toAsciiUpperCase() ); 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir if( FileExists( aURL ) ) 107*cdf0e10cSrcweir bExists = sal_True; 108*cdf0e10cSrcweir else 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir // check lower case file name 111*cdf0e10cSrcweir aURL.setName( aURL.getName().toAsciiLowerCase() ); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir if( FileExists( aURL ) ) 114*cdf0e10cSrcweir bExists = sal_True; 115*cdf0e10cSrcweir } 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir return aURL; 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir void GalleryThemeEntry::SetName( const String& rNewName ) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir if( aName != rNewName ) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir aName = rNewName; 128*cdf0e10cSrcweir SetModified( sal_True ); 129*cdf0e10cSrcweir bThemeNameFromResource = sal_False; 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir void GalleryThemeEntry::SetId( sal_uInt32 nNewId, sal_Bool bResetThemeName ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir nId = nNewId; 138*cdf0e10cSrcweir SetModified( sal_True ); 139*cdf0e10cSrcweir bThemeNameFromResource = ( nId && bResetThemeName ); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir // --------------------------- 143*cdf0e10cSrcweir // - GalleryImportThemeEntry - 144*cdf0e10cSrcweir // --------------------------- 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir SvStream& operator<<( SvStream& rOut, const GalleryImportThemeEntry& rEntry ) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir ByteString aDummy; 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir rOut << ByteString( rEntry.aThemeName, RTL_TEXTENCODING_UTF8 ) << 151*cdf0e10cSrcweir ByteString( rEntry.aUIName, RTL_TEXTENCODING_UTF8 ) << 152*cdf0e10cSrcweir ByteString( String(rEntry.aURL.GetMainURL( INetURLObject::NO_DECODE )), RTL_TEXTENCODING_UTF8 ) << 153*cdf0e10cSrcweir ByteString( rEntry.aImportName, RTL_TEXTENCODING_UTF8 ) << 154*cdf0e10cSrcweir aDummy; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir return rOut; 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir // ------------------------------------------------------------------------ 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir SvStream& operator>>( SvStream& rIn, GalleryImportThemeEntry& rEntry ) 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir ByteString aTmpStr; 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir rIn >> aTmpStr; rEntry.aThemeName = String( aTmpStr, RTL_TEXTENCODING_UTF8 ); 166*cdf0e10cSrcweir rIn >> aTmpStr; rEntry.aUIName = String( aTmpStr, RTL_TEXTENCODING_UTF8 ); 167*cdf0e10cSrcweir rIn >> aTmpStr; rEntry.aURL = INetURLObject( String( aTmpStr, RTL_TEXTENCODING_UTF8 ) ); 168*cdf0e10cSrcweir rIn >> aTmpStr; rEntry.aImportName = String( aTmpStr, RTL_TEXTENCODING_UTF8 ); 169*cdf0e10cSrcweir rIn >> aTmpStr; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir return rIn; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir // -------------------------- 175*cdf0e10cSrcweir // - GalleryThemeCacheEntry - 176*cdf0e10cSrcweir // -------------------------- 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir class GalleryThemeCacheEntry; 179*cdf0e10cSrcweir DBG_NAME(GalleryThemeCacheEntry) 180*cdf0e10cSrcweir class GalleryThemeCacheEntry 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir private: 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir const GalleryThemeEntry* mpThemeEntry; 185*cdf0e10cSrcweir GalleryTheme* mpTheme; 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir public: 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir GalleryThemeCacheEntry( const GalleryThemeEntry* pThemeEntry, GalleryTheme* pTheme ) : 190*cdf0e10cSrcweir mpThemeEntry( pThemeEntry ), mpTheme( pTheme ) {DBG_CTOR(GalleryThemeCacheEntry,NULL);} 191*cdf0e10cSrcweir ~GalleryThemeCacheEntry() { delete mpTheme;DBG_DTOR(GalleryThemeCacheEntry,NULL); } 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir const GalleryThemeEntry* GetThemeEntry() const { return mpThemeEntry; } 194*cdf0e10cSrcweir GalleryTheme* GetTheme() const { return mpTheme; } 195*cdf0e10cSrcweir }; 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir // ----------- 198*cdf0e10cSrcweir // - Gallery - 199*cdf0e10cSrcweir // ----------- 200*cdf0e10cSrcweir Gallery::Gallery( const String& rMultiPath ) 201*cdf0e10cSrcweir : nReadTextEncoding ( gsl_getSystemTextEncoding() ) 202*cdf0e10cSrcweir , nLastFileNumber ( 0 ) 203*cdf0e10cSrcweir , bMultiPath ( sal_False ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir ImplLoad( rMultiPath ); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir // ------------------------------------------------------------------------ 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir Gallery::~Gallery() 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir // Themen-Liste loeschen 213*cdf0e10cSrcweir for( GalleryThemeEntry* pThemeEntry = aThemeList.First(); pThemeEntry; pThemeEntry = aThemeList.Next() ) 214*cdf0e10cSrcweir delete pThemeEntry; 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir // Import-Liste loeschen 217*cdf0e10cSrcweir for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() ) 218*cdf0e10cSrcweir delete pImportEntry; 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir // ------------------------------------------------------------------------ 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir Gallery* Gallery::GetGalleryInstance() 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir static Gallery* pGallery = NULL; 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir if( !pGallery ) 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 230*cdf0e10cSrcweir if( !pGallery ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir pGallery = new Gallery( SvtPathOptions().GetGalleryPath() ); 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir return pGallery; 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir // ------------------------------------------------------------------------ 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir void Gallery::ImplLoad( const String& rMultiPath ) 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir const sal_uInt16 nTokenCount = rMultiPath.GetTokenCount( ';' ); 244*cdf0e10cSrcweir sal_Bool bIsReadOnlyDir; 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir bMultiPath = ( nTokenCount > 0 ); 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir INetURLObject aCurURL(SvtPathOptions().GetConfigPath()); 249*cdf0e10cSrcweir ImplLoadSubDirs( aCurURL, bIsReadOnlyDir ); 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir if( !bIsReadOnlyDir ) 252*cdf0e10cSrcweir aUserURL = aCurURL; 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir if( bMultiPath ) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir aRelURL = INetURLObject( rMultiPath.GetToken( 0, ';' ) ); 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir for( sal_uInt16 i = 0UL; i < nTokenCount; i++ ) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir aCurURL = INetURLObject(rMultiPath.GetToken( i, ';' )); 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir ImplLoadSubDirs( aCurURL, bIsReadOnlyDir ); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir if( !bIsReadOnlyDir ) 265*cdf0e10cSrcweir aUserURL = aCurURL; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir else 269*cdf0e10cSrcweir aRelURL = INetURLObject( rMultiPath ); 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir DBG_ASSERT( aUserURL.GetProtocol() != INET_PROT_NOT_VALID, "no writable Gallery user directory available" ); 272*cdf0e10cSrcweir DBG_ASSERT( aRelURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir ImplLoadImports(); 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir // ------------------------------------------------------------------------ 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir void Gallery::ImplLoadSubDirs( const INetURLObject& rBaseURL, sal_Bool& rbDirIsReadOnly ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir rbDirIsReadOnly = sal_False; 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir try 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir uno::Reference< ucb::XCommandEnvironment > xEnv; 286*cdf0e10cSrcweir ::ucbhelper::Content aCnt( rBaseURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir uno::Sequence< OUString > aProps( 1 ); 289*cdf0e10cSrcweir aProps.getArray()[ 0 ] = OUString::createFromAscii( "Url" ); 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) ); 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir try 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir // check readonlyness the very hard way 296*cdf0e10cSrcweir INetURLObject aTestURL( rBaseURL ); 297*cdf0e10cSrcweir String aTestFile( RTL_CONSTASCII_USTRINGPARAM( "cdefghij.klm" ) ); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir aTestURL.Append( aTestFile ); 300*cdf0e10cSrcweir SvStream* pTestStm = ::utl::UcbStreamHelper::CreateStream( aTestURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE ); 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir if( pTestStm ) 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir *pTestStm << 1; 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir if( pTestStm->GetError() ) 307*cdf0e10cSrcweir rbDirIsReadOnly = sal_True; 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir delete pTestStm; 310*cdf0e10cSrcweir KillFile( aTestURL ); 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir else 313*cdf0e10cSrcweir rbDirIsReadOnly = sal_True; 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir catch( const ucb::ContentCreationException& ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir catch( const uno::Exception& ) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir if( xResultSet.is() ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY ); 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir if( xContentAccess.is() ) 330*cdf0e10cSrcweir { 331*cdf0e10cSrcweir static const ::rtl::OUString s_sTitle(RTL_CONSTASCII_USTRINGPARAM("Title")); 332*cdf0e10cSrcweir static const ::rtl::OUString s_sIsReadOnly(RTL_CONSTASCII_USTRINGPARAM("IsReadOnly")); 333*cdf0e10cSrcweir static const ::rtl::OUString s_sSDG_EXT(RTL_CONSTASCII_USTRINGPARAM("sdg")); 334*cdf0e10cSrcweir static const ::rtl::OUString s_sSDV_EXT(RTL_CONSTASCII_USTRINGPARAM("sdv")); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir while( xResultSet->next() ) 337*cdf0e10cSrcweir { 338*cdf0e10cSrcweir INetURLObject aThmURL( xContentAccess->queryContentIdentifierString() ); 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir if(aThmURL.GetExtension().equalsIgnoreAsciiCaseAscii("thm")) 341*cdf0e10cSrcweir { 342*cdf0e10cSrcweir INetURLObject aSdgURL( aThmURL); aSdgURL.SetExtension( s_sSDG_EXT ); 343*cdf0e10cSrcweir INetURLObject aSdvURL( aThmURL ); aSdvURL.SetExtension( s_sSDV_EXT ); 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir OUString aTitle; 346*cdf0e10cSrcweir sal_Bool bReadOnly = sal_False; 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir try 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir ::ucbhelper::Content aThmCnt( aThmURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); 351*cdf0e10cSrcweir ::ucbhelper::Content aSdgCnt( aSdgURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); 352*cdf0e10cSrcweir ::ucbhelper::Content aSdvCnt( aSdvURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir try 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir aThmCnt.getPropertyValue( s_sTitle ) >>= aTitle; 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 359*cdf0e10cSrcweir { 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir catch( const uno::Exception& ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir if( aTitle.getLength() ) 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir try 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir aThmCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly; 370*cdf0e10cSrcweir } 371*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir catch( const uno::Exception& ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir if( !bReadOnly ) 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir try 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir aSdgCnt.getPropertyValue( s_sTitle ) >>= aTitle; 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 385*cdf0e10cSrcweir { 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir if( aTitle.getLength() ) 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir try 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir aSdgCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir } 400*cdf0e10cSrcweir catch( const uno::Exception& ) 401*cdf0e10cSrcweir { 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir 406*cdf0e10cSrcweir if( !bReadOnly ) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir try 409*cdf0e10cSrcweir { 410*cdf0e10cSrcweir aSdvCnt.getPropertyValue( s_sTitle ) >>= aTitle; 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 413*cdf0e10cSrcweir { 414*cdf0e10cSrcweir } 415*cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir if( aTitle.getLength() ) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir try 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir aSdvCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly; 424*cdf0e10cSrcweir } 425*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir } 428*cdf0e10cSrcweir catch( const uno::Exception& ) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir } 432*cdf0e10cSrcweir } 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir GalleryThemeEntry* pEntry = GalleryTheme::CreateThemeEntry( aThmURL, rbDirIsReadOnly || bReadOnly ); 435*cdf0e10cSrcweir 436*cdf0e10cSrcweir if( pEntry ) 437*cdf0e10cSrcweir { 438*cdf0e10cSrcweir const sal_uIntPtr nFileNumber = (sal_uIntPtr) String(aThmURL.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32(); 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir aThemeList.Insert( pEntry, LIST_APPEND ); 441*cdf0e10cSrcweir 442*cdf0e10cSrcweir if( nFileNumber > nLastFileNumber ) 443*cdf0e10cSrcweir nLastFileNumber = nFileNumber; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir } 447*cdf0e10cSrcweir catch( const ucb::ContentCreationException& ) 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir } 453*cdf0e10cSrcweir catch( const uno::Exception& ) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir catch( const ucb::ContentCreationException& ) 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir } 464*cdf0e10cSrcweir catch( const uno::RuntimeException& ) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir } 467*cdf0e10cSrcweir catch( const uno::Exception& ) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir // ------------------------------------------------------------------------ 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir void Gallery::ImplLoadImports() 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir INetURLObject aURL( GetUserURL() ); 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "gallery.sdi" ) ) ); 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir if( FileExists( aURL ) ) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir if( pIStm ) 485*cdf0e10cSrcweir { 486*cdf0e10cSrcweir GalleryThemeEntry* pThemeEntry; 487*cdf0e10cSrcweir GalleryImportThemeEntry* pImportEntry; 488*cdf0e10cSrcweir INetURLObject aFile; 489*cdf0e10cSrcweir sal_uInt32 nInventor; 490*cdf0e10cSrcweir sal_uInt32 nCount; 491*cdf0e10cSrcweir sal_uInt16 nId; 492*cdf0e10cSrcweir sal_uInt16 i; 493*cdf0e10cSrcweir sal_uInt16 nTempCharSet; 494*cdf0e10cSrcweir 495*cdf0e10cSrcweir for( pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() ) 496*cdf0e10cSrcweir delete pImportEntry; 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir aImportList.Clear(); 499*cdf0e10cSrcweir *pIStm >> nInventor; 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) ) 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir *pIStm >> nId >> nCount >> nTempCharSet; 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir for( i = 0; i < nCount; i++ ) 506*cdf0e10cSrcweir { 507*cdf0e10cSrcweir pImportEntry = new GalleryImportThemeEntry; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir *pIStm >> *pImportEntry; 510*cdf0e10cSrcweir aImportList.Insert( pImportEntry, LIST_APPEND ); 511*cdf0e10cSrcweir aFile = INetURLObject( pImportEntry->aURL ); 512*cdf0e10cSrcweir pThemeEntry = new GalleryThemeEntry( aFile, 513*cdf0e10cSrcweir pImportEntry->aUIName, 514*cdf0e10cSrcweir String(aFile.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32(), 515*cdf0e10cSrcweir sal_True, sal_True, sal_False, 0, sal_False ); 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir aThemeList.Insert( pThemeEntry, LIST_APPEND ); 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir delete pIStm; 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir } 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir // ------------------------------------------------------------------------ 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir void Gallery::ImplWriteImportList() 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir INetURLObject aURL( GetUserURL() ); 531*cdf0e10cSrcweir aURL.Append( ( String( "gallery.sdi", RTL_TEXTENCODING_UTF8 ) ) ); 532*cdf0e10cSrcweir SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ); 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir if( pOStm ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir const sal_uInt32 nInventor = (sal_uInt32) COMPAT_FORMAT( 'S', 'G', 'A', '3' ); 537*cdf0e10cSrcweir const sal_uInt16 nId = 0x0004; 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir *pOStm << nInventor << nId << (sal_uInt32) aImportList.Count() << (sal_uInt16) gsl_getSystemTextEncoding(); 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() ) 542*cdf0e10cSrcweir *pOStm << *pImportEntry; 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir if( pOStm->GetError() ) 545*cdf0e10cSrcweir ErrorHandler::HandleError( ERRCODE_IO_GENERAL ); 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir delete pOStm; 548*cdf0e10cSrcweir } 549*cdf0e10cSrcweir } 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir // ------------------------------------------------------------------------ 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir GalleryThemeEntry* Gallery::ImplGetThemeEntry( const String& rThemeName ) 554*cdf0e10cSrcweir { 555*cdf0e10cSrcweir GalleryThemeEntry* pFound = NULL; 556*cdf0e10cSrcweir 557*cdf0e10cSrcweir if( rThemeName.Len() ) 558*cdf0e10cSrcweir for( GalleryThemeEntry* pEntry = aThemeList.First(); pEntry && !pFound; pEntry = aThemeList.Next() ) 559*cdf0e10cSrcweir if( rThemeName == pEntry->GetThemeName() ) 560*cdf0e10cSrcweir pFound = pEntry; 561*cdf0e10cSrcweir 562*cdf0e10cSrcweir return pFound; 563*cdf0e10cSrcweir } 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir // ------------------------------------------------------------------------ 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir GalleryImportThemeEntry* Gallery::ImplGetImportThemeEntry( const String& rImportName ) 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir GalleryImportThemeEntry* pFound = NULL; 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry && !pFound; pImportEntry = aImportList.Next() ) 572*cdf0e10cSrcweir if ( rImportName == pImportEntry->aUIName ) 573*cdf0e10cSrcweir pFound = pImportEntry; 574*cdf0e10cSrcweir 575*cdf0e10cSrcweir return pFound; 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir 578*cdf0e10cSrcweir // ------------------------------------------------------------------------ 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir String Gallery::GetThemeName( sal_uIntPtr nThemeId ) const 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir GalleryThemeEntry* pFound = NULL; 583*cdf0e10cSrcweir 584*cdf0e10cSrcweir for( sal_uIntPtr n = 0, nCount = aThemeList.Count(); n < nCount; n++ ) 585*cdf0e10cSrcweir { 586*cdf0e10cSrcweir GalleryThemeEntry* pEntry = aThemeList.GetObject( n ); 587*cdf0e10cSrcweir 588*cdf0e10cSrcweir if( nThemeId == pEntry->GetId() ) 589*cdf0e10cSrcweir pFound = pEntry; 590*cdf0e10cSrcweir } 591*cdf0e10cSrcweir 592*cdf0e10cSrcweir // try fallback, if no entry was found 593*cdf0e10cSrcweir if( !pFound ) 594*cdf0e10cSrcweir { 595*cdf0e10cSrcweir ByteString aFallback; 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir switch( nThemeId ) 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir case( GALLERY_THEME_3D ): aFallback = "3D"; break; 600*cdf0e10cSrcweir case( GALLERY_THEME_BULLETS ): aFallback = "Bullets"; break; 601*cdf0e10cSrcweir case( GALLERY_THEME_HOMEPAGE ): aFallback = "Homepage"; break; 602*cdf0e10cSrcweir case( GALLERY_THEME_POWERPOINT ): aFallback = "private://gallery/hidden/imgppt"; break; 603*cdf0e10cSrcweir case( GALLERY_THEME_FONTWORK ): aFallback = "private://gallery/hidden/fontwork"; break; 604*cdf0e10cSrcweir case( GALLERY_THEME_FONTWORK_VERTICAL ): aFallback = "private://gallery/hidden/fontworkvertical"; break; 605*cdf0e10cSrcweir case( GALLERY_THEME_RULERS ): aFallback = "Rulers"; break; 606*cdf0e10cSrcweir case( GALLERY_THEME_SOUNDS ): aFallback = "Sounds"; break; 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir default: 609*cdf0e10cSrcweir break; 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir pFound = ( (Gallery*) this )->ImplGetThemeEntry( String::CreateFromAscii( aFallback.GetBuffer() ) ); 613*cdf0e10cSrcweir } 614*cdf0e10cSrcweir 615*cdf0e10cSrcweir return( pFound ? pFound->GetThemeName() : String() ); 616*cdf0e10cSrcweir } 617*cdf0e10cSrcweir 618*cdf0e10cSrcweir // ------------------------------------------------------------------------ 619*cdf0e10cSrcweir 620*cdf0e10cSrcweir sal_Bool Gallery::HasTheme( const String& rThemeName ) 621*cdf0e10cSrcweir { 622*cdf0e10cSrcweir return( ImplGetThemeEntry( rThemeName ) != NULL ); 623*cdf0e10cSrcweir } 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir // ------------------------------------------------------------------------ 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir sal_Bool Gallery::CreateTheme( const String& rThemeName, sal_uInt32 nNumFrom ) 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir sal_Bool bRet = sal_False; 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir if( !HasTheme( rThemeName ) && ( GetUserURL().GetProtocol() != INET_PROT_NOT_VALID ) ) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir nLastFileNumber = nNumFrom > nLastFileNumber ? nNumFrom : nLastFileNumber + 1; 634*cdf0e10cSrcweir GalleryThemeEntry* pNewEntry = new GalleryThemeEntry( GetUserURL(), rThemeName, 635*cdf0e10cSrcweir nLastFileNumber, 636*cdf0e10cSrcweir sal_False, sal_False, sal_True, 0, sal_False ); 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir aThemeList.Insert( pNewEntry, LIST_APPEND ); 639*cdf0e10cSrcweir delete( new GalleryTheme( this, pNewEntry ) ); 640*cdf0e10cSrcweir Broadcast( GalleryHint( GALLERY_HINT_THEME_CREATED, rThemeName ) ); 641*cdf0e10cSrcweir bRet = sal_True; 642*cdf0e10cSrcweir } 643*cdf0e10cSrcweir 644*cdf0e10cSrcweir return bRet; 645*cdf0e10cSrcweir } 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir // ------------------------------------------------------------------------ 648*cdf0e10cSrcweir 649*cdf0e10cSrcweir sal_Bool Gallery::CreateImportTheme( const INetURLObject& rURL, const String& rImportName ) 650*cdf0e10cSrcweir { 651*cdf0e10cSrcweir INetURLObject aURL( rURL ); 652*cdf0e10cSrcweir sal_Bool bRet = sal_False; 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 655*cdf0e10cSrcweir 656*cdf0e10cSrcweir if( FileExists( aURL ) ) 657*cdf0e10cSrcweir { 658*cdf0e10cSrcweir SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir if( pIStm ) 661*cdf0e10cSrcweir { 662*cdf0e10cSrcweir sal_uIntPtr nStmErr; 663*cdf0e10cSrcweir sal_uInt16 nId; 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir *pIStm >> nId; 666*cdf0e10cSrcweir 667*cdf0e10cSrcweir if( nId > 0x0004 ) 668*cdf0e10cSrcweir ErrorHandler::HandleError( ERRCODE_IO_GENERAL ); 669*cdf0e10cSrcweir else 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir ByteString aTmpStr; 672*cdf0e10cSrcweir String aThemeName; *pIStm >> aTmpStr; aThemeName = String( aTmpStr, RTL_TEXTENCODING_UTF8 ); 673*cdf0e10cSrcweir GalleryThemeEntry* pThemeEntry = new GalleryThemeEntry( aURL, rImportName, 674*cdf0e10cSrcweir String(aURL.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32(), 675*cdf0e10cSrcweir sal_True, sal_True, sal_True, 0, sal_False ); 676*cdf0e10cSrcweir GalleryTheme* pImportTheme = new GalleryTheme( this, pThemeEntry ); 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir pIStm->Seek( STREAM_SEEK_TO_BEGIN ); 679*cdf0e10cSrcweir *pIStm >> *pImportTheme; 680*cdf0e10cSrcweir nStmErr = pIStm->GetError(); 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir if( nStmErr ) 683*cdf0e10cSrcweir { 684*cdf0e10cSrcweir delete pThemeEntry; 685*cdf0e10cSrcweir ErrorHandler::HandleError( ERRCODE_IO_GENERAL ); 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir else 688*cdf0e10cSrcweir { 689*cdf0e10cSrcweir String aName( rImportName ); 690*cdf0e10cSrcweir String aNewName( aName ); 691*cdf0e10cSrcweir sal_uIntPtr nCount = 0; 692*cdf0e10cSrcweir 693*cdf0e10cSrcweir aName += ' '; 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir while ( HasTheme( aNewName ) && ( nCount++ < 16000 ) ) 696*cdf0e10cSrcweir { 697*cdf0e10cSrcweir aNewName = aName; 698*cdf0e10cSrcweir aNewName += String::CreateFromInt32( nCount ); 699*cdf0e10cSrcweir } 700*cdf0e10cSrcweir 701*cdf0e10cSrcweir pImportTheme->SetImportName( aNewName ); 702*cdf0e10cSrcweir aThemeList.Insert( pThemeEntry, LIST_APPEND ); 703*cdf0e10cSrcweir 704*cdf0e10cSrcweir // Thema in Import-Liste eintragen und Import-Liste speichern 705*cdf0e10cSrcweir GalleryImportThemeEntry* pImportEntry = new GalleryImportThemeEntry; 706*cdf0e10cSrcweir pImportEntry->aThemeName = pImportEntry->aUIName = aNewName; 707*cdf0e10cSrcweir pImportEntry->aURL = rURL; 708*cdf0e10cSrcweir pImportEntry->aImportName = rImportName; 709*cdf0e10cSrcweir aImportList.Insert( pImportEntry, LIST_APPEND ); 710*cdf0e10cSrcweir ImplWriteImportList(); 711*cdf0e10cSrcweir bRet = sal_True; 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir delete pImportTheme; 715*cdf0e10cSrcweir } 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir delete pIStm; 718*cdf0e10cSrcweir } 719*cdf0e10cSrcweir } 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir return bRet; 722*cdf0e10cSrcweir } 723*cdf0e10cSrcweir 724*cdf0e10cSrcweir // ------------------------------------------------------------------------ 725*cdf0e10cSrcweir 726*cdf0e10cSrcweir sal_Bool Gallery::RenameTheme( const String& rOldName, const String& rNewName ) 727*cdf0e10cSrcweir { 728*cdf0e10cSrcweir GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rOldName ); 729*cdf0e10cSrcweir sal_Bool bRet = sal_False; 730*cdf0e10cSrcweir 731*cdf0e10cSrcweir // Ueberpruefen, ob neuer Themenname schon vorhanden ist 732*cdf0e10cSrcweir if( pThemeEntry && !HasTheme( rNewName ) && ( !pThemeEntry->IsReadOnly() || pThemeEntry->IsImported() ) ) 733*cdf0e10cSrcweir { 734*cdf0e10cSrcweir SfxListener aListener; 735*cdf0e10cSrcweir GalleryTheme* pThm = AcquireTheme( rOldName, aListener ); 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir if( pThm ) 738*cdf0e10cSrcweir { 739*cdf0e10cSrcweir const String aOldName( rOldName ); 740*cdf0e10cSrcweir 741*cdf0e10cSrcweir pThemeEntry->SetName( rNewName ); 742*cdf0e10cSrcweir pThm->ImplWrite(); 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir if( pThemeEntry->IsImported() ) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir pThm->SetImportName( rNewName ); 747*cdf0e10cSrcweir 748*cdf0e10cSrcweir GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rOldName ); 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir if( pImportEntry ) 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir pImportEntry->aUIName = rNewName; 753*cdf0e10cSrcweir ImplWriteImportList(); 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir } 756*cdf0e10cSrcweir 757*cdf0e10cSrcweir Broadcast( GalleryHint( GALLERY_HINT_THEME_RENAMED, aOldName, pThm->GetName() ) ); 758*cdf0e10cSrcweir ReleaseTheme( pThm, aListener ); 759*cdf0e10cSrcweir bRet = sal_True; 760*cdf0e10cSrcweir } 761*cdf0e10cSrcweir } 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir return bRet; 764*cdf0e10cSrcweir } 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir // ------------------------------------------------------------------------ 767*cdf0e10cSrcweir 768*cdf0e10cSrcweir sal_Bool Gallery::RemoveTheme( const String& rThemeName ) 769*cdf0e10cSrcweir { 770*cdf0e10cSrcweir GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName ); 771*cdf0e10cSrcweir sal_Bool bRet = sal_False; 772*cdf0e10cSrcweir 773*cdf0e10cSrcweir if( pThemeEntry && ( !pThemeEntry->IsReadOnly() || pThemeEntry->IsImported() ) ) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir Broadcast( GalleryHint( GALLERY_HINT_CLOSE_THEME, rThemeName ) ); 776*cdf0e10cSrcweir 777*cdf0e10cSrcweir if( pThemeEntry->IsImported() ) 778*cdf0e10cSrcweir { 779*cdf0e10cSrcweir GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rThemeName ); 780*cdf0e10cSrcweir 781*cdf0e10cSrcweir if( pImportEntry ) 782*cdf0e10cSrcweir { 783*cdf0e10cSrcweir delete aImportList.Remove( pImportEntry ); 784*cdf0e10cSrcweir ImplWriteImportList(); 785*cdf0e10cSrcweir } 786*cdf0e10cSrcweir } 787*cdf0e10cSrcweir else 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir SfxListener aListener; 790*cdf0e10cSrcweir GalleryTheme* pThm = AcquireTheme( rThemeName, aListener ); 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir if( pThm ) 793*cdf0e10cSrcweir { 794*cdf0e10cSrcweir INetURLObject aThmURL( pThm->GetThmURL() ); 795*cdf0e10cSrcweir INetURLObject aSdgURL( pThm->GetSdgURL() ); 796*cdf0e10cSrcweir INetURLObject aSdvURL( pThm->GetSdvURL() ); 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir ReleaseTheme( pThm, aListener ); 799*cdf0e10cSrcweir 800*cdf0e10cSrcweir KillFile( aThmURL ); 801*cdf0e10cSrcweir KillFile( aSdgURL ); 802*cdf0e10cSrcweir KillFile( aSdvURL ); 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir } 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir delete aThemeList.Remove( pThemeEntry ); 807*cdf0e10cSrcweir Broadcast( GalleryHint( GALLERY_HINT_THEME_REMOVED, rThemeName ) ); 808*cdf0e10cSrcweir 809*cdf0e10cSrcweir bRet = sal_True; 810*cdf0e10cSrcweir } 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir return bRet; 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir 815*cdf0e10cSrcweir // ------------------------------------------------------------------------ 816*cdf0e10cSrcweir 817*cdf0e10cSrcweir INetURLObject Gallery::GetImportURL( const String& rThemeName ) 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir INetURLObject aURL; 820*cdf0e10cSrcweir GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rThemeName ); 821*cdf0e10cSrcweir 822*cdf0e10cSrcweir if( pImportEntry ) 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir aURL = pImportEntry->aURL; 825*cdf0e10cSrcweir DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir 828*cdf0e10cSrcweir return aURL; 829*cdf0e10cSrcweir } 830*cdf0e10cSrcweir 831*cdf0e10cSrcweir // ------------------------------------------------------------------------ 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir GalleryTheme* Gallery::ImplGetCachedTheme( const GalleryThemeEntry* pThemeEntry ) 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir GalleryTheme* pTheme = NULL; 836*cdf0e10cSrcweir 837*cdf0e10cSrcweir if( pThemeEntry ) 838*cdf0e10cSrcweir { 839*cdf0e10cSrcweir GalleryThemeCacheEntry* pEntry; 840*cdf0e10cSrcweir 841*cdf0e10cSrcweir for( pEntry = (GalleryThemeCacheEntry*) aThemeCache.First(); pEntry && !pTheme; pEntry = (GalleryThemeCacheEntry*) aThemeCache.Next() ) 842*cdf0e10cSrcweir if( pThemeEntry == pEntry->GetThemeEntry() ) 843*cdf0e10cSrcweir pTheme = pEntry->GetTheme(); 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir if( !pTheme ) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir INetURLObject aURL; 848*cdf0e10cSrcweir 849*cdf0e10cSrcweir if( !pThemeEntry->IsImported() ) 850*cdf0e10cSrcweir aURL = pThemeEntry->GetThmURL(); 851*cdf0e10cSrcweir else 852*cdf0e10cSrcweir aURL = GetImportURL( pThemeEntry->GetThemeName() ); 853*cdf0e10cSrcweir 854*cdf0e10cSrcweir DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir if( FileExists( aURL ) ) 857*cdf0e10cSrcweir { 858*cdf0e10cSrcweir SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); 859*cdf0e10cSrcweir 860*cdf0e10cSrcweir if( pIStm ) 861*cdf0e10cSrcweir { 862*cdf0e10cSrcweir pTheme = new GalleryTheme( this, (GalleryThemeEntry*) pThemeEntry ); 863*cdf0e10cSrcweir *pIStm >> *pTheme; 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir if( pIStm->GetError() ) 866*cdf0e10cSrcweir delete pTheme, pTheme = NULL; 867*cdf0e10cSrcweir else if( pThemeEntry->IsImported() ) 868*cdf0e10cSrcweir pTheme->SetImportName( pThemeEntry->GetThemeName() ); 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir delete pIStm; 871*cdf0e10cSrcweir } 872*cdf0e10cSrcweir } 873*cdf0e10cSrcweir 874*cdf0e10cSrcweir if( pTheme ) 875*cdf0e10cSrcweir aThemeCache.Insert( new GalleryThemeCacheEntry( pThemeEntry, pTheme ), LIST_APPEND ); 876*cdf0e10cSrcweir } 877*cdf0e10cSrcweir } 878*cdf0e10cSrcweir 879*cdf0e10cSrcweir return pTheme; 880*cdf0e10cSrcweir } 881*cdf0e10cSrcweir 882*cdf0e10cSrcweir // ------------------------------------------------------------------------ 883*cdf0e10cSrcweir 884*cdf0e10cSrcweir void Gallery::ImplDeleteCachedTheme( GalleryTheme* pTheme ) 885*cdf0e10cSrcweir { 886*cdf0e10cSrcweir GalleryThemeCacheEntry* pEntry; 887*cdf0e10cSrcweir sal_Bool bDone = sal_False; 888*cdf0e10cSrcweir 889*cdf0e10cSrcweir for( pEntry = (GalleryThemeCacheEntry*) aThemeCache.First(); pEntry && !bDone; pEntry = (GalleryThemeCacheEntry*) aThemeCache.Next() ) 890*cdf0e10cSrcweir { 891*cdf0e10cSrcweir if( pTheme == pEntry->GetTheme() ) 892*cdf0e10cSrcweir { 893*cdf0e10cSrcweir delete (GalleryThemeCacheEntry*) aThemeCache.Remove( pEntry ); 894*cdf0e10cSrcweir bDone = sal_True; 895*cdf0e10cSrcweir } 896*cdf0e10cSrcweir } 897*cdf0e10cSrcweir } 898*cdf0e10cSrcweir 899*cdf0e10cSrcweir // ------------------------------------------------------------------------ 900*cdf0e10cSrcweir 901*cdf0e10cSrcweir GalleryTheme* Gallery::AcquireTheme( const String& rThemeName, SfxListener& rListener ) 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir GalleryTheme* pTheme = NULL; 904*cdf0e10cSrcweir GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName ); 905*cdf0e10cSrcweir 906*cdf0e10cSrcweir if( pThemeEntry && ( ( pTheme = ImplGetCachedTheme( pThemeEntry ) ) != NULL ) ) 907*cdf0e10cSrcweir rListener.StartListening( *pTheme ); 908*cdf0e10cSrcweir 909*cdf0e10cSrcweir return pTheme; 910*cdf0e10cSrcweir } 911*cdf0e10cSrcweir 912*cdf0e10cSrcweir // ------------------------------------------------------------------------ 913*cdf0e10cSrcweir 914*cdf0e10cSrcweir void Gallery::ReleaseTheme( GalleryTheme* pTheme, SfxListener& rListener ) 915*cdf0e10cSrcweir { 916*cdf0e10cSrcweir if( pTheme ) 917*cdf0e10cSrcweir { 918*cdf0e10cSrcweir rListener.EndListening( *pTheme ); 919*cdf0e10cSrcweir 920*cdf0e10cSrcweir if( !pTheme->HasListeners() ) 921*cdf0e10cSrcweir ImplDeleteCachedTheme( pTheme ); 922*cdf0e10cSrcweir } 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir sal_Bool GalleryThemeEntry::IsDefault() const 926*cdf0e10cSrcweir { return( ( nId > 0 ) && ( nId != ( RID_GALLERYSTR_THEME_MYTHEME - RID_GALLERYSTR_THEME_START ) ) ); } 927*cdf0e10cSrcweir 928