1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_framework.hxx" 24 25 //_________________________________________________________________________________________________________________ 26 // includes 27 //_________________________________________________________________________________________________________________ 28 #include <framework/addonsoptions.hxx> 29 #include <unotools/configmgr.hxx> 30 #include <unotools/configitem.hxx> 31 #include <unotools/ucbstreamhelper.hxx> 32 #include <tools/debug.hxx> 33 #include <tools/stream.hxx> 34 #include <tools/color.hxx> 35 #include <com/sun/star/uno/Any.hxx> 36 #include <com/sun/star/uno/Sequence.hxx> 37 #include "com/sun/star/util/XMacroExpander.hpp" 38 #include "com/sun/star/uno/XComponentContext.hpp" 39 #include "com/sun/star/beans/XPropertySet.hpp" 40 #include <rtl/ustrbuf.hxx> 41 #include <rtl/uri.hxx> 42 #include <comphelper/processfactory.hxx> 43 #include <vcl/graph.hxx> 44 #include <svtools/filter.hxx> 45 #include <vcl/dibtools.hxx> 46 #include <hash_map> 47 #include <algorithm> 48 #include <vector> 49 50 //_________________________________________________________________________________________________________________ 51 // namespaces 52 //_________________________________________________________________________________________________________________ 53 54 using namespace ::std ; 55 using namespace ::utl ; 56 using namespace ::osl ; 57 using namespace ::com::sun::star::uno ; 58 using namespace ::com::sun::star::beans ; 59 using namespace ::com::sun::star::lang ; 60 61 //_________________________________________________________________________________________________________________ 62 // const 63 //_________________________________________________________________________________________________________________ 64 65 #define STR_TOOLBARITEMS "ToolBarItems" 66 67 #define ROOTNODE_ADDONMENU ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Addons" )) 68 #define PATHDELIMITER ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/" )) 69 #define TOOLBARITEMS ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_TOOLBARITEMS)) 70 #define SEPARATOR_URL_STR "private:separator" 71 #define SEPARATOR_URL_LEN 17 72 #define SEPARATOR_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SEPARATOR_URL_STR )) 73 74 #define PROPERTYNAME_URL ADDONSMENUITEM_PROPERTYNAME_URL 75 #define PROPERTYNAME_TITLE ADDONSMENUITEM_PROPERTYNAME_TITLE 76 #define PROPERTYNAME_TARGET ADDONSMENUITEM_PROPERTYNAME_TARGET 77 #define PROPERTYNAME_IMAGEIDENTIFIER ADDONSMENUITEM_PROPERTYNAME_IMAGEIDENTIFIER 78 #define PROPERTYNAME_CONTEXT ADDONSMENUITEM_PROPERTYNAME_CONTEXT 79 #define PROPERTYNAME_SUBMENU ADDONSMENUITEM_PROPERTYNAME_SUBMENU 80 #define PROPERTYNAME_CONTROLTYPE ADDONSMENUITEM_PROPERTYNAME_CONTROLTYPE 81 #define PROPERTYNAME_WIDTH ADDONSMENUITEM_PROPERTYNAME_WIDTH 82 #define PROPERTYNAME_TOOLBARITEMS TOOLBARITEMS 83 84 #define PROPERTYNAME_ALIGN STATUSBARITEM_PROPERTYNAME_ALIGN 85 #define PROPERTYNAME_AUTOSIZE STATUSBARITEM_PROPERTYNAME_AUTOSIZE 86 #define PROPERTYNAME_OWNERDRAW STATUSBARITEM_PROPERTYNAME_OWNERDRAW 87 88 #define PROPERTYNAME_IMAGESMALL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmall" )) 89 #define PROPERTYNAME_IMAGEBIG ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBig" )) 90 #define PROPERTYNAME_IMAGESMALLHC ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallHC" )) 91 #define PROPERTYNAME_IMAGEBIGHC ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigHC" )) 92 #define PROPERTYNAME_IMAGESMALL_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallURL" )) 93 #define PROPERTYNAME_IMAGEBIG_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigURL" )) 94 #define PROPERTYNAME_IMAGESMALLHC_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageSmallHCURL" )) 95 #define PROPERTYNAME_IMAGEBIGHC_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageBigHCURL" )) 96 97 #define IMAGES_NODENAME ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UserDefinedImages" )) 98 #define PRIVATE_IMAGE_URL ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("private:image/" )) 99 100 #define PROPERTYNAME_MERGEMENU_MERGEPOINT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergePoint" )) 101 #define PROPERTYNAME_MERGEMENU_MERGECOMMAND ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommand" )) 102 #define PROPERTYNAME_MERGEMENU_MERGECOMMANDPARAMETER ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommandParameter" )) 103 #define PROPERTYNAME_MERGEMENU_MERGEFALLBACK ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeFallback" )) 104 #define PROPERTYNAME_MERGEMENU_MERGECONTEXT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeContext" )) 105 #define PROPERTYNAME_MERGEMENU_MENUITEMS ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MenuItems" )) 106 #define MERGEMENU_MERGEPOINT_SEPARATOR '\\' 107 108 #define PROPERTYNAME_MERGETOOLBAR_TOOLBAR ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeToolBar" )) 109 #define PROPERTYNAME_MERGETOOLBAR_MERGEPOINT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergePoint" )) 110 #define PROPERTYNAME_MERGETOOLBAR_MERGECOMMAND ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommand" )) 111 #define PROPERTYNAME_MERGETOOLBAR_MERGECOMMANDPARAMETER ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommandParameter" )) 112 #define PROPERTYNAME_MERGETOOLBAR_MERGEFALLBACK ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeFallback" )) 113 #define PROPERTYNAME_MERGETOOLBAR_MERGECONTEXT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeContext" )) 114 #define PROPERTYNAME_MERGETOOLBAR_TOOLBARITEMS ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_TOOLBARITEMS )) 115 116 #define PROPERTYNAME_MERGESTATUSBAR_MERGEPOINT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergePoint" )) 117 #define PROPERTYNAME_MERGESTATUSBAR_MERGECOMMAND ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommand" )) 118 #define PROPERTYNAME_MERGESTATUSBAR_MERGECOMMANDPARAMETER ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeCommandParameter" )) 119 #define PROPERTYNAME_MERGESTATUSBAR_MERGEFALLBACK ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeFallback" )) 120 #define PROPERTYNAME_MERGESTATUSBAR_MERGECONTEXT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MergeContext" )) 121 #define PROPERTYNAME_MERGESTATUSBAR_STATUSBARITEMS ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StatusBarItems" )) 122 123 // The following order is mandatory. Please add properties at the end! 124 #define INDEX_URL 0 125 #define INDEX_TITLE 1 126 #define INDEX_IMAGEIDENTIFIER 2 127 #define INDEX_TARGET 3 128 #define INDEX_CONTEXT 4 129 #define INDEX_SUBMENU 5 130 #define INDEX_CONTROLTYPE 6 131 #define INDEX_WIDTH 7 132 #define INDEX_ALIGN 8 133 #define INDEX_AUTOSIZE 9 134 #define INDEX_OWNERDRAW 10 135 #define INDEX_TOOLBARITEMS 11 136 #define PROPERTYCOUNT_INDEX 12 137 138 // The following order is mandatory. Please add properties at the end! 139 #define PROPERTYCOUNT_MENUITEM 6 140 #define OFFSET_MENUITEM_URL 0 141 #define OFFSET_MENUITEM_TITLE 1 142 #define OFFSET_MENUITEM_IMAGEIDENTIFIER 2 143 #define OFFSET_MENUITEM_TARGET 3 144 #define OFFSET_MENUITEM_CONTEXT 4 145 #define OFFSET_MENUITEM_SUBMENU 5 146 147 // The following order is mandatory. Please add properties at the end! 148 #define PROPERTYCOUNT_POPUPMENU 4 149 #define OFFSET_POPUPMENU_TITLE 0 150 #define OFFSET_POPUPMENU_CONTEXT 1 151 #define OFFSET_POPUPMENU_SUBMENU 2 152 #define OFFSET_POPUPMENU_URL 3 // Used for property set 153 154 // The following order is mandatory. Please add properties at the end! 155 #define PROPERTYCOUNT_TOOLBAR 2 156 #define OFFSET_TOOLBAR_TITLE 0 157 #define OFFSET_TOOLBAR_TOOLBARITEMS 1 158 159 // The following order is mandatory. Please add properties at the end! 160 #define PROPERTYCOUNT_TOOLBARITEM 7 161 #define OFFSET_TOOLBARITEM_URL 0 162 #define OFFSET_TOOLBARITEM_TITLE 1 163 #define OFFSET_TOOLBARITEM_IMAGEIDENTIFIER 2 164 #define OFFSET_TOOLBARITEM_TARGET 3 165 #define OFFSET_TOOLBARITEM_CONTEXT 4 166 #define OFFSET_TOOLBARITEM_CONTROLTYPE 5 167 #define OFFSET_TOOLBARITEM_WIDTH 6 168 169 // The following order is mandatory. Please add properties at the end! 170 #define PROPERTYCOUNT_STATUSBARITEM 7 171 #define OFFSET_STATUSBARITEM_URL 0 172 #define OFFSET_STATUSBARITEM_TITLE 1 173 #define OFFSET_STATUSBARITEM_CONTEXT 2 174 #define OFFSET_STATUSBARITEM_ALIGN 3 175 #define OFFSET_STATUSBARITEM_AUTOSIZE 4 176 #define OFFSET_STATUSBARITEM_OWNERDRAW 5 177 #define OFFSET_STATUSBARITEM_WIDTH 6 178 179 180 // The following order is mandatory. Please add properties at the end! 181 #define PROPERTYCOUNT_IMAGES 8 182 #define PROPERTYCOUNT_EMBEDDED_IMAGES 4 183 #define OFFSET_IMAGES_SMALL 0 184 #define OFFSET_IMAGES_BIG 1 185 #define OFFSET_IMAGES_SMALLHC 2 186 #define OFFSET_IMAGES_BIGHC 3 187 #define OFFSET_IMAGES_SMALL_URL 4 188 #define OFFSET_IMAGES_BIG_URL 5 189 #define OFFSET_IMAGES_SMALLHC_URL 6 190 #define OFFSET_IMAGES_BIGHC_URL 7 191 192 #define PROPERTYCOUNT_MERGE_MENUBAR 6 193 #define OFFSET_MERGEMENU_MERGEPOINT 0 194 #define OFFSET_MERGEMENU_MERGECOMMAND 1 195 #define OFFSET_MERGEMENU_MERGECOMMANDPARAMETER 2 196 #define OFFSET_MERGEMENU_MERGEFALLBACK 3 197 #define OFFSET_MERGEMENU_MERGECONTEXT 4 198 #define OFFSET_MERGEMENU_MENUITEMS 5 199 200 #define PROPERTYCOUNT_MERGE_TOOLBAR 7 201 #define OFFSET_MERGETOOLBAR_TOOLBAR 0 202 #define OFFSET_MERGETOOLBAR_MERGEPOINT 1 203 #define OFFSET_MERGETOOLBAR_MERGECOMMAND 2 204 #define OFFSET_MERGETOOLBAR_MERGECOMMANDPARAMETER 3 205 #define OFFSET_MERGETOOLBAR_MERGEFALLBACK 4 206 #define OFFSET_MERGETOOLBAR_MERGECONTEXT 5 207 #define OFFSET_MERGETOOLBAR_TOOLBARITEMS 6 208 209 #define PROPERTYCOUNT_MERGE_STATUSBAR 6 210 #define OFFSET_MERGESTATUSBAR_MERGEPOINT 0 211 #define OFFSET_MERGESTATUSBAR_MERGECOMMAND 1 212 #define OFFSET_MERGESTATUSBAR_MERGECOMMANDPARAMETER 2 213 #define OFFSET_MERGESTATUSBAR_MERGEFALLBACK 3 214 #define OFFSET_MERGESTATUSBAR_MERGECONTEXT 4 215 #define OFFSET_MERGESTATUSBAR_STATUSBARITEMS 5 216 217 #define EXPAND_PROTOCOL "vnd.sun.star.expand:" 218 219 const Size aImageSizeSmall( 16, 16 ); 220 const Size aImageSizeBig( 26, 26 ); 221 222 //_________________________________________________________________________________________________________________ 223 // private declarations! 224 //_________________________________________________________________________________________________________________ 225 226 /*-**************************************************************************************************************** 227 @descr struct to hold information about one menu entry. 228 ****************************************************************************************************************-*/ 229 230 namespace framework 231 { 232 233 class AddonsOptions_Impl : public ConfigItem 234 { 235 //------------------------------------------------------------------------------------------------------------- 236 // public methods 237 //------------------------------------------------------------------------------------------------------------- 238 239 public: 240 //--------------------------------------------------------------------------------------------------------- 241 // constructor / destructor 242 //--------------------------------------------------------------------------------------------------------- 243 244 AddonsOptions_Impl(); 245 ~AddonsOptions_Impl(); 246 247 //--------------------------------------------------------------------------------------------------------- 248 // overloaded methods of baseclass 249 //--------------------------------------------------------------------------------------------------------- 250 251 /*-****************************************************************************************************//** 252 @short called for notify of configmanager 253 @descr These method is called from the ConfigManager before application ends or from the 254 PropertyChangeListener if the sub tree broadcasts changes. You must update your 255 internal values. 256 257 @seealso baseclass ConfigItem 258 259 @param "lPropertyNames" is the list of properties which should be updated. 260 @return - 261 262 @onerror - 263 *//*-*****************************************************************************************************/ 264 265 virtual void Notify( const Sequence< ::rtl::OUString >& lPropertyNames ); 266 267 /*-****************************************************************************************************//** 268 @short write changes to configuration 269 @descr These method writes the changed values into the sub tree 270 and should always called in our destructor to guarantee consistency of config data. 271 272 @seealso baseclass ConfigItem 273 274 @param - 275 @return - 276 277 @onerror - 278 *//*-*****************************************************************************************************/ 279 280 virtual void Commit(); 281 282 //--------------------------------------------------------------------------------------------------------- 283 // public interface 284 //--------------------------------------------------------------------------------------------------------- 285 286 /*-****************************************************************************************************//** 287 @short base implementation of public interface for "SvtDynamicMenuOptions"! 288 @descr These class is used as static member of "SvtDynamicMenuOptions" ... 289 => The code exist only for one time and isn't duplicated for every instance! 290 291 @seealso - 292 293 @param - 294 @return - 295 296 @onerror - 297 *//*-*****************************************************************************************************/ 298 299 sal_Bool HasAddonsMenu () const ; 300 sal_Bool HasAddonsHelpMenu () const ; 301 sal_Int32 GetAddonsToolBarCount() const ; 302 const Sequence< Sequence< PropertyValue > >& GetAddonsMenu () const ; 303 const Sequence< Sequence< PropertyValue > >& GetAddonsMenuBarPart () const ; 304 const Sequence< Sequence< PropertyValue > >& GetAddonsToolBarPart ( sal_uInt32 nIndex ) const ; 305 const ::rtl::OUString GetAddonsToolbarResourceName( sal_uInt32 nIndex ) const; 306 const ::rtl::OUString GetAddonsToolbarUIName( sal_uInt32 nIndex ) const; 307 const Sequence< Sequence< PropertyValue > >& GetAddonsHelpMenu () const ; 308 Image GetImageFromURL( const rtl::OUString& aURL, sal_Bool bBig, sal_Bool bHiContrast, sal_Bool bNoScale ) const; 309 const MergeMenuInstructionContainer& GetMergeMenuInstructions() const; 310 bool GetMergeToolbarInstructions( const ::rtl::OUString& rToolbarName, MergeToolbarInstructionContainer& rToolbarInstructions ) const; 311 const MergeStatusbarInstructionContainer& GetMergeStatusbarInstructions() const; 312 void ReadConfigurationData(); 313 314 //------------------------------------------------------------------------------------------------------------- 315 // private methods 316 //------------------------------------------------------------------------------------------------------------- 317 318 private: 319 320 struct ImageEntry 321 { 322 Image aImageSmall; 323 Image aImageBig; 324 Image aImageSmallHC; 325 Image aImageBigHC; 326 327 Image aImageSmallNoScale; 328 Image aImageBigNoScale; 329 Image aImageSmallHCNoScale; 330 Image aImageBigHCNoScale; 331 }; 332 333 typedef std::hash_map< ::rtl::OUString, ImageEntry, rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > ImageManager; 334 typedef std::hash_map< ::rtl::OUString, sal_uInt32, rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > StringToIndexMap; 335 typedef std::vector< Sequence< Sequence< PropertyValue > > > AddonToolBars; 336 typedef ::std::hash_map< ::rtl::OUString, MergeToolbarInstructionContainer, rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > ToolbarMergingInstructions; 337 338 enum ImageSize 339 { 340 IMGSIZE_SMALL, 341 IMGSIZE_BIG 342 }; 343 344 /*-****************************************************************************************************//** 345 @short return list of key names of our configuration management which represent oue module tree 346 @descr These methods return the current list of key names! We need it to get needed values from our 347 configuration management! 348 349 @seealso - 350 351 @param "nCount" , returns count of menu entries for "new" 352 @return A list of configuration key names is returned. 353 354 @onerror - 355 *//*-*****************************************************************************************************/ 356 357 sal_Bool ReadAddonMenuSet( Sequence< Sequence< PropertyValue > >& aAddonMenuSeq ); 358 sal_Bool ReadOfficeMenuBarSet( Sequence< Sequence< PropertyValue > >& aAddonOfficeMenuBarSeq ); 359 sal_Bool ReadOfficeToolBarSet( AddonToolBars& rAddonOfficeToolBars, 360 std::vector< rtl::OUString >& rAddonOfficeToolBarResNames, 361 std::vector< rtl::OUString >& rAddonOfficeToolBarUINames ); 362 sal_Bool ReadToolBarItemSet( const rtl::OUString rToolBarItemSetNodeName, Sequence< Sequence< PropertyValue > >& aAddonOfficeToolBarSeq ); 363 sal_Bool ReadOfficeHelpSet( Sequence< Sequence< PropertyValue > >& aAddonOfficeHelpMenuSeq ); 364 sal_Bool ReadImages( ImageManager& aImageManager ); 365 sal_Bool ReadMenuMergeInstructions( MergeMenuInstructionContainer& rContainer ); 366 sal_Bool ReadToolbarMergeInstructions( ToolbarMergingInstructions& rToolbarMergeMap ); 367 sal_Bool ReadStatusbarMergeInstructions( MergeStatusbarInstructionContainer& rContainer ); 368 369 sal_Bool ReadMergeMenuData( const ::rtl::OUString& aMergeAddonInstructionBase, Sequence< Sequence< PropertyValue > >& rMergeMenu ); 370 sal_Bool ReadMergeToolbarData( const ::rtl::OUString& aMergeAddonInstructionBase, Sequence< Sequence< PropertyValue > >& rMergeToolbarItems ); 371 sal_Bool ReadMergeStatusbarData( const ::rtl::OUString& aMergeAddonInstructionBase, Sequence< Sequence< PropertyValue > >& rMergeStatusbar ); 372 sal_Bool ReadMenuItem( const ::rtl::OUString& aMenuItemNodeName, Sequence< PropertyValue >& aMenuItem, sal_Bool bIgnoreSubMenu = sal_False ); 373 sal_Bool ReadPopupMenu( const ::rtl::OUString& aPopupMenuNodeName, Sequence< PropertyValue >& aPopupMenu ); 374 sal_Bool AppendPopupMenu( Sequence< PropertyValue >& aTargetPopupMenu, const Sequence< PropertyValue >& rSourcePopupMenu ); 375 sal_Bool ReadToolBarItem( const ::rtl::OUString& aToolBarItemNodeName, Sequence< PropertyValue >& aToolBarItem ); 376 sal_Bool ReadStatusBarItem( const ::rtl::OUString& aStatusbarItemNodeName, Sequence< PropertyValue >& aStatusbarItem ); 377 sal_Bool ReadImagesItem( const ::rtl::OUString& aImagesItemNodeName, Sequence< PropertyValue >& aImagesItem ); 378 ImageEntry* ReadImageData( const ::rtl::OUString& aImagesNodeName ); 379 void ReadAndAssociateImages( const ::rtl::OUString& aURL, const ::rtl::OUString& aImageId ); 380 void ReadImageFromURL( ImageSize nImageSize, const ::rtl::OUString& aURL, Image& aImage, Image& aNoScaleImage ); 381 sal_Bool HasAssociatedImages( const ::rtl::OUString& aURL ); 382 void SubstituteVariables( ::rtl::OUString& aURL ); 383 384 sal_Bool ReadSubMenuEntries( const Sequence< ::rtl::OUString >& aSubMenuNodeNames, Sequence< Sequence< PropertyValue > >& rSubMenu ); 385 void InsertToolBarSeparator( Sequence< Sequence< PropertyValue > >& rAddonOfficeToolBarSeq ); 386 ::rtl::OUString GeneratePrefixURL(); 387 388 Sequence< ::rtl::OUString > GetPropertyNamesMergeMenuInstruction( const ::rtl::OUString& aPropertyRootName ) const; 389 Sequence< ::rtl::OUString > GetPropertyNamesMenuItem( const ::rtl::OUString& aPropertyRootNode ) const; 390 Sequence< ::rtl::OUString > GetPropertyNamesPopupMenu( const ::rtl::OUString& aPropertyRootNode ) const; 391 Sequence< ::rtl::OUString > GetPropertyNamesToolBar( const ::rtl::OUString& aPropertyRootNode ) const; 392 Sequence< ::rtl::OUString > GetPropertyNamesToolBarItem( const ::rtl::OUString& aPropertyRootNode ) const; 393 Sequence< ::rtl::OUString > GetPropertyNamesStatusbarItem( const ::rtl::OUString& aPropertyRootNode ) const; 394 Sequence< ::rtl::OUString > GetPropertyNamesImages( const ::rtl::OUString& aPropertyRootNode ) const; 395 sal_Bool CreateImageFromSequence( Image& rImage, sal_Bool bBig, Sequence< sal_Int8 >& rBitmapDataSeq ) const; 396 397 //------------------------------------------------------------------------------------------------------------- 398 // private member 399 //------------------------------------------------------------------------------------------------------------- 400 401 private: 402 ImageEntry* ReadOptionalImageData( const ::rtl::OUString& aMenuNodeName ); 403 404 sal_Int32 m_nRootAddonPopupMenuId; 405 ::rtl::OUString m_aPropNames[PROPERTYCOUNT_INDEX]; 406 ::rtl::OUString m_aPropImagesNames[PROPERTYCOUNT_IMAGES]; 407 ::rtl::OUString m_aPropMergeMenuNames[PROPERTYCOUNT_MERGE_MENUBAR]; 408 ::rtl::OUString m_aPropMergeToolbarNames[PROPERTYCOUNT_MERGE_TOOLBAR]; 409 ::rtl::OUString m_aPropMergeStatusbarNames[PROPERTYCOUNT_MERGE_STATUSBAR]; 410 ::rtl::OUString m_aEmpty; 411 ::rtl::OUString m_aPathDelimiter; 412 ::rtl::OUString m_aSeparator; 413 ::rtl::OUString m_aRootAddonPopupMenuURLPrexfix; 414 ::rtl::OUString m_aPrivateImageURL; 415 Sequence< Sequence< PropertyValue > > m_aCachedMenuProperties; 416 Sequence< Sequence< PropertyValue > > m_aCachedMenuBarPartProperties; 417 AddonToolBars m_aCachedToolBarPartProperties; 418 std::vector< rtl::OUString > m_aCachedToolBarPartResourceNames; 419 std::vector< rtl::OUString > m_aCachedToolBarPartUINames; 420 Sequence< Sequence< PropertyValue > > m_aCachedHelpMenuProperties; 421 Reference< com::sun::star::util::XMacroExpander > m_xMacroExpander; 422 ImageManager m_aImageManager; 423 Sequence< Sequence< PropertyValue > > m_aEmptyAddonToolBar; 424 MergeMenuInstructionContainer m_aCachedMergeMenuInsContainer; 425 ToolbarMergingInstructions m_aCachedToolbarMergingInstructions; 426 MergeStatusbarInstructionContainer m_aCachedStatusbarMergingInstructions; 427 }; 428 429 //_________________________________________________________________________________________________________________ 430 // definitions 431 //_________________________________________________________________________________________________________________ 432 433 //***************************************************************************************************************** 434 // constructor 435 //***************************************************************************************************************** 436 AddonsOptions_Impl::AddonsOptions_Impl() 437 // Init baseclasses first 438 : ConfigItem( ROOTNODE_ADDONMENU ), 439 m_nRootAddonPopupMenuId( 0 ), 440 m_aPathDelimiter( PATHDELIMITER ), 441 m_aSeparator( SEPARATOR_URL ), 442 m_aRootAddonPopupMenuURLPrexfix( ADDONSPOPUPMENU_URL_PREFIX ), 443 m_aPrivateImageURL( PRIVATE_IMAGE_URL ) 444 { 445 // initialize array with fixed property names 446 m_aPropNames[ INDEX_URL ] = PROPERTYNAME_URL; 447 m_aPropNames[ INDEX_TITLE ] = PROPERTYNAME_TITLE; 448 m_aPropNames[ INDEX_TARGET ] = PROPERTYNAME_TARGET; 449 m_aPropNames[ INDEX_IMAGEIDENTIFIER ] = PROPERTYNAME_IMAGEIDENTIFIER; 450 m_aPropNames[ INDEX_CONTEXT ] = PROPERTYNAME_CONTEXT; 451 m_aPropNames[ INDEX_SUBMENU ] = PROPERTYNAME_SUBMENU; // Submenu set! 452 m_aPropNames[ INDEX_CONTROLTYPE ] = PROPERTYNAME_CONTROLTYPE; 453 m_aPropNames[ INDEX_WIDTH ] = PROPERTYNAME_WIDTH; 454 m_aPropNames[ INDEX_ALIGN ] = PROPERTYNAME_ALIGN; 455 m_aPropNames[ INDEX_AUTOSIZE ] = PROPERTYNAME_AUTOSIZE; 456 m_aPropNames[ INDEX_OWNERDRAW ] = PROPERTYNAME_OWNERDRAW; 457 m_aPropNames[ INDEX_TOOLBARITEMS ] = PROPERTYNAME_TOOLBARITEMS; 458 459 // initialize array with fixed images property names 460 m_aPropImagesNames[ OFFSET_IMAGES_SMALL ] = PROPERTYNAME_IMAGESMALL; 461 m_aPropImagesNames[ OFFSET_IMAGES_BIG ] = PROPERTYNAME_IMAGEBIG; 462 m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC ] = PROPERTYNAME_IMAGESMALLHC; 463 m_aPropImagesNames[ OFFSET_IMAGES_BIGHC ] = PROPERTYNAME_IMAGEBIGHC; 464 m_aPropImagesNames[ OFFSET_IMAGES_SMALL_URL ] = PROPERTYNAME_IMAGESMALL_URL; 465 m_aPropImagesNames[ OFFSET_IMAGES_BIG_URL ] = PROPERTYNAME_IMAGEBIG_URL; 466 m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC_URL ] = PROPERTYNAME_IMAGESMALLHC_URL; 467 m_aPropImagesNames[ OFFSET_IMAGES_BIGHC_URL ] = PROPERTYNAME_IMAGEBIGHC_URL; 468 469 // initialize array with fixed merge menu property names 470 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEPOINT ] = PROPERTYNAME_MERGEMENU_MERGEPOINT; 471 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMAND ] = PROPERTYNAME_MERGEMENU_MERGECOMMAND; 472 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMANDPARAMETER ] = PROPERTYNAME_MERGEMENU_MERGECOMMANDPARAMETER; 473 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEFALLBACK ] = PROPERTYNAME_MERGEMENU_MERGEFALLBACK; 474 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECONTEXT ] = PROPERTYNAME_MERGEMENU_MERGECONTEXT; 475 m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MENUITEMS ] = PROPERTYNAME_MERGEMENU_MENUITEMS; 476 477 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_TOOLBAR ] = PROPERTYNAME_MERGETOOLBAR_TOOLBAR; 478 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGEPOINT ] = PROPERTYNAME_MERGETOOLBAR_MERGEPOINT; 479 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECOMMAND ] = PROPERTYNAME_MERGETOOLBAR_MERGECOMMAND; 480 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECOMMANDPARAMETER ] = PROPERTYNAME_MERGETOOLBAR_MERGECOMMANDPARAMETER; 481 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGEFALLBACK ] = PROPERTYNAME_MERGETOOLBAR_MERGEFALLBACK; 482 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECONTEXT ] = PROPERTYNAME_MERGETOOLBAR_MERGECONTEXT; 483 m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_TOOLBARITEMS ] = PROPERTYNAME_MERGETOOLBAR_TOOLBARITEMS; 484 485 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_MERGEPOINT ] = PROPERTYNAME_MERGESTATUSBAR_MERGEPOINT; 486 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_MERGECOMMAND ] = PROPERTYNAME_MERGESTATUSBAR_MERGECOMMAND; 487 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_MERGECOMMANDPARAMETER ] = PROPERTYNAME_MERGESTATUSBAR_MERGECOMMANDPARAMETER; 488 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_MERGEFALLBACK ] = PROPERTYNAME_MERGESTATUSBAR_MERGEFALLBACK; 489 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_MERGECONTEXT ] = PROPERTYNAME_MERGESTATUSBAR_MERGECONTEXT; 490 m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_STATUSBARITEMS ] = PROPERTYNAME_MERGESTATUSBAR_STATUSBARITEMS; 491 492 Reference< XComponentContext > xContext; 493 Reference< com::sun::star::beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); 494 xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xContext; 495 if ( xContext.is() ) 496 { 497 m_xMacroExpander = Reference< com::sun::star::util::XMacroExpander >( xContext->getValueByName( 498 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/singletons/com.sun.star.util.theMacroExpander"))), 499 UNO_QUERY ); 500 } 501 502 ReadConfigurationData(); 503 504 // Enable notification mechanism of ouer baseclass. 505 // We need it to get information about changes outside these class on ouer used configuration keys! 506 Sequence< rtl::OUString > aNotifySeq( 1 ); 507 aNotifySeq[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AddonUI" )); 508 EnableNotification( aNotifySeq ); 509 } 510 511 //***************************************************************************************************************** 512 // destructor 513 //***************************************************************************************************************** 514 AddonsOptions_Impl::~AddonsOptions_Impl() 515 { 516 // We must save our current values .. if user forget it! 517 if( IsModified() == sal_True ) 518 { 519 Commit(); 520 } 521 } 522 523 void AddonsOptions_Impl::ReadConfigurationData() 524 { 525 // reset members to be read again from configuration 526 m_aCachedMenuProperties = Sequence< Sequence< PropertyValue > >(); 527 m_aCachedMenuBarPartProperties = Sequence< Sequence< PropertyValue > >(); 528 m_aCachedToolBarPartProperties = AddonToolBars(); 529 m_aCachedHelpMenuProperties = Sequence< Sequence< PropertyValue > >(); 530 m_aCachedToolBarPartResourceNames.clear(); 531 m_aCachedToolBarPartUINames.clear(); 532 m_aImageManager = ImageManager(); 533 534 ReadAddonMenuSet( m_aCachedMenuProperties ); 535 ReadOfficeMenuBarSet( m_aCachedMenuBarPartProperties ); 536 ReadOfficeToolBarSet( m_aCachedToolBarPartProperties, 537 m_aCachedToolBarPartResourceNames, 538 m_aCachedToolBarPartUINames ); 539 540 ReadOfficeHelpSet( m_aCachedHelpMenuProperties ); 541 ReadImages( m_aImageManager ); 542 543 m_aCachedMergeMenuInsContainer.clear(); 544 m_aCachedToolbarMergingInstructions.clear(); 545 m_aCachedStatusbarMergingInstructions.clear(); 546 547 ReadMenuMergeInstructions( m_aCachedMergeMenuInsContainer ); 548 ReadToolbarMergeInstructions( m_aCachedToolbarMergingInstructions ); 549 ReadStatusbarMergeInstructions( m_aCachedStatusbarMergingInstructions ); 550 } 551 552 //***************************************************************************************************************** 553 // public method 554 //***************************************************************************************************************** 555 void AddonsOptions_Impl::Notify( const Sequence< ::rtl::OUString >& /*lPropertyNames*/ ) 556 { 557 Application::PostUserEvent( STATIC_LINK( 0, AddonsOptions, Notify ) ); 558 } 559 560 //***************************************************************************************************************** 561 // public method 562 //***************************************************************************************************************** 563 void AddonsOptions_Impl::Commit() 564 { 565 DBG_ERROR( "AddonsOptions_Impl::Commit()\nNot implemented yet!\n" ); 566 } 567 568 //***************************************************************************************************************** 569 // public method 570 //***************************************************************************************************************** 571 sal_Bool AddonsOptions_Impl::HasAddonsMenu() const 572 { 573 return ( m_aCachedMenuProperties.getLength() > 0 ); 574 } 575 576 //***************************************************************************************************************** 577 // public method 578 //***************************************************************************************************************** 579 sal_Bool AddonsOptions_Impl::HasAddonsHelpMenu () const 580 { 581 return ( m_aCachedHelpMenuProperties.getLength() > 0 ); 582 } 583 584 //***************************************************************************************************************** 585 // public method 586 //***************************************************************************************************************** 587 sal_Int32 AddonsOptions_Impl::GetAddonsToolBarCount() const 588 { 589 return m_aCachedToolBarPartProperties.size(); 590 } 591 592 //***************************************************************************************************************** 593 // public method 594 //***************************************************************************************************************** 595 const Sequence< Sequence< PropertyValue > >& AddonsOptions_Impl::GetAddonsMenu() const 596 { 597 return m_aCachedMenuProperties; 598 } 599 600 //***************************************************************************************************************** 601 // public method 602 //***************************************************************************************************************** 603 const Sequence< Sequence< PropertyValue > >& AddonsOptions_Impl::GetAddonsMenuBarPart() const 604 { 605 return m_aCachedMenuBarPartProperties; 606 } 607 608 //***************************************************************************************************************** 609 // public method 610 //***************************************************************************************************************** 611 const Sequence< Sequence< PropertyValue > >& AddonsOptions_Impl::GetAddonsToolBarPart( sal_uInt32 nIndex ) const 612 { 613 if ( /*nIndex >= 0 &&*/ nIndex < m_aCachedToolBarPartProperties.size() ) 614 return m_aCachedToolBarPartProperties[nIndex]; 615 else 616 return m_aEmptyAddonToolBar; 617 } 618 619 //***************************************************************************************************************** 620 // public method 621 //***************************************************************************************************************** 622 const ::rtl::OUString AddonsOptions_Impl::GetAddonsToolbarResourceName( sal_uInt32 nIndex ) const 623 { 624 if ( nIndex < m_aCachedToolBarPartResourceNames.size() ) 625 return m_aCachedToolBarPartResourceNames[nIndex]; 626 else 627 return rtl::OUString(); 628 } 629 630 631 const ::rtl::OUString AddonsOptions_Impl::GetAddonsToolbarUIName( sal_uInt32 nIndex ) const 632 { 633 if ( nIndex < m_aCachedToolBarPartUINames.size() ) 634 return m_aCachedToolBarPartUINames[nIndex]; 635 else 636 return rtl::OUString(); 637 } 638 639 //***************************************************************************************************************** 640 // public method 641 //***************************************************************************************************************** 642 const Sequence< Sequence< PropertyValue > >& AddonsOptions_Impl::GetAddonsHelpMenu () const 643 { 644 return m_aCachedHelpMenuProperties; 645 } 646 647 //***************************************************************************************************************** 648 // public method 649 //***************************************************************************************************************** 650 const MergeMenuInstructionContainer& AddonsOptions_Impl::GetMergeMenuInstructions() const 651 { 652 return m_aCachedMergeMenuInsContainer; 653 } 654 655 //***************************************************************************************************************** 656 // public method 657 //***************************************************************************************************************** 658 bool AddonsOptions_Impl::GetMergeToolbarInstructions( 659 const ::rtl::OUString& rToolbarName, 660 MergeToolbarInstructionContainer& rToolbarInstructions ) const 661 { 662 ToolbarMergingInstructions::const_iterator pIter = m_aCachedToolbarMergingInstructions.find( rToolbarName ); 663 if ( pIter != m_aCachedToolbarMergingInstructions.end() ) 664 { 665 rToolbarInstructions = pIter->second; 666 return true; 667 } 668 else 669 return false; 670 } 671 672 const MergeStatusbarInstructionContainer& AddonsOptions_Impl::GetMergeStatusbarInstructions() const 673 { 674 return m_aCachedStatusbarMergingInstructions; 675 } 676 677 //***************************************************************************************************************** 678 // public method 679 //***************************************************************************************************************** 680 Image AddonsOptions_Impl::GetImageFromURL( const rtl::OUString& aURL, sal_Bool bBig, sal_Bool bHiContrast, sal_Bool bNoScale ) const 681 { 682 Image aImage; 683 684 ImageManager::const_iterator pIter = m_aImageManager.find( aURL ); 685 if ( pIter != m_aImageManager.end() ) 686 { 687 if ( !bHiContrast ) 688 { 689 if ( bNoScale ) 690 aImage = ( bBig ? pIter->second.aImageBigNoScale : pIter->second.aImageSmallNoScale ); 691 if ( !aImage ) 692 aImage = ( bBig ? pIter->second.aImageBig : pIter->second.aImageSmall ); 693 } 694 else 695 { 696 if ( bNoScale ) 697 aImage = ( bBig ? pIter->second.aImageBigHCNoScale : pIter->second.aImageSmallHCNoScale ); 698 if ( !aImage ) 699 aImage = ( bBig ? pIter->second.aImageBigHC : pIter->second.aImageSmallHC ); 700 } 701 } 702 703 return aImage; 704 } 705 706 //***************************************************************************************************************** 707 // private method 708 //***************************************************************************************************************** 709 sal_Bool AddonsOptions_Impl::ReadAddonMenuSet( Sequence< Sequence< PropertyValue > >& rAddonMenuSeq ) 710 { 711 // Read the AddonMenu set and fill property sequences 712 ::rtl::OUString aAddonMenuNodeName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/AddonMenu" )); 713 Sequence< ::rtl::OUString > aAddonMenuNodeSeq = GetNodeNames( aAddonMenuNodeName ); 714 ::rtl::OUString aAddonMenuItemNode( aAddonMenuNodeName + m_aPathDelimiter ); 715 716 sal_uInt32 nCount = aAddonMenuNodeSeq.getLength(); 717 sal_uInt32 nIndex = 0; 718 Sequence< PropertyValue > aMenuItem( PROPERTYCOUNT_MENUITEM ); 719 720 // Init the property value sequence 721 aMenuItem[ OFFSET_MENUITEM_URL ].Name = m_aPropNames[ INDEX_URL ]; 722 aMenuItem[ OFFSET_MENUITEM_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 723 aMenuItem[ OFFSET_MENUITEM_TARGET ].Name = m_aPropNames[ INDEX_TARGET ]; 724 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Name = m_aPropNames[ INDEX_IMAGEIDENTIFIER]; 725 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT ]; 726 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Name = m_aPropNames[ INDEX_SUBMENU ]; // Submenu set! 727 728 for ( sal_uInt32 n = 0; n < nCount; n++ ) 729 { 730 ::rtl::OUString aRootMenuItemNode( aAddonMenuItemNode + aAddonMenuNodeSeq[n] ); 731 732 // Read the MenuItem 733 if ( ReadMenuItem( aRootMenuItemNode, aMenuItem ) ) 734 { 735 // Successfully read a menu item, append to our list 736 sal_uInt32 nMenuItemCount = rAddonMenuSeq.getLength() + 1; 737 rAddonMenuSeq.realloc( nMenuItemCount ); 738 rAddonMenuSeq[nIndex++] = aMenuItem; 739 } 740 } 741 742 return ( rAddonMenuSeq.getLength() > 0 ); 743 } 744 745 //***************************************************************************************************************** 746 // private method 747 //***************************************************************************************************************** 748 sal_Bool AddonsOptions_Impl::ReadOfficeHelpSet( Sequence< Sequence< PropertyValue > >& rAddonOfficeHelpMenuSeq ) 749 { 750 // Read the AddonMenu set and fill property sequences 751 ::rtl::OUString aAddonHelpMenuNodeName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeHelp" )); 752 Sequence< ::rtl::OUString > aAddonHelpMenuNodeSeq = GetNodeNames( aAddonHelpMenuNodeName ); 753 ::rtl::OUString aAddonHelpMenuItemNode( aAddonHelpMenuNodeName + m_aPathDelimiter ); 754 755 sal_uInt32 nCount = aAddonHelpMenuNodeSeq.getLength(); 756 sal_uInt32 nIndex = 0; 757 Sequence< PropertyValue > aMenuItem( PROPERTYCOUNT_MENUITEM ); 758 759 // Init the property value sequence 760 aMenuItem[ OFFSET_MENUITEM_URL ].Name = m_aPropNames[ INDEX_URL ]; 761 aMenuItem[ OFFSET_MENUITEM_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 762 aMenuItem[ OFFSET_MENUITEM_TARGET ].Name = m_aPropNames[ INDEX_TARGET ]; 763 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Name = m_aPropNames[ INDEX_IMAGEIDENTIFIER]; 764 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT ]; 765 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Name = m_aPropNames[ INDEX_SUBMENU ]; // Submenu set! 766 767 for ( sal_uInt32 n = 0; n < nCount; n++ ) 768 { 769 ::rtl::OUString aRootMenuItemNode( aAddonHelpMenuItemNode + aAddonHelpMenuNodeSeq[n] ); 770 771 // Read the MenuItem 772 if ( ReadMenuItem( aRootMenuItemNode, aMenuItem, sal_True ) ) 773 { 774 // Successfully read a menu item, append to our list 775 sal_uInt32 nMenuItemCount = rAddonOfficeHelpMenuSeq.getLength() + 1; 776 rAddonOfficeHelpMenuSeq.realloc( nMenuItemCount ); 777 rAddonOfficeHelpMenuSeq[nIndex++] = aMenuItem; 778 } 779 } 780 781 return ( rAddonOfficeHelpMenuSeq.getLength() > 0 ); 782 } 783 784 //***************************************************************************************************************** 785 // private method 786 //***************************************************************************************************************** 787 sal_Bool AddonsOptions_Impl::ReadOfficeMenuBarSet( Sequence< Sequence< PropertyValue > >& rAddonOfficeMenuBarSeq ) 788 { 789 // Read the OfficeMenuBar set and fill property sequences 790 ::rtl::OUString aAddonMenuBarNodeName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeMenuBar" )); 791 Sequence< ::rtl::OUString > aAddonMenuBarNodeSeq = GetNodeNames( aAddonMenuBarNodeName ); 792 ::rtl::OUString aAddonMenuBarNode( aAddonMenuBarNodeName + m_aPathDelimiter ); 793 794 sal_uInt32 nCount = aAddonMenuBarNodeSeq.getLength(); 795 sal_uInt32 nIndex = 0; 796 Sequence< PropertyValue > aPopupMenu( PROPERTYCOUNT_POPUPMENU ); 797 798 // Init the property value sequence 799 aPopupMenu[ OFFSET_POPUPMENU_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 800 aPopupMenu[ OFFSET_POPUPMENU_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT]; 801 aPopupMenu[ OFFSET_POPUPMENU_SUBMENU ].Name = m_aPropNames[ INDEX_SUBMENU]; 802 aPopupMenu[ OFFSET_POPUPMENU_URL ].Name = m_aPropNames[ INDEX_URL ]; 803 804 StringToIndexMap aTitleToIndexMap; 805 806 for ( sal_uInt32 n = 0; n < nCount; n++ ) 807 { 808 ::rtl::OUString aPopupMenuNode( aAddonMenuBarNode + aAddonMenuBarNodeSeq[n] ); 809 810 // Read the MenuItem 811 if ( ReadPopupMenu( aPopupMenuNode, aPopupMenu ) ) 812 { 813 // Successfully read a popup menu, append to our list 814 ::rtl::OUString aPopupTitle; 815 if ( aPopupMenu[OFFSET_POPUPMENU_TITLE].Value >>= aPopupTitle ) 816 { 817 StringToIndexMap::const_iterator pIter = aTitleToIndexMap.find( aPopupTitle ); 818 if ( pIter != aTitleToIndexMap.end() ) 819 { 820 // title already there => concat both popup menus 821 Sequence< PropertyValue >& rOldPopupMenu = rAddonOfficeMenuBarSeq[pIter->second]; 822 AppendPopupMenu( rOldPopupMenu, aPopupMenu ); 823 } 824 else 825 { 826 // not found 827 sal_uInt32 nMenuItemCount = rAddonOfficeMenuBarSeq.getLength() + 1; 828 rAddonOfficeMenuBarSeq.realloc( nMenuItemCount ); 829 rAddonOfficeMenuBarSeq[nIndex] = aPopupMenu; 830 aTitleToIndexMap.insert( StringToIndexMap::value_type( aPopupTitle, nIndex )); 831 ++nIndex; 832 } 833 } 834 } 835 } 836 837 return ( rAddonOfficeMenuBarSeq.getLength() > 0 ); 838 } 839 840 //***************************************************************************************************************** 841 // private method 842 //***************************************************************************************************************** 843 sal_Bool AddonsOptions_Impl::ReadOfficeToolBarSet( 844 AddonToolBars& rAddonOfficeToolBars, 845 std::vector< rtl::OUString >& rAddonOfficeToolBarResNames, 846 std::vector< rtl::OUString >& rAddonOfficeToolBarUINames ) 847 { 848 // Read the OfficeToolBar set and fill property sequences 849 ::rtl::OUString aAddonToolBarNodeName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeToolBar" )); 850 Sequence< ::rtl::OUString > aAddonToolBarNodeSeq = GetNodeNames( aAddonToolBarNodeName ); 851 ::rtl::OUString aAddonToolBarNode( aAddonToolBarNodeName + m_aPathDelimiter ); 852 853 sal_uInt32 nCount = aAddonToolBarNodeSeq.getLength(); 854 855 for ( sal_uInt32 n = 0; n < nCount; n++ ) 856 { 857 ::rtl::OUString aToolBarNode( aAddonToolBarNode + aAddonToolBarNodeSeq[n] + m_aPathDelimiter ); 858 rAddonOfficeToolBarResNames.push_back( aAddonToolBarNodeSeq[n] ); 859 rAddonOfficeToolBars.push_back( m_aEmptyAddonToolBar ); 860 861 Sequence< Any > aToolBarNodeValues = GetProperties( GetPropertyNamesToolBar( aToolBarNode ) ); 862 863 rtl::OUString aUIName; 864 aToolBarNodeValues[OFFSET_TOOLBAR_TITLE] >>= aUIName; 865 rAddonOfficeToolBarUINames.push_back( aUIName ); 866 867 Reference < XInterface > xToolbarItems; 868 if ( ( aToolBarNodeValues[OFFSET_TOOLBAR_TOOLBARITEMS] >>= xToolbarItems ) && xToolbarItems.is() ) 869 { 870 ::rtl::OUStringBuffer aBuffer; 871 aBuffer.append( aToolBarNode ); 872 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( STR_TOOLBARITEMS ) ); 873 ReadToolBarItemSet( aBuffer.makeStringAndClear(), rAddonOfficeToolBars[n] ); 874 } 875 } 876 877 return ( !rAddonOfficeToolBars.empty() ); 878 } 879 880 881 //***************************************************************************************************************** 882 // private method 883 //***************************************************************************************************************** 884 sal_Bool AddonsOptions_Impl::ReadToolBarItemSet( const rtl::OUString rToolBarItemSetNodeName, Sequence< Sequence< PropertyValue > >& rAddonOfficeToolBarSeq ) 885 { 886 sal_Bool bInsertSeparator = sal_False; 887 sal_uInt32 nToolBarItemCount = rAddonOfficeToolBarSeq.getLength(); 888 ::rtl::OUString aAddonToolBarItemSetNode( rToolBarItemSetNodeName + m_aPathDelimiter ); 889 Sequence< ::rtl::OUString > aAddonToolBarItemSetNodeSeq = GetNodeNames( rToolBarItemSetNodeName ); 890 Sequence< PropertyValue > aToolBarItem( PROPERTYCOUNT_TOOLBARITEM ); 891 892 // Init the property value sequence 893 aToolBarItem[ OFFSET_TOOLBARITEM_URL ].Name = m_aPropNames[ INDEX_URL ]; 894 aToolBarItem[ OFFSET_TOOLBARITEM_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 895 aToolBarItem[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ].Name = m_aPropNames[ INDEX_IMAGEIDENTIFIER]; 896 aToolBarItem[ OFFSET_TOOLBARITEM_TARGET ].Name = m_aPropNames[ INDEX_TARGET ]; 897 aToolBarItem[ OFFSET_TOOLBARITEM_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT ]; 898 aToolBarItem[ OFFSET_TOOLBARITEM_CONTROLTYPE ].Name = m_aPropNames[ INDEX_CONTROLTYPE ]; 899 aToolBarItem[ OFFSET_TOOLBARITEM_WIDTH ].Name = m_aPropNames[ INDEX_WIDTH ]; 900 901 sal_uInt32 nCount = aAddonToolBarItemSetNodeSeq.getLength(); 902 for ( sal_uInt32 n = 0; n < nCount; n++ ) 903 { 904 ::rtl::OUString aToolBarItemNode( aAddonToolBarItemSetNode + aAddonToolBarItemSetNodeSeq[n] ); 905 906 // Read the ToolBarItem 907 if ( ReadToolBarItem( aToolBarItemNode, aToolBarItem ) ) 908 { 909 if ( bInsertSeparator ) 910 { 911 bInsertSeparator = sal_False; 912 InsertToolBarSeparator( rAddonOfficeToolBarSeq ); 913 } 914 915 // Successfully read a toolbar item, append to our list 916 sal_uInt32 nAddonCount = rAddonOfficeToolBarSeq.getLength(); 917 rAddonOfficeToolBarSeq.realloc( nAddonCount+1 ); 918 rAddonOfficeToolBarSeq[nAddonCount] = aToolBarItem; 919 } 920 } 921 922 return ( (sal_uInt32)rAddonOfficeToolBarSeq.getLength() > nToolBarItemCount ); 923 } 924 925 //***************************************************************************************************************** 926 // private method 927 //***************************************************************************************************************** 928 void AddonsOptions_Impl::InsertToolBarSeparator( Sequence< Sequence< PropertyValue > >& rAddonOfficeToolBarSeq ) 929 { 930 Sequence< PropertyValue > aToolBarItem( PROPERTYCOUNT_TOOLBARITEM ); 931 932 aToolBarItem[ OFFSET_TOOLBARITEM_URL ].Name = m_aPropNames[ INDEX_URL ]; 933 aToolBarItem[ OFFSET_TOOLBARITEM_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 934 aToolBarItem[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ].Name = m_aPropNames[ INDEX_IMAGEIDENTIFIER]; 935 aToolBarItem[ OFFSET_TOOLBARITEM_TARGET ].Name = m_aPropNames[ INDEX_TARGET ]; 936 aToolBarItem[ OFFSET_TOOLBARITEM_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT ]; 937 938 aToolBarItem[ OFFSET_TOOLBARITEM_URL ].Value <<= SEPARATOR_URL; 939 aToolBarItem[ OFFSET_TOOLBARITEM_TITLE ].Value <<= m_aEmpty; 940 aToolBarItem[ OFFSET_TOOLBARITEM_TARGET ].Value <<= m_aEmpty; 941 aToolBarItem[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ].Value <<= m_aEmpty; 942 aToolBarItem[ OFFSET_TOOLBARITEM_CONTEXT ].Value <<= m_aEmpty; 943 944 sal_uInt32 nToolBarItemCount = rAddonOfficeToolBarSeq.getLength(); 945 rAddonOfficeToolBarSeq.realloc( nToolBarItemCount+1 ); 946 rAddonOfficeToolBarSeq[nToolBarItemCount] = aToolBarItem; 947 } 948 949 950 //***************************************************************************************************************** 951 // private method 952 //***************************************************************************************************************** 953 sal_Bool AddonsOptions_Impl::ReadImages( ImageManager& aImageManager ) 954 { 955 // Read the user-defined Images set and fill image manager 956 ::rtl::OUString aAddonImagesNodeName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/Images" )); 957 Sequence< ::rtl::OUString > aAddonImagesNodeSeq = GetNodeNames( aAddonImagesNodeName ); 958 ::rtl::OUString aAddonImagesNode( aAddonImagesNodeName + m_aPathDelimiter ); 959 960 sal_uInt32 nCount = aAddonImagesNodeSeq.getLength(); 961 962 // Init the property value sequence 963 Sequence< ::rtl::OUString > aAddonImageItemNodePropNames( 1 ); 964 ::rtl::OUString aURL; 965 966 for ( sal_uInt32 n = 0; n < nCount; n++ ) 967 { 968 ::rtl::OUString aImagesItemNode( aAddonImagesNode + aAddonImagesNodeSeq[n] ); 969 970 // Create sequence for data access 971 ::rtl::OUStringBuffer aBuffer( aImagesItemNode ); 972 aBuffer.append( m_aPathDelimiter ); 973 aBuffer.append( m_aPropNames[ OFFSET_MENUITEM_URL ] ); 974 aAddonImageItemNodePropNames[0] = aBuffer.makeStringAndClear(); 975 976 Sequence< Any > aAddonImageItemNodeValues = GetProperties( aAddonImageItemNodePropNames ); 977 978 // An user-defined image entry must have an URL. As "ImageIdentifier" has a higher priority 979 // we also check if we already have an images association. 980 if (( aAddonImageItemNodeValues[0] >>= aURL ) && 981 aURL.getLength() > 0 && 982 !HasAssociatedImages( aURL )) 983 { 984 ::rtl::OUStringBuffer aBuf( aImagesItemNode ); 985 aBuf.append( m_aPathDelimiter ); 986 aBuf.append( IMAGES_NODENAME ); 987 aBuf.append( m_aPathDelimiter ); 988 ::rtl::OUString aImagesUserDefinedItemNode = aBuf.makeStringAndClear(); 989 990 // Read a user-defined images data 991 ImageEntry* pImageEntry = ReadImageData( aImagesUserDefinedItemNode ); 992 if ( pImageEntry ) 993 { 994 // Successfully read a user-defined images item, put it into our image manager 995 aImageManager.insert( ImageManager::value_type( aURL, *pImageEntry )); 996 delete pImageEntry; // We have the ownership of the pointer 997 } 998 } 999 } 1000 1001 return sal_True; 1002 } 1003 1004 //***************************************************************************************************************** 1005 // private method 1006 //***************************************************************************************************************** 1007 1008 ::rtl::OUString AddonsOptions_Impl::GeneratePrefixURL() 1009 { 1010 // Create an unique prefixed Add-On popup menu URL so it can be identified later as a runtime popup menu. 1011 // They use a different image manager, so they must be identified by the sfx2/framework code. 1012 ::rtl::OUString aPopupMenuURL; 1013 ::rtl::OUStringBuffer aBuf( m_aRootAddonPopupMenuURLPrexfix.getLength() + 3 ); 1014 aBuf.append( m_aRootAddonPopupMenuURLPrexfix ); 1015 aBuf.append( ::rtl::OUString::valueOf( ++m_nRootAddonPopupMenuId )); 1016 aPopupMenuURL = aBuf.makeStringAndClear(); 1017 return aPopupMenuURL; 1018 } 1019 1020 //***************************************************************************************************************** 1021 // private method 1022 //***************************************************************************************************************** 1023 1024 sal_Bool AddonsOptions_Impl::ReadMenuMergeInstructions( MergeMenuInstructionContainer& aContainer ) 1025 { 1026 const ::rtl::OUString aMenuMergeRootName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeMenuBarMerging/" )); 1027 1028 Sequence< ::rtl::OUString > aAddonMergeNodesSeq = GetNodeNames( aMenuMergeRootName ); 1029 ::rtl::OUString aAddonMergeNode( aMenuMergeRootName ); 1030 1031 sal_uInt32 nCount = aAddonMergeNodesSeq.getLength(); 1032 1033 // Init the property value sequence 1034 Sequence< ::rtl::OUString > aNodePropNames( 5 ); 1035 ::rtl::OUString aURL; 1036 1037 for ( sal_uInt32 i = 0; i < nCount; i++ ) 1038 { 1039 ::rtl::OUString aMergeAddonInstructions( aAddonMergeNode + aAddonMergeNodesSeq[i] ); 1040 1041 Sequence< ::rtl::OUString > aAddonInstMergeNodesSeq = GetNodeNames( aMergeAddonInstructions ); 1042 sal_uInt32 nCountAddons = aAddonInstMergeNodesSeq.getLength(); 1043 1044 for ( sal_uInt32 j = 0; j < nCountAddons; j++ ) 1045 { 1046 ::rtl::OUStringBuffer aMergeAddonInstructionBase( aMergeAddonInstructions ); 1047 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1048 aMergeAddonInstructionBase.append( aAddonInstMergeNodesSeq[j] ); 1049 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1050 1051 // Create sequence for data access 1052 ::rtl::OUStringBuffer aBuffer( aMergeAddonInstructionBase ); 1053 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEPOINT ] ); 1054 aNodePropNames[0] = aBuffer.makeStringAndClear(); 1055 1056 aBuffer = aMergeAddonInstructionBase; 1057 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMAND ] ); 1058 aNodePropNames[1] = aBuffer.makeStringAndClear(); 1059 1060 aBuffer = aMergeAddonInstructionBase; 1061 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMANDPARAMETER ] ); 1062 aNodePropNames[2] = aBuffer.makeStringAndClear(); 1063 1064 aBuffer = aMergeAddonInstructionBase; 1065 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEFALLBACK ] ); 1066 aNodePropNames[3] = aBuffer.makeStringAndClear(); 1067 1068 aBuffer = aMergeAddonInstructionBase; 1069 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECONTEXT ] ); 1070 aNodePropNames[4] = aBuffer.makeStringAndClear(); 1071 1072 Sequence< Any > aNodePropValues = GetProperties( aNodePropNames ); 1073 1074 MergeMenuInstruction aMergeMenuInstruction; 1075 aNodePropValues[0] >>= aMergeMenuInstruction.aMergePoint; 1076 aNodePropValues[1] >>= aMergeMenuInstruction.aMergeCommand; 1077 aNodePropValues[2] >>= aMergeMenuInstruction.aMergeCommandParameter; 1078 aNodePropValues[3] >>= aMergeMenuInstruction.aMergeFallback; 1079 aNodePropValues[4] >>= aMergeMenuInstruction.aMergeContext; 1080 1081 ::rtl::OUString aMergeMenuBase = aMergeAddonInstructionBase.makeStringAndClear(); 1082 ReadMergeMenuData( aMergeMenuBase, aMergeMenuInstruction.aMergeMenu ); 1083 1084 aContainer.push_back( aMergeMenuInstruction ); 1085 } 1086 } 1087 1088 return sal_True; 1089 } 1090 1091 //***************************************************************************************************************** 1092 // private method 1093 //***************************************************************************************************************** 1094 sal_Bool AddonsOptions_Impl::ReadMergeMenuData( const ::rtl::OUString& aMergeAddonInstructionBase, Sequence< Sequence< PropertyValue > >& rMergeMenu ) 1095 { 1096 ::rtl::OUString aMergeMenuBaseNode( aMergeAddonInstructionBase+m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MENUITEMS ] ); 1097 1098 Sequence< ::rtl::OUString > aSubMenuNodeNames = GetNodeNames( aMergeMenuBaseNode ); 1099 aMergeMenuBaseNode += m_aPathDelimiter; 1100 1101 // extend the node names to have full path strings 1102 for ( sal_uInt32 i = 0; i < (sal_uInt32)aSubMenuNodeNames.getLength(); i++ ) 1103 aSubMenuNodeNames[i] = ::rtl::OUString( aMergeMenuBaseNode + aSubMenuNodeNames[i] ); 1104 1105 return ReadSubMenuEntries( aSubMenuNodeNames, rMergeMenu ); 1106 } 1107 1108 //***************************************************************************************************************** 1109 // private method 1110 //***************************************************************************************************************** 1111 sal_Bool AddonsOptions_Impl::ReadToolbarMergeInstructions( ToolbarMergingInstructions& rCachedToolbarMergingInstructions ) 1112 { 1113 const ::rtl::OUString aToolbarMergeRootName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeToolbarMerging/" )); 1114 1115 Sequence< ::rtl::OUString > aAddonMergeNodesSeq = GetNodeNames( aToolbarMergeRootName ); 1116 ::rtl::OUString aAddonMergeNode( aToolbarMergeRootName ); 1117 1118 sal_uInt32 nCount = aAddonMergeNodesSeq.getLength(); 1119 1120 // Init the property value sequence 1121 Sequence< ::rtl::OUString > aNodePropNames( 6 ); 1122 ::rtl::OUString aURL; 1123 1124 for ( sal_uInt32 i = 0; i < nCount; i++ ) 1125 { 1126 ::rtl::OUString aMergeAddonInstructions( aAddonMergeNode + aAddonMergeNodesSeq[i] ); 1127 1128 Sequence< ::rtl::OUString > aAddonInstMergeNodesSeq = GetNodeNames( aMergeAddonInstructions ); 1129 sal_uInt32 nCountAddons = aAddonInstMergeNodesSeq.getLength(); 1130 1131 for ( sal_uInt32 j = 0; j < nCountAddons; j++ ) 1132 { 1133 ::rtl::OUStringBuffer aMergeAddonInstructionBase( aMergeAddonInstructions ); 1134 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1135 aMergeAddonInstructionBase.append( aAddonInstMergeNodesSeq[j] ); 1136 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1137 1138 // Create sequence for data access 1139 ::rtl::OUStringBuffer aBuffer( aMergeAddonInstructionBase ); 1140 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_TOOLBAR ] ); 1141 aNodePropNames[0] = aBuffer.makeStringAndClear(); 1142 1143 aBuffer = aMergeAddonInstructionBase; 1144 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGEPOINT ] ); 1145 aNodePropNames[1] = aBuffer.makeStringAndClear(); 1146 1147 aBuffer = aMergeAddonInstructionBase; 1148 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECOMMAND ] ); 1149 aNodePropNames[2] = aBuffer.makeStringAndClear(); 1150 1151 aBuffer = aMergeAddonInstructionBase; 1152 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECOMMANDPARAMETER ] ); 1153 aNodePropNames[3] = aBuffer.makeStringAndClear(); 1154 1155 aBuffer = aMergeAddonInstructionBase; 1156 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGEFALLBACK ] ); 1157 aNodePropNames[4] = aBuffer.makeStringAndClear(); 1158 1159 aBuffer = aMergeAddonInstructionBase; 1160 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_MERGECONTEXT ] ); 1161 aNodePropNames[5] = aBuffer.makeStringAndClear(); 1162 1163 Sequence< Any > aNodePropValues = GetProperties( aNodePropNames ); 1164 1165 MergeToolbarInstruction aMergeToolbarInstruction; 1166 aNodePropValues[0] >>= aMergeToolbarInstruction.aMergeToolbar; 1167 aNodePropValues[1] >>= aMergeToolbarInstruction.aMergePoint; 1168 aNodePropValues[2] >>= aMergeToolbarInstruction.aMergeCommand; 1169 aNodePropValues[3] >>= aMergeToolbarInstruction.aMergeCommandParameter; 1170 aNodePropValues[4] >>= aMergeToolbarInstruction.aMergeFallback; 1171 aNodePropValues[5] >>= aMergeToolbarInstruction.aMergeContext; 1172 1173 ReadMergeToolbarData( aMergeAddonInstructionBase.makeStringAndClear(), 1174 aMergeToolbarInstruction.aMergeToolbarItems ); 1175 1176 MergeToolbarInstructionContainer& rVector = rCachedToolbarMergingInstructions[ aMergeToolbarInstruction.aMergeToolbar ]; 1177 rVector.push_back( aMergeToolbarInstruction ); 1178 } 1179 } 1180 1181 return sal_True; 1182 } 1183 1184 //***************************************************************************************************************** 1185 // private method 1186 //***************************************************************************************************************** 1187 sal_Bool AddonsOptions_Impl::ReadMergeToolbarData( const ::rtl::OUString& aMergeAddonInstructionBase, Sequence< Sequence< PropertyValue > >& rMergeToolbarItems ) 1188 { 1189 ::rtl::OUStringBuffer aBuffer( aMergeAddonInstructionBase ); 1190 aBuffer.append( m_aPropMergeToolbarNames[ OFFSET_MERGETOOLBAR_TOOLBARITEMS ] ); 1191 1192 ::rtl::OUString aMergeToolbarBaseNode = aBuffer.makeStringAndClear(); 1193 1194 return ReadToolBarItemSet( aMergeToolbarBaseNode, rMergeToolbarItems ); 1195 } 1196 1197 1198 sal_Bool AddonsOptions_Impl::ReadStatusbarMergeInstructions( MergeStatusbarInstructionContainer& aContainer ) 1199 { 1200 const ::rtl::OUString aStatusbarMergeRootName( RTL_CONSTASCII_USTRINGPARAM( "AddonUI/OfficeStatusbarMerging/" )); 1201 1202 Sequence< ::rtl::OUString > aAddonMergeNodesSeq = GetNodeNames( aStatusbarMergeRootName ); 1203 ::rtl::OUString aAddonMergeNode( aStatusbarMergeRootName ); 1204 sal_uInt32 nCount = aAddonMergeNodesSeq.getLength(); 1205 1206 Sequence< ::rtl::OUString > aNodePropNames( 5 ); 1207 ::rtl::OUString aURL; 1208 1209 for ( sal_uInt32 i = 0; i < nCount; i++ ) 1210 { 1211 ::rtl::OUString aMergeAddonInstructions( aAddonMergeNode + aAddonMergeNodesSeq[i] ); 1212 1213 Sequence< ::rtl::OUString > aAddonInstMergeNodesSeq = GetNodeNames( aMergeAddonInstructions ); 1214 sal_uInt32 nCountAddons = aAddonInstMergeNodesSeq.getLength(); 1215 1216 for ( sal_uInt32 j = 0; j < nCountAddons; j++ ) 1217 { 1218 ::rtl::OUStringBuffer aMergeAddonInstructionBase( aMergeAddonInstructions ); 1219 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1220 aMergeAddonInstructionBase.append( aAddonInstMergeNodesSeq[j] ); 1221 aMergeAddonInstructionBase.append( m_aPathDelimiter ); 1222 1223 // Create sequence for data access 1224 ::rtl::OUStringBuffer aBuffer( aMergeAddonInstructionBase ); 1225 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGESTATUSBAR_MERGEPOINT ] ); 1226 aNodePropNames[0] = aBuffer.makeStringAndClear(); 1227 1228 aBuffer = aMergeAddonInstructionBase; 1229 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGESTATUSBAR_MERGECOMMAND ] ); 1230 aNodePropNames[1] = aBuffer.makeStringAndClear(); 1231 1232 aBuffer = aMergeAddonInstructionBase; 1233 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGESTATUSBAR_MERGECOMMANDPARAMETER ] ); 1234 aNodePropNames[2] = aBuffer.makeStringAndClear(); 1235 1236 aBuffer = aMergeAddonInstructionBase; 1237 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGESTATUSBAR_MERGEFALLBACK ] ); 1238 aNodePropNames[3] = aBuffer.makeStringAndClear(); 1239 1240 aBuffer = aMergeAddonInstructionBase; 1241 aBuffer.append( m_aPropMergeMenuNames[ OFFSET_MERGESTATUSBAR_MERGECONTEXT ] ); 1242 aNodePropNames[4] = aBuffer.makeStringAndClear(); 1243 1244 Sequence< Any > aNodePropValues = GetProperties( aNodePropNames ); 1245 1246 MergeStatusbarInstruction aMergeStatusbarInstruction; 1247 aNodePropValues[0] >>= aMergeStatusbarInstruction.aMergePoint; 1248 aNodePropValues[1] >>= aMergeStatusbarInstruction.aMergeCommand; 1249 aNodePropValues[2] >>= aMergeStatusbarInstruction.aMergeCommandParameter; 1250 aNodePropValues[3] >>= aMergeStatusbarInstruction.aMergeFallback; 1251 aNodePropValues[4] >>= aMergeStatusbarInstruction.aMergeContext; 1252 1253 ReadMergeStatusbarData( aMergeAddonInstructionBase.makeStringAndClear(), 1254 aMergeStatusbarInstruction.aMergeStatusbarItems ); 1255 1256 aContainer.push_back( aMergeStatusbarInstruction ); 1257 } 1258 } 1259 1260 return sal_True; 1261 } 1262 1263 sal_Bool AddonsOptions_Impl::ReadMergeStatusbarData( 1264 const ::rtl::OUString& aMergeAddonInstructionBase, 1265 Sequence< Sequence< PropertyValue > >& rMergeStatusbarItems ) 1266 { 1267 sal_uInt32 nStatusbarItemCount = rMergeStatusbarItems.getLength(); 1268 1269 ::rtl::OUStringBuffer aBuffer( aMergeAddonInstructionBase ); 1270 aBuffer.append( m_aPropMergeStatusbarNames[ OFFSET_MERGESTATUSBAR_STATUSBARITEMS ] ); 1271 ::rtl::OUString aMergeStatusbarBaseNode = aBuffer.makeStringAndClear(); 1272 1273 ::rtl::OUString aAddonStatusbarItemSetNode( aMergeStatusbarBaseNode + m_aPathDelimiter ); 1274 Sequence< ::rtl::OUString > aAddonStatusbarItemSetNodeSeq = GetNodeNames( aMergeStatusbarBaseNode ); 1275 1276 Sequence< PropertyValue > aStatusbarItem( PROPERTYCOUNT_STATUSBARITEM ); 1277 aStatusbarItem[ OFFSET_STATUSBARITEM_URL ].Name = m_aPropNames[ INDEX_URL ]; 1278 aStatusbarItem[ OFFSET_STATUSBARITEM_TITLE ].Name = m_aPropNames[ INDEX_TITLE ]; 1279 aStatusbarItem[ OFFSET_STATUSBARITEM_CONTEXT ].Name = m_aPropNames[ INDEX_CONTEXT ]; 1280 aStatusbarItem[ OFFSET_STATUSBARITEM_ALIGN ].Name = m_aPropNames[ INDEX_ALIGN ]; 1281 aStatusbarItem[ OFFSET_STATUSBARITEM_AUTOSIZE ].Name = m_aPropNames[ INDEX_AUTOSIZE ]; 1282 aStatusbarItem[ OFFSET_STATUSBARITEM_OWNERDRAW ].Name = m_aPropNames[ INDEX_OWNERDRAW ]; 1283 aStatusbarItem[ OFFSET_STATUSBARITEM_WIDTH ].Name = m_aPropNames[ INDEX_WIDTH ]; 1284 1285 sal_uInt32 nCount = aAddonStatusbarItemSetNodeSeq.getLength(); 1286 for ( sal_uInt32 n = 0; n < nCount; n++ ) 1287 { 1288 ::rtl::OUString aStatusbarItemNode( aAddonStatusbarItemSetNode + aAddonStatusbarItemSetNodeSeq[n] ); 1289 1290 if ( ReadStatusBarItem( aStatusbarItemNode, aStatusbarItem ) ) 1291 { 1292 sal_uInt32 nAddonCount = rMergeStatusbarItems.getLength(); 1293 rMergeStatusbarItems.realloc( nAddonCount+1 ); 1294 rMergeStatusbarItems[nAddonCount] = aStatusbarItem; 1295 } 1296 } 1297 1298 return ( (sal_uInt32)rMergeStatusbarItems.getLength() > nStatusbarItemCount ); 1299 } 1300 1301 sal_Bool AddonsOptions_Impl::ReadStatusBarItem( 1302 const ::rtl::OUString& aStatusarItemNodeName, 1303 Sequence< PropertyValue >& aStatusbarItem ) 1304 { 1305 sal_Bool bResult( sal_False ); 1306 ::rtl::OUString aURL; 1307 ::rtl::OUString aAddonStatusbarItemTreeNode( aStatusarItemNodeName + m_aPathDelimiter ); 1308 Sequence< Any > aStatusbarItemNodePropValues; 1309 1310 aStatusbarItemNodePropValues = GetProperties( GetPropertyNamesStatusbarItem( aAddonStatusbarItemTreeNode ) ); 1311 1312 // Command URL is required 1313 if (( aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_URL ] >>= aURL ) && aURL.getLength() > 0 ) 1314 { 1315 aStatusbarItem[ OFFSET_STATUSBARITEM_URL ].Value <<= aURL; 1316 aStatusbarItem[ OFFSET_STATUSBARITEM_TITLE ].Value <<= aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_TITLE ]; 1317 aStatusbarItem[ OFFSET_STATUSBARITEM_CONTEXT ].Value <<= aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_CONTEXT ]; 1318 aStatusbarItem[ OFFSET_STATUSBARITEM_ALIGN ].Value <<= aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_ALIGN ]; 1319 aStatusbarItem[ OFFSET_STATUSBARITEM_AUTOSIZE ].Value <<= aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_AUTOSIZE ];; 1320 aStatusbarItem[ OFFSET_STATUSBARITEM_OWNERDRAW ].Value <<= aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_OWNERDRAW ]; 1321 1322 // Configuration uses hyper for long. Therefore transform into sal_Int32 1323 sal_Int64 nValue( 0 ); 1324 aStatusbarItemNodePropValues[ OFFSET_STATUSBARITEM_WIDTH ] >>= nValue; 1325 aStatusbarItem[ OFFSET_STATUSBARITEM_WIDTH ].Value <<= sal_Int32( nValue ); 1326 1327 bResult = sal_True; 1328 } 1329 1330 return bResult; 1331 } 1332 1333 //***************************************************************************************************************** 1334 // private method 1335 //***************************************************************************************************************** 1336 sal_Bool AddonsOptions_Impl::ReadMenuItem( const ::rtl::OUString& aMenuNodeName, Sequence< PropertyValue >& aMenuItem, sal_Bool bIgnoreSubMenu ) 1337 { 1338 sal_Bool bResult = sal_False; 1339 ::rtl::OUString aStrValue; 1340 ::rtl::OUString aAddonMenuItemTreeNode( aMenuNodeName + m_aPathDelimiter ); 1341 Sequence< Any > aMenuItemNodePropValues; 1342 1343 aMenuItemNodePropValues = GetProperties( GetPropertyNamesMenuItem( aAddonMenuItemTreeNode ) ); 1344 if (( aMenuItemNodePropValues[ OFFSET_MENUITEM_TITLE ] >>= aStrValue ) && aStrValue.getLength() > 0 ) 1345 { 1346 aMenuItem[ OFFSET_MENUITEM_TITLE ].Value <<= aStrValue; 1347 1348 ::rtl::OUString aRootSubMenuName( aAddonMenuItemTreeNode + m_aPropNames[ INDEX_SUBMENU ] ); 1349 Sequence< ::rtl::OUString > aRootSubMenuNodeNames = GetNodeNames( aRootSubMenuName ); 1350 if ( aRootSubMenuNodeNames.getLength() > 0 && !bIgnoreSubMenu ) 1351 { 1352 // Set a unique prefixed Add-On popup menu URL so it can be identified later 1353 ::rtl::OUString aPopupMenuURL = GeneratePrefixURL(); 1354 ::rtl::OUString aPopupMenuImageId; 1355 1356 aMenuItemNodePropValues[ OFFSET_MENUITEM_IMAGEIDENTIFIER ] >>= aPopupMenuImageId; 1357 ReadAndAssociateImages( aPopupMenuURL, aPopupMenuImageId ); 1358 1359 // A popup menu must have a title and can have a URL and ImageIdentifier 1360 // Set the other property values to empty 1361 aMenuItem[ OFFSET_MENUITEM_URL ].Value <<= aPopupMenuURL; 1362 aMenuItem[ OFFSET_MENUITEM_TARGET ].Value <<= m_aEmpty; 1363 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Value <<= aPopupMenuImageId; 1364 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Value <<= aMenuItemNodePropValues[ OFFSET_MENUITEM_CONTEXT ]; 1365 1366 // Continue to read the sub menu nodes 1367 Sequence< Sequence< PropertyValue > > aSubMenuSeq; 1368 ::rtl::OUString aSubMenuRootNodeName( aRootSubMenuName + m_aPathDelimiter ); 1369 for ( sal_uInt32 n = 0; n < (sal_uInt32)aRootSubMenuNodeNames.getLength(); n++ ) 1370 aRootSubMenuNodeNames[n] = ::rtl::OUString( aSubMenuRootNodeName + aRootSubMenuNodeNames[n] ); 1371 ReadSubMenuEntries( aRootSubMenuNodeNames, aSubMenuSeq ); 1372 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Value <<= aSubMenuSeq; 1373 bResult = sal_True; 1374 } 1375 else if (( aMenuItemNodePropValues[ OFFSET_MENUITEM_URL ] >>= aStrValue ) && aStrValue.getLength() > 0 ) 1376 { 1377 // A simple menu item => read the other properties; 1378 ::rtl::OUString aMenuImageId; 1379 1380 aMenuItemNodePropValues[ OFFSET_MENUITEM_IMAGEIDENTIFIER ] >>= aMenuImageId; 1381 ReadAndAssociateImages( aStrValue, aMenuImageId ); 1382 1383 aMenuItem[ OFFSET_MENUITEM_URL ].Value <<= aStrValue; 1384 aMenuItem[ OFFSET_MENUITEM_TARGET ].Value <<= aMenuItemNodePropValues[ OFFSET_MENUITEM_TARGET ]; 1385 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Value <<= aMenuImageId; 1386 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Value <<= aMenuItemNodePropValues[ OFFSET_MENUITEM_CONTEXT ]; 1387 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Value <<= Sequence< Sequence< PropertyValue > >(); // Submenu set! 1388 1389 bResult = sal_True; 1390 } 1391 } 1392 else if (( aMenuItemNodePropValues[ OFFSET_MENUITEM_URL ] >>= aStrValue ) && 1393 aStrValue.equalsAsciiL( SEPARATOR_URL_STR, SEPARATOR_URL_LEN )) 1394 { 1395 // Separator 1396 aMenuItem[ OFFSET_MENUITEM_URL ].Value <<= aStrValue; 1397 aMenuItem[ OFFSET_MENUITEM_TARGET ].Value <<= m_aEmpty; 1398 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Value <<= m_aEmpty; 1399 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Value <<= m_aEmpty; 1400 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Value <<= Sequence< Sequence< PropertyValue > >(); // Submenu set! 1401 bResult = sal_True; 1402 } 1403 1404 return bResult; 1405 } 1406 1407 //***************************************************************************************************************** 1408 // private method 1409 //***************************************************************************************************************** 1410 sal_Bool AddonsOptions_Impl::ReadPopupMenu( const ::rtl::OUString& aPopupMenuNodeName, Sequence< PropertyValue >& aPopupMenu ) 1411 { 1412 sal_Bool bResult = sal_False; 1413 ::rtl::OUString aStrValue; 1414 ::rtl::OUString aAddonPopupMenuTreeNode( aPopupMenuNodeName + m_aPathDelimiter ); 1415 Sequence< Any > aPopupMenuNodePropValues; 1416 1417 aPopupMenuNodePropValues = GetProperties( GetPropertyNamesPopupMenu( aAddonPopupMenuTreeNode ) ); 1418 if (( aPopupMenuNodePropValues[ OFFSET_POPUPMENU_TITLE ] >>= aStrValue ) && 1419 aStrValue.getLength() > 0 ) 1420 { 1421 aPopupMenu[ OFFSET_POPUPMENU_TITLE ].Value <<= aStrValue; 1422 1423 ::rtl::OUString aRootSubMenuName( aAddonPopupMenuTreeNode + m_aPropNames[ INDEX_SUBMENU ] ); 1424 Sequence< ::rtl::OUString > aRootSubMenuNodeNames = GetNodeNames( aRootSubMenuName ); 1425 if ( aRootSubMenuNodeNames.getLength() > 0 ) 1426 { 1427 // A top-level popup menu needs a title 1428 // Set a unique prefixed Add-On popup menu URL so it can be identified later 1429 ::rtl::OUString aPopupMenuURL = GeneratePrefixURL(); 1430 1431 aPopupMenu[ OFFSET_POPUPMENU_URL ].Value <<= aPopupMenuURL; 1432 aPopupMenu[ OFFSET_POPUPMENU_CONTEXT ].Value <<= aPopupMenuNodePropValues[ OFFSET_POPUPMENU_CONTEXT ]; 1433 1434 // Continue to read the sub menu nodes 1435 Sequence< Sequence< PropertyValue > > aSubMenuSeq; 1436 ::rtl::OUString aSubMenuRootNodeName( aRootSubMenuName + m_aPathDelimiter ); 1437 for ( sal_uInt32 n = 0; n < (sal_uInt32)aRootSubMenuNodeNames.getLength(); n++ ) 1438 aRootSubMenuNodeNames[n] = ::rtl::OUString( aSubMenuRootNodeName + aRootSubMenuNodeNames[n] ); 1439 ReadSubMenuEntries( aRootSubMenuNodeNames, aSubMenuSeq ); 1440 aPopupMenu[ OFFSET_POPUPMENU_SUBMENU ].Value <<= aSubMenuSeq; 1441 bResult = sal_True; 1442 } 1443 } 1444 1445 return bResult; 1446 } 1447 1448 //***************************************************************************************************************** 1449 // private method 1450 //***************************************************************************************************************** 1451 sal_Bool AddonsOptions_Impl::AppendPopupMenu( Sequence< PropertyValue >& rTargetPopupMenu, const Sequence< PropertyValue >& rSourcePopupMenu ) 1452 { 1453 Sequence< Sequence< PropertyValue > > aTargetSubMenuSeq; 1454 Sequence< Sequence< PropertyValue > > aSourceSubMenuSeq; 1455 1456 if (( rTargetPopupMenu[ OFFSET_POPUPMENU_SUBMENU ].Value >>= aTargetSubMenuSeq ) && 1457 ( rSourcePopupMenu[ OFFSET_POPUPMENU_SUBMENU ].Value >>= aSourceSubMenuSeq )) 1458 { 1459 sal_uInt32 nIndex = aTargetSubMenuSeq.getLength(); 1460 aTargetSubMenuSeq.realloc( nIndex + aSourceSubMenuSeq.getLength() ); 1461 for ( sal_uInt32 i = 0; i < sal_uInt32( aSourceSubMenuSeq.getLength() ); i++ ) 1462 aTargetSubMenuSeq[nIndex++] = aSourceSubMenuSeq[i]; 1463 rTargetPopupMenu[ OFFSET_POPUPMENU_SUBMENU ].Value <<= aTargetSubMenuSeq; 1464 } 1465 1466 return sal_True; 1467 } 1468 1469 //***************************************************************************************************************** 1470 // private method 1471 //***************************************************************************************************************** 1472 sal_Bool AddonsOptions_Impl::ReadToolBarItem( const ::rtl::OUString& aToolBarItemNodeName, Sequence< PropertyValue >& aToolBarItem ) 1473 { 1474 sal_Bool bResult = sal_False; 1475 ::rtl::OUString aTitle; 1476 ::rtl::OUString aURL; 1477 ::rtl::OUString aAddonToolBarItemTreeNode( aToolBarItemNodeName + m_aPathDelimiter ); 1478 Sequence< Any > aToolBarItemNodePropValues; 1479 1480 aToolBarItemNodePropValues = GetProperties( GetPropertyNamesToolBarItem( aAddonToolBarItemTreeNode ) ); 1481 1482 // A toolbar item must have a command URL 1483 if (( aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_URL ] >>= aURL ) && aURL.getLength() > 0 ) 1484 { 1485 if ( aURL.equals( SEPARATOR_URL )) 1486 { 1487 // A speparator toolbar item only needs a URL 1488 aToolBarItem[ OFFSET_TOOLBARITEM_URL ].Value <<= aURL; 1489 aToolBarItem[ OFFSET_TOOLBARITEM_TITLE ].Value <<= m_aEmpty; 1490 aToolBarItem[ OFFSET_TOOLBARITEM_TARGET ].Value <<= m_aEmpty; 1491 aToolBarItem[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ].Value <<= m_aEmpty; 1492 aToolBarItem[ OFFSET_TOOLBARITEM_CONTEXT ].Value <<= m_aEmpty; 1493 aToolBarItem[ OFFSET_TOOLBARITEM_CONTROLTYPE ].Value <<= m_aEmpty; 1494 aToolBarItem[ OFFSET_TOOLBARITEM_WIDTH ].Value <<= sal_Int32( 0 ); 1495 1496 bResult = sal_True; 1497 } 1498 else if (( aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_TITLE ] >>= aTitle ) && aTitle.getLength() > 0 ) 1499 { 1500 // A normal toolbar item must also have title => read the other properties; 1501 ::rtl::OUString aImageId; 1502 1503 // Try to map a user-defined image URL to our internal private image URL 1504 aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ] >>= aImageId; 1505 ReadAndAssociateImages( aURL, aImageId ); 1506 1507 aToolBarItem[ OFFSET_TOOLBARITEM_URL ].Value <<= aURL; 1508 aToolBarItem[ OFFSET_TOOLBARITEM_TITLE ].Value <<= aTitle; 1509 aToolBarItem[ OFFSET_TOOLBARITEM_TARGET ].Value <<= aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_TARGET ]; 1510 aToolBarItem[ OFFSET_TOOLBARITEM_IMAGEIDENTIFIER ].Value <<= aImageId; 1511 aToolBarItem[ OFFSET_TOOLBARITEM_CONTEXT ].Value <<= aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_CONTEXT ]; 1512 aToolBarItem[ OFFSET_TOOLBARITEM_CONTROLTYPE ].Value <<= aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_CONTROLTYPE ]; 1513 1514 // Configuration uses hyper for long. Therefore transform into sal_Int32 1515 sal_Int64 nValue( 0 ); 1516 aToolBarItemNodePropValues[ OFFSET_TOOLBARITEM_WIDTH ] >>= nValue; 1517 aToolBarItem[ OFFSET_TOOLBARITEM_WIDTH ].Value <<= sal_Int32( nValue ); 1518 1519 bResult = sal_True; 1520 } 1521 } 1522 1523 return bResult; 1524 } 1525 1526 //***************************************************************************************************************** 1527 // private method 1528 //***************************************************************************************************************** 1529 sal_Bool AddonsOptions_Impl::ReadSubMenuEntries( const Sequence< ::rtl::OUString >& aSubMenuNodeNames, Sequence< Sequence< PropertyValue > >& rSubMenuSeq ) 1530 { 1531 Sequence< PropertyValue > aMenuItem( PROPERTYCOUNT_MENUITEM ); 1532 1533 // Init the property value sequence 1534 aMenuItem[ OFFSET_MENUITEM_URL ].Name = PROPERTYNAME_URL; 1535 aMenuItem[ OFFSET_MENUITEM_TITLE ].Name = PROPERTYNAME_TITLE; 1536 aMenuItem[ OFFSET_MENUITEM_TARGET ].Name = PROPERTYNAME_TARGET; 1537 aMenuItem[ OFFSET_MENUITEM_IMAGEIDENTIFIER ].Name = PROPERTYNAME_IMAGEIDENTIFIER; 1538 aMenuItem[ OFFSET_MENUITEM_CONTEXT ].Name = PROPERTYNAME_CONTEXT; 1539 aMenuItem[ OFFSET_MENUITEM_SUBMENU ].Name = PROPERTYNAME_SUBMENU; // Submenu set! 1540 1541 sal_uInt32 nIndex = 0; 1542 sal_uInt32 nCount = aSubMenuNodeNames.getLength(); 1543 for ( sal_uInt32 n = 0; n < nCount; n++ ) 1544 { 1545 if ( ReadMenuItem( aSubMenuNodeNames[n], aMenuItem )) 1546 { 1547 sal_uInt32 nSubMenuCount = rSubMenuSeq.getLength() + 1; 1548 rSubMenuSeq.realloc( nSubMenuCount ); 1549 rSubMenuSeq[nIndex++] = aMenuItem; 1550 } 1551 } 1552 1553 return sal_True; 1554 } 1555 1556 //***************************************************************************************************************** 1557 // private method 1558 //***************************************************************************************************************** 1559 sal_Bool AddonsOptions_Impl::HasAssociatedImages( const ::rtl::OUString& aURL ) 1560 { 1561 ImageManager::const_iterator pIter = m_aImageManager.find( aURL ); 1562 return ( pIter != m_aImageManager.end() ); 1563 } 1564 1565 //***************************************************************************************************************** 1566 // private method 1567 //***************************************************************************************************************** 1568 void AddonsOptions_Impl::SubstituteVariables( ::rtl::OUString& aURL ) 1569 { 1570 if (( aURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( EXPAND_PROTOCOL )) == 0 ) && 1571 m_xMacroExpander.is() ) 1572 { 1573 // cut protocol 1574 ::rtl::OUString macro( aURL.copy( sizeof ( EXPAND_PROTOCOL ) -1 ) ); 1575 // decode uric class chars 1576 macro = ::rtl::Uri::decode( 1577 macro, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); 1578 // expand macro string 1579 aURL = m_xMacroExpander->expandMacros( macro ); 1580 } 1581 } 1582 1583 //***************************************************************************************************************** 1584 // private method 1585 //***************************************************************************************************************** 1586 void AddonsOptions_Impl::ReadImageFromURL( ImageSize nImageSize, const ::rtl::OUString& aImageURL, Image& aImage, Image& aImageNoScale ) 1587 { 1588 SvStream* pStream = UcbStreamHelper::CreateStream( aImageURL, STREAM_STD_READ ); 1589 if ( pStream && ( pStream->GetErrorCode() == 0 )) 1590 { 1591 // Use graphic class to also support more graphic formats (bmp,png,...) 1592 Graphic aGraphic; 1593 1594 GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); 1595 pGF->ImportGraphic( aGraphic, String(), *pStream, GRFILTER_FORMAT_DONTKNOW ); 1596 1597 BitmapEx aBitmapEx = aGraphic.GetBitmapEx(); 1598 1599 const Size aSize = ( nImageSize == IMGSIZE_SMALL ) ? aImageSizeSmall : aImageSizeBig; // Sizes used for menu/toolbox images 1600 1601 Size aBmpSize = aBitmapEx.GetSizePixel(); 1602 if ( aBmpSize.Width() > 0 && aBmpSize.Height() > 0 ) 1603 { 1604 // Support non-transparent bitmaps to be downward compatible with OOo 1.1.x addons 1605 if( !aBitmapEx.IsTransparent() ) 1606 aBitmapEx = BitmapEx( aBitmapEx.GetBitmap(), COL_LIGHTMAGENTA ); 1607 1608 // A non-scaled bitmap can have a flexible width, but must have a defined height! 1609 Size aNoScaleSize( aBmpSize.Width(), aSize.Height() ); 1610 if ( aBmpSize != aNoScaleSize ) 1611 { 1612 BitmapEx aNoScaleBmp( aBitmapEx ); 1613 aNoScaleBmp.Scale( aNoScaleSize, BMP_SCALE_INTERPOLATE ); 1614 } 1615 else 1616 aImageNoScale = Image( aBitmapEx ); 1617 1618 if ( aBmpSize != aSize ) 1619 aBitmapEx.Scale( aSize, BMP_SCALE_INTERPOLATE ); 1620 1621 aImage = Image( aBitmapEx ); 1622 } 1623 } 1624 1625 delete pStream; 1626 } 1627 1628 //***************************************************************************************************************** 1629 // private method 1630 //***************************************************************************************************************** 1631 void AddonsOptions_Impl::ReadAndAssociateImages( const ::rtl::OUString& aURL, const ::rtl::OUString& aImageId ) 1632 { 1633 const int MAX_NUM_IMAGES = 4; 1634 const char* aExtArray[MAX_NUM_IMAGES] = { "_16", "_26", "_16h", "_26h" }; 1635 const char* pBmpExt = ".bmp"; 1636 1637 if ( aImageId.getLength() == 0 ) 1638 return; 1639 1640 bool bImageFound = true; 1641 ImageEntry aImageEntry; 1642 ::rtl::OUString aImageURL( aImageId ); 1643 1644 SubstituteVariables( aImageURL ); 1645 1646 // Loop to create the four possible image names and try to read the bitmap files 1647 for ( int i = 0; i < MAX_NUM_IMAGES; i++ ) 1648 { 1649 ::rtl::OUStringBuffer aFileURL( aImageURL ); 1650 aFileURL.appendAscii( aExtArray[i] ); 1651 aFileURL.appendAscii( pBmpExt ); 1652 1653 Image aImage; 1654 Image aImageNoScale; 1655 ReadImageFromURL( ((i==0)||(i==2)) ? IMGSIZE_SMALL : IMGSIZE_BIG, aFileURL.makeStringAndClear(), aImage, aImageNoScale ); 1656 if ( !!aImage ) 1657 { 1658 bImageFound = true; 1659 switch ( i ) 1660 { 1661 case 0: 1662 aImageEntry.aImageSmall = aImage; 1663 aImageEntry.aImageSmallNoScale = aImageNoScale; 1664 break; 1665 case 1: 1666 aImageEntry.aImageBig = aImage; 1667 aImageEntry.aImageBigNoScale = aImageNoScale; 1668 break; 1669 case 2: 1670 aImageEntry.aImageSmallHC = aImage; 1671 aImageEntry.aImageSmallHCNoScale = aImageNoScale; 1672 break; 1673 case 3: 1674 aImageEntry.aImageBigHC = aImage; 1675 aImageEntry.aImageBigHCNoScale = aImageNoScale; 1676 break; 1677 } 1678 } 1679 } 1680 1681 if ( bImageFound ) 1682 m_aImageManager.insert( ImageManager::value_type( aURL, aImageEntry )); 1683 } 1684 1685 //***************************************************************************************************************** 1686 // private method 1687 //***************************************************************************************************************** 1688 AddonsOptions_Impl::ImageEntry* AddonsOptions_Impl::ReadImageData( const ::rtl::OUString& aImagesNodeName ) 1689 { 1690 Sequence< ::rtl::OUString > aImageDataNodeNames = GetPropertyNamesImages( aImagesNodeName ); 1691 Sequence< Any > aPropertyData; 1692 Sequence< sal_Int8 > aImageDataSeq; 1693 ::rtl::OUString aImageURL; 1694 1695 ImageEntry* pEntry = NULL; 1696 1697 // It is possible to use both forms (embedded image data and URLs to external bitmap files) at the 1698 // same time. Embedded image data has a higher priority. 1699 aPropertyData = GetProperties( aImageDataNodeNames ); 1700 for ( int i = 0; i < PROPERTYCOUNT_IMAGES; i++ ) 1701 { 1702 if ( i < PROPERTYCOUNT_EMBEDDED_IMAGES ) 1703 { 1704 // Extract image data from the embedded hex binary sequence 1705 Image aImage; 1706 if (( aPropertyData[i] >>= aImageDataSeq ) && 1707 aImageDataSeq.getLength() > 0 && 1708 ( CreateImageFromSequence( aImage, 1709 (( i == OFFSET_IMAGES_BIG ) || 1710 ( i == OFFSET_IMAGES_BIGHC )), 1711 aImageDataSeq )) ) 1712 { 1713 if ( !pEntry ) 1714 pEntry = new ImageEntry; 1715 1716 if ( i == OFFSET_IMAGES_SMALL ) 1717 pEntry->aImageSmall = aImage; 1718 else if ( i == OFFSET_IMAGES_BIG ) 1719 pEntry->aImageBig = aImage; 1720 else if ( i == OFFSET_IMAGES_SMALLHC ) 1721 pEntry->aImageSmallHC = aImage; 1722 else 1723 pEntry->aImageBigHC = aImage; 1724 } 1725 } 1726 else 1727 { 1728 // Retrieve image data from a external bitmap file. Make sure that embedded image data 1729 // has a higher priority. 1730 aPropertyData[i] >>= aImageURL; 1731 1732 if ( aImageURL.getLength() > 0 ) 1733 { 1734 Image aImage; 1735 Image aImageNoScale; 1736 1737 SubstituteVariables( aImageURL ); 1738 ReadImageFromURL( ((i==OFFSET_IMAGES_SMALL_URL)||(i==OFFSET_IMAGES_SMALLHC_URL)) ? IMGSIZE_SMALL : IMGSIZE_BIG, 1739 aImageURL, aImage, aImageNoScale ); 1740 if ( !!aImage ) 1741 { 1742 if ( !pEntry ) 1743 pEntry = new ImageEntry; 1744 1745 if ( i == OFFSET_IMAGES_SMALL_URL && !pEntry->aImageSmall ) 1746 { 1747 pEntry->aImageSmall = aImage; 1748 pEntry->aImageSmallNoScale = aImageNoScale; 1749 } 1750 else if ( i == OFFSET_IMAGES_BIG_URL && !pEntry->aImageBig ) 1751 { 1752 pEntry->aImageBig = aImage; 1753 pEntry->aImageBigNoScale = aImageNoScale; 1754 } 1755 else if ( i == OFFSET_IMAGES_SMALLHC_URL && !pEntry->aImageSmallHC ) 1756 { 1757 pEntry->aImageSmallHC = aImage; 1758 pEntry->aImageSmallHCNoScale = aImageNoScale; 1759 } 1760 else if ( !pEntry->aImageBigHC ) 1761 { 1762 pEntry->aImageBigHC = aImage; 1763 pEntry->aImageBigHCNoScale = aImageNoScale; 1764 } 1765 } 1766 } 1767 } 1768 } 1769 1770 return pEntry; 1771 } 1772 1773 //***************************************************************************************************************** 1774 // private method 1775 //***************************************************************************************************************** 1776 sal_Bool AddonsOptions_Impl::CreateImageFromSequence( Image& rImage, sal_Bool bBig, Sequence< sal_Int8 >& rBitmapDataSeq ) const 1777 { 1778 sal_Bool bResult = sal_False; 1779 Size aSize = bBig ? aImageSizeBig : aImageSizeSmall; // Sizes used for menu/toolbox images 1780 1781 if ( rBitmapDataSeq.getLength() > 0 ) 1782 { 1783 SvMemoryStream aMemStream( rBitmapDataSeq.getArray(), rBitmapDataSeq.getLength(), STREAM_STD_READ ); 1784 BitmapEx aBitmapEx; 1785 1786 ReadDIBBitmapEx(aBitmapEx, aMemStream); 1787 1788 // Scale bitmap to fit the correct size for the menu/toolbar. Use best quality 1789 if ( aBitmapEx.GetSizePixel() != aSize ) 1790 aBitmapEx.Scale( aSize, BMP_SCALE_INTERPOLATE ); 1791 1792 if( !aBitmapEx.IsTransparent() ) 1793 { 1794 // Support non-transparent bitmaps to be downward compatible with OOo 1.1.x addons 1795 aBitmapEx = BitmapEx( aBitmapEx.GetBitmap(), COL_LIGHTMAGENTA ); 1796 } 1797 1798 rImage = Image( aBitmapEx ); 1799 bResult = sal_True; 1800 } 1801 1802 return bResult; 1803 } 1804 1805 //***************************************************************************************************************** 1806 // private methods 1807 //***************************************************************************************************************** 1808 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesMergeMenuInstruction( const ::rtl::OUString& aPropertyRootNode ) const 1809 { 1810 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_MERGE_MENUBAR ); 1811 1812 // Create property names dependent from the root node name 1813 lResult[ OFFSET_MERGEMENU_MERGEPOINT ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEPOINT ] ); 1814 lResult[ OFFSET_MERGEMENU_MERGECOMMAND ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMAND ] ); 1815 lResult[ OFFSET_MERGEMENU_MERGECOMMANDPARAMETER ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECOMMANDPARAMETER ] ); 1816 lResult[ OFFSET_MERGEMENU_MERGEFALLBACK ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGEFALLBACK ] ); 1817 lResult[ OFFSET_MERGEMENU_MERGECONTEXT ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MERGECONTEXT ] ); 1818 lResult[ OFFSET_MERGEMENU_MENUITEMS ] = ::rtl::OUString( aPropertyRootNode + m_aPropMergeMenuNames[ OFFSET_MERGEMENU_MENUITEMS ] ); 1819 1820 return lResult; 1821 } 1822 1823 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesMenuItem( const ::rtl::OUString& aPropertyRootNode ) const 1824 { 1825 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_MENUITEM ); 1826 1827 // Create property names dependent from the root node name 1828 lResult[OFFSET_MENUITEM_URL] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_URL ] ); 1829 lResult[OFFSET_MENUITEM_TITLE] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TITLE ] ); 1830 lResult[OFFSET_MENUITEM_IMAGEIDENTIFIER] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_IMAGEIDENTIFIER ] ); 1831 lResult[OFFSET_MENUITEM_TARGET] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TARGET ] ); 1832 lResult[OFFSET_MENUITEM_CONTEXT] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_CONTEXT ] ); 1833 lResult[OFFSET_MENUITEM_SUBMENU] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_SUBMENU ] ); 1834 1835 return lResult; 1836 } 1837 1838 //***************************************************************************************************************** 1839 // private method 1840 //***************************************************************************************************************** 1841 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesPopupMenu( const ::rtl::OUString& aPropertyRootNode ) const 1842 { 1843 // The URL is automatically set and not read from the configuration. 1844 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_POPUPMENU-1 ); 1845 1846 // Create property names dependent from the root node name 1847 lResult[OFFSET_POPUPMENU_TITLE] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TITLE ] ); 1848 lResult[OFFSET_POPUPMENU_CONTEXT] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_CONTEXT ] ); 1849 lResult[OFFSET_POPUPMENU_SUBMENU] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_SUBMENU ] ); 1850 1851 return lResult; 1852 } 1853 1854 //***************************************************************************************************************** 1855 // private method 1856 //***************************************************************************************************************** 1857 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesToolBar( const ::rtl::OUString& aPropertyRootNode ) const 1858 { 1859 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_TOOLBAR ); 1860 1861 // Create property names dependent from the root node name 1862 lResult[OFFSET_TOOLBAR_TITLE] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TITLE ] ); 1863 lResult[OFFSET_TOOLBAR_TOOLBARITEMS] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TOOLBARITEMS ] ); 1864 1865 return lResult; 1866 } 1867 1868 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesToolBarItem( const ::rtl::OUString& aPropertyRootNode ) const 1869 { 1870 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_TOOLBARITEM ); 1871 1872 // Create property names dependent from the root node name 1873 lResult[0] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_URL ] ); 1874 lResult[1] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TITLE ] ); 1875 lResult[2] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_IMAGEIDENTIFIER] ); 1876 lResult[3] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TARGET ] ); 1877 lResult[4] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_CONTEXT ] ); 1878 lResult[5] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_CONTROLTYPE ] ); 1879 lResult[6] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_WIDTH ] ); 1880 1881 return lResult; 1882 } 1883 1884 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesStatusbarItem( 1885 const ::rtl::OUString& aPropertyRootNode ) const 1886 { 1887 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_STATUSBARITEM ); 1888 1889 lResult[0] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_URL ] ); 1890 lResult[1] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_TITLE ] ); 1891 lResult[2] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_CONTEXT ] ); 1892 lResult[3] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_ALIGN ] ); 1893 lResult[4] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_AUTOSIZE ] ); 1894 lResult[5] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_OWNERDRAW ] ); 1895 lResult[6] = ::rtl::OUString( aPropertyRootNode + m_aPropNames[ INDEX_WIDTH ] ); 1896 1897 return lResult; 1898 } 1899 1900 //***************************************************************************************************************** 1901 // private method 1902 //***************************************************************************************************************** 1903 Sequence< ::rtl::OUString > AddonsOptions_Impl::GetPropertyNamesImages( const ::rtl::OUString& aPropertyRootNode ) const 1904 { 1905 Sequence< ::rtl::OUString > lResult( PROPERTYCOUNT_IMAGES ); 1906 1907 // Create property names dependent from the root node name 1908 lResult[0] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALL ] ); 1909 lResult[1] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIG ] ); 1910 lResult[2] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC ] ); 1911 lResult[3] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIGHC ] ); 1912 lResult[4] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALL_URL ] ); 1913 lResult[5] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIG_URL ] ); 1914 lResult[6] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_SMALLHC_URL] ); 1915 lResult[7] = ::rtl::OUString( aPropertyRootNode + m_aPropImagesNames[ OFFSET_IMAGES_BIGHC_URL ] ); 1916 1917 return lResult; 1918 } 1919 1920 //***************************************************************************************************************** 1921 // initialize static member 1922 // DON'T DO IT IN YOUR HEADER! 1923 // see definition for further informations 1924 //***************************************************************************************************************** 1925 AddonsOptions_Impl* AddonsOptions::m_pDataContainer = NULL ; 1926 sal_Int32 AddonsOptions::m_nRefCount = 0 ; 1927 1928 //***************************************************************************************************************** 1929 // constructor 1930 //***************************************************************************************************************** 1931 AddonsOptions::AddonsOptions() 1932 { 1933 // Global access, must be guarded (multithreading!). 1934 MutexGuard aGuard( GetOwnStaticMutex() ); 1935 // Increase ouer refcount ... 1936 ++m_nRefCount; 1937 // ... and initialize ouer data container only if it not already exist! 1938 if( m_pDataContainer == NULL ) 1939 { 1940 m_pDataContainer = new AddonsOptions_Impl; 1941 } 1942 } 1943 1944 //***************************************************************************************************************** 1945 // destructor 1946 //***************************************************************************************************************** 1947 AddonsOptions::~AddonsOptions() 1948 { 1949 // Global access, must be guarded (multithreading!) 1950 MutexGuard aGuard( GetOwnStaticMutex() ); 1951 // Decrease ouer refcount. 1952 --m_nRefCount; 1953 // If last instance was deleted ... 1954 // we must destroy ouer static data container! 1955 if( m_nRefCount <= 0 ) 1956 { 1957 delete m_pDataContainer; 1958 m_pDataContainer = NULL; 1959 } 1960 } 1961 1962 //***************************************************************************************************************** 1963 // public method 1964 //***************************************************************************************************************** 1965 sal_Bool AddonsOptions::HasAddonsMenu() const 1966 { 1967 MutexGuard aGuard( GetOwnStaticMutex() ); 1968 return m_pDataContainer->HasAddonsMenu(); 1969 } 1970 1971 //***************************************************************************************************************** 1972 // public method 1973 //***************************************************************************************************************** 1974 1975 sal_Bool AddonsOptions::HasAddonsHelpMenu() const 1976 { 1977 MutexGuard aGuard( GetOwnStaticMutex() ); 1978 return m_pDataContainer->HasAddonsHelpMenu(); 1979 } 1980 1981 //***************************************************************************************************************** 1982 // public method 1983 //***************************************************************************************************************** 1984 1985 sal_Int32 AddonsOptions::GetAddonsToolBarCount() const 1986 { 1987 MutexGuard aGuard( GetOwnStaticMutex() ); 1988 return m_pDataContainer->GetAddonsToolBarCount(); 1989 } 1990 1991 //***************************************************************************************************************** 1992 // public method 1993 //***************************************************************************************************************** 1994 const Sequence< Sequence< PropertyValue > >& AddonsOptions::GetAddonsMenu() const 1995 { 1996 MutexGuard aGuard( GetOwnStaticMutex() ); 1997 return m_pDataContainer->GetAddonsMenu(); 1998 } 1999 2000 //***************************************************************************************************************** 2001 // public method 2002 //***************************************************************************************************************** 2003 const Sequence< Sequence< PropertyValue > >& AddonsOptions::GetAddonsMenuBarPart() const 2004 { 2005 MutexGuard aGuard( GetOwnStaticMutex() ); 2006 return m_pDataContainer->GetAddonsMenuBarPart(); 2007 } 2008 2009 //***************************************************************************************************************** 2010 // public method 2011 //***************************************************************************************************************** 2012 const Sequence< Sequence< PropertyValue > >& AddonsOptions::GetAddonsToolBarPart( sal_uInt32 nIndex ) const 2013 { 2014 MutexGuard aGuard( GetOwnStaticMutex() ); 2015 return m_pDataContainer->GetAddonsToolBarPart( nIndex ); 2016 } 2017 2018 //***************************************************************************************************************** 2019 // public method 2020 //***************************************************************************************************************** 2021 const ::rtl::OUString AddonsOptions::GetAddonsToolbarResourceName( sal_uInt32 nIndex ) const 2022 { 2023 MutexGuard aGuard( GetOwnStaticMutex() ); 2024 return m_pDataContainer->GetAddonsToolbarResourceName( nIndex ); 2025 } 2026 2027 const ::rtl::OUString AddonsOptions::GetAddonsToolbarUIName( sal_uInt32 nIndex ) const 2028 { 2029 MutexGuard aGuard( GetOwnStaticMutex() ); 2030 return m_pDataContainer->GetAddonsToolbarUIName( nIndex ); 2031 } 2032 2033 //***************************************************************************************************************** 2034 // public method 2035 //***************************************************************************************************************** 2036 const Sequence< Sequence< PropertyValue > >& AddonsOptions::GetAddonsHelpMenu() const 2037 { 2038 MutexGuard aGuard( GetOwnStaticMutex() ); 2039 return m_pDataContainer->GetAddonsHelpMenu(); 2040 } 2041 2042 //***************************************************************************************************************** 2043 // public method 2044 //***************************************************************************************************************** 2045 const MergeMenuInstructionContainer& AddonsOptions::GetMergeMenuInstructions() const 2046 { 2047 MutexGuard aGuard( GetOwnStaticMutex() ); 2048 return m_pDataContainer->GetMergeMenuInstructions(); 2049 } 2050 2051 //***************************************************************************************************************** 2052 // public method 2053 //***************************************************************************************************************** 2054 bool AddonsOptions::GetMergeToolbarInstructions( 2055 const ::rtl::OUString& rToolbarName, 2056 MergeToolbarInstructionContainer& rToolbarInstructions ) const 2057 { 2058 MutexGuard aGuard( GetOwnStaticMutex() ); 2059 return m_pDataContainer->GetMergeToolbarInstructions( 2060 rToolbarName, rToolbarInstructions ); 2061 } 2062 2063 const MergeStatusbarInstructionContainer& AddonsOptions::GetMergeStatusbarInstructions() const 2064 { 2065 MutexGuard aGuard( GetOwnStaticMutex() ); 2066 return m_pDataContainer->GetMergeStatusbarInstructions(); 2067 } 2068 2069 //***************************************************************************************************************** 2070 // public method 2071 //***************************************************************************************************************** 2072 Image AddonsOptions::GetImageFromURL( const rtl::OUString& aURL, sal_Bool bBig, sal_Bool bHiContrast, sal_Bool bNoScale ) const 2073 { 2074 MutexGuard aGuard( GetOwnStaticMutex() ); 2075 return m_pDataContainer->GetImageFromURL( aURL, bBig, bHiContrast, bNoScale ); 2076 } 2077 2078 //***************************************************************************************************************** 2079 // public method 2080 //***************************************************************************************************************** 2081 Image AddonsOptions::GetImageFromURL( const rtl::OUString& aURL, sal_Bool bBig, sal_Bool bHiContrast ) const 2082 { 2083 return GetImageFromURL( aURL, bBig, bHiContrast, sal_False ); 2084 } 2085 2086 //***************************************************************************************************************** 2087 // private method 2088 //***************************************************************************************************************** 2089 Mutex& AddonsOptions::GetOwnStaticMutex() 2090 { 2091 // Initialize static mutex only for one time! 2092 static Mutex* pMutex = NULL; 2093 // If these method first called (Mutex not already exist!) ... 2094 if( pMutex == NULL ) 2095 { 2096 // ... we must create a new one. Protect follow code with the global mutex - 2097 // It must be - we create a static variable! 2098 MutexGuard aGuard( Mutex::getGlobalMutex() ); 2099 // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! 2100 if( pMutex == NULL ) 2101 { 2102 // Create the new mutex and set it for return on static variable. 2103 static Mutex aMutex; 2104 pMutex = &aMutex; 2105 } 2106 } 2107 // Return new created or already existing mutex object. 2108 return *pMutex; 2109 } 2110 2111 //***************************************************************************************************************** 2112 // private method 2113 //***************************************************************************************************************** 2114 IMPL_STATIC_LINK_NOINSTANCE( AddonsOptions, Notify, void*, EMPTYARG ) 2115 { 2116 MutexGuard aGuard( GetOwnStaticMutex() ); 2117 m_pDataContainer->ReadConfigurationData(); 2118 return 0; 2119 } 2120 2121 } 2122 2123