diff options
Diffstat (limited to 'svx/source/gallery2/galtheme.cxx')
-rw-r--r-- | svx/source/gallery2/galtheme.cxx | 1599 |
1 files changed, 1599 insertions, 0 deletions
diff --git a/svx/source/gallery2/galtheme.cxx b/svx/source/gallery2/galtheme.cxx new file mode 100644 index 000000000000..8fd38025f4a5 --- /dev/null +++ b/svx/source/gallery2/galtheme.cxx @@ -0,0 +1,1599 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +#define ENABLE_BYTESTRING_STREAM_OPERATORS + +#include <tools/urlobj.hxx> +#include <tools/vcompat.hxx> +#include <unotools/streamwrap.hxx> +#include <unotools/ucbstreamhelper.hxx> +#include <unotools/tempfile.hxx> +#include <unotools/localfilehelper.hxx> +#include <ucbhelper/content.hxx> +#include <sot/storage.hxx> +#include <sot/formats.hxx> +#include <sot/filelist.hxx> +#include <vcl/virdev.hxx> +#include <vcl/cvtgrf.hxx> +#include <svl/itempool.hxx> +#include <sfx2/docfile.hxx> +#include <avmedia/mediawindow.hxx> +#include <svx/svdograf.hxx> +#include <svx/fmpage.hxx> +#include "codec.hxx" +#include <svx/unomodel.hxx> +#include <svx/fmmodel.hxx> +#include <svx/fmview.hxx> +#include "svx/galmisc.hxx" +#include "galtheme.hxx" +#include <com/sun/star/sdbc/XResultSet.hpp> +#include <com/sun/star/ucb/XContentAccess.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include "galobj.hxx" +#include <svx/gallery1.hxx> +#include "galtheme.hrc" +#include <vcl/lstbox.hxx> +#include "gallerydrawmodel.hxx" + +// -------------- +// - Namespaces - +// -------------- + +using namespace ::rtl; +using namespace ::com::sun::star; + +// ------------ +// - SgaTheme - +// ------------ + +GalleryTheme::GalleryTheme( Gallery* pGallery, GalleryThemeEntry* pThemeEntry ) : + pParent ( pGallery ), + pThm ( pThemeEntry ), + mnThemeLockCount ( 0 ), + mnBroadcasterLockCount( 0 ), + nDragPos ( 0 ), + bDragging ( FALSE ) +{ + ImplCreateSvDrawStorage(); + + if( pThm->IsImported() ) + aImportName = pThm->GetThemeName(); +} + +// ------------------------------------------------------------------------ + +GalleryTheme::~GalleryTheme() +{ + ImplWrite(); + + for( GalleryObject* pEntry = aObjectList.First(); pEntry; pEntry = aObjectList.Next() ) + { + Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + delete pEntry; + Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + } +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::ImplCreateSvDrawStorage() +{ + if( !pThm->IsImported() ) + { + aSvDrawStorageRef = new SvStorage( FALSE, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), pThm->IsReadOnly() ? STREAM_READ : STREAM_STD_READWRITE ); + // #i50423# ReadOnly may not been set though the file can't be written (because of security reasons) + if ( ( aSvDrawStorageRef->GetError() != ERRCODE_NONE ) && !pThm->IsReadOnly() ) + aSvDrawStorageRef = new SvStorage( FALSE, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + } + else + aSvDrawStorageRef.Clear(); +} + +// ------------------------------------------------------------------------ + +BOOL GalleryTheme::ImplWriteSgaObject( const SgaObject& rObj, ULONG nPos, GalleryObject* pExistentEntry ) +{ + SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE ); + BOOL bRet = FALSE; + + if( pOStm ) + { + const sal_uInt32 nOffset = pOStm->Seek( STREAM_SEEK_TO_END ); + + rObj.WriteData( *pOStm, m_aDestDir ); + + if( !pOStm->GetError() ) + { + GalleryObject* pEntry; + + if( !pExistentEntry ) + { + pEntry = new GalleryObject; + aObjectList.Insert( pEntry, nPos ); + } + else + pEntry = pExistentEntry; + + pEntry->aURL = rObj.GetURL(); + pEntry->nOffset = nOffset; + pEntry->eObjKind = rObj.GetObjKind(); + bRet = TRUE; + } + + delete pOStm; + } + + return bRet; +} + +// ------------------------------------------------------------------------ + +SgaObject* GalleryTheme::ImplReadSgaObject( GalleryObject* pEntry ) +{ + SgaObject* pSgaObj = NULL; + + if( pEntry ) + { + SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + + if( pIStm ) + { + sal_uInt32 nInventor; + + // Ueberpruefen, ob das File ein gueltiges SGA-File ist + pIStm->Seek( pEntry->nOffset ); + *pIStm >> nInventor; + + if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) ) + { + pIStm->Seek( pEntry->nOffset ); + + switch( pEntry->eObjKind ) + { + case( SGA_OBJ_BMP ): pSgaObj = new SgaObjectBmp(); break; + case( SGA_OBJ_ANIM ): pSgaObj = new SgaObjectAnim(); break; + case( SGA_OBJ_INET ): pSgaObj = new SgaObjectINet(); break; + case( SGA_OBJ_SVDRAW ): pSgaObj = new SgaObjectSvDraw(); break; + case( SGA_OBJ_SOUND ): pSgaObj = new SgaObjectSound(); break; + + default: + break; + } + + if( pSgaObj ) + { + *pIStm >> *pSgaObj; + pSgaObj->ImplUpdateURL( pEntry->aURL ); + } + } + + delete pIStm; + } + } + + return pSgaObj; +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::ImplRead() +{ + SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + + if( pIStm ) + { + *pIStm >> *this; + delete pIStm; + } +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::ImplWrite() +{ + if( IsModified() ) + { + INetURLObject aPathURL( GetThmURL() ); + + aPathURL.removeSegment(); + aPathURL.removeFinalSlash(); + + DBG_ASSERT( aPathURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); + + if( FileExists( aPathURL ) || CreateDir( aPathURL ) ) + { +#ifdef UNX + SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_COPY_ON_SYMLINK | STREAM_TRUNC ); +#else + SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ); +#endif + + if( pOStm ) + { + *pOStm << *this; + delete pOStm; + } + + ImplSetModified( FALSE ); + } + } +} + +// ------------------------------------------------------------------------ + +const GalleryObject* GalleryTheme::ImplGetGalleryObject( const INetURLObject& rURL ) +{ + GalleryObject* pEntry = aObjectList.First(); + GalleryObject* pFoundEntry = NULL; + + for( ; pEntry && !pFoundEntry; pEntry = aObjectList.Next() ) + if( pEntry->aURL == rURL ) + pFoundEntry = pEntry; + + return pFoundEntry; +} + +// ------------------------------------------------------------------------ + +INetURLObject GalleryTheme::ImplGetURL( const GalleryObject* pObject ) const +{ + INetURLObject aURL; + + if( pObject ) + { + if( IsImported() ) + { + INetURLObject aPathURL( GetParent()->GetImportURL( GetName() ) ); + + aPathURL.removeSegment(); + aPathURL.removeFinalSlash(); + aPathURL.Append( pObject->aURL.GetName() ); + aURL = aPathURL; + } + else + aURL = pObject->aURL; + } + + return aURL; +} + +// ------------------------------------------------------------------------ + +INetURLObject GalleryTheme::ImplCreateUniqueURL( SgaObjKind eObjKind, ULONG nFormat ) +{ + INetURLObject aDir( GetParent()->GetUserURL() ); + INetURLObject aInfoFileURL( GetParent()->GetUserURL() ); + INetURLObject aNewURL; + sal_uInt32 nNextNumber = 1999; + sal_Char const* pExt = NULL; + BOOL bExists; + + aDir.Append( String( RTL_CONSTASCII_USTRINGPARAM( "dragdrop" ) ) ); + CreateDir( aDir ); + + aInfoFileURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "sdddndx1" ) ) ); + + // read next possible number + if( FileExists( aInfoFileURL ) ) + { + SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + + if( pIStm ) + { + *pIStm >> nNextNumber; + delete pIStm; + } + } + + // create extension + if( nFormat ) + { + switch( nFormat ) + { + case( CVT_BMP ): pExt = ".bmp"; break; + case( CVT_GIF ): pExt = ".gif"; break; + case( CVT_JPG ): pExt = ".jpg"; break; + case( CVT_MET ): pExt = ".met"; break; + case( CVT_PCT ): pExt = ".pct"; break; + case( CVT_PNG ): pExt = ".png"; break; + case( CVT_SVM ): pExt = ".svm"; break; + case( CVT_TIF ): pExt = ".tif"; break; + case( CVT_WMF ): pExt = ".wmf"; break; + case( CVT_EMF ): pExt = ".emf"; break; + + default: + pExt = ".grf"; + break; + } + } + + do + { + // get URL + if( SGA_OBJ_SVDRAW == eObjKind ) + { + String aFileName( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/dd" ) ); + aNewURL = INetURLObject( aFileName += String::CreateFromInt32( ++nNextNumber % 99999999 ), INET_PROT_PRIV_SOFFICE ); + + bExists = FALSE; + + for( GalleryObject* pEntry = aObjectList.First(); pEntry && !bExists; pEntry = aObjectList.Next() ) + if( pEntry->aURL == aNewURL ) + bExists = TRUE; + } + else + { + String aFileName( RTL_CONSTASCII_USTRINGPARAM( "dd" ) ); + + aFileName += String::CreateFromInt32( ++nNextNumber % 999999 ); + aFileName += String( pExt, RTL_TEXTENCODING_ASCII_US ); + + aNewURL = aDir; + aNewURL.Append( aFileName ); + + bExists = FileExists( aNewURL ); + } + } + while( bExists ); + + // write updated number + SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE ); + + if( pOStm ) + { + *pOStm << nNextNumber; + delete pOStm; + } + + return aNewURL; +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::ImplBroadcast( ULONG nUpdatePos ) +{ + if( !IsBroadcasterLocked() ) + { + if( GetObjectCount() && ( nUpdatePos >= GetObjectCount() ) ) + nUpdatePos = GetObjectCount() - 1; + + Broadcast( GalleryHint( GALLERY_HINT_THEME_UPDATEVIEW, GetName(), nUpdatePos ) ); + } +} + +// ------------------------------------------------------------------------ + +BOOL GalleryTheme::UnlockTheme() +{ + DBG_ASSERT( mnThemeLockCount, "Theme is not locked" ); + + BOOL bRet = FALSE; + + if( mnThemeLockCount ) + { + --mnThemeLockCount; + bRet = TRUE; + } + + return bRet; +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::UnlockBroadcaster( ULONG nUpdatePos ) +{ + DBG_ASSERT( mnBroadcasterLockCount, "Broadcaster is not locked" ); + + if( mnBroadcasterLockCount && !--mnBroadcasterLockCount ) + ImplBroadcast( nUpdatePos ); +} + +// ------------------------------------------------------------------------ + +BOOL GalleryTheme::InsertObject( const SgaObject& rObj, ULONG nInsertPos ) +{ + BOOL bRet = FALSE; + + if( rObj.IsValid() ) + { + GalleryObject* pEntry = aObjectList.First(); + GalleryObject* pFoundEntry = NULL; + + for( ; pEntry && !pFoundEntry; pEntry = aObjectList.Next() ) + if( pEntry->aURL == rObj.GetURL() ) + pFoundEntry = pEntry; + + if( pFoundEntry ) + { + GalleryObject aNewEntry; + + // update title of new object if neccessary + if( !rObj.GetTitle().Len() ) + { + SgaObject* pOldObj = ImplReadSgaObject( pFoundEntry ); + + if( pOldObj ) + { + ( (SgaObject&) rObj ).SetTitle( pOldObj->GetTitle() ); + delete pOldObj; + } + } + else if( rObj.GetTitle() == String( RTL_CONSTASCII_USTRINGPARAM( "__<empty>__" ) ) ) + ( (SgaObject&) rObj ).SetTitle( String() ); + + ImplWriteSgaObject( rObj, nInsertPos, &aNewEntry ); + pFoundEntry->nOffset = aNewEntry.nOffset; + } + else + ImplWriteSgaObject( rObj, nInsertPos, NULL ); + + ImplSetModified( bRet = TRUE ); + ImplBroadcast( pFoundEntry ? aObjectList.GetPos( pFoundEntry ) : nInsertPos ); + } + + return bRet; +} + +// ------------------------------------------------------------------------ + +SgaObject* GalleryTheme::AcquireObject( ULONG nPos ) +{ + return ImplReadSgaObject( aObjectList.GetObject( nPos ) ); +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::ReleaseObject( SgaObject* pObject ) +{ + delete pObject; +} + +// ------------------------------------------------------------------------ + +BOOL GalleryTheme::RemoveObject( ULONG nPos ) +{ + GalleryObject* pEntry = aObjectList.Remove( nPos ); + + if( !aObjectList.Count() ) + KillFile( GetSdgURL() ); + + if( pEntry ) + { + if( SGA_OBJ_SVDRAW == pEntry->eObjKind ) + aSvDrawStorageRef->Remove( pEntry->aURL.GetMainURL( INetURLObject::NO_DECODE ) ); + + Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + delete pEntry; + Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + + ImplSetModified( TRUE ); + ImplBroadcast( nPos ); + } + + return( pEntry != NULL ); +} + +// ------------------------------------------------------------------------ + +BOOL GalleryTheme::ChangeObjectPos( ULONG nOldPos, ULONG nNewPos ) +{ + BOOL bRet = FALSE; + + if( nOldPos != nNewPos ) + { + GalleryObject* pEntry = aObjectList.GetObject( nOldPos ); + + if( pEntry ) + { + aObjectList.Insert( pEntry, nNewPos ); + + if( nNewPos < nOldPos ) + nOldPos++; + + aObjectList.Remove( nOldPos ); + ImplSetModified( bRet = TRUE ); + ImplBroadcast( ( nNewPos < nOldPos ) ? nNewPos : ( nNewPos - 1 ) ); + } + } + + return bRet; +} + +// ------------------------------------------------------------------------ + +void GalleryTheme::Actualize( const Link& rActualizeLink, GalleryProgress* pProgress ) +{ + if( !IsReadOnly() && !IsImported() ) + { + Graphic aGraphic; + String aFormat; + GalleryObject* pEntry; + const ULONG nCount = aObjectList.Count(); + ULONG i; + + LockBroadcaster(); + bAbortActualize = FALSE; + + // LoeschFlag zuruecksetzen + for ( i = 0; i < nCount; i++ ) + aObjectList.GetObject( i )->bDummy = FALSE; + + for( i = 0; ( i < nCount ) && !bAbortActualize; i++ ) + { + if( pProgress ) + pProgress->Update( i, nCount - 1 ); + + pEntry = aObjectList.GetObject( i ); + + const INetURLObject aURL( pEntry->aURL ); + + rActualizeLink.Call( (void*) &aURL ); + + // SvDraw-Objekte werden spaeter aktualisiert + if( pEntry->eObjKind != SGA_OBJ_SVDRAW ) + { + // Hier muss noch etwas eingebaut werden, + // das Files auf den ensprechenden Eintrag matched + // Grafiken als Grafik-Objekte in die Gallery aufnehmen + if( pEntry->eObjKind == SGA_OBJ_SOUND ) + { + SgaObjectSound aObjSound( aURL ); + if( !InsertObject( aObjSound ) ) + pEntry->bDummy = TRUE; + } + else + { + aGraphic.Clear(); + + if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) ) + { + SgaObject* pNewObj; + + if ( SGA_OBJ_INET == pEntry->eObjKind ) + pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, aURL, aFormat ); + else if ( aGraphic.IsAnimated() ) + pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, aURL, aFormat ); + else + pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, aURL, aFormat ); + + if( !InsertObject( *pNewObj ) ) + pEntry->bDummy = TRUE; + + delete pNewObj; + } + else + pEntry->bDummy = TRUE; // Loesch-Flag setzen + } + } + else + { + if ( aSvDrawStorageRef.Is() ) + { + const String aStmName( GetSvDrawStreamNameFromURL( pEntry->aURL ) ); + SvStorageStreamRef pIStm = aSvDrawStorageRef->OpenSotStream( aStmName, STREAM_READ ); + + if( pIStm && !pIStm->GetError() ) + { + pIStm->SetBufferSize( 16384 ); + + SgaObjectSvDraw aNewObj( *pIStm, pEntry->aURL ); + + if( !InsertObject( aNewObj ) ) + pEntry->bDummy = TRUE; + + pIStm->SetBufferSize( 0L ); + } + } + } + } + + // remove all entries with set flag + pEntry = aObjectList.First(); + while( pEntry ) + { + if( pEntry->bDummy ) + { + Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + delete aObjectList.Remove( pEntry ); + Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< ULONG >( pEntry ) ) ); + + pEntry = aObjectList.GetCurObject(); + } + else + pEntry = aObjectList.Next(); + } + + // update theme + ::utl::TempFile aTmp; + INetURLObject aInURL( GetSdgURL() ); + INetURLObject aTmpURL( aTmp.GetURL() ); + + DBG_ASSERT( aInURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); + DBG_ASSERT( aTmpURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); + + SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + SvStream* pTmpStm = ::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ); + + if( pIStm && pTmpStm ) + { + pEntry = aObjectList.First(); + + while( pEntry ) + { + SgaObject* pObj; + + switch( pEntry->eObjKind ) + { + case( SGA_OBJ_BMP ): pObj = new SgaObjectBmp(); break; + case( SGA_OBJ_ANIM ): pObj = new SgaObjectAnim(); break; + case( SGA_OBJ_INET ): pObj = new SgaObjectINet(); break; + case( SGA_OBJ_SVDRAW ): pObj = new SgaObjectSvDraw(); break; + case (SGA_OBJ_SOUND): pObj = new SgaObjectSound(); break; + + default: + pObj = NULL; + break; + } + + if( pObj ) + { + pIStm->Seek( pEntry->nOffset ); + *pIStm >> *pObj; + pEntry->nOffset = pTmpStm->Tell(); + *pTmpStm << *pObj; + delete pObj; + } + + pEntry = aObjectList.Next(); + } + } + else + { + DBG_ERROR( "File(s) could not be opened" ); + } + + delete pIStm; + delete pTmpStm; + + CopyFile( aTmpURL, aInURL ); + KillFile( aTmpURL ); + + ULONG nStorErr = 0; + + { + SvStorageRef aTempStorageRef( new SvStorage( FALSE, aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ) ); + aSvDrawStorageRef->CopyTo( aTempStorageRef ); + nStorErr = aSvDrawStorageRef->GetError(); + } + + if( !nStorErr ) + { + aSvDrawStorageRef.Clear(); + CopyFile( aTmpURL, GetSdvURL() ); + ImplCreateSvDrawStorage(); + } + + KillFile( aTmpURL ); + ImplSetModified( TRUE ); + ImplWrite(); + UnlockBroadcaster(); + } +} + +// ------------------------------------------------------------------------ + +GalleryThemeEntry* GalleryTheme::CreateThemeEntry( const INetURLObject& rURL, BOOL bReadOnly ) +{ + DBG_ASSERT( rURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); + + GalleryThemeEntry* pRet = NULL; + + if( FileExists( rURL ) ) + { + SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( rURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); + + if( pIStm ) + { + String aThemeName; + sal_uInt32 nThemeId = 0; + sal_uInt16 nVersion; + BOOL bThemeNameFromResource = FALSE; + + *pIStm >> nVersion; + + if( nVersion <= 0x00ff ) + { + ByteString aTmpStr; + + *pIStm >> aTmpStr; aThemeName = String( aTmpStr.GetBuffer(), RTL_TEXTENCODING_UTF8 ); + + // Charakterkonvertierung durchfuehren + if( nVersion >= 0x0004 ) + { + sal_uInt32 nCount; + sal_uInt16 nTemp16; + + *pIStm >> nCount >> nTemp16; + pIStm->Seek( STREAM_SEEK_TO_END ); + + // pruefen, ob es sich um eine neuere Version handelt; + // daher um 520Bytes (8Bytes Kennung + 512Bytes Reserverpuffer ) zurueckspringen, + // falls dies ueberhaupt moeglich ist + if( pIStm->Tell() >= 520 ) + { + sal_uInt32 nId1, nId2; + + pIStm->SeekRel( -520 ); + *pIStm >> nId1 >> nId2; + + if( nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) && + nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) ) + { + VersionCompat* pCompat = new VersionCompat( *pIStm, STREAM_READ ); + + *pIStm >> nThemeId; + + if( pCompat->GetVersion() >= 2 ) + { + *pIStm >> bThemeNameFromResource; + } + + delete pCompat; + } + } + } + + INetURLObject aPathURL( rURL ); + + aPathURL.removeSegment(); + aPathURL.removeFinalSlash(); + pRet = new GalleryThemeEntry( aPathURL, aThemeName, + String(rURL.GetBase()).Copy( 2, 6 ).ToInt32(), + bReadOnly, FALSE, FALSE, nThemeId, + bThemeNameFromResource ); + } + + delete pIStm; + } + } + + return pRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::GetThumb( ULONG nPos, Bitmap& rBmp, BOOL ) +{ + SgaObject* pObj = AcquireObject( nPos ); + BOOL bRet = FALSE; + + if( pObj ) + { + rBmp = pObj->GetThumbBmp(); + ReleaseObject( pObj ); + bRet = TRUE; + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::GetGraphic( ULONG nPos, Graphic& rGraphic, BOOL bProgress ) +{ + const GalleryObject* pObject = ImplGetGalleryObject( nPos ); + BOOL bRet = FALSE; + + if( pObject ) + { + const INetURLObject aURL( ImplGetURL( pObject ) ); + + switch( pObject->eObjKind ) + { + case( SGA_OBJ_BMP ): + case( SGA_OBJ_ANIM ): + case( SGA_OBJ_INET ): + { + String aFilterDummy; + bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy, bProgress ) != SGA_IMPORT_NONE ); + } + break; + + case( SGA_OBJ_SVDRAW ): + { + SvxGalleryDrawModel aModel; + + if( aModel.GetModel() ) + { + if( GetModel( nPos, *aModel.GetModel(), bProgress ) ) + { + ImageMap aIMap; + + if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) ) + bRet = TRUE; + else + { + VirtualDevice aVDev; + aVDev.SetMapMode( MapMode( MAP_100TH_MM ) ); + FmFormView aView( aModel.GetModel(), &aVDev ); + + aView.hideMarkHandles(); + aView.ShowSdrPage(aView.GetModel()->GetPage(0)); + aView.MarkAll(); + rGraphic = aView.GetAllMarkedGraphic(); + bRet = TRUE; + } + } + } + } + break; + + case( SGA_OBJ_SOUND ): + { + SgaObject* pObj = AcquireObject( nPos ); + + if( pObj ) + { + Bitmap aBmp( pObj->GetThumbBmp() ); + aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE ); + rGraphic = aBmp; + ReleaseObject( pObj ); + bRet = TRUE; + } + } + break; + + default: + break; + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertGraphic( const Graphic& rGraphic, ULONG nInsertPos ) +{ + BOOL bRet = FALSE; + + if( rGraphic.GetType() != GRAPHIC_NONE ) + { + ULONG nExportFormat = CVT_UNKNOWN; + const GfxLink aGfxLink( ( (Graphic&) rGraphic ).GetLink() ); + + if( aGfxLink.GetDataSize() ) + { + switch( aGfxLink.GetType() ) + { + case( GFX_LINK_TYPE_EPS_BUFFER ): nExportFormat = CVT_SVM; break; + case( GFX_LINK_TYPE_NATIVE_GIF ): nExportFormat = CVT_GIF; break; + case( GFX_LINK_TYPE_NATIVE_JPG ): nExportFormat = CVT_JPG; break; + case( GFX_LINK_TYPE_NATIVE_PNG ): nExportFormat = CVT_PNG; break; + case( GFX_LINK_TYPE_NATIVE_TIF ): nExportFormat = CVT_TIF; break; + case( GFX_LINK_TYPE_NATIVE_WMF ): nExportFormat = CVT_WMF; break; + case( GFX_LINK_TYPE_NATIVE_MET ): nExportFormat = CVT_MET; break; + case( GFX_LINK_TYPE_NATIVE_PCT ): nExportFormat = CVT_PCT; break; + default: + break; + } + } + else + { + if( rGraphic.GetType() == GRAPHIC_BITMAP ) + { + if( rGraphic.IsAnimated() ) + nExportFormat = CVT_GIF; + else + nExportFormat = CVT_PNG; + } + else + nExportFormat = CVT_SVM; + } + + const INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_BMP, nExportFormat ) ); + SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ); + + if( pOStm ) + { + pOStm->SetVersion( SOFFICE_FILEFORMAT_50 ); + + if( CVT_SVM == nExportFormat ) + { + GDIMetaFile aMtf( rGraphic.GetGDIMetaFile() ); + + aMtf.Write( *pOStm ); + bRet = ( pOStm->GetError() == ERRCODE_NONE ); + } + else + { + if( aGfxLink.GetDataSize() && aGfxLink.GetData() ) + { + pOStm->Write( aGfxLink.GetData(), aGfxLink.GetDataSize() ); + bRet = ( pOStm->GetError() == ERRCODE_NONE ); + } + else + bRet = ( GraphicConverter::Export( *pOStm, rGraphic, nExportFormat ) == ERRCODE_NONE ); + } + + delete pOStm; + } + + if( bRet ) + { + const SgaObjectBmp aObjBmp( aURL.GetMainURL( INetURLObject::NO_DECODE ) ); + InsertObject( aObjBmp, nInsertPos ); + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::GetModel( ULONG nPos, SdrModel& rModel, BOOL ) +{ + const GalleryObject* pObject = ImplGetGalleryObject( nPos ); + BOOL bRet = FALSE; + + if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) ) + { + const INetURLObject aURL( ImplGetURL( pObject ) ); + SvStorageRef xStor( GetSvDrawStorage() ); + + if( xStor.Is() ) + { + const String aStmName( GetSvDrawStreamNameFromURL( aURL ) ); + SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) ); + + if( xIStm.Is() && !xIStm->GetError() ) + { + xIStm->SetBufferSize( STREAMBUF_SIZE ); + bRet = GallerySvDrawImport( *xIStm, rModel ); + xIStm->SetBufferSize( 0L ); + } + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertModel( const FmFormModel& rModel, ULONG nInsertPos ) +{ + INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) ); + SvStorageRef xStor( GetSvDrawStorage() ); + BOOL bRet = FALSE; + + if( xStor.Is() ) + { + const String aStmName( GetSvDrawStreamNameFromURL( aURL ) ); + SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) ); + + if( xOStm.Is() && !xOStm->GetError() ) + { + SvMemoryStream aMemStm( 65535, 65535 ); + FmFormModel* pFormModel = (FmFormModel*) &rModel; + + pFormModel->BurnInStyleSheetAttributes(); + + { + uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( aMemStm ) ); + + if( xDocOut.is() ) + SvxDrawingLayerExport( pFormModel, xDocOut ); + } + + aMemStm.Seek( 0 ); + + xOStm->SetBufferSize( 16348 ); + GalleryCodec aCodec( *xOStm ); + aCodec.Write( aMemStm ); + + if( !xOStm->GetError() ) + { + SgaObjectSvDraw aObjSvDraw( rModel, aURL ); + bRet = InsertObject( aObjSvDraw, nInsertPos ); + } + + xOStm->SetBufferSize( 0L ); + xOStm->Commit(); + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::GetModelStream( ULONG nPos, SotStorageStreamRef& rxModelStream, BOOL ) +{ + const GalleryObject* pObject = ImplGetGalleryObject( nPos ); + BOOL bRet = FALSE; + + if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) ) + { + const INetURLObject aURL( ImplGetURL( pObject ) ); + SvStorageRef xStor( GetSvDrawStorage() ); + + if( xStor.Is() ) + { + const String aStmName( GetSvDrawStreamNameFromURL( aURL ) ); + SvStorageStreamRef xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) ); + + if( xIStm.Is() && !xIStm->GetError() ) + { + UINT32 nVersion = 0; + + xIStm->SetBufferSize( 16348 ); + + if( GalleryCodec::IsCoded( *xIStm, nVersion ) ) + { + SvxGalleryDrawModel aModel; + + if( aModel.GetModel() ) + { + if( GallerySvDrawImport( *xIStm, *aModel.GetModel() ) ) + { + aModel.GetModel()->BurnInStyleSheetAttributes(); + + { + uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxModelStream ) ); + + if( SvxDrawingLayerExport( aModel.GetModel(), xDocOut ) ) + rxModelStream->Commit(); + } + } + + bRet = ( rxModelStream->GetError() == ERRCODE_NONE ); + } + } + + xIStm->SetBufferSize( 0 ); + } + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertModelStream( const SotStorageStreamRef& rxModelStream, ULONG nInsertPos ) +{ + INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) ); + SvStorageRef xStor( GetSvDrawStorage() ); + BOOL bRet = FALSE; + + if( xStor.Is() ) + { + const String aStmName( GetSvDrawStreamNameFromURL( aURL ) ); + SvStorageStreamRef xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) ); + + if( xOStm.Is() && !xOStm->GetError() ) + { + GalleryCodec aCodec( *xOStm ); + SvMemoryStream aMemStm( 65535, 65535 ); + + xOStm->SetBufferSize( 16348 ); + aCodec.Write( *rxModelStream ); + + if( !xOStm->GetError() ) + { + xOStm->Seek( 0 ); + SgaObjectSvDraw aObjSvDraw( *xOStm, aURL ); + bRet = InsertObject( aObjSvDraw, nInsertPos ); + } + + xOStm->SetBufferSize( 0L ); + xOStm->Commit(); + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::GetURL( ULONG nPos, INetURLObject& rURL, BOOL ) +{ + const GalleryObject* pObject = ImplGetGalleryObject( nPos ); + BOOL bRet = FALSE; + + if( pObject ) + { + rURL = INetURLObject( ImplGetURL( pObject ) ); + bRet = TRUE; + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertURL( const INetURLObject& rURL, ULONG nInsertPos ) +{ + Graphic aGraphic; + String aFormat; + SgaObject* pNewObj = NULL; + const USHORT nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat ); + BOOL bRet = FALSE; + + if( nImportRet != SGA_IMPORT_NONE ) + { + if ( SGA_IMPORT_INET == nImportRet ) + pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, rURL, aFormat ); + else if ( aGraphic.IsAnimated() ) + pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, rURL, aFormat ); + else + pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, rURL, aFormat ); + } + else if( ::avmedia::MediaWindow::isMediaURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) ) + pNewObj = (SgaObject*) new SgaObjectSound( rURL ); + + if( pNewObj && InsertObject( *pNewObj, nInsertPos ) ) + bRet = TRUE; + + delete pNewObj; + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertFileOrDirURL( const INetURLObject& rFileOrDirURL, ULONG nInsertPos ) +{ + INetURLObject aURL; + ::std::vector< INetURLObject > aURLVector; + BOOL bRet = FALSE; + + try + { + ::ucbhelper::Content aCnt( rFileOrDirURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() ); + sal_Bool bFolder = false; + + aCnt.getPropertyValue( OUString::createFromAscii( "IsFolder" ) ) >>= bFolder; + + if( bFolder ) + { + uno::Sequence< OUString > aProps( 1 ); + aProps.getArray()[ 0 ] = OUString::createFromAscii( "Url" ); + uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) ); + + if( xResultSet.is() ) + { + uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY ); + + if( xContentAccess.is() ) + { + while( xResultSet->next() ) + { + aURL.SetSmartURL( xContentAccess->queryContentIdentifierString() ); + aURLVector.push_back( aURL ); + } + } + } + } + else + aURLVector.push_back( rFileOrDirURL ); + } + catch( const ucb::ContentCreationException& ) + { + } + catch( const uno::RuntimeException& ) + { + } + catch( const uno::Exception& ) + { + } + + ::std::vector< INetURLObject >::const_iterator aIter( aURLVector.begin() ), aEnd( aURLVector.end() ); + + while( aIter != aEnd ) + bRet = bRet || InsertURL( *aIter++, nInsertPos ); + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryTheme::InsertTransferable( const uno::Reference< datatransfer::XTransferable >& rxTransferable, ULONG nInsertPos ) +{ + BOOL bRet = FALSE; + + if( rxTransferable.is() ) + { + TransferableDataHelper aDataHelper( rxTransferable ); + Graphic* pGraphic = NULL; + + if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) ) + { + SotStorageStreamRef xModelStm; + + if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xModelStm ) ) + bRet = InsertModelStream( xModelStm, nInsertPos ); + } + else if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) || + aDataHelper.HasFormat( FORMAT_FILE ) ) + { + FileList aFileList; + + if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ) + aDataHelper.GetFileList( SOT_FORMAT_FILE_LIST, aFileList ); + else + { + String aFile; + + aDataHelper.GetString( FORMAT_FILE, aFile ); + + if( aFile.Len() ) + aFileList.AppendFile( aFile ); + } + + for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i ) + { + const String aFile( aFileList.GetFile( i ) ); + INetURLObject aURL( aFile ); + + if( aURL.GetProtocol() == INET_PROT_NOT_VALID ) + { + String aLocalURL; + + if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFile, aLocalURL ) ) + aURL = INetURLObject( aLocalURL ); + } + + if( aURL.GetProtocol() != INET_PROT_NOT_VALID ) + bRet = InsertFileOrDirURL( aURL, nInsertPos ); + } + } + else + { + Graphic aGraphic; + ULONG nFormat = 0; + + if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) ) + nFormat = SOT_FORMATSTR_ID_SVXB; + else if( aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) ) + nFormat = FORMAT_GDIMETAFILE; + else if( aDataHelper.HasFormat( FORMAT_BITMAP ) ) + nFormat = FORMAT_BITMAP; + + if( nFormat && aDataHelper.GetGraphic( nFormat, aGraphic ) ) + pGraphic = new Graphic( aGraphic ); + } + + if( pGraphic ) + { + bRet = FALSE; + + if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVIM ) ) + { + + ImageMap aImageMap; + + // according to KA we don't need a BaseURL here + if( aDataHelper.GetImageMap( SOT_FORMATSTR_ID_SVIM, aImageMap ) ) + { + SvxGalleryDrawModel aModel; + + if( aModel.GetModel() ) + { + SgaUserDataFactory aFactory; + + SdrPage* pPage = aModel.GetModel()->GetPage(0); + SdrGrafObj* pGrafObj = new SdrGrafObj( *pGraphic ); + + pGrafObj->InsertUserData( new SgaIMapInfo( aImageMap ) ); + pPage->InsertObject( pGrafObj ); + bRet = InsertModel( *aModel.GetModel(), nInsertPos ); + } + } + } + + if( !bRet ) + bRet = InsertGraphic( *pGraphic, nInsertPos ); + + delete pGraphic; + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +void GalleryTheme::CopyToClipboard( Window* pWindow, ULONG nPos ) +{ + GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false ); + pTransferable->CopyToClipboard( pWindow ); +} + +// ----------------------------------------------------------------------------- + +void GalleryTheme::StartDrag( Window* pWindow, ULONG nPos ) +{ + GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, true ); + pTransferable->StartDrag( pWindow, DND_ACTION_COPY | DND_ACTION_LINK ); +} + +// ----------------------------------------------------------------------------- + +SvStream& GalleryTheme::WriteData( SvStream& rOStm ) const +{ + const INetURLObject aRelURL1( GetParent()->GetRelativeURL() ); + const INetURLObject aRelURL2( GetParent()->GetUserURL() ); + INetURLObject aNewURL, aTempURL; + sal_uInt32 nCount = GetObjectCount(); + BOOL bRel; + + rOStm << (sal_uInt16) 0x0004; + rOStm << ByteString( GetRealName(), RTL_TEXTENCODING_UTF8 ); + rOStm << nCount << (sal_uInt16) gsl_getSystemTextEncoding(); + + for( sal_uInt32 i = 0; i < nCount; i++ ) + { + const GalleryObject* pObj = ImplGetGalleryObject( i ); + String aPath; + + if( SGA_OBJ_SVDRAW == pObj->eObjKind ) + { + aPath = GetSvDrawStreamNameFromURL( pObj->aURL ); + bRel = FALSE; + } + else + { + aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ); + bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ) )); + + if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) ) + { + aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ); + aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ); + } + else + { + aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ); + bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ) )); + + if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) ) + { + aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ); + aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ); + } + else + aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ); + } + } + + aPath.SearchAndReplace(m_aDestDir, String()); + rOStm << bRel << ByteString( aPath, RTL_TEXTENCODING_UTF8 ) << pObj->nOffset << (sal_uInt16) pObj->eObjKind; + } + + // neuerdings wird ein 512-Byte-Reservepuffer gechrieben; + // um diesen zu erkennen werden zwei ULONG-Ids geschrieben + rOStm << COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) << COMPAT_FORMAT( 'E', 'S', 'R', 'V' ); + + const long nReservePos = rOStm.Tell(); + VersionCompat* pCompat = new VersionCompat( rOStm, STREAM_WRITE, 2 ); + + rOStm << (sal_uInt32) GetId() << IsThemeNameFromResource(); // ab Version 2 + + delete pCompat; + + // Rest des Puffers auffuellen + const long nRest = Max( 512L - ( (long) rOStm.Tell() - nReservePos ), 0L ); + + if( nRest ) + { + char* pReserve = new char[ nRest ]; + memset( pReserve, 0, nRest ); + rOStm.Write( pReserve, nRest ); + delete[] pReserve; + } + + return rOStm; +} + +// ------------------------------------------------------------------------ + +SvStream& GalleryTheme::ReadData( SvStream& rIStm ) +{ + sal_uInt32 nCount; + sal_uInt16 nVersion; + ByteString aTmpStr; + String aThemeName; + rtl_TextEncoding nTextEncoding; + + aImportName = String(); + rIStm >> nVersion >> aTmpStr >> nCount; + + if( nVersion >= 0x0004 ) + { + UINT16 nTmp16; + rIStm >> nTmp16; + nTextEncoding = (rtl_TextEncoding) nTmp16; + } + else + nTextEncoding = RTL_TEXTENCODING_UTF8; + + aThemeName = String( aTmpStr.GetBuffer(), nTextEncoding ); + + if( nCount <= ( 1L << 14 ) ) + { + GalleryObject* pObj; + INetURLObject aRelURL1( GetParent()->GetRelativeURL() ); + INetURLObject aRelURL2( GetParent()->GetUserURL() ); + sal_uInt32 nId1, nId2; + BOOL bRel; + + for( pObj = aObjectList.First(); pObj; pObj = aObjectList.Next() ) + { + Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< ULONG >( pObj ) ) ); + delete pObj; + Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< ULONG >( pObj ) ) ); + } + + aObjectList.Clear(); + + for( sal_uInt32 i = 0; i < nCount; i++ ) + { + pObj = new GalleryObject; + + ByteString aTempFileName; + String aFileName; + String aPath; + sal_uInt16 nTemp; + + rIStm >> bRel >> aTempFileName >> pObj->nOffset; + rIStm >> nTemp; pObj->eObjKind = (SgaObjKind) nTemp; + + aFileName = String( aTempFileName.GetBuffer(), gsl_getSystemTextEncoding() ); + + if( bRel ) + { + aFileName.SearchAndReplaceAll( '\\', '/' ); + aPath = aRelURL1.GetMainURL( INetURLObject::NO_DECODE ); + + if( aFileName.GetChar( 0 ) != '/' ) + aPath += '/'; + + aPath += aFileName; + + pObj->aURL = INetURLObject( aPath ); + + if( !FileExists( pObj->aURL ) ) + { + aPath = aRelURL2.GetMainURL( INetURLObject::NO_DECODE ); + + if( aFileName.GetChar( 0 ) != '/' ) + aPath += '/'; + + aPath += aFileName; + + // assign this URL, even in the case it is not valid (#94482) + pObj->aURL = INetURLObject( aPath ); + } + } + else + { + if( SGA_OBJ_SVDRAW == pObj->eObjKind ) + { + const static String aBaseURLStr( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/" ) ); + + String aDummyURL( aBaseURLStr ); + pObj->aURL = INetURLObject( aDummyURL += aFileName, INET_PROT_PRIV_SOFFICE ); + } + else + { + String aLocalURL; + + pObj->aURL = INetURLObject( aFileName ); + + if( ( pObj->aURL.GetProtocol() == INET_PROT_NOT_VALID ) && + ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aLocalURL ) ) + { + pObj->aURL = INetURLObject( aLocalURL ); + } + } + } + + aObjectList.Insert( pObj, LIST_APPEND ); + } + + rIStm >> nId1 >> nId2; + + // in neueren Versionen befindet sich am Ende ein 512-Byte-Reservepuffer; + // die Daten befinden sich am Anfang dieses Puffers und + // sind durch eine VersionCompat geklammert + if( !rIStm.IsEof() && + nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) && + nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) ) + { + VersionCompat* pCompat = new VersionCompat( rIStm, STREAM_READ ); + sal_uInt32 nTemp32; + BOOL bThemeNameFromResource = FALSE; + + rIStm >> nTemp32; + + if( pCompat->GetVersion() >= 2 ) + { + rIStm >> bThemeNameFromResource; + } + + SetId( nTemp32, bThemeNameFromResource ); + delete pCompat; + } + } + else + rIStm.SetError( SVSTREAM_READ_ERROR ); + + ImplSetModified( FALSE ); + + return rIStm; +} + +// ------------------------------------------------------------------------ + +SvStream& operator<<( SvStream& rOut, const GalleryTheme& rTheme ) +{ + return rTheme.WriteData( rOut ); +} + +// ------------------------------------------------------------------------ + +SvStream& operator>>( SvStream& rIn, GalleryTheme& rTheme ) +{ + return rTheme.ReadData( rIn ); +} + +void GalleryTheme::ImplSetModified( BOOL bModified ) +{ pThm->SetModified( bModified ); } + +const String& GalleryTheme::GetRealName() const { return pThm->GetThemeName(); } +const INetURLObject& GalleryTheme::GetThmURL() const { return pThm->GetThmURL(); } +const INetURLObject& GalleryTheme::GetSdgURL() const { return pThm->GetSdgURL(); } +const INetURLObject& GalleryTheme::GetSdvURL() const { return pThm->GetSdvURL(); } +UINT32 GalleryTheme::GetId() const { return pThm->GetId(); } +void GalleryTheme::SetId( UINT32 nNewId, BOOL bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); } +BOOL GalleryTheme::IsThemeNameFromResource() const { return pThm->IsNameFromResource(); } +BOOL GalleryTheme::IsImported() const { return pThm->IsImported(); } +BOOL GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); } +BOOL GalleryTheme::IsDefault() const { return pThm->IsDefault(); } +BOOL GalleryTheme::IsModified() const { return pThm->IsModified(); } +const String& GalleryTheme::GetName() const { return IsImported() ? aImportName : pThm->GetThemeName(); } + +void GalleryTheme::InsertAllThemes( ListBox& rListBox ) +{ + for( USHORT i = RID_GALLERYSTR_THEME_FIRST; i <= RID_GALLERYSTR_THEME_LAST; i++ ) + rListBox.InsertEntry( String( GAL_RESID( i ) ) ); +} + |