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