--- old/cfg.cxx 2006-12-20 01:45:00.000000000 +0800 +++ old/cfg.cxx 2007-08-14 16:30:22.000000000 +0800 @@ -146,6 +146,9 @@ #ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_ #include #endif +#ifndef _COM_SUN_STAR_EMBED_ELEMENTMODES_HPP_ +#include +#endif #define PRTSTR(x) rtl::OUStringToOString(x, RTL_TEXTENCODING_ASCII_US).pData->buffer @@ -5368,7 +5371,7 @@ *******************************************************************************/ SvxIconSelectorDialog::SvxIconSelectorDialog( Window *pWindow, const uno::Reference< css::ui::XImageManager >& rXImageManager, - const uno::Reference< css::ui::XImageManager >& rXParentImageManager ) + const uno::Reference< css::ui::XImageManager >& rXParentImageManager ) : ModalDialog ( pWindow, ResId( MD_ICONSELECTOR, DIALOG_MGR() ) ), aFtDescription ( this, ResId( FT_SYMBOLS ) ), @@ -5415,7 +5418,92 @@ aBtnImport.Enable( FALSE ); } - uno::Sequence< OUString > names; + uno::Reference< beans::XPropertySet > xPropSet( + xServiceManager->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.util.PathSettings" ) ), + uno::UNO_QUERY ); + + uno::Any aAny = xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserConfig" ) ) ); + + ::rtl::OUString aDirectory; + + aAny >>= aDirectory; + + sal_Int32 aCount = aDirectory.getLength(); + + if ( aCount > 0 ) + { + sal_Unicode aChar = aDirectory[ aCount-1 ]; + if ( aChar != '/') + { + aDirectory += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) ); + } + } + else + { + aBtnImport.Enable( FALSE ); + } + + aDirectory += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "soffice.cfg/import" ) ); + + uno::Reference< lang::XSingleServiceFactory > xStorageFactory( + xServiceManager->createInstance( + ::rtl::OUString::createFromAscii( "com.sun.star.embed.FileSystemStorageFactory" )), + uno::UNO_QUERY ); + + uno::Sequence< uno::Any > aArgs( 2 ); + aArgs[ 0 ] <<= aDirectory; + aArgs[ 1 ] <<= com::sun::star::embed::ElementModes::READWRITE; + + uno::Reference< com::sun::star::embed::XStorage > xStorage( + xStorageFactory->createInstanceWithArguments( aArgs ), uno::UNO_QUERY ); + + uno::Sequence< uno::Any > aProp( 2 ); + beans::PropertyValue aPropValue; + + aPropValue.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserConfigStorage" ) ); + aPropValue.Value <<= xStorage; + aProp[ 0 ] <<= aPropValue; + + aPropValue.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenMode" ) ); + aPropValue.Value <<= com::sun::star::embed::ElementModes::READWRITE; + aProp[ 1 ] <<= aPropValue; + + m_xImportedImageManager = uno::Reference< com::sun::star::ui::XImageManager >( + xServiceManager->createInstanceWithArguments( + ::rtl::OUString::createFromAscii( "com.sun.star.ui.ImageManager" ), aProp ), + uno::UNO_QUERY ); + + uno::Sequence< OUString > names; + ImageInfo mImageInfo; + + if ( m_xImportedImageManager.is() ) + { + names = m_xImportedImageManager->getAllImageNames( GetImageType() ); + for ( sal_Int32 n = 0; n < names.getLength(); n++ ) + mImageInfo.insert( ImageInfo::value_type( names[n], false )); + } + USHORT nId = 1; + uno::Sequence< OUString > name( 1 ); + ImageInfo::const_iterator pConstIter = mImageInfo.begin(); + while ( pConstIter != mImageInfo.end() ) + { + name[ 0 ] = pConstIter->first; + uno::Sequence< uno::Reference< graphic::XGraphic> > graphics = m_xImportedImageManager->getImages( GetImageType(), name ); + if ( graphics.getLength() > 0 ) + { + Image img = Image( graphics[ 0 ] ); + aTbSymbol.InsertItem( nId, img, pConstIter->first ); + + graphics[ 0 ]->acquire(); + + aTbSymbol.SetItemData( + nId, static_cast< void * > ( graphics[ 0 ].get() ) ); + + ++nId; + } + ++pConstIter; + } + ImageInfo aImageInfo; if ( m_xParentImageManager.is() ) @@ -5434,11 +5522,9 @@ else aImageInfo.insert( ImageInfo::value_type( names[n], true )); } - + // large growth factor, expecting many entries - USHORT nId = 1; - uno::Sequence< OUString > name( 1 ); - ImageInfo::const_iterator pConstIter = aImageInfo.begin(); + pConstIter = aImageInfo.begin(); while ( pConstIter != aImageInfo.end() ) { name[ 0 ] = pConstIter->first; @@ -5448,8 +5534,8 @@ { if ( pConstIter->second ) graphics = m_xImageManager->getImages( GetImageType(), name ); - else - graphics = m_xParentImageManager->getImages( GetImageType(), name ); + else + graphics = m_xParentImageManager->getImages( GetImageType(), name ); } catch ( uno::Exception& ) { @@ -5619,7 +5705,7 @@ { bool result = FALSE; - USHORT nId = aTbSymbol.GetItemId(aTbSymbol.GetItemCount() -1); + USHORT nId = aTbSymbol.GetItemCount(); nId++; uno::Sequence< beans::PropertyValue > aMediaProps( 1 ); @@ -5649,13 +5735,27 @@ if ( !!aImage ) { - aTbSymbol.InsertItem( nId, aImage, aURL ); + aTbSymbol.InsertItem( nId, aImage, aURL, 0, 0 ); xGraphic->acquire(); aTbSymbol.SetItemData( nId, static_cast< void * > ( xGraphic.get() ) ); + uno::Sequence< OUString > aImportURL( 1 ); + aImportURL[ 0 ] = aURL; + uno::Sequence< uno::Reference > aImportGraph( 1 ); + aImportGraph[ 0 ] = xGraphic; + m_xImportedImageManager->insertImages( GetImageType(), aImportURL, aImportGraph ); + + uno::Reference< css::ui::XUIConfigurationPersistence > + xConfigPersistence( m_xImportedImageManager, uno::UNO_QUERY ); + + if ( xConfigPersistence.is() && xConfigPersistence->isModified() ) + { + xConfigPersistence->store(); + } + result = TRUE; } else --- old/cfg.hxx 2006-10-12 20:06:26.000000000 +0800 +++ old/cfg.hxx 2007-08-14 16:28:58.000000000 +0800 @@ -188,7 +188,7 @@ ::com::sun::star::uno::Reference < ::com::sun::star::ui::XUIConfigurationManager > GetParentConfigManager() { return m_xParentCfgMgr; }; - + ::com::sun::star::uno::Reference < ::com::sun::star::ui::XImageManager > GetImageManager() { return m_xImgMgr; }; @@ -805,9 +805,12 @@ ::com::sun::star::uno::Reference< ::com::sun::star::ui::XImageManager > m_xParentImageManager; + ::com::sun::star::uno::Reference< + ::com::sun::star::ui::XImageManager > m_xImportedImageManager; + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicProvider > m_xGraphProvider; - + bool ImportGraphic( const rtl::OUString& aURL ); void ImportGraphics( @@ -820,8 +823,8 @@ const ::com::sun::star::uno::Reference< ::com::sun::star::ui::XImageManager >& rXImageManager, const ::com::sun::star::uno::Reference< - ::com::sun::star::ui::XImageManager >& rXParentImageManager - ); + ::com::sun::star::ui::XImageManager >& rXParentImageManager + ); ~SvxIconSelectorDialog();