xref: /trunk/main/framework/source/fwe/classes/addonsoptions.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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