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