summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2003-05-28 12:29:22 +0000
committerVladimir Glazounov <vg@openoffice.org>2003-05-28 12:29:22 +0000
commit32e9c2c0490eb7e8b336f0193644c43c76fd8840 (patch)
treef654bf3c25a01306b6a234330ff14a46db8dbf32
parentd8da6454dff40172b50a581843128d1fae288167 (diff)
INTEGRATION: CWS fwk04 (1.3.24); FILE MERGED
2003/05/23 15:42:08 cd 1.3.24.1: #109787# Support references to external bitmap inside UserDefinedImages node
-rw-r--r--framework/source/classes/addonsoptions.cxx193
1 files changed, 142 insertions, 51 deletions
diff --git a/framework/source/classes/addonsoptions.cxx b/framework/source/classes/addonsoptions.cxx
index d39eea6ab934..d7a3e7d0289f 100644
--- a/framework/source/classes/addonsoptions.cxx
+++ b/framework/source/classes/addonsoptions.cxx
@@ -2,8 +2,8 @@
*
* $RCSfile: addonsoptions.cxx,v $
*
- * $Revision: 1.4 $
- * last change: $Author: vg $ $Date: 2003-05-22 08:36:12 $
+ * $Revision: 1.5 $
+ * last change: $Author: vg $ $Date: 2003-05-28 13:29:22 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -147,10 +147,15 @@ using namespace ::com::sun::star::lang ;
#define PROPERTYNAME_IMAGEBIG OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBig" ))
#define PROPERTYNAME_IMAGESMALLHC OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallHC" ))
#define PROPERTYNAME_IMAGEBIGHC OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigHC" ))
+#define PROPERTYNAME_IMAGESMALL_URL OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallURL" ))
+#define PROPERTYNAME_IMAGEBIG_URL OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigURL" ))
+#define PROPERTYNAME_IMAGESMALLHC_URL OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallHCURL" ))
+#define PROPERTYNAME_IMAGEBIGHC_URL OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigHCURL" ))
#define IMAGES_NODENAME OUString(RTL_CONSTASCII_USTRINGPARAM("UserDefinedImages" ))
#define PRIVATE_IMAGE_URL OUString(RTL_CONSTASCII_USTRINGPARAM("private:image/" ))
+// The following order is mandatory. Please add properties at the end!
#define PROPERTYCOUNT_MENUITEM 6
#define OFFSET_MENUITEM_URL 0
#define OFFSET_MENUITEM_TITLE 1
@@ -159,12 +164,14 @@ using namespace ::com::sun::star::lang ;
#define OFFSET_MENUITEM_SUBMENU 4
#define OFFSET_MENUITEM_CONTEXT 5
+// The following order is mandatory. Please add properties at the end!
#define PROPERTYCOUNT_POPUPMENU 4
#define OFFSET_POPUPMENU_TITLE 0
#define OFFSET_POPUPMENU_CONTEXT 1
#define OFFSET_POPUPMENU_SUBMENU 2
#define OFFSET_POPUPMENU_URL 3 // Used for property set
+// The following order is mandatory. Please add properties at the end!
#define PROPERTYCOUNT_TOOLBARITEM 5
#define OFFSET_TOOLBARITEM_URL 0
#define OFFSET_TOOLBARITEM_TITLE 1
@@ -172,13 +179,22 @@ using namespace ::com::sun::star::lang ;
#define OFFSET_TOOLBARITEM_TARGET 3
#define OFFSET_TOOLBARITEM_CONTEXT 4
-#define PROPERTYCOUNT_IMAGES 4
+// The following order is mandatory. Please add properties at the end!
+#define PROPERTYCOUNT_IMAGES 8
+#define PROPERTYCOUNT_EMBEDDED_IMAGES 4
#define OFFSET_IMAGES_SMALL 0
#define OFFSET_IMAGES_BIG 1
#define OFFSET_IMAGES_SMALLHC 2
#define OFFSET_IMAGES_BIGHC 3
+#define OFFSET_IMAGES_SMALL_URL 4
+#define OFFSET_IMAGES_BIG_URL 5
+#define OFFSET_IMAGES_SMALLHC_URL 6
+#define OFFSET_IMAGES_BIGHC_URL 7
-#define EXPAND_PROTOCOL "vnd.sun.star.expand"
+#define EXPAND_PROTOCOL "vnd.sun.star.expand:"
+
+const Size aImageSizeSmall( 16, 16 );
+const Size aImageSizeBig( 26, 26 );
//_________________________________________________________________________________________________________________
// private declarations!
@@ -288,6 +304,12 @@ class AddonsOptions_Impl : public ConfigItem
typedef std::hash_map< OUString, ImageEntry, OUStringHashCode, ::std::equal_to< OUString > > ImageManager;
+ enum ImageSize
+ {
+ IMGSIZE_SMALL,
+ IMGSIZE_BIG
+ };
+
/*-****************************************************************************************************//**
@short return list of key names of our configuration management which represent oue module tree
@descr These methods return the current list of key names! We need it to get needed values from our
@@ -314,7 +336,9 @@ class AddonsOptions_Impl : public ConfigItem
sal_Bool ReadImagesItem( const OUString& aImagesItemNodeName, Sequence< PropertyValue >& aImagesItem );
ImageEntry* ReadImageData( const OUString& aImagesNodeName );
void ReadAndAssociateImages( const OUString& aURL, const OUString& aImageId );
+ Image ReadImageFromURL( ImageSize nImageSize, const OUString& aURL );
sal_Bool HasAssociatedImages( const OUString& aURL );
+ void SubstituteVariables( OUString& aURL );
sal_Bool ReadSubMenuEntries( const Sequence< OUString >& aSubMenuNodeNames, Sequence< Sequence< PropertyValue > >& rSubMenu );
void InsertToolBarSeparator( Sequence< Sequence< PropertyValue > >& rAddonOfficeToolBarSeq );
@@ -378,6 +402,10 @@ AddonsOptions_Impl::AddonsOptions_Impl()
m_aPropImagesNames[ OFFSET_IMAGES_BIG ] = PROPERTYNAME_IMAGEBIG;
m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC ] = PROPERTYNAME_IMAGESMALLHC;
m_aPropImagesNames[ OFFSET_IMAGES_BIGHC ] = PROPERTYNAME_IMAGEBIGHC;
+ m_aPropImagesNames[ OFFSET_IMAGES_SMALL_URL ] = PROPERTYNAME_IMAGESMALL_URL;
+ m_aPropImagesNames[ OFFSET_IMAGES_BIG_URL ] = PROPERTYNAME_IMAGEBIG_URL;
+ m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC_URL ] = PROPERTYNAME_IMAGESMALLHC_URL;
+ m_aPropImagesNames[ OFFSET_IMAGES_BIGHC_URL ] = PROPERTYNAME_IMAGEBIGHC_URL;
Reference< XComponentContext > xContext;
Reference< com::sun::star::beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY );
@@ -990,10 +1018,56 @@ sal_Bool AddonsOptions_Impl::HasAssociatedImages( const OUString& aURL )
//*****************************************************************************************************************
// private method
//*****************************************************************************************************************
+void AddonsOptions_Impl::SubstituteVariables( OUString& aURL )
+{
+ if (( aURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( EXPAND_PROTOCOL )) == 0 ) &&
+ m_xMacroExpander.is() )
+ {
+ // cut protocol
+ OUString macro( aURL.copy( sizeof ( EXPAND_PROTOCOL ) -1 ) );
+ // decode uric class chars
+ macro = Uri::decode(
+ macro, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
+ // expand macro string
+ aURL = m_xMacroExpander->expandMacros( macro );
+ }
+}
+
+//*****************************************************************************************************************
+// private method
+//*****************************************************************************************************************
+Image AddonsOptions_Impl::ReadImageFromURL( ImageSize nImageSize, const OUString& aImageURL )
+{
+ const Color aTransparentColor( COL_LIGHTMAGENTA );
+
+ Image aImage;
+
+ SvStream* pStream = UcbStreamHelper::CreateStream( aImageURL, STREAM_STD_READ );
+ if ( pStream && ( pStream->GetErrorCode() == 0 ))
+ {
+ Bitmap aBitmap;
+
+ aBitmap.Read( *pStream );
+
+ const Size aSize = ( nImageSize == IMGSIZE_SMALL ) ? aImageSizeSmall : aImageSizeBig; // Sizes used for menu/toolbox images
+ if ( aBitmap.GetSizePixel() != aSize )
+ aBitmap.Scale( aSize, BMP_SCALE_INTERPOLATE );
+
+ aImage = Image( aBitmap, aTransparentColor );
+ }
+
+ if ( pStream )
+ delete pStream;
+
+ return aImage;
+}
+
+//*****************************************************************************************************************
+// private method
+//*****************************************************************************************************************
void AddonsOptions_Impl::ReadAndAssociateImages( const OUString& aURL, const OUString& aImageId )
{
const int MAX_NUM_IMAGES = 4;
- const Color aTransparentColor( COL_LIGHTMAGENTA );
const char* aExtArray[MAX_NUM_IMAGES] = { "_16", "_26", "_16h", "_26h" };
const char* pBmpExt = ".bmp";
@@ -1005,37 +1079,19 @@ void AddonsOptions_Impl::ReadAndAssociateImages( const OUString& aURL, const OUS
Bitmap aBitmap;
OUString aImageURL( aImageId );
- if (( aImageURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( EXPAND_PROTOCOL ":" )) == 0 ) &&
- m_xMacroExpander.is() )
- {
- // cut protocol
- OUString macro( aImageURL.copy( sizeof (EXPAND_PROTOCOL ":") -1 ) );
- // decode uric class chars
- macro = Uri::decode(
- macro, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
- // expand macro string
- aImageURL = m_xMacroExpander->expandMacros( macro );
- }
- else return;
+ SubstituteVariables( aImageURL );
// Loop to create the four possible image names and try to read the bitmap files
for ( int i = 0; i < MAX_NUM_IMAGES; i++ )
{
- OUStringBuffer aFileNameBuf( aImageURL );
- aFileNameBuf.appendAscii( aExtArray[i] );
- aFileNameBuf.appendAscii( pBmpExt );
+ OUStringBuffer aFileURL( aImageURL );
+ aFileURL.appendAscii( aExtArray[i] );
+ aFileURL.appendAscii( pBmpExt );
- OUString aFileName( aFileNameBuf.makeStringAndClear() );
- SvStream* pStream = UcbStreamHelper::CreateStream( aFileName, STREAM_STD_READ );
- if ( pStream && ( pStream->GetErrorCode() == 0 ))
+ Image aImage = ReadImageFromURL( ((i==0)||(i==2)) ? IMGSIZE_SMALL : IMGSIZE_BIG, aFileURL.makeStringAndClear() );
+ if ( !!aImage )
{
- aBitmap.Read( *pStream );
-
- const Size aSize = ((i == 0) || (i == 2)) ? Size( 16, 16 ) : Size( 26, 26 ); // Sizes used for menu/toolbox images
- if ( aBitmap.GetSizePixel() != aSize )
- aBitmap.Scale( aSize, BMP_SCALE_INTERPOLATE );
-
- Image aImage( aBitmap, aTransparentColor );
+ bImageFound = true;
switch ( i )
{
case 0:
@@ -1051,11 +1107,7 @@ void AddonsOptions_Impl::ReadAndAssociateImages( const OUString& aURL, const OUS
aImageEntry.aImageBigHC = aImage;
break;
}
- bImageFound = true;
}
-
- if ( pStream )
- delete pStream;
}
if ( bImageFound )
@@ -1070,30 +1122,65 @@ AddonsOptions_Impl::ImageEntry* AddonsOptions_Impl::ReadImageData( const OUStrin
Sequence< OUString > aImageDataNodeNames = GetPropertyNamesImages( aImagesNodeName );
Sequence< Any > aPropertyData;
Sequence< sal_Int8 > aImageDataSeq;
+ OUString aImageURL;
Image aImage;
ImageEntry* pEntry = NULL;
+ // It is possible to use both forms (embedded image data and URLs to external bitmap files) at the
+ // same time. Embedded image data has a higher priority.
aPropertyData = GetProperties( aImageDataNodeNames );
for ( int i = 0; i < PROPERTYCOUNT_IMAGES; i++ )
{
- if (( aPropertyData[i] >>= aImageDataSeq ) &&
- ( CreateImageFromSequence( aImage,
- (( i == OFFSET_IMAGES_BIG ) ||
- ( i == OFFSET_IMAGES_BIGHC )),
- aImageDataSeq )) )
+ if ( i < PROPERTYCOUNT_EMBEDDED_IMAGES )
{
- if ( !pEntry )
- pEntry = new ImageEntry;
-
- if ( i == OFFSET_IMAGES_SMALL )
- pEntry->aImageSmall = aImage;
- else if ( i == OFFSET_IMAGES_BIG )
- pEntry->aImageBig = aImage;
- else if ( i == OFFSET_IMAGES_SMALLHC )
- pEntry->aImageSmallHC = aImage;
- else
- pEntry->aImageBigHC = aImage;
+ // Extract image data from the embedded hex binary sequence
+ if (( aPropertyData[i] >>= aImageDataSeq ) &&
+ aImageDataSeq.getLength() > 0 &&
+ ( CreateImageFromSequence( aImage,
+ (( i == OFFSET_IMAGES_BIG ) ||
+ ( i == OFFSET_IMAGES_BIGHC )),
+ aImageDataSeq )) )
+ {
+ if ( !pEntry )
+ pEntry = new ImageEntry;
+
+ if ( i == OFFSET_IMAGES_SMALL )
+ pEntry->aImageSmall = aImage;
+ else if ( i == OFFSET_IMAGES_BIG )
+ pEntry->aImageBig = aImage;
+ else if ( i == OFFSET_IMAGES_SMALLHC )
+ pEntry->aImageSmallHC = aImage;
+ else
+ pEntry->aImageBigHC = aImage;
+ }
+ }
+ else
+ {
+ // Retrieve image data from a external bitmap file. Make sure that embedded image data
+ // has a higher priority.
+ aPropertyData[i] >>= aImageURL;
+
+ if ( aImageURL.getLength() > 0 )
+ {
+ SubstituteVariables( aImageURL );
+ aImage = ReadImageFromURL( ((i==OFFSET_IMAGES_SMALL_URL)||(i==OFFSET_IMAGES_SMALLHC_URL)) ? IMGSIZE_SMALL : IMGSIZE_BIG,
+ aImageURL );
+ if ( !!aImage )
+ {
+ if ( !pEntry )
+ pEntry = new ImageEntry;
+
+ if ( i == OFFSET_IMAGES_SMALL_URL && !pEntry->aImageSmall )
+ pEntry->aImageSmall = aImage;
+ else if ( i == OFFSET_IMAGES_BIG_URL && !pEntry->aImageBig )
+ pEntry->aImageBig = aImage;
+ else if ( i == OFFSET_IMAGES_SMALLHC_URL && !pEntry->aImageSmallHC )
+ pEntry->aImageSmallHC = aImage;
+ else if ( !pEntry->aImageBigHC )
+ pEntry->aImageBigHC = aImage;
+ }
+ }
}
}
@@ -1107,7 +1194,7 @@ sal_Bool AddonsOptions_Impl::CreateImageFromSequence( Image& rImage, sal_Bool bB
{
sal_Bool bResult = sal_False;
Color aTransparentColor( COL_LIGHTMAGENTA );
- Size aSize = bBig ? Size( 26, 26 ) : Size( 16, 16 ); // Sizes used for menu/toolbox images
+ Size aSize = bBig ? aImageSizeBig : aImageSizeSmall; // Sizes used for menu/toolbox images
if ( rBitmapDataSeq.getLength() > 0 )
{
@@ -1189,6 +1276,10 @@ Sequence< OUString > AddonsOptions_Impl::GetPropertyNamesImages( const OUString&
lResult[1] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIG ] );
lResult[2] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC ] );
lResult[3] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIGHC ] );
+ lResult[4] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALL_URL ] );
+ lResult[5] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIG_URL ] );
+ lResult[6] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC_URL] );
+ lResult[7] = OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIGHC_URL ] );
return lResult;
}