blob: 9a67804bc77956cd01d877dd647bd209fee9aa58 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#define ENABLE_BYTESTRING_STREAM_OPERATORS
#include <tools/vcompat.hxx>
#include <ucbhelper/content.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <unotools/pathoptions.hxx>
#include <sfx2/docfile.hxx>
#include "svx/gallery.hxx"
#include "gallery.hrc"
#include "svx/galmisc.hxx"
#include "svx/galtheme.hxx"
#include "svx/gallery1.hxx"
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/ucb/XContentAccess.hpp>
#define ENABLE_BYTESTRING_STREAM_OPERATORS
// --------------
// - Namespaces -
// --------------
using namespace ::rtl;
using namespace ::com::sun::star;
// ---------------------
// - GalleryThemeEntry -
// ---------------------
GalleryThemeEntry::GalleryThemeEntry( const INetURLObject& rBaseURL, const String& rName,
sal_uInt32 _nFileNumber, sal_Bool _bReadOnly, sal_Bool _bImported,
sal_Bool _bNewFile, sal_uInt32 _nId, sal_Bool _bThemeNameFromResource ) :
nFileNumber ( _nFileNumber ),
nId ( _nId ),
bReadOnly ( _bReadOnly || _bImported ),
bImported ( _bImported ),
bThemeNameFromResource ( _bThemeNameFromResource )
{
INetURLObject aURL( rBaseURL );
DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
String aFileName( String( RTL_CONSTASCII_USTRINGPARAM( "sg" ) ) );
aURL.Append( ( aFileName += String::CreateFromInt32( nFileNumber ) ) += String( RTL_CONSTASCII_USTRINGPARAM( ".thm" ) ) );
aThmURL = ImplGetURLIgnoreCase( aURL );
aURL.setExtension( String( RTL_CONSTASCII_USTRINGPARAM( "sdg" ) ) );
aSdgURL = ImplGetURLIgnoreCase( aURL );
aURL.setExtension( String( RTL_CONSTASCII_USTRINGPARAM( "sdv" ) ) );
aSdvURL = ImplGetURLIgnoreCase( aURL );
SetModified( _bNewFile );
if( nId && bThemeNameFromResource )
{
const ResId aId (GAL_RESID( RID_GALLERYSTR_THEME_START + (sal_uInt16) nId));
if (aId.GetpResource() == NULL)
OSL_TRACE("");
aName = String(aId);
}
if( !aName.Len() )
aName = rName;
}
// -----------------------------------------------------------------------------
INetURLObject GalleryThemeEntry::ImplGetURLIgnoreCase( const INetURLObject& rURL ) const
{
INetURLObject aURL( rURL );
String aFileName;
sal_Bool bExists = sal_False;
// check original file name
if( FileExists( aURL ) )
bExists = sal_True;
else
{
// check upper case file name
aURL.setName( aURL.getName().toAsciiUpperCase() );
if( FileExists( aURL ) )
bExists = sal_True;
else
{
// check lower case file name
aURL.setName( aURL.getName().toAsciiLowerCase() );
if( FileExists( aURL ) )
bExists = sal_True;
}
}
return aURL;
}
// -----------------------------------------------------------------------------
void GalleryThemeEntry::SetName( const String& rNewName )
{
if( aName != rNewName )
{
aName = rNewName;
SetModified( sal_True );
bThemeNameFromResource = sal_False;
}
}
// -----------------------------------------------------------------------------
void GalleryThemeEntry::SetId( sal_uInt32 nNewId, sal_Bool bResetThemeName )
{
nId = nNewId;
SetModified( sal_True );
bThemeNameFromResource = ( nId && bResetThemeName );
}
// ---------------------------
// - GalleryImportThemeEntry -
// ---------------------------
SvStream& operator<<( SvStream& rOut, const GalleryImportThemeEntry& rEntry )
{
ByteString aDummy;
rOut << ByteString( rEntry.aThemeName, RTL_TEXTENCODING_UTF8 ) <<
ByteString( rEntry.aUIName, RTL_TEXTENCODING_UTF8 ) <<
ByteString( String(rEntry.aURL.GetMainURL( INetURLObject::NO_DECODE )), RTL_TEXTENCODING_UTF8 ) <<
ByteString( rEntry.aImportName, RTL_TEXTENCODING_UTF8 ) <<
aDummy;
return rOut;
}
// ------------------------------------------------------------------------
SvStream& operator>>( SvStream& rIn, GalleryImportThemeEntry& rEntry )
{
ByteString aTmpStr;
rIn >> aTmpStr; rEntry.aThemeName = String( aTmpStr, RTL_TEXTENCODING_UTF8 );
rIn >> aTmpStr; rEntry.aUIName = String( aTmpStr, RTL_TEXTENCODING_UTF8 );
rIn >> aTmpStr; rEntry.aURL = INetURLObject( String( aTmpStr, RTL_TEXTENCODING_UTF8 ) );
rIn >> aTmpStr; rEntry.aImportName = String( aTmpStr, RTL_TEXTENCODING_UTF8 );
rIn >> aTmpStr;
return rIn;
}
// --------------------------
// - GalleryThemeCacheEntry -
// --------------------------
class GalleryThemeCacheEntry;
DBG_NAME(GalleryThemeCacheEntry)
class GalleryThemeCacheEntry
{
private:
const GalleryThemeEntry* mpThemeEntry;
GalleryTheme* mpTheme;
public:
GalleryThemeCacheEntry( const GalleryThemeEntry* pThemeEntry, GalleryTheme* pTheme ) :
mpThemeEntry( pThemeEntry ), mpTheme( pTheme ) {DBG_CTOR(GalleryThemeCacheEntry,NULL);}
~GalleryThemeCacheEntry() { delete mpTheme;DBG_DTOR(GalleryThemeCacheEntry,NULL); }
const GalleryThemeEntry* GetThemeEntry() const { return mpThemeEntry; }
GalleryTheme* GetTheme() const { return mpTheme; }
};
// -----------
// - Gallery -
// -----------
Gallery::Gallery( const String& rMultiPath )
: nReadTextEncoding ( gsl_getSystemTextEncoding() )
, nLastFileNumber ( 0 )
, bMultiPath ( sal_False )
{
ImplLoad( rMultiPath );
}
// ------------------------------------------------------------------------
Gallery::~Gallery()
{
// Themen-Liste loeschen
for( GalleryThemeEntry* pThemeEntry = aThemeList.First(); pThemeEntry; pThemeEntry = aThemeList.Next() )
delete pThemeEntry;
// Import-Liste loeschen
for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() )
delete pImportEntry;
}
// ------------------------------------------------------------------------
Gallery* Gallery::GetGalleryInstance()
{
static Gallery* pGallery = NULL;
if( !pGallery )
{
::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
if( !pGallery )
{
pGallery = new Gallery( SvtPathOptions().GetGalleryPath() );
}
}
return pGallery;
}
// ------------------------------------------------------------------------
void Gallery::ImplLoad( const String& rMultiPath )
{
const sal_uInt16 nTokenCount = rMultiPath.GetTokenCount( ';' );
sal_Bool bIsReadOnlyDir;
bMultiPath = ( nTokenCount > 0 );
INetURLObject aCurURL(SvtPathOptions().GetConfigPath());
ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
if( !bIsReadOnlyDir )
aUserURL = aCurURL;
if( bMultiPath )
{
aRelURL = INetURLObject( rMultiPath.GetToken( 0, ';' ) );
for( sal_uInt16 i = 0UL; i < nTokenCount; i++ )
{
aCurURL = INetURLObject(rMultiPath.GetToken( i, ';' ));
ImplLoadSubDirs( aCurURL, bIsReadOnlyDir );
if( !bIsReadOnlyDir )
aUserURL = aCurURL;
}
}
else
aRelURL = INetURLObject( rMultiPath );
DBG_ASSERT( aUserURL.GetProtocol() != INET_PROT_NOT_VALID, "no writable Gallery user directory available" );
DBG_ASSERT( aRelURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
ImplLoadImports();
}
// ------------------------------------------------------------------------
void Gallery::ImplLoadSubDirs( const INetURLObject& rBaseURL, sal_Bool& rbDirIsReadOnly )
{
rbDirIsReadOnly = sal_False;
try
{
uno::Reference< ucb::XCommandEnvironment > xEnv;
::ucbhelper::Content aCnt( rBaseURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv );
uno::Sequence< OUString > aProps( 1 );
aProps.getArray()[ 0 ] = OUString::createFromAscii( "Url" );
uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
try
{
// check readonlyness the very hard way
INetURLObject aTestURL( rBaseURL );
String aTestFile( RTL_CONSTASCII_USTRINGPARAM( "cdefghij.klm" ) );
aTestURL.Append( aTestFile );
SvStream* pTestStm = ::utl::UcbStreamHelper::CreateStream( aTestURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
if( pTestStm )
{
*pTestStm << 1;
if( pTestStm->GetError() )
rbDirIsReadOnly = sal_True;
delete pTestStm;
KillFile( aTestURL );
}
else
rbDirIsReadOnly = sal_True;
}
catch( const ucb::ContentCreationException& )
{
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
if( xResultSet.is() )
{
uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
if( xContentAccess.is() )
{
static const ::rtl::OUString s_sTitle(RTL_CONSTASCII_USTRINGPARAM("Title"));
static const ::rtl::OUString s_sIsReadOnly(RTL_CONSTASCII_USTRINGPARAM("IsReadOnly"));
static const ::rtl::OUString s_sSDG_EXT(RTL_CONSTASCII_USTRINGPARAM("sdg"));
static const ::rtl::OUString s_sSDV_EXT(RTL_CONSTASCII_USTRINGPARAM("sdv"));
while( xResultSet->next() )
{
INetURLObject aThmURL( xContentAccess->queryContentIdentifierString() );
if(aThmURL.GetExtension().equalsIgnoreAsciiCaseAscii("thm"))
{
INetURLObject aSdgURL( aThmURL); aSdgURL.SetExtension( s_sSDG_EXT );
INetURLObject aSdvURL( aThmURL ); aSdvURL.SetExtension( s_sSDV_EXT );
OUString aTitle;
sal_Bool bReadOnly = sal_False;
try
{
::ucbhelper::Content aThmCnt( aThmURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv );
::ucbhelper::Content aSdgCnt( aSdgURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv );
::ucbhelper::Content aSdvCnt( aSdvURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv );
try
{
aThmCnt.getPropertyValue( s_sTitle ) >>= aTitle;
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
if( aTitle.getLength() )
{
try
{
aThmCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
if( !bReadOnly )
{
try
{
aSdgCnt.getPropertyValue( s_sTitle ) >>= aTitle;
}
catch( const ::com::sun::star::uno::RuntimeException& )
{
}
catch( const ::com::sun::star::uno::Exception& )
{
}
if( aTitle.getLength() )
{
try
{
aSdgCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
}
}
if( !bReadOnly )
{
try
{
aSdvCnt.getPropertyValue( s_sTitle ) >>= aTitle;
}
catch( const ::com::sun::star::uno::RuntimeException& )
{
}
catch( const ::com::sun::star::uno::Exception& )
{
}
if( aTitle.getLength() )
{
try
{
aSdvCnt.getPropertyValue( s_sIsReadOnly ) >>= bReadOnly;
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
}
}
GalleryThemeEntry* pEntry = GalleryTheme::CreateThemeEntry( aThmURL, rbDirIsReadOnly || bReadOnly );
if( pEntry )
{
const sal_uIntPtr nFileNumber = (sal_uIntPtr) String(aThmURL.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32();
aThemeList.Insert( pEntry, LIST_APPEND );
if( nFileNumber > nLastFileNumber )
nLastFileNumber = nFileNumber;
}
}
}
catch( const ucb::ContentCreationException& )
{
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
}
}
}
}
}
catch( const ucb::ContentCreationException& )
{
}
catch( const uno::RuntimeException& )
{
}
catch( const uno::Exception& )
{
}
}
// ------------------------------------------------------------------------
void Gallery::ImplLoadImports()
{
INetURLObject aURL( GetUserURL() );
aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "gallery.sdi" ) ) );
if( FileExists( aURL ) )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
GalleryThemeEntry* pThemeEntry;
GalleryImportThemeEntry* pImportEntry;
INetURLObject aFile;
sal_uInt32 nInventor;
sal_uInt32 nCount;
sal_uInt16 nId;
sal_uInt16 i;
sal_uInt16 nTempCharSet;
for( pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() )
delete pImportEntry;
aImportList.Clear();
*pIStm >> nInventor;
if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) )
{
*pIStm >> nId >> nCount >> nTempCharSet;
for( i = 0; i < nCount; i++ )
{
pImportEntry = new GalleryImportThemeEntry;
*pIStm >> *pImportEntry;
aImportList.Insert( pImportEntry, LIST_APPEND );
aFile = INetURLObject( pImportEntry->aURL );
pThemeEntry = new GalleryThemeEntry( aFile,
pImportEntry->aUIName,
String(aFile.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32(),
sal_True, sal_True, sal_False, 0, sal_False );
aThemeList.Insert( pThemeEntry, LIST_APPEND );
}
}
delete pIStm;
}
}
}
// ------------------------------------------------------------------------
void Gallery::ImplWriteImportList()
{
INetURLObject aURL( GetUserURL() );
aURL.Append( ( String( "gallery.sdi", RTL_TEXTENCODING_UTF8 ) ) );
SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
if( pOStm )
{
const sal_uInt32 nInventor = (sal_uInt32) COMPAT_FORMAT( 'S', 'G', 'A', '3' );
const sal_uInt16 nId = 0x0004;
*pOStm << nInventor << nId << (sal_uInt32) aImportList.Count() << (sal_uInt16) gsl_getSystemTextEncoding();
for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry; pImportEntry = aImportList.Next() )
*pOStm << *pImportEntry;
if( pOStm->GetError() )
ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
delete pOStm;
}
}
// ------------------------------------------------------------------------
GalleryThemeEntry* Gallery::ImplGetThemeEntry( const String& rThemeName )
{
GalleryThemeEntry* pFound = NULL;
if( rThemeName.Len() )
for( GalleryThemeEntry* pEntry = aThemeList.First(); pEntry && !pFound; pEntry = aThemeList.Next() )
if( rThemeName == pEntry->GetThemeName() )
pFound = pEntry;
return pFound;
}
// ------------------------------------------------------------------------
GalleryImportThemeEntry* Gallery::ImplGetImportThemeEntry( const String& rImportName )
{
GalleryImportThemeEntry* pFound = NULL;
for( GalleryImportThemeEntry* pImportEntry = aImportList.First(); pImportEntry && !pFound; pImportEntry = aImportList.Next() )
if ( rImportName == pImportEntry->aUIName )
pFound = pImportEntry;
return pFound;
}
// ------------------------------------------------------------------------
String Gallery::GetThemeName( sal_uIntPtr nThemeId ) const
{
GalleryThemeEntry* pFound = NULL;
for( sal_uIntPtr n = 0, nCount = aThemeList.Count(); n < nCount; n++ )
{
GalleryThemeEntry* pEntry = aThemeList.GetObject( n );
if( nThemeId == pEntry->GetId() )
pFound = pEntry;
}
// try fallback, if no entry was found
if( !pFound )
{
ByteString aFallback;
switch( nThemeId )
{
case( GALLERY_THEME_3D ): aFallback = "3D"; break;
case( GALLERY_THEME_BULLETS ): aFallback = "Bullets"; break;
case( GALLERY_THEME_HOMEPAGE ): aFallback = "Homepage"; break;
case( GALLERY_THEME_POWERPOINT ): aFallback = "private://gallery/hidden/imgppt"; break;
case( GALLERY_THEME_FONTWORK ): aFallback = "private://gallery/hidden/fontwork"; break;
case( GALLERY_THEME_FONTWORK_VERTICAL ): aFallback = "private://gallery/hidden/fontworkvertical"; break;
case( GALLERY_THEME_RULERS ): aFallback = "Rulers"; break;
case( GALLERY_THEME_SOUNDS ): aFallback = "Sounds"; break;
case( RID_GALLERYSTR_THEME_ARROWS ): aFallback = "Arrows"; break;
case( RID_GALLERYSTR_THEME_COMPUTERS ): aFallback = "Computers"; break;
case( RID_GALLERYSTR_THEME_DIAGRAMS ): aFallback = "Diagrams"; break;
case( RID_GALLERYSTR_THEME_EDUCATION ): aFallback = "Education"; break;
case( RID_GALLERYSTR_THEME_ENVIRONMENT ): aFallback = "Environment"; break;
case( RID_GALLERYSTR_THEME_FINANCE ): aFallback = "Finance"; break;
case( RID_GALLERYSTR_THEME_PEOPLE ): aFallback = "People"; break;
case( RID_GALLERYSTR_THEME_SYMBOLS ): aFallback = "Symbols"; break;
case( RID_GALLERYSTR_THEME_TRANSPORT ): aFallback = "Transport"; break;
case( RID_GALLERYSTR_THEME_TXTSHAPES ): aFallback = "Textshapes"; break;
default:
break;
}
pFound = ( (Gallery*) this )->ImplGetThemeEntry( String::CreateFromAscii( aFallback.GetBuffer() ) );
}
return( pFound ? pFound->GetThemeName() : String() );
}
// ------------------------------------------------------------------------
sal_Bool Gallery::HasTheme( const String& rThemeName )
{
return( ImplGetThemeEntry( rThemeName ) != NULL );
}
// ------------------------------------------------------------------------
sal_Bool Gallery::CreateTheme( const String& rThemeName, sal_uInt32 nNumFrom )
{
sal_Bool bRet = sal_False;
if( !HasTheme( rThemeName ) && ( GetUserURL().GetProtocol() != INET_PROT_NOT_VALID ) )
{
nLastFileNumber = nNumFrom > nLastFileNumber ? nNumFrom : nLastFileNumber + 1;
GalleryThemeEntry* pNewEntry = new GalleryThemeEntry( GetUserURL(), rThemeName,
nLastFileNumber,
sal_False, sal_False, sal_True, 0, sal_False );
aThemeList.Insert( pNewEntry, LIST_APPEND );
delete( new GalleryTheme( this, pNewEntry ) );
Broadcast( GalleryHint( GALLERY_HINT_THEME_CREATED, rThemeName ) );
bRet = sal_True;
}
return bRet;
}
// ------------------------------------------------------------------------
sal_Bool Gallery::CreateImportTheme( const INetURLObject& rURL, const String& rImportName )
{
INetURLObject aURL( rURL );
sal_Bool bRet = sal_False;
DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
if( FileExists( aURL ) )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
sal_uIntPtr nStmErr;
sal_uInt16 nId;
*pIStm >> nId;
if( nId > 0x0004 )
ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
else
{
ByteString aTmpStr;
String aThemeName; *pIStm >> aTmpStr; aThemeName = String( aTmpStr, RTL_TEXTENCODING_UTF8 );
GalleryThemeEntry* pThemeEntry = new GalleryThemeEntry( aURL, rImportName,
String(aURL.GetBase()).Erase( 0, 2 ).Erase( 6 ).ToInt32(),
sal_True, sal_True, sal_True, 0, sal_False );
GalleryTheme* pImportTheme = new GalleryTheme( this, pThemeEntry );
pIStm->Seek( STREAM_SEEK_TO_BEGIN );
*pIStm >> *pImportTheme;
nStmErr = pIStm->GetError();
if( nStmErr )
{
delete pThemeEntry;
ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
}
else
{
String aName( rImportName );
String aNewName( aName );
sal_uIntPtr nCount = 0;
aName += ' ';
while ( HasTheme( aNewName ) && ( nCount++ < 16000 ) )
{
aNewName = aName;
aNewName += String::CreateFromInt32( nCount );
}
pImportTheme->SetImportName( aNewName );
aThemeList.Insert( pThemeEntry, LIST_APPEND );
// Thema in Import-Liste eintragen und Import-Liste speichern
GalleryImportThemeEntry* pImportEntry = new GalleryImportThemeEntry;
pImportEntry->aThemeName = pImportEntry->aUIName = aNewName;
pImportEntry->aURL = rURL;
pImportEntry->aImportName = rImportName;
aImportList.Insert( pImportEntry, LIST_APPEND );
ImplWriteImportList();
bRet = sal_True;
}
delete pImportTheme;
}
delete pIStm;
}
}
return bRet;
}
// ------------------------------------------------------------------------
sal_Bool Gallery::RenameTheme( const String& rOldName, const String& rNewName )
{
GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rOldName );
sal_Bool bRet = sal_False;
// Ueberpruefen, ob neuer Themenname schon vorhanden ist
if( pThemeEntry && !HasTheme( rNewName ) && ( !pThemeEntry->IsReadOnly() || pThemeEntry->IsImported() ) )
{
SfxListener aListener;
GalleryTheme* pThm = AcquireTheme( rOldName, aListener );
if( pThm )
{
const String aOldName( rOldName );
pThemeEntry->SetName( rNewName );
pThm->ImplWrite();
if( pThemeEntry->IsImported() )
{
pThm->SetImportName( rNewName );
GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rOldName );
if( pImportEntry )
{
pImportEntry->aUIName = rNewName;
ImplWriteImportList();
}
}
Broadcast( GalleryHint( GALLERY_HINT_THEME_RENAMED, aOldName, pThm->GetName() ) );
ReleaseTheme( pThm, aListener );
bRet = sal_True;
}
}
return bRet;
}
// ------------------------------------------------------------------------
sal_Bool Gallery::RemoveTheme( const String& rThemeName )
{
GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName );
sal_Bool bRet = sal_False;
if( pThemeEntry && ( !pThemeEntry->IsReadOnly() || pThemeEntry->IsImported() ) )
{
Broadcast( GalleryHint( GALLERY_HINT_CLOSE_THEME, rThemeName ) );
if( pThemeEntry->IsImported() )
{
GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rThemeName );
if( pImportEntry )
{
delete aImportList.Remove( pImportEntry );
ImplWriteImportList();
}
}
else
{
SfxListener aListener;
GalleryTheme* pThm = AcquireTheme( rThemeName, aListener );
if( pThm )
{
INetURLObject aThmURL( pThm->GetThmURL() );
INetURLObject aSdgURL( pThm->GetSdgURL() );
INetURLObject aSdvURL( pThm->GetSdvURL() );
ReleaseTheme( pThm, aListener );
KillFile( aThmURL );
KillFile( aSdgURL );
KillFile( aSdvURL );
}
}
delete aThemeList.Remove( pThemeEntry );
Broadcast( GalleryHint( GALLERY_HINT_THEME_REMOVED, rThemeName ) );
bRet = sal_True;
}
return bRet;
}
// ------------------------------------------------------------------------
INetURLObject Gallery::GetImportURL( const String& rThemeName )
{
INetURLObject aURL;
GalleryImportThemeEntry* pImportEntry = ImplGetImportThemeEntry( rThemeName );
if( pImportEntry )
{
aURL = pImportEntry->aURL;
DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
}
return aURL;
}
// ------------------------------------------------------------------------
GalleryTheme* Gallery::ImplGetCachedTheme( const GalleryThemeEntry* pThemeEntry )
{
GalleryTheme* pTheme = NULL;
if( pThemeEntry )
{
GalleryThemeCacheEntry* pEntry;
for( pEntry = (GalleryThemeCacheEntry*) aThemeCache.First(); pEntry && !pTheme; pEntry = (GalleryThemeCacheEntry*) aThemeCache.Next() )
if( pThemeEntry == pEntry->GetThemeEntry() )
pTheme = pEntry->GetTheme();
if( !pTheme )
{
INetURLObject aURL;
if( !pThemeEntry->IsImported() )
aURL = pThemeEntry->GetThmURL();
else
aURL = GetImportURL( pThemeEntry->GetThemeName() );
DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
if( FileExists( aURL ) )
{
SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
if( pIStm )
{
pTheme = new GalleryTheme( this, (GalleryThemeEntry*) pThemeEntry );
*pIStm >> *pTheme;
if( pIStm->GetError() )
delete pTheme, pTheme = NULL;
else if( pThemeEntry->IsImported() )
pTheme->SetImportName( pThemeEntry->GetThemeName() );
delete pIStm;
}
}
if( pTheme )
aThemeCache.Insert( new GalleryThemeCacheEntry( pThemeEntry, pTheme ), LIST_APPEND );
}
}
return pTheme;
}
// ------------------------------------------------------------------------
void Gallery::ImplDeleteCachedTheme( GalleryTheme* pTheme )
{
GalleryThemeCacheEntry* pEntry;
sal_Bool bDone = sal_False;
for( pEntry = (GalleryThemeCacheEntry*) aThemeCache.First(); pEntry && !bDone; pEntry = (GalleryThemeCacheEntry*) aThemeCache.Next() )
{
if( pTheme == pEntry->GetTheme() )
{
delete (GalleryThemeCacheEntry*) aThemeCache.Remove( pEntry );
bDone = sal_True;
}
}
}
// ------------------------------------------------------------------------
GalleryTheme* Gallery::AcquireTheme( const String& rThemeName, SfxListener& rListener )
{
GalleryTheme* pTheme = NULL;
GalleryThemeEntry* pThemeEntry = ImplGetThemeEntry( rThemeName );
if( pThemeEntry && ( ( pTheme = ImplGetCachedTheme( pThemeEntry ) ) != NULL ) )
rListener.StartListening( *pTheme );
return pTheme;
}
// ------------------------------------------------------------------------
void Gallery::ReleaseTheme( GalleryTheme* pTheme, SfxListener& rListener )
{
if( pTheme )
{
rListener.EndListening( *pTheme );
if( !pTheme->HasListeners() )
ImplDeleteCachedTheme( pTheme );
}
}
sal_Bool GalleryThemeEntry::IsDefault() const
{ return( ( nId > 0 ) && ( nId != ( RID_GALLERYSTR_THEME_MYTHEME - RID_GALLERYSTR_THEME_START ) ) ); }