1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_framework.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
29*b1cdbd2cSJim Jagielski //	my own includes
30*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
31*b1cdbd2cSJim Jagielski #include <uielement/menubarmanager.hxx>
32*b1cdbd2cSJim Jagielski #include <framework/menuconfiguration.hxx>
33*b1cdbd2cSJim Jagielski #include <framework/bmkmenu.hxx>
34*b1cdbd2cSJim Jagielski #include <framework/addonmenu.hxx>
35*b1cdbd2cSJim Jagielski #include <framework/imageproducer.hxx>
36*b1cdbd2cSJim Jagielski #include <threadhelp/resetableguard.hxx>
37*b1cdbd2cSJim Jagielski #include "framework/addonsoptions.hxx"
38*b1cdbd2cSJim Jagielski #include <classes/fwkresid.hxx>
39*b1cdbd2cSJim Jagielski #include <classes/menumanager.hxx>
40*b1cdbd2cSJim Jagielski #include <framework/acceleratorinfo.hxx>
41*b1cdbd2cSJim Jagielski #include <helper/mischelper.hxx>
42*b1cdbd2cSJim Jagielski #include <framework/menuextensionsupplier.hxx>
43*b1cdbd2cSJim Jagielski #include <classes/resource.hrc>
44*b1cdbd2cSJim Jagielski #include <services.h>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
47*b1cdbd2cSJim Jagielski //	interface includes
48*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
49*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatch.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFramesSupplier.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDesktop.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumeration.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XStringWidth.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XPopupMenuController.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/PopupMenuControllerFactory.hpp>
61*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_LANG_XSYSTEMDEPENDENT_HPP_
62*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/SystemDependent.hpp>
63*b1cdbd2cSJim Jagielski #endif
64*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/ItemType.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/ImageType.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModuleManager.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
69*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
70*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/ItemStyle.hpp>
71*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/status/Visibility.hpp>
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
74*b1cdbd2cSJim Jagielski //	includes of other projects
75*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
76*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
77*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
78*b1cdbd2cSJim Jagielski #include <svtools/menuoptions.hxx>
79*b1cdbd2cSJim Jagielski #include <unotools/historyoptions.hxx>
80*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx>
81*b1cdbd2cSJim Jagielski #include <unotools/cmdoptions.hxx>
82*b1cdbd2cSJim Jagielski #include <unotools/localfilehelper.hxx>
83*b1cdbd2cSJim Jagielski #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
84*b1cdbd2cSJim Jagielski #include <toolkit/unohlp.hxx>
85*b1cdbd2cSJim Jagielski #endif
86*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
87*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
88*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
89*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
90*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
91*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
92*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
93*b1cdbd2cSJim Jagielski #include <svtools/acceleratorexecute.hxx>
94*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
95*b1cdbd2cSJim Jagielski #include "svtools/miscopt.hxx"
96*b1cdbd2cSJim Jagielski #include <framework/addonmenu.hxx>
97*b1cdbd2cSJim Jagielski #include <uielement/menubarmerger.hxx>
98*b1cdbd2cSJim Jagielski #include <dispatch/uieventloghelper.hxx>
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski // Be careful removing this "bad" construct. There are serious problems
101*b1cdbd2cSJim Jagielski // with #define STRICT and including windows.h. Changing this needs some
102*b1cdbd2cSJim Jagielski // redesign on other projects, too. Especially sal/main.h which defines
103*b1cdbd2cSJim Jagielski // HINSTANCE depending on STRCIT!!!!!!!!!!!!!!!
104*b1cdbd2cSJim Jagielski struct SystemMenuData
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski     unsigned long nSize;
107*b1cdbd2cSJim Jagielski 	long          hMenu;
108*b1cdbd2cSJim Jagielski };
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
111*b1cdbd2cSJim Jagielski //	namespace
112*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski using namespace ::cppu;
115*b1cdbd2cSJim Jagielski using namespace ::vos;
116*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
117*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
118*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
119*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
120*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
121*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
122*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
123*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
124*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_COMMANDURL[]        = "CommandURL";
127*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_HELPURL[]           = "HelpURL";
128*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_CONTAINER[]         = "ItemDescriptorContainer";
129*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_LABEL[]             = "Label";
130*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_TYPE[]              = "Type";
131*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_MODULEIDENTIFIER[]  = "ModuleIdentifier";
132*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_DISPATCHPROVIDER[]  = "DispatchProvider";
133*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_STYLE[]             = "Style";
134*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_ISVISIBLE[]         = "IsVisible";
135*b1cdbd2cSJim Jagielski static const char ITEM_DESCRIPTOR_ENABLED[]           = "Enabled";
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_COMMANDURL       = 10;
138*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_HELPURL          = 7;
139*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_CONTAINER        = 23;
140*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_LABEL            = 5;
141*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_TYPE             = 4;
142*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_MODULEIDENTIFIER = 16;
143*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_DISPATCHPROVIDER = 16;
144*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_STYLE            = 5;
145*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_ISVISIBLE        = 9;
146*b1cdbd2cSJim Jagielski static const sal_Int32 LEN_DESCRIPTOR_ENABLED          = 7;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski const sal_uInt16 ADDONMENU_MERGE_ITEMID_START = 1500;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski class StringLength : public ::cppu::WeakImplHelper1< ::com::sun::star::util::XStringWidth >
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	public:
StringLength()153*b1cdbd2cSJim Jagielski 		StringLength() {}
~StringLength()154*b1cdbd2cSJim Jagielski 		virtual ~StringLength() {}
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 		// XStringWidth
queryStringWidth(const::rtl::OUString & aString)157*b1cdbd2cSJim Jagielski 		sal_Int32 SAL_CALL queryStringWidth( const ::rtl::OUString& aString )
158*b1cdbd2cSJim Jagielski 			throw (RuntimeException)
159*b1cdbd2cSJim Jagielski 		{
160*b1cdbd2cSJim Jagielski 			return aString.getLength();
161*b1cdbd2cSJim Jagielski 		}
162*b1cdbd2cSJim Jagielski };
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski namespace framework
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski // special menu ids/command ids for dynamic popup menus
168*b1cdbd2cSJim Jagielski #define SID_SFX_START			5000
169*b1cdbd2cSJim Jagielski #define SID_NEWDOCDIRECT		(SID_SFX_START + 537)
170*b1cdbd2cSJim Jagielski #define SID_AUTOPILOTMENU		(SID_SFX_START + 1381)
171*b1cdbd2cSJim Jagielski #define SID_PICKLIST			(SID_SFX_START + 510)
172*b1cdbd2cSJim Jagielski #define SID_MDIWINDOWLIST		(SID_SFX_START + 610)
173*b1cdbd2cSJim Jagielski #define SID_ADDONLIST			(SID_SFX_START + 1677)
174*b1cdbd2cSJim Jagielski #define SID_HELPMENU			(SID_SFX_START + 410)
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski #define SFX_REFERER_USER		"private:user"
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski const ::rtl::OUString aCmdHelpIndex( RTL_CONSTASCII_USTRINGPARAM( ".uno:HelpIndex" ));
179*b1cdbd2cSJim Jagielski const ::rtl::OUString aCmdToolsMenu( RTL_CONSTASCII_USTRINGPARAM( ".uno:ToolsMenu" ));
180*b1cdbd2cSJim Jagielski const ::rtl::OUString aCmdHelpMenu( RTL_CONSTASCII_USTRINGPARAM( ".uno:HelpMenu" ));
181*b1cdbd2cSJim Jagielski const ::rtl::OUString aSlotHelpMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:5410" ));
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski const ::rtl::OUString aSpecialFileMenu( RTL_CONSTASCII_USTRINGPARAM( "file" ));
184*b1cdbd2cSJim Jagielski const ::rtl::OUString aSpecialWindowMenu( RTL_CONSTASCII_USTRINGPARAM( "window" ));
185*b1cdbd2cSJim Jagielski const ::rtl::OUString aSlotSpecialFileMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:5510" ));
186*b1cdbd2cSJim Jagielski const ::rtl::OUString aSlotSpecialWindowMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:5610" ));
187*b1cdbd2cSJim Jagielski const ::rtl::OUString aSlotSpecialToolsMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:6677" ));
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski // special uno commands for picklist and window list
190*b1cdbd2cSJim Jagielski const ::rtl::OUString aSpecialFileCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:PickList" ));
191*b1cdbd2cSJim Jagielski const ::rtl::OUString aSpecialWindowCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:WindowList" ));
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski const ::rtl::OUString UNO_COMMAND( RTL_CONSTASCII_USTRINGPARAM( ".uno:" ));
194*b1cdbd2cSJim Jagielski 
getImageTypeFromBools(sal_Bool bBig,sal_Bool bHighContrast)195*b1cdbd2cSJim Jagielski static sal_Int16 getImageTypeFromBools( sal_Bool bBig, sal_Bool bHighContrast )
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski     sal_Int16 n( 0 );
198*b1cdbd2cSJim Jagielski     if ( bBig )
199*b1cdbd2cSJim Jagielski         n |= ::com::sun::star::ui::ImageType::SIZE_LARGE;
200*b1cdbd2cSJim Jagielski     if ( bHighContrast )
201*b1cdbd2cSJim Jagielski         n |= ::com::sun::star::ui::ImageType::COLOR_HIGHCONTRAST;
202*b1cdbd2cSJim Jagielski     return n;
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski // #110897#
MenuBarManager(const Reference<XMultiServiceFactory> & xServiceFactory,const Reference<XFrame> & rFrame,const Reference<XURLTransformer> & _xURLTransformer,const Reference<XDispatchProvider> & rDispatchProvider,const rtl::OUString & rModuleIdentifier,Menu * pMenu,sal_Bool bDelete,sal_Bool bDeleteChildren)206*b1cdbd2cSJim Jagielski MenuBarManager::MenuBarManager(
207*b1cdbd2cSJim Jagielski 	const Reference< XMultiServiceFactory >& xServiceFactory,
208*b1cdbd2cSJim Jagielski 	const Reference< XFrame >& rFrame,
209*b1cdbd2cSJim Jagielski     const Reference< XURLTransformer >& _xURLTransformer,
210*b1cdbd2cSJim Jagielski     const Reference< XDispatchProvider >& rDispatchProvider,
211*b1cdbd2cSJim Jagielski     const rtl::OUString& rModuleIdentifier,
212*b1cdbd2cSJim Jagielski     Menu* pMenu, sal_Bool bDelete, sal_Bool bDeleteChildren )
213*b1cdbd2cSJim Jagielski : ThreadHelpBase( &Application::GetSolarMutex() ), OWeakObject()
214*b1cdbd2cSJim Jagielski     , m_bDisposed( sal_False )
215*b1cdbd2cSJim Jagielski     , m_bRetrieveImages( sal_False )
216*b1cdbd2cSJim Jagielski     , m_bAcceleratorCfg( sal_False )
217*b1cdbd2cSJim Jagielski     , m_bModuleIdentified( sal_False )
218*b1cdbd2cSJim Jagielski     , m_aListenerContainer( m_aLock.getShareableOslMutex() )
219*b1cdbd2cSJim Jagielski     , mxServiceFactory(xServiceFactory)
220*b1cdbd2cSJim Jagielski     , m_xURLTransformer(_xURLTransformer)
221*b1cdbd2cSJim Jagielski     , m_nSymbolsStyle( SvtMiscOptions().GetCurrentSymbolsStyle() )
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::MenuBarManager" );
224*b1cdbd2cSJim Jagielski     m_xPopupMenuControllerFactory = frame::PopupMenuControllerFactory::create(
225*b1cdbd2cSJim Jagielski         ::comphelper::getProcessComponentContext() );
226*b1cdbd2cSJim Jagielski 	FillMenuManager( pMenu, rFrame, rDispatchProvider, rModuleIdentifier, bDelete, bDeleteChildren );
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski // #110897#
MenuBarManager(const Reference<XMultiServiceFactory> & xServiceFactory,const Reference<XFrame> & rFrame,const Reference<XURLTransformer> & _xURLTransformer,AddonMenu * pAddonMenu,sal_Bool bDelete,sal_Bool bDeleteChildren)230*b1cdbd2cSJim Jagielski MenuBarManager::MenuBarManager(
231*b1cdbd2cSJim Jagielski 	const Reference< XMultiServiceFactory >& xServiceFactory,
232*b1cdbd2cSJim Jagielski 	const Reference< XFrame >& rFrame,
233*b1cdbd2cSJim Jagielski     const Reference< XURLTransformer >& _xURLTransformer,
234*b1cdbd2cSJim Jagielski     AddonMenu* pAddonMenu,
235*b1cdbd2cSJim Jagielski     sal_Bool bDelete,
236*b1cdbd2cSJim Jagielski     sal_Bool bDeleteChildren )
237*b1cdbd2cSJim Jagielski :   ThreadHelpBase( &Application::GetSolarMutex() )
238*b1cdbd2cSJim Jagielski     , OWeakObject()
239*b1cdbd2cSJim Jagielski     , m_bDisposed( sal_False )
240*b1cdbd2cSJim Jagielski     , m_bRetrieveImages( sal_True )
241*b1cdbd2cSJim Jagielski     , m_bAcceleratorCfg( sal_False )
242*b1cdbd2cSJim Jagielski     , m_bModuleIdentified( sal_False )
243*b1cdbd2cSJim Jagielski     , m_aListenerContainer( m_aLock.getShareableOslMutex() )
244*b1cdbd2cSJim Jagielski     , mxServiceFactory(xServiceFactory)
245*b1cdbd2cSJim Jagielski     , m_xURLTransformer(_xURLTransformer)
246*b1cdbd2cSJim Jagielski     , m_nSymbolsStyle( SvtMiscOptions().GetCurrentSymbolsStyle() )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::MenuBarManager" );
249*b1cdbd2cSJim Jagielski     Init(rFrame,pAddonMenu,bDelete,bDeleteChildren);
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski // #110897#
MenuBarManager(const Reference<XMultiServiceFactory> & xServiceFactory,const Reference<XFrame> & rFrame,const Reference<XURLTransformer> & _xURLTransformer,AddonPopupMenu * pAddonPopupMenu,sal_Bool bDelete,sal_Bool bDeleteChildren)253*b1cdbd2cSJim Jagielski MenuBarManager::MenuBarManager(
254*b1cdbd2cSJim Jagielski 	const Reference< XMultiServiceFactory >& xServiceFactory,
255*b1cdbd2cSJim Jagielski 	const Reference< XFrame >& rFrame,
256*b1cdbd2cSJim Jagielski     const Reference< XURLTransformer >& _xURLTransformer,
257*b1cdbd2cSJim Jagielski     AddonPopupMenu* pAddonPopupMenu,
258*b1cdbd2cSJim Jagielski     sal_Bool bDelete,
259*b1cdbd2cSJim Jagielski     sal_Bool bDeleteChildren )
260*b1cdbd2cSJim Jagielski :     ThreadHelpBase( &Application::GetSolarMutex() )
261*b1cdbd2cSJim Jagielski     , OWeakObject()
262*b1cdbd2cSJim Jagielski     , m_bDisposed( sal_False )
263*b1cdbd2cSJim Jagielski     , m_bRetrieveImages( sal_True )
264*b1cdbd2cSJim Jagielski     , m_bAcceleratorCfg( sal_False )
265*b1cdbd2cSJim Jagielski     , m_bModuleIdentified( sal_False )
266*b1cdbd2cSJim Jagielski     , m_aListenerContainer( m_aLock.getShareableOslMutex() )
267*b1cdbd2cSJim Jagielski     , mxServiceFactory(xServiceFactory)
268*b1cdbd2cSJim Jagielski     , m_xURLTransformer(_xURLTransformer)
269*b1cdbd2cSJim Jagielski     , m_nSymbolsStyle( SvtMiscOptions().GetCurrentSymbolsStyle() )
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::MenuBarManager" );
272*b1cdbd2cSJim Jagielski     Init(rFrame,pAddonPopupMenu,bDelete,bDeleteChildren,true);
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
queryInterface(const Type & rType)275*b1cdbd2cSJim Jagielski Any SAL_CALL MenuBarManager::queryInterface( const Type & rType ) throw ( RuntimeException )
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski 	Any a = ::cppu::queryInterface(
278*b1cdbd2cSJim Jagielski 				rType ,
279*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( ::com::sun::star::frame::XStatusListener*, this ),
280*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( ::com::sun::star::frame::XFrameActionListener*, this ),
281*b1cdbd2cSJim Jagielski                 SAL_STATIC_CAST( ::com::sun::star::ui::XUIConfigurationListener*, this ),
282*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( XEventListener*, (XStatusListener *)this ),
283*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( XComponent*, this ),
284*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( ::com::sun::star::awt::XSystemDependentMenuPeer*, this ));
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 	if ( a.hasValue() )
287*b1cdbd2cSJim Jagielski 		return a;
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 	return OWeakObject::queryInterface( rType );
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 
acquire()293*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::acquire() throw()
294*b1cdbd2cSJim Jagielski {
295*b1cdbd2cSJim Jagielski     OWeakObject::acquire();
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 
release()299*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::release() throw()
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski     OWeakObject::release();
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 
getMenuHandle(const Sequence<sal_Int8> &,sal_Int16 SystemType)305*b1cdbd2cSJim Jagielski Any SAL_CALL MenuBarManager::getMenuHandle( const Sequence< sal_Int8 >& /*ProcessId*/, sal_Int16 SystemType ) throw (RuntimeException)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::getMenuHandle" );
308*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
311*b1cdbd2cSJim Jagielski 	    throw com::sun::star::lang::DisposedException();
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     Any a;
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski     if ( m_pVCLMenu )
316*b1cdbd2cSJim Jagielski     {
317*b1cdbd2cSJim Jagielski         OGuard	aSolarGuard( Application::GetSolarMutex() );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski         SystemMenuData aSystemMenuData;
320*b1cdbd2cSJim Jagielski         aSystemMenuData.nSize = sizeof( SystemMenuData );
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski         m_pVCLMenu->GetSystemMenuData( &aSystemMenuData );
323*b1cdbd2cSJim Jagielski #ifdef QUARTZ
324*b1cdbd2cSJim Jagielski         if( SystemType == SystemDependent::SYSTEM_MAC )
325*b1cdbd2cSJim Jagielski         {
326*b1cdbd2cSJim Jagielski         }
327*b1cdbd2cSJim Jagielski #elif (defined WNT)
328*b1cdbd2cSJim Jagielski 		if( SystemType == SystemDependent::SYSTEM_WIN32 )
329*b1cdbd2cSJim Jagielski 		{
330*b1cdbd2cSJim Jagielski             a <<= (long) aSystemMenuData.hMenu;
331*b1cdbd2cSJim Jagielski 		}
332*b1cdbd2cSJim Jagielski #elif (defined UNX)
333*b1cdbd2cSJim Jagielski 		if( SystemType == SystemDependent::SYSTEM_XWINDOW )
334*b1cdbd2cSJim Jagielski 		{
335*b1cdbd2cSJim Jagielski 		}
336*b1cdbd2cSJim Jagielski #endif
337*b1cdbd2cSJim Jagielski     }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     return a;
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski 
~MenuBarManager()342*b1cdbd2cSJim Jagielski MenuBarManager::~MenuBarManager()
343*b1cdbd2cSJim Jagielski {
344*b1cdbd2cSJim Jagielski     // stop asynchronous settings timer
345*b1cdbd2cSJim Jagielski     m_xDeferedItemContainer.clear();
346*b1cdbd2cSJim Jagielski     m_aAsyncSettingsTimer.Stop();
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     DBG_ASSERT( OWeakObject::m_refCount == 0, "Who wants to delete an object with refcount > 0!" );
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
Destroy()351*b1cdbd2cSJim Jagielski void MenuBarManager::Destroy()
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::Destroy" );
354*b1cdbd2cSJim Jagielski     OGuard	aGuard( Application::GetSolarMutex() );
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski     if ( !m_bDisposed )
357*b1cdbd2cSJim Jagielski     {
358*b1cdbd2cSJim Jagielski         // stop asynchronous settings timer and
359*b1cdbd2cSJim Jagielski         // release defered item container reference
360*b1cdbd2cSJim Jagielski         m_aAsyncSettingsTimer.Stop();
361*b1cdbd2cSJim Jagielski         m_xDeferedItemContainer.clear();
362*b1cdbd2cSJim Jagielski         RemoveListener();
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski         std::vector< MenuItemHandler* >::iterator p;
365*b1cdbd2cSJim Jagielski 	    for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
366*b1cdbd2cSJim Jagielski 	    {
367*b1cdbd2cSJim Jagielski             MenuItemHandler* pItemHandler = *p;
368*b1cdbd2cSJim Jagielski 		    pItemHandler->xMenuItemDispatch.clear();
369*b1cdbd2cSJim Jagielski 		    pItemHandler->xSubMenuManager.clear();
370*b1cdbd2cSJim Jagielski 	        pItemHandler->xPopupMenu.clear();
371*b1cdbd2cSJim Jagielski 		    delete pItemHandler;
372*b1cdbd2cSJim Jagielski 	    }
373*b1cdbd2cSJim Jagielski         m_aMenuItemHandlerVector.clear();
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	    if ( m_bDeleteMenu )
376*b1cdbd2cSJim Jagielski         {
377*b1cdbd2cSJim Jagielski 		    delete m_pVCLMenu;
378*b1cdbd2cSJim Jagielski             m_pVCLMenu = 0;
379*b1cdbd2cSJim Jagielski         }
380*b1cdbd2cSJim Jagielski     }
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski // XComponent
dispose()384*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::dispose() throw( RuntimeException )
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::dispose" );
387*b1cdbd2cSJim Jagielski     Reference< XComponent > xThis( static_cast< OWeakObject* >(this), UNO_QUERY );
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     EventObject aEvent( xThis );
390*b1cdbd2cSJim Jagielski     m_aListenerContainer.disposeAndClear( aEvent );
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 	{
393*b1cdbd2cSJim Jagielski 	    ResetableGuard aGuard( m_aLock );
394*b1cdbd2cSJim Jagielski //        RemoveListener();
395*b1cdbd2cSJim Jagielski         Destroy();
396*b1cdbd2cSJim Jagielski         m_bDisposed = sal_True;
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski         if ( m_xDocImageManager.is() )
399*b1cdbd2cSJim Jagielski         {
400*b1cdbd2cSJim Jagielski             try
401*b1cdbd2cSJim Jagielski             {
402*b1cdbd2cSJim Jagielski                 m_xDocImageManager->removeConfigurationListener(
403*b1cdbd2cSJim Jagielski                     Reference< XUIConfigurationListener >(
404*b1cdbd2cSJim Jagielski                         static_cast< OWeakObject* >( this ), UNO_QUERY ));
405*b1cdbd2cSJim Jagielski             }
406*b1cdbd2cSJim Jagielski             catch ( Exception& )
407*b1cdbd2cSJim Jagielski             {
408*b1cdbd2cSJim Jagielski             }
409*b1cdbd2cSJim Jagielski         }
410*b1cdbd2cSJim Jagielski         if ( m_xModuleImageManager.is() )
411*b1cdbd2cSJim Jagielski         {
412*b1cdbd2cSJim Jagielski             try
413*b1cdbd2cSJim Jagielski             {
414*b1cdbd2cSJim Jagielski                 m_xModuleImageManager->removeConfigurationListener(
415*b1cdbd2cSJim Jagielski                     Reference< XUIConfigurationListener >(
416*b1cdbd2cSJim Jagielski                         static_cast< OWeakObject* >( this ), UNO_QUERY ));
417*b1cdbd2cSJim Jagielski             }
418*b1cdbd2cSJim Jagielski             catch ( Exception& )
419*b1cdbd2cSJim Jagielski             {
420*b1cdbd2cSJim Jagielski             }
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski         m_xDocImageManager.clear();
423*b1cdbd2cSJim Jagielski         m_xModuleImageManager.clear();
424*b1cdbd2cSJim Jagielski         Reference< XComponent > xCompGAM( m_xGlobalAcceleratorManager, UNO_QUERY );
425*b1cdbd2cSJim Jagielski         if ( xCompGAM.is() )
426*b1cdbd2cSJim Jagielski             xCompGAM->dispose();
427*b1cdbd2cSJim Jagielski         m_xGlobalAcceleratorManager.clear();
428*b1cdbd2cSJim Jagielski         m_xModuleAcceleratorManager.clear();
429*b1cdbd2cSJim Jagielski         m_xDocAcceleratorManager.clear();
430*b1cdbd2cSJim Jagielski         m_xUICommandLabels.clear();
431*b1cdbd2cSJim Jagielski         m_xPopupMenuControllerFactory.clear();
432*b1cdbd2cSJim Jagielski         mxServiceFactory.clear();
433*b1cdbd2cSJim Jagielski     }
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
addEventListener(const Reference<XEventListener> & xListener)436*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::addEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException )
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::addEventListener" );
439*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski 	/* SAFE AREA ----------------------------------------------------------------------------------------------- */
442*b1cdbd2cSJim Jagielski     if ( m_bDisposed )
443*b1cdbd2cSJim Jagielski         throw DisposedException();
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     m_aListenerContainer.addInterface( ::getCppuType( ( const Reference< XEventListener >* ) NULL ), xListener );
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
removeEventListener(const Reference<XEventListener> & xListener)448*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::removeEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException )
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::removeEventListener" );
451*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
452*b1cdbd2cSJim Jagielski 	/* SAFE AREA ----------------------------------------------------------------------------------------------- */
453*b1cdbd2cSJim Jagielski     m_aListenerContainer.removeInterface( ::getCppuType( ( const Reference< XEventListener >* ) NULL ), xListener );
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
elementInserted(const::com::sun::star::ui::ConfigurationEvent & Event)456*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::elementInserted( const ::com::sun::star::ui::ConfigurationEvent& Event )
457*b1cdbd2cSJim Jagielski throw (RuntimeException)
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::elementInserted" );
460*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski     /* SAFE AREA ----------------------------------------------------------------------------------------------- */
463*b1cdbd2cSJim Jagielski     if ( m_bDisposed )
464*b1cdbd2cSJim Jagielski         return;
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski     sal_Int16 nImageType = sal_Int16();
467*b1cdbd2cSJim Jagielski     sal_Int16 nCurrentImageType = getImageTypeFromBools( sal_False, m_bWasHiContrast );
468*b1cdbd2cSJim Jagielski     if (( Event.aInfo >>= nImageType ) &&
469*b1cdbd2cSJim Jagielski         ( nImageType == nCurrentImageType ))
470*b1cdbd2cSJim Jagielski         RequestImages();
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski 
elementRemoved(const::com::sun::star::ui::ConfigurationEvent & Event)473*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::elementRemoved( const ::com::sun::star::ui::ConfigurationEvent& Event )
474*b1cdbd2cSJim Jagielski throw (RuntimeException)
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::elementRemoved" );
477*b1cdbd2cSJim Jagielski 	elementInserted(Event);
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski 
elementReplaced(const::com::sun::star::ui::ConfigurationEvent & Event)480*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::elementReplaced( const ::com::sun::star::ui::ConfigurationEvent& Event )
481*b1cdbd2cSJim Jagielski throw (RuntimeException)
482*b1cdbd2cSJim Jagielski {
483*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::elementReplaced" );
484*b1cdbd2cSJim Jagielski 	elementInserted(Event);
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski // XFrameActionListener
frameAction(const FrameActionEvent & Action)488*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::frameAction( const FrameActionEvent& Action )
489*b1cdbd2cSJim Jagielski throw ( RuntimeException )
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::frameAction" );
492*b1cdbd2cSJim Jagielski     ResetableGuard aGuard( m_aLock );
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
495*b1cdbd2cSJim Jagielski 	    throw com::sun::star::lang::DisposedException();
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski     if ( Action.Action == FrameAction_CONTEXT_CHANGED )
498*b1cdbd2cSJim Jagielski     {
499*b1cdbd2cSJim Jagielski         std::vector< MenuItemHandler* >::iterator p;
500*b1cdbd2cSJim Jagielski 	    for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
501*b1cdbd2cSJim Jagielski 	    {
502*b1cdbd2cSJim Jagielski             // Clear dispatch reference as we will requery it later o
503*b1cdbd2cSJim Jagielski             MenuItemHandler* pItemHandler = *p;
504*b1cdbd2cSJim Jagielski 		    pItemHandler->xMenuItemDispatch.clear();
505*b1cdbd2cSJim Jagielski         }
506*b1cdbd2cSJim Jagielski     }
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski // XStatusListener
statusChanged(const FeatureStateEvent & Event)510*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::statusChanged( const FeatureStateEvent& Event )
511*b1cdbd2cSJim Jagielski throw ( RuntimeException )
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::statusChanged" );
514*b1cdbd2cSJim Jagielski 	::rtl::OUString aFeatureURL = Event.FeatureURL.Complete;
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski     OGuard	aSolarGuard( Application::GetSolarMutex() );
517*b1cdbd2cSJim Jagielski 	{
518*b1cdbd2cSJim Jagielski 		ResetableGuard aGuard( m_aLock );
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski 		if ( m_bDisposed )
521*b1cdbd2cSJim Jagielski 		    return;
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski         // We have to check all menu entries as there can be identical entries in a popup menu.
524*b1cdbd2cSJim Jagielski         std::vector< MenuItemHandler* >::iterator p;
525*b1cdbd2cSJim Jagielski 		for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
526*b1cdbd2cSJim Jagielski 		{
527*b1cdbd2cSJim Jagielski 			MenuItemHandler* pMenuItemHandler = *p;
528*b1cdbd2cSJim Jagielski 			if ( pMenuItemHandler->aMenuItemURL == aFeatureURL )
529*b1cdbd2cSJim Jagielski 		    {
530*b1cdbd2cSJim Jagielski 			    sal_Bool            bCheckmark( sal_False );
531*b1cdbd2cSJim Jagielski 			    sal_Bool            bMenuItemEnabled( m_pVCLMenu->IsItemEnabled( pMenuItemHandler->nItemId ));
532*b1cdbd2cSJim Jagielski                 sal_Bool            bEnabledItem( Event.IsEnabled );
533*b1cdbd2cSJim Jagielski                 rtl::OUString       aItemText;
534*b1cdbd2cSJim Jagielski                 status::Visibility  aVisibilityStatus;
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski                 #ifdef UNIX
537*b1cdbd2cSJim Jagielski                 // #b6673979# enable some slots hardly, because UNIX clipboard does not notify all changes
538*b1cdbd2cSJim Jagielski                 // Can be removed if follow up task will be fixed directly within applications.
539*b1cdbd2cSJim Jagielski                 if (
540*b1cdbd2cSJim Jagielski                     ( pMenuItemHandler->aMenuItemURL.equalsAscii (".uno:Paste"         ) ) ||
541*b1cdbd2cSJim Jagielski                     ( pMenuItemHandler->aMenuItemURL.equalsAscii (".uno:PasteSpecial"  ) ) ||
542*b1cdbd2cSJim Jagielski                     ( pMenuItemHandler->aMenuItemURL.equalsAscii (".uno:PasteClipboard") )      // special for draw/impress
543*b1cdbd2cSJim Jagielski                    )
544*b1cdbd2cSJim Jagielski                     bEnabledItem = sal_True;
545*b1cdbd2cSJim Jagielski                 #endif
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski                 // Enable/disable item
548*b1cdbd2cSJim Jagielski 			    if ( bEnabledItem != bMenuItemEnabled )
549*b1cdbd2cSJim Jagielski 			        m_pVCLMenu->EnableItem( pMenuItemHandler->nItemId, bEnabledItem );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski 			    if ( Event.State >>= bCheckmark )
552*b1cdbd2cSJim Jagielski                 {
553*b1cdbd2cSJim Jagielski                     // Checkmark or RadioButton
554*b1cdbd2cSJim Jagielski                     m_pVCLMenu->ShowItem( pMenuItemHandler->nItemId, sal_True );
555*b1cdbd2cSJim Jagielski                     m_pVCLMenu->CheckItem( pMenuItemHandler->nItemId, bCheckmark );
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski                     MenuItemBits nBits = m_pVCLMenu->GetItemBits( pMenuItemHandler->nItemId );
558*b1cdbd2cSJim Jagielski                     //If not already designated RadioButton set as CheckMark
559*b1cdbd2cSJim Jagielski                     if (!(nBits & MIB_RADIOCHECK))
560*b1cdbd2cSJim Jagielski                         m_pVCLMenu->SetItemBits( pMenuItemHandler->nItemId, nBits | MIB_CHECKABLE );
561*b1cdbd2cSJim Jagielski                 }
562*b1cdbd2cSJim Jagielski                 else if ( Event.State >>= aItemText )
563*b1cdbd2cSJim Jagielski                 {
564*b1cdbd2cSJim Jagielski                     // Replacement for place holders
565*b1cdbd2cSJim Jagielski                     if ( aItemText.matchAsciiL( "($1)", 4 ))
566*b1cdbd2cSJim Jagielski                     {
567*b1cdbd2cSJim Jagielski 					    String aResStr = String( FwkResId( STR_UPDATEDOC ));
568*b1cdbd2cSJim Jagielski                         rtl::OUString aTmp( aResStr );
569*b1cdbd2cSJim Jagielski                         aTmp += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " ));
570*b1cdbd2cSJim Jagielski                         aTmp += aItemText.copy( 4 );
571*b1cdbd2cSJim Jagielski                         aItemText = aTmp;
572*b1cdbd2cSJim Jagielski                     }
573*b1cdbd2cSJim Jagielski                     else if ( aItemText.matchAsciiL( "($2)", 4 ))
574*b1cdbd2cSJim Jagielski                     {
575*b1cdbd2cSJim Jagielski 					    String aResStr = String( FwkResId( STR_CLOSEDOC_ANDRETURN ));
576*b1cdbd2cSJim Jagielski                         rtl::OUString aTmp( aResStr );
577*b1cdbd2cSJim Jagielski                         aTmp += aItemText.copy( 4 );
578*b1cdbd2cSJim Jagielski                         aItemText = aTmp;
579*b1cdbd2cSJim Jagielski                     }
580*b1cdbd2cSJim Jagielski                     else if ( aItemText.matchAsciiL( "($3)", 4 ))
581*b1cdbd2cSJim Jagielski                     {
582*b1cdbd2cSJim Jagielski 					    String aResStr = String( FwkResId( STR_SAVECOPYDOC ));
583*b1cdbd2cSJim Jagielski                         rtl::OUString aTmp( aResStr );
584*b1cdbd2cSJim Jagielski                         aTmp += aItemText.copy( 4 );
585*b1cdbd2cSJim Jagielski                         aItemText = aTmp;
586*b1cdbd2cSJim Jagielski                     }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski                     m_pVCLMenu->ShowItem( pMenuItemHandler->nItemId, sal_True );
589*b1cdbd2cSJim Jagielski                     m_pVCLMenu->SetItemText( pMenuItemHandler->nItemId, aItemText );
590*b1cdbd2cSJim Jagielski                 }
591*b1cdbd2cSJim Jagielski                 else if ( Event.State >>= aVisibilityStatus )
592*b1cdbd2cSJim Jagielski                 {
593*b1cdbd2cSJim Jagielski                     // Visibility
594*b1cdbd2cSJim Jagielski                     m_pVCLMenu->ShowItem( pMenuItemHandler->nItemId, aVisibilityStatus.bVisible );
595*b1cdbd2cSJim Jagielski                 }
596*b1cdbd2cSJim Jagielski                 else
597*b1cdbd2cSJim Jagielski                     m_pVCLMenu->ShowItem( pMenuItemHandler->nItemId, sal_True );
598*b1cdbd2cSJim Jagielski 		    }
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 		    if ( Event.Requery )
601*b1cdbd2cSJim Jagielski 		    {
602*b1cdbd2cSJim Jagielski                 // Release dispatch object - will be requeried on the next activate!
603*b1cdbd2cSJim Jagielski                 pMenuItemHandler->xMenuItemDispatch.clear();
604*b1cdbd2cSJim Jagielski 		    }
605*b1cdbd2cSJim Jagielski         }
606*b1cdbd2cSJim Jagielski 	}
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski // Helper to retrieve own structure from item ID
GetMenuItemHandler(sal_uInt16 nItemId)610*b1cdbd2cSJim Jagielski MenuBarManager::MenuItemHandler* MenuBarManager::GetMenuItemHandler( sal_uInt16 nItemId )
611*b1cdbd2cSJim Jagielski {
612*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::GetMenuItemHandler" );
613*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 	std::vector< MenuItemHandler* >::iterator p;
616*b1cdbd2cSJim Jagielski 	for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
617*b1cdbd2cSJim Jagielski 	{
618*b1cdbd2cSJim Jagielski 		MenuItemHandler* pItemHandler = *p;
619*b1cdbd2cSJim Jagielski 		if ( pItemHandler->nItemId == nItemId )
620*b1cdbd2cSJim Jagielski 			return pItemHandler;
621*b1cdbd2cSJim Jagielski 	}
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 	return 0;
624*b1cdbd2cSJim Jagielski }
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski // Helper to set request images flag
RequestImages()627*b1cdbd2cSJim Jagielski void MenuBarManager::RequestImages()
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::RequestImages" );
630*b1cdbd2cSJim Jagielski     // must be locked from callee
631*b1cdbd2cSJim Jagielski 	// ResetableGuard aGuard( m_aLock );
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski     m_bRetrieveImages = sal_True;
634*b1cdbd2cSJim Jagielski     const sal_uInt32 nCount = m_aMenuItemHandlerVector.size();
635*b1cdbd2cSJim Jagielski     for ( sal_uInt32 i = 0; i < nCount; ++i )
636*b1cdbd2cSJim Jagielski     {
637*b1cdbd2cSJim Jagielski 		MenuItemHandler* pItemHandler = m_aMenuItemHandlerVector[i];
638*b1cdbd2cSJim Jagielski 		if ( pItemHandler->xSubMenuManager.is() )
639*b1cdbd2cSJim Jagielski         {
640*b1cdbd2cSJim Jagielski             MenuBarManager* pMenuBarManager = (MenuBarManager*)(pItemHandler->xSubMenuManager.get());
641*b1cdbd2cSJim Jagielski             pMenuBarManager->RequestImages();
642*b1cdbd2cSJim Jagielski         }
643*b1cdbd2cSJim Jagielski 	}
644*b1cdbd2cSJim Jagielski }
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski // Helper to reset objects to prepare shutdown
RemoveListener()647*b1cdbd2cSJim Jagielski void MenuBarManager::RemoveListener()
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::RemoveListener" );
650*b1cdbd2cSJim Jagielski 	ResetableGuard aGuard( m_aLock );
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski     // Check service manager reference. Remove listener can be called due
653*b1cdbd2cSJim Jagielski     // to a disposing call from the frame and therefore we already removed
654*b1cdbd2cSJim Jagielski     // our listeners and release the service manager reference!
655*b1cdbd2cSJim Jagielski     Reference< XMultiServiceFactory > xServiceManager = getServiceFactory();
656*b1cdbd2cSJim Jagielski     if ( xServiceManager.is() )
657*b1cdbd2cSJim Jagielski     {
658*b1cdbd2cSJim Jagielski 	    std::vector< MenuItemHandler* >::iterator p;
659*b1cdbd2cSJim Jagielski 	    for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
660*b1cdbd2cSJim Jagielski 	    {
661*b1cdbd2cSJim Jagielski 		    MenuItemHandler* pItemHandler = *p;
662*b1cdbd2cSJim Jagielski 		    if ( pItemHandler->xMenuItemDispatch.is() )
663*b1cdbd2cSJim Jagielski 		    {
664*b1cdbd2cSJim Jagielski 			    URL aTargetURL;
665*b1cdbd2cSJim Jagielski 			    aTargetURL.Complete	= pItemHandler->aMenuItemURL;
666*b1cdbd2cSJim Jagielski 			    m_xURLTransformer->parseStrict( aTargetURL );
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski 			    pItemHandler->xMenuItemDispatch->removeStatusListener(
669*b1cdbd2cSJim Jagielski 				    static_cast< XStatusListener* >( this ), aTargetURL );
670*b1cdbd2cSJim Jagielski 		    }
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski 		    pItemHandler->xMenuItemDispatch.clear();
673*b1cdbd2cSJim Jagielski 		    if ( pItemHandler->xPopupMenu.is() )
674*b1cdbd2cSJim Jagielski             {
675*b1cdbd2cSJim Jagielski 		        {
676*b1cdbd2cSJim Jagielski                     // Remove popup menu from menu structure
677*b1cdbd2cSJim Jagielski 		            OGuard	aGuard2( Application::GetSolarMutex() );
678*b1cdbd2cSJim Jagielski                     m_pVCLMenu->SetPopupMenu( pItemHandler->nItemId, 0 );
679*b1cdbd2cSJim Jagielski                 }
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski                 Reference< com::sun::star::lang::XEventListener > xEventListener( pItemHandler->xPopupMenuController, UNO_QUERY );
682*b1cdbd2cSJim Jagielski                 if ( xEventListener.is() )
683*b1cdbd2cSJim Jagielski                 {
684*b1cdbd2cSJim Jagielski                     EventObject aEventObject;
685*b1cdbd2cSJim Jagielski                     aEventObject.Source = (OWeakObject *)this;
686*b1cdbd2cSJim Jagielski                     xEventListener->disposing( aEventObject );
687*b1cdbd2cSJim Jagielski                 }
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski                 // We now provide a popup menu controller to external code.
690*b1cdbd2cSJim Jagielski                 // Therefore the life-time must be explicitly handled via
691*b1cdbd2cSJim Jagielski                 // dispose!!
692*b1cdbd2cSJim Jagielski                 try
693*b1cdbd2cSJim Jagielski                 {
694*b1cdbd2cSJim Jagielski                     Reference< XComponent > xComponent( pItemHandler->xPopupMenuController, UNO_QUERY );
695*b1cdbd2cSJim Jagielski                     if ( xComponent.is() )
696*b1cdbd2cSJim Jagielski                         xComponent->dispose();
697*b1cdbd2cSJim Jagielski                 }
698*b1cdbd2cSJim Jagielski                 catch ( RuntimeException& )
699*b1cdbd2cSJim Jagielski                 {
700*b1cdbd2cSJim Jagielski                     throw;
701*b1cdbd2cSJim Jagielski                 }
702*b1cdbd2cSJim Jagielski                 catch ( Exception& )
703*b1cdbd2cSJim Jagielski                 {
704*b1cdbd2cSJim Jagielski                 }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski                 // Release references to controller and popup menu
707*b1cdbd2cSJim Jagielski                 pItemHandler->xPopupMenuController.clear();
708*b1cdbd2cSJim Jagielski                 pItemHandler->xPopupMenu.clear();
709*b1cdbd2cSJim Jagielski             }
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 		    Reference< XComponent > xComponent( pItemHandler->xSubMenuManager, UNO_QUERY );
712*b1cdbd2cSJim Jagielski 		    if ( xComponent.is() )
713*b1cdbd2cSJim Jagielski 		        xComponent->dispose();
714*b1cdbd2cSJim Jagielski 	    }
715*b1cdbd2cSJim Jagielski     }
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski     try
718*b1cdbd2cSJim Jagielski     {
719*b1cdbd2cSJim Jagielski         if ( m_xFrame.is() )
720*b1cdbd2cSJim Jagielski             m_xFrame->removeFrameActionListener( Reference< XFrameActionListener >(
721*b1cdbd2cSJim Jagielski                                                     static_cast< OWeakObject* >( this ), UNO_QUERY ));
722*b1cdbd2cSJim Jagielski     }
723*b1cdbd2cSJim Jagielski     catch ( Exception& )
724*b1cdbd2cSJim Jagielski     {
725*b1cdbd2cSJim Jagielski     }
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 	m_xFrame = 0;
728*b1cdbd2cSJim Jagielski }
729*b1cdbd2cSJim Jagielski 
disposing(const EventObject & Source)730*b1cdbd2cSJim Jagielski void SAL_CALL MenuBarManager::disposing( const EventObject& Source ) throw ( RuntimeException )
731*b1cdbd2cSJim Jagielski {
732*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::disposing(evt)" );
733*b1cdbd2cSJim Jagielski     MenuItemHandler* pMenuItemDisposing = NULL;
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski     ResetableGuard aGuard( m_aLock );
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski 	std::vector< MenuItemHandler* >::iterator p;
738*b1cdbd2cSJim Jagielski 	for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
739*b1cdbd2cSJim Jagielski 	{
740*b1cdbd2cSJim Jagielski 		MenuItemHandler* pMenuItemHandler = *p;
741*b1cdbd2cSJim Jagielski 		if ( pMenuItemHandler->xMenuItemDispatch.is() &&
742*b1cdbd2cSJim Jagielski              pMenuItemHandler->xMenuItemDispatch == Source.Source )
743*b1cdbd2cSJim Jagielski 		{
744*b1cdbd2cSJim Jagielski 	        // disposing called from menu item dispatcher, remove listener
745*b1cdbd2cSJim Jagielski 			pMenuItemDisposing = pMenuItemHandler;
746*b1cdbd2cSJim Jagielski 			break;
747*b1cdbd2cSJim Jagielski 		}
748*b1cdbd2cSJim Jagielski 	}
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski     if ( pMenuItemDisposing )
751*b1cdbd2cSJim Jagielski 	{
752*b1cdbd2cSJim Jagielski         // Release references to the dispatch object
753*b1cdbd2cSJim Jagielski 		URL aTargetURL;
754*b1cdbd2cSJim Jagielski 		aTargetURL.Complete	= pMenuItemDisposing->aMenuItemURL;
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski         // Check reference of service manager before we use it. Reference could
757*b1cdbd2cSJim Jagielski         // be cleared due to RemoveListener call!
758*b1cdbd2cSJim Jagielski         Reference< XMultiServiceFactory > xServiceManager( getServiceFactory() );
759*b1cdbd2cSJim Jagielski         if ( xServiceManager.is() )
760*b1cdbd2cSJim Jagielski         {
761*b1cdbd2cSJim Jagielski 		    m_xURLTransformer->parseStrict( aTargetURL );
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski 		    pMenuItemDisposing->xMenuItemDispatch->removeStatusListener(
764*b1cdbd2cSJim Jagielski 			    static_cast< XStatusListener* >( this ), aTargetURL );
765*b1cdbd2cSJim Jagielski 		    pMenuItemDisposing->xMenuItemDispatch = Reference< XDispatch >();
766*b1cdbd2cSJim Jagielski 		    if ( pMenuItemDisposing->xPopupMenu.is() )
767*b1cdbd2cSJim Jagielski             {
768*b1cdbd2cSJim Jagielski                 Reference< com::sun::star::lang::XEventListener > xEventListener( pMenuItemDisposing->xPopupMenuController, UNO_QUERY );
769*b1cdbd2cSJim Jagielski                 if ( xEventListener.is() )
770*b1cdbd2cSJim Jagielski                     xEventListener->disposing( Source );
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski                 {
773*b1cdbd2cSJim Jagielski                     // Remove popup menu from menu structure as we release our reference to
774*b1cdbd2cSJim Jagielski                     // the controller.
775*b1cdbd2cSJim Jagielski 		            OGuard	aGuard2( Application::GetSolarMutex() );
776*b1cdbd2cSJim Jagielski                     m_pVCLMenu->SetPopupMenu( pMenuItemDisposing->nItemId, 0 );
777*b1cdbd2cSJim Jagielski                 }
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski                 pMenuItemDisposing->xPopupMenuController.clear();
780*b1cdbd2cSJim Jagielski                 pMenuItemDisposing->xPopupMenu.clear();
781*b1cdbd2cSJim Jagielski             }
782*b1cdbd2cSJim Jagielski         }
783*b1cdbd2cSJim Jagielski         return;
784*b1cdbd2cSJim Jagielski 	}
785*b1cdbd2cSJim Jagielski 	else if ( Source.Source == m_xFrame )
786*b1cdbd2cSJim Jagielski 	{
787*b1cdbd2cSJim Jagielski         // Our frame gets disposed. We have to remove all our listeners
788*b1cdbd2cSJim Jagielski 	    RemoveListener();
789*b1cdbd2cSJim Jagielski 	}
790*b1cdbd2cSJim Jagielski     else if ( Source.Source == Reference< XInterface >( m_xDocImageManager, UNO_QUERY ))
791*b1cdbd2cSJim Jagielski         m_xDocImageManager.clear();
792*b1cdbd2cSJim Jagielski     else if ( Source.Source == Reference< XInterface >( m_xModuleImageManager, UNO_QUERY ))
793*b1cdbd2cSJim Jagielski         m_xModuleImageManager.clear();
794*b1cdbd2cSJim Jagielski }
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski 
CheckAndAddMenuExtension(Menu * pMenu)797*b1cdbd2cSJim Jagielski void MenuBarManager::CheckAndAddMenuExtension( Menu* pMenu )
798*b1cdbd2cSJim Jagielski {
799*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::CheckAndAddMenuExtension" );
800*b1cdbd2cSJim Jagielski     static const char REFERENCECOMMAND_AFTER[]          = ".uno:HelpSupport";
801*b1cdbd2cSJim Jagielski     static const char REFERENCECOMMAND_BEFORE[]         = ".uno:About";
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski     // retrieve menu extension item
804*b1cdbd2cSJim Jagielski     MenuExtensionItem aMenuItem( GetMenuExtension() );
805*b1cdbd2cSJim Jagielski     if (( aMenuItem.aURL.getLength() > 0 ) &&
806*b1cdbd2cSJim Jagielski         ( aMenuItem.aLabel.getLength() > 0 ))
807*b1cdbd2cSJim Jagielski     {
808*b1cdbd2cSJim Jagielski         // remove all old window list entries from menu
809*b1cdbd2cSJim Jagielski         sal_uInt16 nNewItemId( 0 );
810*b1cdbd2cSJim Jagielski         sal_uInt16 nInsertPos( MENU_APPEND );
811*b1cdbd2cSJim Jagielski         sal_uInt16 nAfterPos( MENU_APPEND );
812*b1cdbd2cSJim Jagielski         sal_uInt16 nBeforePos( MENU_APPEND );
813*b1cdbd2cSJim Jagielski         String     aCommandAfter( String::CreateFromAscii ( REFERENCECOMMAND_AFTER ));
814*b1cdbd2cSJim Jagielski         String     aCommandBefore( String::CreateFromAscii ( REFERENCECOMMAND_BEFORE ));
815*b1cdbd2cSJim Jagielski         for ( sal_uInt16 n = 0; n < pMenu->GetItemCount(); n++ )
816*b1cdbd2cSJim Jagielski         {
817*b1cdbd2cSJim Jagielski             sal_uInt16 nItemId = pMenu->GetItemId( n );
818*b1cdbd2cSJim Jagielski             nNewItemId = std::max( nItemId, nNewItemId );
819*b1cdbd2cSJim Jagielski             if ( pMenu->GetItemCommand( nItemId ) == aCommandAfter )
820*b1cdbd2cSJim Jagielski                 nAfterPos = n+1;
821*b1cdbd2cSJim Jagielski             else if ( pMenu->GetItemCommand( nItemId ) == aCommandBefore )
822*b1cdbd2cSJim Jagielski                 nBeforePos = n;
823*b1cdbd2cSJim Jagielski         }
824*b1cdbd2cSJim Jagielski         ++nNewItemId;
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski         if ( nAfterPos != MENU_APPEND )
827*b1cdbd2cSJim Jagielski             nInsertPos = nAfterPos;
828*b1cdbd2cSJim Jagielski         else if ( nBeforePos != MENU_APPEND )
829*b1cdbd2cSJim Jagielski             nInsertPos = nBeforePos;
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski         pMenu->InsertItem( nNewItemId, aMenuItem.aLabel, 0, nInsertPos );
832*b1cdbd2cSJim Jagielski         pMenu->SetItemCommand( nNewItemId, aMenuItem.aURL );
833*b1cdbd2cSJim Jagielski     }
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski 
lcl_CheckForChildren(Menu * pMenu,sal_uInt16 nItemId)836*b1cdbd2cSJim Jagielski static void lcl_CheckForChildren(Menu* pMenu, sal_uInt16 nItemId)
837*b1cdbd2cSJim Jagielski {
838*b1cdbd2cSJim Jagielski     if (PopupMenu* pThisPopup = pMenu->GetPopupMenu( nItemId ))
839*b1cdbd2cSJim Jagielski         pMenu->EnableItem( nItemId, pThisPopup->GetItemCount() ? true : false );
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
843*b1cdbd2cSJim Jagielski // vcl handler
844*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
845*b1cdbd2cSJim Jagielski 
IMPL_LINK(MenuBarManager,Activate,Menu *,pMenu)846*b1cdbd2cSJim Jagielski IMPL_LINK( MenuBarManager, Activate, Menu *, pMenu )
847*b1cdbd2cSJim Jagielski {
848*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::Activate" );
849*b1cdbd2cSJim Jagielski 	if ( pMenu == m_pVCLMenu )
850*b1cdbd2cSJim Jagielski 	{
851*b1cdbd2cSJim Jagielski 		// set/unset hiding disabled menu entries
852*b1cdbd2cSJim Jagielski 		sal_Bool bDontHide			 = SvtMenuOptions().IsEntryHidingEnabled();
853*b1cdbd2cSJim Jagielski 		const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
854*b1cdbd2cSJim Jagielski 		sal_Bool bShowMenuImages	 = rSettings.GetUseImagesInMenus();
855*b1cdbd2cSJim Jagielski         sal_Bool bHasDisabledEntries = SvtCommandOptions().HasEntries( SvtCommandOptions::CMDOPTION_DISABLED );
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski         ResetableGuard aGuard( m_aLock );
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski 		sal_uInt16 nFlag = pMenu->GetMenuFlags();
860*b1cdbd2cSJim Jagielski 		if ( bDontHide )
861*b1cdbd2cSJim Jagielski 			nFlag &= ~MENU_FLAG_HIDEDISABLEDENTRIES;
862*b1cdbd2cSJim Jagielski 		else
863*b1cdbd2cSJim Jagielski 			nFlag |= MENU_FLAG_HIDEDISABLEDENTRIES;
864*b1cdbd2cSJim Jagielski 		pMenu->SetMenuFlags( nFlag );
865*b1cdbd2cSJim Jagielski 
866*b1cdbd2cSJim Jagielski 		if ( m_bActive )
867*b1cdbd2cSJim Jagielski 			return 0;
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski 		m_bActive = sal_True;
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 		::rtl::OUString aMenuCommand( m_aMenuItemCommand );
872*b1cdbd2cSJim Jagielski         if ( m_aMenuItemCommand == aSpecialWindowMenu ||
873*b1cdbd2cSJim Jagielski              m_aMenuItemCommand == aSlotSpecialWindowMenu ||
874*b1cdbd2cSJim Jagielski 			 aMenuCommand == aSpecialWindowCommand )
875*b1cdbd2cSJim Jagielski              MenuManager::UpdateSpecialWindowMenu( pMenu,getServiceFactory(),m_aLock );
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski 		// Check if some modes have changed so we have to update our menu images
878*b1cdbd2cSJim Jagielski 		sal_Bool bIsHiContrast = rSettings.GetHighContrastMode();
879*b1cdbd2cSJim Jagielski 		sal_Int16 nSymbolsStyle = SvtMiscOptions().GetCurrentSymbolsStyle();
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 		if ( m_bRetrieveImages ||
882*b1cdbd2cSJim Jagielski              m_bWasHiContrast != bIsHiContrast ||
883*b1cdbd2cSJim Jagielski              bShowMenuImages != m_bShowMenuImages ||
884*b1cdbd2cSJim Jagielski              nSymbolsStyle != m_nSymbolsStyle )
885*b1cdbd2cSJim Jagielski 		{
886*b1cdbd2cSJim Jagielski 			// The mode changed so we have to replace all images
887*b1cdbd2cSJim Jagielski 			m_bWasHiContrast	= bIsHiContrast;
888*b1cdbd2cSJim Jagielski 			m_bShowMenuImages	= bShowMenuImages;
889*b1cdbd2cSJim Jagielski 			m_bRetrieveImages	= sal_False;
890*b1cdbd2cSJim Jagielski 			m_nSymbolsStyle		= nSymbolsStyle;
891*b1cdbd2cSJim Jagielski             MenuManager::FillMenuImages(m_xFrame,pMenu,bIsHiContrast,bShowMenuImages);
892*b1cdbd2cSJim Jagielski 		}
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski         // Try to map commands to labels
895*b1cdbd2cSJim Jagielski         for ( sal_uInt16 nPos = 0; nPos < pMenu->GetItemCount(); nPos++ )
896*b1cdbd2cSJim Jagielski         {
897*b1cdbd2cSJim Jagielski             sal_uInt16 nItemId = pMenu->GetItemId( nPos );
898*b1cdbd2cSJim Jagielski             if (( pMenu->GetItemType( nPos ) != MENUITEM_SEPARATOR ) &&
899*b1cdbd2cSJim Jagielski                 ( pMenu->GetItemText( nItemId ).Len() == 0 ))
900*b1cdbd2cSJim Jagielski             {
901*b1cdbd2cSJim Jagielski                 String aCommand = pMenu->GetItemCommand( nItemId );
902*b1cdbd2cSJim Jagielski                 if ( aCommand.Len() > 0 )
903*b1cdbd2cSJim Jagielski                     pMenu->SetItemText( nItemId, RetrieveLabelFromCommand( aCommand ));
904*b1cdbd2cSJim Jagielski             }
905*b1cdbd2cSJim Jagielski         }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski         // Try to set accelerator keys
908*b1cdbd2cSJim Jagielski         {
909*b1cdbd2cSJim Jagielski             RetrieveShortcuts( m_aMenuItemHandlerVector );
910*b1cdbd2cSJim Jagielski             std::vector< MenuItemHandler* >::iterator p;
911*b1cdbd2cSJim Jagielski 		    for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
912*b1cdbd2cSJim Jagielski 		    {
913*b1cdbd2cSJim Jagielski 		        MenuItemHandler* pMenuItemHandler = *p;
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski                 // Set key code, workaround for hard-coded shortcut F1 mapped to .uno:HelpIndex
916*b1cdbd2cSJim Jagielski                 // Only non-popup menu items can have a short-cut
917*b1cdbd2cSJim Jagielski                 if ( pMenuItemHandler->aMenuItemURL == aCmdHelpIndex )
918*b1cdbd2cSJim Jagielski                 {
919*b1cdbd2cSJim Jagielski                     KeyCode aKeyCode( KEY_F1 );
920*b1cdbd2cSJim Jagielski                     pMenu->SetAccelKey( pMenuItemHandler->nItemId, aKeyCode );
921*b1cdbd2cSJim Jagielski                 }
922*b1cdbd2cSJim Jagielski                 else if ( pMenu->GetPopupMenu( pMenuItemHandler->nItemId ) == 0 )
923*b1cdbd2cSJim Jagielski                     pMenu->SetAccelKey( pMenuItemHandler->nItemId, pMenuItemHandler->aKeyCode );
924*b1cdbd2cSJim Jagielski             }
925*b1cdbd2cSJim Jagielski         }
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 		URL aTargetURL;
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski         // Use provided dispatch provider => fallback to frame as dispatch provider
930*b1cdbd2cSJim Jagielski         Reference< XDispatchProvider > xDispatchProvider;
931*b1cdbd2cSJim Jagielski         if ( m_xDispatchProvider.is() )
932*b1cdbd2cSJim Jagielski             xDispatchProvider = m_xDispatchProvider;
933*b1cdbd2cSJim Jagielski         else
934*b1cdbd2cSJim Jagielski             xDispatchProvider = Reference< XDispatchProvider >( m_xFrame, UNO_QUERY );
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 		if ( xDispatchProvider.is() )
937*b1cdbd2cSJim Jagielski 		{
938*b1cdbd2cSJim Jagielski             KeyCode             aEmptyKeyCode;
939*b1cdbd2cSJim Jagielski             SvtCommandOptions   aCmdOptions;
940*b1cdbd2cSJim Jagielski 			std::vector< MenuItemHandler* >::iterator p;
941*b1cdbd2cSJim Jagielski 			for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
942*b1cdbd2cSJim Jagielski 			{
943*b1cdbd2cSJim Jagielski 				MenuItemHandler* pMenuItemHandler = *p;
944*b1cdbd2cSJim Jagielski 				if ( pMenuItemHandler )
945*b1cdbd2cSJim Jagielski                 {
946*b1cdbd2cSJim Jagielski                     if ( !pMenuItemHandler->xMenuItemDispatch.is() &&
947*b1cdbd2cSJim Jagielski                          !pMenuItemHandler->xSubMenuManager.is()      )
948*b1cdbd2cSJim Jagielski                     {
949*b1cdbd2cSJim Jagielski 					    // There is no dispatch mechanism for the special window list menu items,
950*b1cdbd2cSJim Jagielski 					    // because they are handled directly through XFrame->activate!!!
951*b1cdbd2cSJim Jagielski                         // Don't update dispatches for special file menu items.
952*b1cdbd2cSJim Jagielski 					    if ( !(( pMenuItemHandler->nItemId >= START_ITEMID_WINDOWLIST &&
953*b1cdbd2cSJim Jagielski 					             pMenuItemHandler->nItemId < END_ITEMID_WINDOWLIST )))
954*b1cdbd2cSJim Jagielski 					    {
955*b1cdbd2cSJim Jagielski                             Reference< XDispatch > xMenuItemDispatch;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski                             ::rtl::OUString aItemCommand = pMenu->GetItemCommand( pMenuItemHandler->nItemId );
958*b1cdbd2cSJim Jagielski 						    if ( !aItemCommand.getLength() )
959*b1cdbd2cSJim Jagielski 						    {
960*b1cdbd2cSJim Jagielski 							    aItemCommand = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
961*b1cdbd2cSJim Jagielski 							    aItemCommand += ::rtl::OUString::valueOf( (sal_Int32)pMenuItemHandler->nItemId );
962*b1cdbd2cSJim Jagielski 							    pMenu->SetItemCommand( pMenuItemHandler->nItemId, aItemCommand );
963*b1cdbd2cSJim Jagielski 						    }
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski                             aTargetURL.Complete = aItemCommand;
966*b1cdbd2cSJim Jagielski 
967*b1cdbd2cSJim Jagielski                             m_xURLTransformer->parseStrict( aTargetURL );
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski                             if ( bHasDisabledEntries )
970*b1cdbd2cSJim Jagielski                             {
971*b1cdbd2cSJim Jagielski                                 if ( aCmdOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, aTargetURL.Path ))
972*b1cdbd2cSJim Jagielski                                     pMenu->HideItem( pMenuItemHandler->nItemId );
973*b1cdbd2cSJim Jagielski                             }
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski 						    if ( m_bIsBookmarkMenu )
976*b1cdbd2cSJim Jagielski 							    xMenuItemDispatch = xDispatchProvider->queryDispatch( aTargetURL, pMenuItemHandler->aTargetFrame, 0 );
977*b1cdbd2cSJim Jagielski 						    else
978*b1cdbd2cSJim Jagielski 							    xMenuItemDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski                             sal_Bool bPopupMenu( sal_False );
981*b1cdbd2cSJim Jagielski                             if ( !pMenuItemHandler->xPopupMenuController.is() &&
982*b1cdbd2cSJim Jagielski                                  m_xPopupMenuControllerFactory->hasController( aItemCommand, rtl::OUString() ))
983*b1cdbd2cSJim Jagielski                             {
984*b1cdbd2cSJim Jagielski                                 bPopupMenu = CreatePopupMenuController( pMenuItemHandler );
985*b1cdbd2cSJim Jagielski                             }
986*b1cdbd2cSJim Jagielski                             else if ( pMenuItemHandler->xPopupMenuController.is() )
987*b1cdbd2cSJim Jagielski                             {
988*b1cdbd2cSJim Jagielski                                 // Force update of popup menu
989*b1cdbd2cSJim Jagielski                                 pMenuItemHandler->xPopupMenuController->updatePopupMenu();
990*b1cdbd2cSJim Jagielski                                 bPopupMenu = sal_True;
991*b1cdbd2cSJim Jagielski 								if (PopupMenu*  pThisPopup = pMenu->GetPopupMenu( pMenuItemHandler->nItemId ))
992*b1cdbd2cSJim Jagielski                                     pMenu->EnableItem( pMenuItemHandler->nItemId, pThisPopup->GetItemCount() ? true : false );
993*b1cdbd2cSJim Jagielski                             }
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 							lcl_CheckForChildren(pMenu, pMenuItemHandler->nItemId);
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski                             if ( xMenuItemDispatch.is() )
998*b1cdbd2cSJim Jagielski 						    {
999*b1cdbd2cSJim Jagielski 							    pMenuItemHandler->xMenuItemDispatch = xMenuItemDispatch;
1000*b1cdbd2cSJim Jagielski 							    pMenuItemHandler->aMenuItemURL		= aTargetURL.Complete;
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski                                 if ( !bPopupMenu )
1003*b1cdbd2cSJim Jagielski                                 {
1004*b1cdbd2cSJim Jagielski                                     // We need only an update to reflect the current state
1005*b1cdbd2cSJim Jagielski                                     xMenuItemDispatch->addStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
1006*b1cdbd2cSJim Jagielski                                     xMenuItemDispatch->removeStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
1007*b1cdbd2cSJim Jagielski                                 }
1008*b1cdbd2cSJim Jagielski 						    }
1009*b1cdbd2cSJim Jagielski 						    else if ( !bPopupMenu )
1010*b1cdbd2cSJim Jagielski 							    pMenu->EnableItem( pMenuItemHandler->nItemId, sal_False );
1011*b1cdbd2cSJim Jagielski 					    }
1012*b1cdbd2cSJim Jagielski 				    }
1013*b1cdbd2cSJim Jagielski                     else if ( pMenuItemHandler->xPopupMenuController.is() )
1014*b1cdbd2cSJim Jagielski                     {
1015*b1cdbd2cSJim Jagielski                         // Force update of popup menu
1016*b1cdbd2cSJim Jagielski                         pMenuItemHandler->xPopupMenuController->updatePopupMenu();
1017*b1cdbd2cSJim Jagielski 						lcl_CheckForChildren(pMenu, pMenuItemHandler->nItemId);
1018*b1cdbd2cSJim Jagielski                     }
1019*b1cdbd2cSJim Jagielski                     else if ( pMenuItemHandler->xMenuItemDispatch.is() )
1020*b1cdbd2cSJim Jagielski                     {
1021*b1cdbd2cSJim Jagielski                         // We need an update to reflect the current state
1022*b1cdbd2cSJim Jagielski                         try
1023*b1cdbd2cSJim Jagielski                         {
1024*b1cdbd2cSJim Jagielski                             aTargetURL.Complete = pMenuItemHandler->aMenuItemURL;
1025*b1cdbd2cSJim Jagielski                             m_xURLTransformer->parseStrict( aTargetURL );
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski                             pMenuItemHandler->xMenuItemDispatch->addStatusListener(
1028*b1cdbd2cSJim Jagielski                                                                     static_cast< XStatusListener* >( this ), aTargetURL );
1029*b1cdbd2cSJim Jagielski                             pMenuItemHandler->xMenuItemDispatch->removeStatusListener(
1030*b1cdbd2cSJim Jagielski                                                                     static_cast< XStatusListener* >( this ), aTargetURL );
1031*b1cdbd2cSJim Jagielski                         }
1032*b1cdbd2cSJim Jagielski                         catch ( Exception& )
1033*b1cdbd2cSJim Jagielski                         {
1034*b1cdbd2cSJim Jagielski                         }
1035*b1cdbd2cSJim Jagielski                     }
1036*b1cdbd2cSJim Jagielski                     else if ( pMenuItemHandler->xSubMenuManager.is() )
1037*b1cdbd2cSJim Jagielski 						lcl_CheckForChildren(pMenu, pMenuItemHandler->nItemId);
1038*b1cdbd2cSJim Jagielski                 }
1039*b1cdbd2cSJim Jagielski 			}
1040*b1cdbd2cSJim Jagielski 		}
1041*b1cdbd2cSJim Jagielski 	}
1042*b1cdbd2cSJim Jagielski 
1043*b1cdbd2cSJim Jagielski 	return 1;
1044*b1cdbd2cSJim Jagielski }
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski 
IMPL_LINK(MenuBarManager,Deactivate,Menu *,pMenu)1047*b1cdbd2cSJim Jagielski IMPL_LINK( MenuBarManager, Deactivate, Menu *, pMenu )
1048*b1cdbd2cSJim Jagielski {
1049*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::Deactivate" );
1050*b1cdbd2cSJim Jagielski 	if ( pMenu == m_pVCLMenu )
1051*b1cdbd2cSJim Jagielski     {
1052*b1cdbd2cSJim Jagielski         m_bActive = sal_False;
1053*b1cdbd2cSJim Jagielski         if ( pMenu->IsMenuBar() && m_xDeferedItemContainer.is() )
1054*b1cdbd2cSJim Jagielski         {
1055*b1cdbd2cSJim Jagielski             // Start timer to handle settings asynchronous
1056*b1cdbd2cSJim Jagielski             // Changing the menu inside this handler leads to
1057*b1cdbd2cSJim Jagielski             // a crash under X!
1058*b1cdbd2cSJim Jagielski             m_aAsyncSettingsTimer.SetTimeoutHdl(LINK(this, MenuBarManager, AsyncSettingsHdl));
1059*b1cdbd2cSJim Jagielski             m_aAsyncSettingsTimer.SetTimeout(10);
1060*b1cdbd2cSJim Jagielski             m_aAsyncSettingsTimer.Start();
1061*b1cdbd2cSJim Jagielski         }
1062*b1cdbd2cSJim Jagielski     }
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski 	return 1;
1065*b1cdbd2cSJim Jagielski }
1066*b1cdbd2cSJim Jagielski 
1067*b1cdbd2cSJim Jagielski IMPL_LINK( MenuBarManager, AsyncSettingsHdl, Timer*,)
1068*b1cdbd2cSJim Jagielski {
1069*b1cdbd2cSJim Jagielski     OGuard	aGuard( Application::GetSolarMutex() );
1070*b1cdbd2cSJim Jagielski     Reference< XInterface > xSelfHold(
1071*b1cdbd2cSJim Jagielski         static_cast< ::cppu::OWeakObject* >( this ), UNO_QUERY_THROW );
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski     m_aAsyncSettingsTimer.Stop();
1074*b1cdbd2cSJim Jagielski     if ( !m_bActive && m_xDeferedItemContainer.is() )
1075*b1cdbd2cSJim Jagielski     {
1076*b1cdbd2cSJim Jagielski         SetItemContainer( m_xDeferedItemContainer );
1077*b1cdbd2cSJim Jagielski         m_xDeferedItemContainer.clear();
1078*b1cdbd2cSJim Jagielski     }
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 	return 0;
1081*b1cdbd2cSJim Jagielski }
1082*b1cdbd2cSJim Jagielski 
IMPL_LINK(MenuBarManager,Select,Menu *,pMenu)1083*b1cdbd2cSJim Jagielski IMPL_LINK( MenuBarManager, Select, Menu *, pMenu )
1084*b1cdbd2cSJim Jagielski {
1085*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::Select" );
1086*b1cdbd2cSJim Jagielski 	URL						aTargetURL;
1087*b1cdbd2cSJim Jagielski 	Sequence<PropertyValue>	aArgs;
1088*b1cdbd2cSJim Jagielski 	Reference< XDispatch >	xDispatch;
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 	{
1091*b1cdbd2cSJim Jagielski 		ResetableGuard aGuard( m_aLock );
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski 		sal_uInt16 nCurItemId = pMenu->GetCurItemId();
1094*b1cdbd2cSJim Jagielski         sal_uInt16 nCurPos    = pMenu->GetItemPos( nCurItemId );
1095*b1cdbd2cSJim Jagielski 		if ( pMenu == m_pVCLMenu &&
1096*b1cdbd2cSJim Jagielski 			 pMenu->GetItemType( nCurPos ) != MENUITEM_SEPARATOR )
1097*b1cdbd2cSJim Jagielski 		{
1098*b1cdbd2cSJim Jagielski 			if ( nCurItemId >= START_ITEMID_WINDOWLIST &&
1099*b1cdbd2cSJim Jagielski 				 nCurItemId <= END_ITEMID_WINDOWLIST )
1100*b1cdbd2cSJim Jagielski 			{
1101*b1cdbd2cSJim Jagielski 				// window list menu item selected
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski 				// #110897#
1104*b1cdbd2cSJim Jagielski                 // Reference< XFramesSupplier > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( DESKTOP_SERVICE ), UNO_QUERY );
1105*b1cdbd2cSJim Jagielski                 Reference< XFramesSupplier > xDesktop( getServiceFactory()->createInstance( SERVICENAME_DESKTOP ), UNO_QUERY );
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski 				if ( xDesktop.is() )
1108*b1cdbd2cSJim Jagielski 				{
1109*b1cdbd2cSJim Jagielski 					sal_uInt16 nTaskId = START_ITEMID_WINDOWLIST;
1110*b1cdbd2cSJim Jagielski                     Reference< XIndexAccess > xList( xDesktop->getFrames(), UNO_QUERY );
1111*b1cdbd2cSJim Jagielski                     sal_Int32 nCount = xList->getCount();
1112*b1cdbd2cSJim Jagielski                     for ( sal_Int32 i=0; i<nCount; ++i )
1113*b1cdbd2cSJim Jagielski 					{
1114*b1cdbd2cSJim Jagielski                         Reference< XFrame > xFrame;
1115*b1cdbd2cSJim Jagielski                         xList->getByIndex(i) >>= xFrame;
1116*b1cdbd2cSJim Jagielski                         if ( xFrame.is() && nTaskId == nCurItemId )
1117*b1cdbd2cSJim Jagielski 						{
1118*b1cdbd2cSJim Jagielski                             Window* pWin = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() );
1119*b1cdbd2cSJim Jagielski 							pWin->GrabFocus();
1120*b1cdbd2cSJim Jagielski 							pWin->ToTop( TOTOP_RESTOREWHENMIN );
1121*b1cdbd2cSJim Jagielski 							break;
1122*b1cdbd2cSJim Jagielski 						}
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski 						nTaskId++;
1125*b1cdbd2cSJim Jagielski 					}
1126*b1cdbd2cSJim Jagielski 				}
1127*b1cdbd2cSJim Jagielski 			}
1128*b1cdbd2cSJim Jagielski 			else
1129*b1cdbd2cSJim Jagielski 			{
1130*b1cdbd2cSJim Jagielski 				MenuItemHandler* pMenuItemHandler = GetMenuItemHandler( nCurItemId );
1131*b1cdbd2cSJim Jagielski 				if ( pMenuItemHandler && pMenuItemHandler->xMenuItemDispatch.is() )
1132*b1cdbd2cSJim Jagielski 				{
1133*b1cdbd2cSJim Jagielski 					aTargetURL.Complete = pMenuItemHandler->aMenuItemURL;
1134*b1cdbd2cSJim Jagielski                     m_xURLTransformer->parseStrict( aTargetURL );
1135*b1cdbd2cSJim Jagielski 
1136*b1cdbd2cSJim Jagielski                     if ( m_bIsBookmarkMenu )
1137*b1cdbd2cSJim Jagielski 					{
1138*b1cdbd2cSJim Jagielski 						// bookmark menu item selected
1139*b1cdbd2cSJim Jagielski 						aArgs.realloc( 1 );
1140*b1cdbd2cSJim Jagielski 						aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Referer" ));
1141*b1cdbd2cSJim Jagielski 						aArgs[0].Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SFX_REFERER_USER ));
1142*b1cdbd2cSJim Jagielski 					}
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 					xDispatch = pMenuItemHandler->xMenuItemDispatch;
1145*b1cdbd2cSJim Jagielski 				}
1146*b1cdbd2cSJim Jagielski 			}
1147*b1cdbd2cSJim Jagielski 		}
1148*b1cdbd2cSJim Jagielski 	}
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski 	if ( xDispatch.is() )
1151*b1cdbd2cSJim Jagielski     {
1152*b1cdbd2cSJim Jagielski         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1153*b1cdbd2cSJim Jagielski         if(::comphelper::UiEventsLogger::isEnabled()) //#i88653#
1154*b1cdbd2cSJim Jagielski             UiEventLogHelper(::rtl::OUString::createFromAscii("MenuBarManager")).log(getServiceFactory(), m_xFrame, aTargetURL, aArgs);
1155*b1cdbd2cSJim Jagielski 		xDispatch->dispatch( aTargetURL, aArgs );
1156*b1cdbd2cSJim Jagielski         Application::AcquireSolarMutex( nRef );
1157*b1cdbd2cSJim Jagielski     }
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 	return 1;
1160*b1cdbd2cSJim Jagielski }
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 
IMPL_LINK(MenuBarManager,Highlight,Menu *,EMPTYARG)1163*b1cdbd2cSJim Jagielski IMPL_LINK( MenuBarManager, Highlight, Menu *, EMPTYARG )
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski 	return 0;
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski 
MustBeHidden(PopupMenu * pPopupMenu,const Reference<XURLTransformer> & rTransformer)1168*b1cdbd2cSJim Jagielski sal_Bool MenuBarManager::MustBeHidden( PopupMenu* pPopupMenu, const Reference< XURLTransformer >& rTransformer )
1169*b1cdbd2cSJim Jagielski {
1170*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::MustBeHidden" );
1171*b1cdbd2cSJim Jagielski     if ( pPopupMenu )
1172*b1cdbd2cSJim Jagielski     {
1173*b1cdbd2cSJim Jagielski         URL               aTargetURL;
1174*b1cdbd2cSJim Jagielski         SvtCommandOptions aCmdOptions;
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = pPopupMenu->GetItemCount();
1177*b1cdbd2cSJim Jagielski         sal_uInt16 nHideCount( 0 );
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = 0; i < nCount; i++ )
1180*b1cdbd2cSJim Jagielski         {
1181*b1cdbd2cSJim Jagielski             sal_uInt16 nId = pPopupMenu->GetItemId( i );
1182*b1cdbd2cSJim Jagielski             if ( nId > 0 )
1183*b1cdbd2cSJim Jagielski             {
1184*b1cdbd2cSJim Jagielski                 PopupMenu* pSubPopupMenu = pPopupMenu->GetPopupMenu( nId );
1185*b1cdbd2cSJim Jagielski                 if ( pSubPopupMenu )
1186*b1cdbd2cSJim Jagielski                 {
1187*b1cdbd2cSJim Jagielski                     if ( MustBeHidden( pSubPopupMenu, rTransformer ))
1188*b1cdbd2cSJim Jagielski                     {
1189*b1cdbd2cSJim Jagielski                         pPopupMenu->HideItem( nId );
1190*b1cdbd2cSJim Jagielski                         ++nHideCount;
1191*b1cdbd2cSJim Jagielski                     }
1192*b1cdbd2cSJim Jagielski                 }
1193*b1cdbd2cSJim Jagielski                 else
1194*b1cdbd2cSJim Jagielski                 {
1195*b1cdbd2cSJim Jagielski                     aTargetURL.Complete = pPopupMenu->GetItemCommand( nId );
1196*b1cdbd2cSJim Jagielski                     rTransformer->parseStrict( aTargetURL );
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski                     if ( aCmdOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, aTargetURL.Path ))
1199*b1cdbd2cSJim Jagielski                         ++nHideCount;
1200*b1cdbd2cSJim Jagielski                 }
1201*b1cdbd2cSJim Jagielski             }
1202*b1cdbd2cSJim Jagielski             else
1203*b1cdbd2cSJim Jagielski                 ++nHideCount;
1204*b1cdbd2cSJim Jagielski         }
1205*b1cdbd2cSJim Jagielski 
1206*b1cdbd2cSJim Jagielski         return ( nCount == nHideCount );
1207*b1cdbd2cSJim Jagielski     }
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski     return sal_True;
1210*b1cdbd2cSJim Jagielski }
RetrieveLabelFromCommand(const String & aCmdURL)1211*b1cdbd2cSJim Jagielski String MenuBarManager::RetrieveLabelFromCommand( const String& aCmdURL )
1212*b1cdbd2cSJim Jagielski {
1213*b1cdbd2cSJim Jagielski     return framework::RetrieveLabelFromCommand(aCmdURL,mxServiceFactory,m_xUICommandLabels,m_xFrame,m_aModuleIdentifier,m_bModuleIdentified,"Label");
1214*b1cdbd2cSJim Jagielski }
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 
CreatePopupMenuController(MenuItemHandler * pMenuItemHandler)1218*b1cdbd2cSJim Jagielski sal_Bool MenuBarManager::CreatePopupMenuController( MenuItemHandler* pMenuItemHandler )
1219*b1cdbd2cSJim Jagielski {
1220*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::CreatePopupMenuController" );
1221*b1cdbd2cSJim Jagielski     rtl::OUString aItemCommand( pMenuItemHandler->aMenuItemURL );
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski     // Try instanciate a popup menu controller. It is stored in the menu item handler.
1224*b1cdbd2cSJim Jagielski     if ( !m_xPopupMenuControllerFactory.is() )
1225*b1cdbd2cSJim Jagielski         return sal_False;
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski     Sequence< Any > aSeq( 2 );
1228*b1cdbd2cSJim Jagielski     PropertyValue aPropValue;
1229*b1cdbd2cSJim Jagielski 
1230*b1cdbd2cSJim Jagielski     aPropValue.Name         = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" ));
1231*b1cdbd2cSJim Jagielski     aPropValue.Value      <<= m_aModuleIdentifier;
1232*b1cdbd2cSJim Jagielski     aSeq[0] <<= aPropValue;
1233*b1cdbd2cSJim Jagielski     aPropValue.Name         = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
1234*b1cdbd2cSJim Jagielski     aPropValue.Value      <<= m_xFrame;
1235*b1cdbd2cSJim Jagielski     aSeq[1] <<= aPropValue;
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski     Reference< XComponentContext > xComponentContext;
1238*b1cdbd2cSJim Jagielski     Reference< XPropertySet >      xProps( getServiceFactory(), UNO_QUERY );
1239*b1cdbd2cSJim Jagielski 
1240*b1cdbd2cSJim Jagielski     xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>=
1241*b1cdbd2cSJim Jagielski         xComponentContext;
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski     Reference< XPopupMenuController > xPopupMenuController(
1244*b1cdbd2cSJim Jagielski                                             m_xPopupMenuControllerFactory->createInstanceWithArgumentsAndContext(
1245*b1cdbd2cSJim Jagielski                                                 aItemCommand,
1246*b1cdbd2cSJim Jagielski                                                 aSeq,
1247*b1cdbd2cSJim Jagielski                                                 xComponentContext ),
1248*b1cdbd2cSJim Jagielski                                             UNO_QUERY );
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski     if ( xPopupMenuController.is() )
1251*b1cdbd2cSJim Jagielski     {
1252*b1cdbd2cSJim Jagielski         // Provide our awt popup menu to the popup menu controller
1253*b1cdbd2cSJim Jagielski         pMenuItemHandler->xPopupMenuController = xPopupMenuController;
1254*b1cdbd2cSJim Jagielski         xPopupMenuController->setPopupMenu( pMenuItemHandler->xPopupMenu );
1255*b1cdbd2cSJim Jagielski         return sal_True;
1256*b1cdbd2cSJim Jagielski     }
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski     return sal_False;
1259*b1cdbd2cSJim Jagielski }
1260*b1cdbd2cSJim Jagielski 
FillMenuManager(Menu * pMenu,const Reference<XFrame> & rFrame,const Reference<XDispatchProvider> & rDispatchProvider,const rtl::OUString & rModuleIdentifier,sal_Bool bDelete,sal_Bool bDeleteChildren)1261*b1cdbd2cSJim Jagielski void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rFrame, const Reference< XDispatchProvider >& rDispatchProvider, const rtl::OUString& rModuleIdentifier, sal_Bool bDelete, sal_Bool bDeleteChildren )
1262*b1cdbd2cSJim Jagielski {
1263*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::FillMenuManager" );
1264*b1cdbd2cSJim Jagielski 	m_xFrame			= rFrame;
1265*b1cdbd2cSJim Jagielski 	m_bActive			= sal_False;
1266*b1cdbd2cSJim Jagielski 	m_bDeleteMenu		= bDelete;
1267*b1cdbd2cSJim Jagielski 	m_bDeleteChildren	= bDeleteChildren;
1268*b1cdbd2cSJim Jagielski 	m_pVCLMenu			= pMenu;
1269*b1cdbd2cSJim Jagielski 	m_bInitialized		= sal_False;
1270*b1cdbd2cSJim Jagielski 	m_bIsBookmarkMenu	= sal_False;
1271*b1cdbd2cSJim Jagielski     m_xDispatchProvider = rDispatchProvider;
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski 	const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
1274*b1cdbd2cSJim Jagielski 	m_bWasHiContrast	= rSettings.GetHighContrastMode();
1275*b1cdbd2cSJim Jagielski 	m_bShowMenuImages	= rSettings.GetUseImagesInMenus();
1276*b1cdbd2cSJim Jagielski     m_bRetrieveImages   = sal_False;
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski 	sal_Int32 nAddonsURLPrefixLength = ADDONSPOPUPMENU_URL_PREFIX.getLength();
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski     // Add root as ui configuration listener
1281*b1cdbd2cSJim Jagielski     RetrieveImageManagers();
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski     if ( pMenu->IsMenuBar() && rFrame.is() )
1284*b1cdbd2cSJim Jagielski 	{
1285*b1cdbd2cSJim Jagielski         // First merge all addon popup menus into our structure
1286*b1cdbd2cSJim Jagielski         sal_uInt16 nPos = 0;
1287*b1cdbd2cSJim Jagielski         for ( nPos = 0; nPos < pMenu->GetItemCount(); nPos++ )
1288*b1cdbd2cSJim Jagielski         {
1289*b1cdbd2cSJim Jagielski             sal_uInt16          nItemId  = pMenu->GetItemId( nPos );
1290*b1cdbd2cSJim Jagielski             ::rtl::OUString aCommand = pMenu->GetItemCommand( nItemId );
1291*b1cdbd2cSJim Jagielski             if ( nItemId == SID_MDIWINDOWLIST ||
1292*b1cdbd2cSJim Jagielski                  aCommand == aSpecialWindowCommand )
1293*b1cdbd2cSJim Jagielski             {
1294*b1cdbd2cSJim Jagielski 		        // Retrieve addon popup menus and add them to our menu bar
1295*b1cdbd2cSJim Jagielski 		        Reference< com::sun::star::frame::XModel >		xModel;
1296*b1cdbd2cSJim Jagielski 		        Reference< com::sun::star::frame::XController >	xController( rFrame->getController(), UNO_QUERY );
1297*b1cdbd2cSJim Jagielski 		        if ( xController.is() )
1298*b1cdbd2cSJim Jagielski 			        xModel = Reference< com::sun::star::frame::XModel >( xController->getModel(), UNO_QUERY );
1299*b1cdbd2cSJim Jagielski 		        framework::AddonMenuManager::MergeAddonPopupMenus( rFrame, xModel, nPos, (MenuBar *)pMenu );
1300*b1cdbd2cSJim Jagielski                 break;
1301*b1cdbd2cSJim Jagielski             }
1302*b1cdbd2cSJim Jagielski         }
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski         // Merge the Add-Ons help menu items into the Office help menu
1305*b1cdbd2cSJim Jagielski         framework::AddonMenuManager::MergeAddonHelpMenu( rFrame, (MenuBar *)pMenu );
1306*b1cdbd2cSJim Jagielski     }
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski     String      aEmpty;
1309*b1cdbd2cSJim Jagielski     sal_Bool    bAccessibilityEnabled( Application::GetSettings().GetMiscSettings().GetEnableATToolSupport() );
1310*b1cdbd2cSJim Jagielski     sal_uInt16 nItemCount = pMenu->GetItemCount();
1311*b1cdbd2cSJim Jagielski     ::rtl::OUString aItemCommand;
1312*b1cdbd2cSJim Jagielski     m_aMenuItemHandlerVector.reserve(nItemCount);
1313*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nItemCount; i++ )
1314*b1cdbd2cSJim Jagielski 	{
1315*b1cdbd2cSJim Jagielski         sal_uInt16 nItemId = FillItemCommand(aItemCommand,pMenu, i );
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski         // Set module identifier when provided from outside
1318*b1cdbd2cSJim Jagielski         if ( rModuleIdentifier.getLength() > 0 )
1319*b1cdbd2cSJim Jagielski         {
1320*b1cdbd2cSJim Jagielski             m_aModuleIdentifier = rModuleIdentifier;
1321*b1cdbd2cSJim Jagielski             m_bModuleIdentified = sal_True;
1322*b1cdbd2cSJim Jagielski         }
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski         if (( pMenu->IsMenuBar() || bAccessibilityEnabled ) &&
1325*b1cdbd2cSJim Jagielski 			( pMenu->GetItemText( nItemId ).Len() == 0 ))
1326*b1cdbd2cSJim Jagielski         {
1327*b1cdbd2cSJim Jagielski             if ( aItemCommand.getLength() > 0 )
1328*b1cdbd2cSJim Jagielski                 pMenu->SetItemText( nItemId, RetrieveLabelFromCommand( aItemCommand ));
1329*b1cdbd2cSJim Jagielski         }
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski         Reference< XDispatch > xDispatch;
1332*b1cdbd2cSJim Jagielski 		Reference< XStatusListener > xStatusListener;
1333*b1cdbd2cSJim Jagielski 		PopupMenu* pPopup = pMenu->GetPopupMenu( nItemId );
1334*b1cdbd2cSJim Jagielski         bool bItemShowMenuImages = m_bShowMenuImages;
1335*b1cdbd2cSJim Jagielski         MenuItemBits nBits =  pMenu->GetItemBits( nItemId );
1336*b1cdbd2cSJim Jagielski         // overwrite the show icons on menu option?
1337*b1cdbd2cSJim Jagielski         if ( nBits )
1338*b1cdbd2cSJim Jagielski             bItemShowMenuImages = ( ( nBits & MIB_ICON ) == MIB_ICON );
1339*b1cdbd2cSJim Jagielski 		if ( pPopup )
1340*b1cdbd2cSJim Jagielski 		{
1341*b1cdbd2cSJim Jagielski             // Retrieve module identifier from Help Command entry
1342*b1cdbd2cSJim Jagielski             rtl::OUString aModuleIdentifier( rModuleIdentifier );
1343*b1cdbd2cSJim Jagielski             if ( pMenu->GetHelpCommand( nItemId ).Len() > 0 )
1344*b1cdbd2cSJim Jagielski             {
1345*b1cdbd2cSJim Jagielski                 aModuleIdentifier = pMenu->GetHelpCommand( nItemId );
1346*b1cdbd2cSJim Jagielski                 pMenu->SetHelpCommand( nItemId, aEmpty );
1347*b1cdbd2cSJim Jagielski             }
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski             if ( m_xPopupMenuControllerFactory.is() &&
1350*b1cdbd2cSJim Jagielski                  pPopup->GetItemCount() == 0 &&
1351*b1cdbd2cSJim Jagielski                  m_xPopupMenuControllerFactory->hasController( aItemCommand, rtl::OUString() )
1352*b1cdbd2cSJim Jagielski                   )
1353*b1cdbd2cSJim Jagielski             {
1354*b1cdbd2cSJim Jagielski                 // Check if we have to create a popup menu for a uno based popup menu controller.
1355*b1cdbd2cSJim Jagielski                 // We have to set an empty popup menu into our menu structure so the controller also
1356*b1cdbd2cSJim Jagielski                 // works with inplace OLE. Remove old dummy popup menu!
1357*b1cdbd2cSJim Jagielski                 MenuItemHandler* pItemHandler = new MenuItemHandler( nItemId, xStatusListener, xDispatch );
1358*b1cdbd2cSJim Jagielski                 VCLXPopupMenu* pVCLXPopupMenu = new VCLXPopupMenu;
1359*b1cdbd2cSJim Jagielski                 PopupMenu* pNewPopupMenu = (PopupMenu *)pVCLXPopupMenu->GetMenu();
1360*b1cdbd2cSJim Jagielski                 pMenu->SetPopupMenu( nItemId, pNewPopupMenu );
1361*b1cdbd2cSJim Jagielski                 pItemHandler->xPopupMenu = Reference< com::sun::star::awt::XPopupMenu >( (OWeakObject *)pVCLXPopupMenu, UNO_QUERY );
1362*b1cdbd2cSJim Jagielski                 pItemHandler->aMenuItemURL = aItemCommand;
1363*b1cdbd2cSJim Jagielski                 m_aMenuItemHandlerVector.push_back( pItemHandler );
1364*b1cdbd2cSJim Jagielski                 delete pPopup;
1365*b1cdbd2cSJim Jagielski 
1366*b1cdbd2cSJim Jagielski                 if ( bAccessibilityEnabled )
1367*b1cdbd2cSJim Jagielski                 {
1368*b1cdbd2cSJim Jagielski                     if ( CreatePopupMenuController( pItemHandler ))
1369*b1cdbd2cSJim Jagielski                         pItemHandler->xPopupMenuController->updatePopupMenu();
1370*b1cdbd2cSJim Jagielski                 }
1371*b1cdbd2cSJim Jagielski 				lcl_CheckForChildren(pMenu, nItemId);
1372*b1cdbd2cSJim Jagielski             }
1373*b1cdbd2cSJim Jagielski             else if (( aItemCommand.getLength() > nAddonsURLPrefixLength ) &&
1374*b1cdbd2cSJim Jagielski 				     ( aItemCommand.indexOf( ADDONSPOPUPMENU_URL_PREFIX ) == 0 ))
1375*b1cdbd2cSJim Jagielski 			{
1376*b1cdbd2cSJim Jagielski 				// A special addon popup menu, must be created with a different ctor
1377*b1cdbd2cSJim Jagielski 				// #110897#
1378*b1cdbd2cSJim Jagielski                 MenuBarManager* pSubMenuManager = new MenuBarManager( getServiceFactory(), m_xFrame, m_xURLTransformer,(AddonPopupMenu *)pPopup, bDeleteChildren, bDeleteChildren );
1379*b1cdbd2cSJim Jagielski                 AddMenu(pSubMenuManager,aItemCommand,nItemId);
1380*b1cdbd2cSJim Jagielski 			}
1381*b1cdbd2cSJim Jagielski 			else
1382*b1cdbd2cSJim Jagielski 			{
1383*b1cdbd2cSJim Jagielski                 Reference< XDispatchProvider > xPopupMenuDispatchProvider( rDispatchProvider );
1384*b1cdbd2cSJim Jagielski 
1385*b1cdbd2cSJim Jagielski                 // Retrieve possible attributes struct
1386*b1cdbd2cSJim Jagielski 				MenuConfiguration::Attributes* pAttributes = (MenuConfiguration::Attributes *)(pMenu->GetUserValue( nItemId ));
1387*b1cdbd2cSJim Jagielski                 if ( pAttributes )
1388*b1cdbd2cSJim Jagielski                     xPopupMenuDispatchProvider = pAttributes->xDispatchProvider;
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski                 // Check if this is the help menu. Add menu item if needed
1391*b1cdbd2cSJim Jagielski                 if ( nItemId == SID_HELPMENU || aItemCommand == aSlotHelpMenu || aItemCommand == aCmdHelpMenu )
1392*b1cdbd2cSJim Jagielski                 {
1393*b1cdbd2cSJim Jagielski                     // Check if this is the help menu. Add menu item if needed
1394*b1cdbd2cSJim Jagielski                     CheckAndAddMenuExtension( pPopup );
1395*b1cdbd2cSJim Jagielski                 }
1396*b1cdbd2cSJim Jagielski                 else if (( nItemId == SID_ADDONLIST || aItemCommand == aSlotSpecialToolsMenu || aItemCommand == aCmdToolsMenu ) &&
1397*b1cdbd2cSJim Jagielski 					     AddonMenuManager::HasAddonMenuElements() )
1398*b1cdbd2cSJim Jagielski                 {
1399*b1cdbd2cSJim Jagielski                     // Create addon popup menu if there exist elements and this is the tools popup menu
1400*b1cdbd2cSJim Jagielski 					sal_uInt16      nCount   = 0;
1401*b1cdbd2cSJim Jagielski 					AddonMenu*  pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame );
1402*b1cdbd2cSJim Jagielski 					if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 ))
1403*b1cdbd2cSJim Jagielski 					{
1404*b1cdbd2cSJim Jagielski 						if ( pPopup->GetItemType( nCount-1 ) != MENUITEM_SEPARATOR )
1405*b1cdbd2cSJim Jagielski 							pPopup->InsertSeparator();
1406*b1cdbd2cSJim Jagielski 
1407*b1cdbd2cSJim Jagielski 					    // Use resource to load popup menu title
1408*b1cdbd2cSJim Jagielski 					    String aAddonsStrRes = String( FwkResId( STR_MENU_ADDONS ));
1409*b1cdbd2cSJim Jagielski 					    pPopup->InsertItem( ITEMID_ADDONLIST, aAddonsStrRes );
1410*b1cdbd2cSJim Jagielski 					    pPopup->SetPopupMenu( ITEMID_ADDONLIST, pSubMenu );
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski 					    // Set item command for popup menu to enable it for GetImageFromURL
1413*b1cdbd2cSJim Jagielski 						const ::rtl::OUString aSlotString( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
1414*b1cdbd2cSJim Jagielski                         ::rtl::OUString aNewItemCommand( aSlotString );
1415*b1cdbd2cSJim Jagielski 					    aNewItemCommand += ::rtl::OUString::valueOf( (sal_Int32)ITEMID_ADDONLIST );
1416*b1cdbd2cSJim Jagielski 					    pPopup->SetItemCommand( ITEMID_ADDONLIST, aNewItemCommand );
1417*b1cdbd2cSJim Jagielski 					}
1418*b1cdbd2cSJim Jagielski 					else
1419*b1cdbd2cSJim Jagielski 					    delete pSubMenu;
1420*b1cdbd2cSJim Jagielski 				}
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski                 if ( nItemId == ITEMID_ADDONLIST )
1423*b1cdbd2cSJim Jagielski                 {
1424*b1cdbd2cSJim Jagielski 			        // Create control structure within the "Tools" sub menu for the Add-Ons popup menu
1425*b1cdbd2cSJim Jagielski                     // #110897# MenuBarManager* pSubMenuManager = new MenuBarManager( rFrame, pSubMenu, sal_True, sal_False );
1426*b1cdbd2cSJim Jagielski                     AddonMenu* pSubMenu = dynamic_cast< AddonMenu* >( pPopup );
1427*b1cdbd2cSJim Jagielski                     if ( pSubMenu )
1428*b1cdbd2cSJim Jagielski                     {
1429*b1cdbd2cSJim Jagielski                         MenuBarManager* pSubMenuManager = new MenuBarManager( getServiceFactory(), m_xFrame, m_xURLTransformer,pSubMenu, sal_True, sal_False );
1430*b1cdbd2cSJim Jagielski                         AddMenu(pSubMenuManager,aItemCommand,nItemId);
1431*b1cdbd2cSJim Jagielski                         pSubMenuManager->m_aMenuItemCommand = ::rtl::OUString();
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 			            // Set image for the addon popup menu item
1434*b1cdbd2cSJim Jagielski 			            if ( bItemShowMenuImages && !pPopup->GetItemImage( ITEMID_ADDONLIST ))
1435*b1cdbd2cSJim Jagielski 			            {
1436*b1cdbd2cSJim Jagielski                             Reference< XFrame > xTemp( rFrame );
1437*b1cdbd2cSJim Jagielski                             Image aImage = GetImageFromURL( xTemp, aItemCommand, sal_False, m_bWasHiContrast );
1438*b1cdbd2cSJim Jagielski         		            if ( !!aImage )
1439*b1cdbd2cSJim Jagielski            			            pPopup->SetItemImage( ITEMID_ADDONLIST, aImage );
1440*b1cdbd2cSJim Jagielski 			            }
1441*b1cdbd2cSJim Jagielski                     }
1442*b1cdbd2cSJim Jagielski                 }
1443*b1cdbd2cSJim Jagielski                 else
1444*b1cdbd2cSJim Jagielski                 {
1445*b1cdbd2cSJim Jagielski                     // #110897# MenuBarManager* pSubMenuManager = new MenuBarManager( rFrame, pPopupMenu, bDeleteChildren, bDeleteChildren );
1446*b1cdbd2cSJim Jagielski                     MenuBarManager* pSubMenuMgr = new MenuBarManager( getServiceFactory(), rFrame, m_xURLTransformer,rDispatchProvider, aModuleIdentifier, pPopup, bDeleteChildren, bDeleteChildren );
1447*b1cdbd2cSJim Jagielski                     AddMenu(pSubMenuMgr,aItemCommand,nItemId);
1448*b1cdbd2cSJim Jagielski                 }
1449*b1cdbd2cSJim Jagielski 			}
1450*b1cdbd2cSJim Jagielski 		}
1451*b1cdbd2cSJim Jagielski         else if ( pMenu->GetItemType( i ) != MENUITEM_SEPARATOR )
1452*b1cdbd2cSJim Jagielski 		{
1453*b1cdbd2cSJim Jagielski             if ( bItemShowMenuImages )
1454*b1cdbd2cSJim Jagielski 			{
1455*b1cdbd2cSJim Jagielski 			    if ( AddonMenuManager::IsAddonMenuId( nItemId ))
1456*b1cdbd2cSJim Jagielski 			    {
1457*b1cdbd2cSJim Jagielski                     // Add-Ons uses images from different places
1458*b1cdbd2cSJim Jagielski                     Image           aImage;
1459*b1cdbd2cSJim Jagielski                     rtl::OUString   aImageId;
1460*b1cdbd2cSJim Jagielski 
1461*b1cdbd2cSJim Jagielski 					MenuConfiguration::Attributes* pMenuAttributes =
1462*b1cdbd2cSJim Jagielski 						(MenuConfiguration::Attributes*)pMenu->GetUserValue( nItemId );
1463*b1cdbd2cSJim Jagielski 
1464*b1cdbd2cSJim Jagielski 					if ( pMenuAttributes && pMenuAttributes->aImageId.getLength() > 0 )
1465*b1cdbd2cSJim Jagielski 					{
1466*b1cdbd2cSJim Jagielski 						// Retrieve image id from menu attributes
1467*b1cdbd2cSJim Jagielski 						aImage = GetImageFromURL( m_xFrame, aImageId, sal_False, m_bWasHiContrast );
1468*b1cdbd2cSJim Jagielski                     }
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski 	                if ( !aImage )
1471*b1cdbd2cSJim Jagielski 	                {
1472*b1cdbd2cSJim Jagielski 						aImage = GetImageFromURL( m_xFrame, aItemCommand, sal_False, m_bWasHiContrast );
1473*b1cdbd2cSJim Jagielski 	                    if ( !aImage )
1474*b1cdbd2cSJim Jagielski                             aImage = AddonsOptions().GetImageFromURL( aItemCommand, sal_False, m_bWasHiContrast );
1475*b1cdbd2cSJim Jagielski                     }
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski 		            if ( !!aImage )
1478*b1cdbd2cSJim Jagielski 		                pMenu->SetItemImage( nItemId, aImage );
1479*b1cdbd2cSJim Jagielski                     else
1480*b1cdbd2cSJim Jagielski                         m_bRetrieveImages = sal_True;
1481*b1cdbd2cSJim Jagielski 			    }
1482*b1cdbd2cSJim Jagielski                 m_bRetrieveImages = sal_True;
1483*b1cdbd2cSJim Jagielski             }
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski             MenuItemHandler* pItemHandler = new MenuItemHandler( nItemId, xStatusListener, xDispatch );
1486*b1cdbd2cSJim Jagielski             pItemHandler->aMenuItemURL = aItemCommand;
1487*b1cdbd2cSJim Jagielski 
1488*b1cdbd2cSJim Jagielski             if ( m_xPopupMenuControllerFactory.is() &&
1489*b1cdbd2cSJim Jagielski                  m_xPopupMenuControllerFactory->hasController( aItemCommand, rtl::OUString() ))
1490*b1cdbd2cSJim Jagielski             {
1491*b1cdbd2cSJim Jagielski                 // Check if we have to create a popup menu for a uno based popup menu controller.
1492*b1cdbd2cSJim Jagielski                 // We have to set an empty popup menu into our menu structure so the controller also
1493*b1cdbd2cSJim Jagielski                 // works with inplace OLE.
1494*b1cdbd2cSJim Jagielski                 VCLXPopupMenu* pVCLXPopupMenu = new VCLXPopupMenu;
1495*b1cdbd2cSJim Jagielski                 PopupMenu* pPopupMenu = (PopupMenu *)pVCLXPopupMenu->GetMenu();
1496*b1cdbd2cSJim Jagielski                 pMenu->SetPopupMenu( pItemHandler->nItemId, pPopupMenu );
1497*b1cdbd2cSJim Jagielski                 pItemHandler->xPopupMenu = Reference< com::sun::star::awt::XPopupMenu >( (OWeakObject *)pVCLXPopupMenu, UNO_QUERY );
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski                 if ( bAccessibilityEnabled && CreatePopupMenuController( pItemHandler ) )
1500*b1cdbd2cSJim Jagielski                 {
1501*b1cdbd2cSJim Jagielski                     pItemHandler->xPopupMenuController->updatePopupMenu();
1502*b1cdbd2cSJim Jagielski 				}
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski 				lcl_CheckForChildren(pMenu, pItemHandler->nItemId);
1505*b1cdbd2cSJim Jagielski             }
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski 			m_aMenuItemHandlerVector.push_back( pItemHandler );
1508*b1cdbd2cSJim Jagielski 		}
1509*b1cdbd2cSJim Jagielski 	}
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski     if ( bAccessibilityEnabled )
1512*b1cdbd2cSJim Jagielski     {
1513*b1cdbd2cSJim Jagielski         RetrieveShortcuts( m_aMenuItemHandlerVector );
1514*b1cdbd2cSJim Jagielski         std::vector< MenuItemHandler* >::iterator p;
1515*b1cdbd2cSJim Jagielski 		for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
1516*b1cdbd2cSJim Jagielski 		{
1517*b1cdbd2cSJim Jagielski 		    MenuItemHandler* pMenuItemHandler = *p;
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski             // Set key code, workaround for hard-coded shortcut F1 mapped to .uno:HelpIndex
1520*b1cdbd2cSJim Jagielski             // Only non-popup menu items can have a short-cut
1521*b1cdbd2cSJim Jagielski             if ( pMenuItemHandler->aMenuItemURL == aCmdHelpIndex )
1522*b1cdbd2cSJim Jagielski             {
1523*b1cdbd2cSJim Jagielski                 KeyCode aKeyCode( KEY_F1 );
1524*b1cdbd2cSJim Jagielski                 pMenu->SetAccelKey( pMenuItemHandler->nItemId, aKeyCode );
1525*b1cdbd2cSJim Jagielski             }
1526*b1cdbd2cSJim Jagielski             else if ( pMenu->GetPopupMenu( pMenuItemHandler->nItemId ) == 0 )
1527*b1cdbd2cSJim Jagielski                 pMenu->SetAccelKey( pMenuItemHandler->nItemId, pMenuItemHandler->aKeyCode );
1528*b1cdbd2cSJim Jagielski         }
1529*b1cdbd2cSJim Jagielski     }
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski     SetHdl();
1532*b1cdbd2cSJim Jagielski }
1533*b1cdbd2cSJim Jagielski 
impl_RetrieveShortcutsFromConfiguration(const Reference<XAcceleratorConfiguration> & rAccelCfg,const Sequence<rtl::OUString> & rCommands,std::vector<MenuItemHandler * > & aMenuShortCuts)1534*b1cdbd2cSJim Jagielski void MenuBarManager::impl_RetrieveShortcutsFromConfiguration(
1535*b1cdbd2cSJim Jagielski     const Reference< XAcceleratorConfiguration >& rAccelCfg,
1536*b1cdbd2cSJim Jagielski     const Sequence< rtl::OUString >& rCommands,
1537*b1cdbd2cSJim Jagielski     std::vector< MenuItemHandler* >& aMenuShortCuts )
1538*b1cdbd2cSJim Jagielski {
1539*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::impl_RetrieveShortcutsFromConfiguration" );
1540*b1cdbd2cSJim Jagielski     if ( rAccelCfg.is() )
1541*b1cdbd2cSJim Jagielski     {
1542*b1cdbd2cSJim Jagielski         try
1543*b1cdbd2cSJim Jagielski         {
1544*b1cdbd2cSJim Jagielski             com::sun::star::awt::KeyEvent aKeyEvent;
1545*b1cdbd2cSJim Jagielski             Sequence< Any > aSeqKeyCode = rAccelCfg->getPreferredKeyEventsForCommandList( rCommands );
1546*b1cdbd2cSJim Jagielski             for ( sal_Int32 i = 0; i < aSeqKeyCode.getLength(); i++ )
1547*b1cdbd2cSJim Jagielski             {
1548*b1cdbd2cSJim Jagielski                 if ( aSeqKeyCode[i] >>= aKeyEvent )
1549*b1cdbd2cSJim Jagielski                     aMenuShortCuts[i]->aKeyCode = svt::AcceleratorExecute::st_AWTKey2VCLKey( aKeyEvent );
1550*b1cdbd2cSJim Jagielski             }
1551*b1cdbd2cSJim Jagielski         }
1552*b1cdbd2cSJim Jagielski         catch ( IllegalArgumentException& )
1553*b1cdbd2cSJim Jagielski         {
1554*b1cdbd2cSJim Jagielski         }
1555*b1cdbd2cSJim Jagielski     }
1556*b1cdbd2cSJim Jagielski }
1557*b1cdbd2cSJim Jagielski 
RetrieveShortcuts(std::vector<MenuItemHandler * > & aMenuShortCuts)1558*b1cdbd2cSJim Jagielski void MenuBarManager::RetrieveShortcuts( std::vector< MenuItemHandler* >& aMenuShortCuts )
1559*b1cdbd2cSJim Jagielski {
1560*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::RetrieveShortcuts" );
1561*b1cdbd2cSJim Jagielski     if ( !m_bModuleIdentified )
1562*b1cdbd2cSJim Jagielski     {
1563*b1cdbd2cSJim Jagielski         m_bModuleIdentified = sal_True;
1564*b1cdbd2cSJim Jagielski         Reference< XModuleManager > xModuleManager;
1565*b1cdbd2cSJim Jagielski         xModuleManager = Reference< XModuleManager >( getServiceFactory()->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY_THROW );
1566*b1cdbd2cSJim Jagielski 
1567*b1cdbd2cSJim Jagielski         try
1568*b1cdbd2cSJim Jagielski         {
1569*b1cdbd2cSJim Jagielski             m_aModuleIdentifier = xModuleManager->identify( m_xFrame );
1570*b1cdbd2cSJim Jagielski         }
1571*b1cdbd2cSJim Jagielski         catch( Exception& )
1572*b1cdbd2cSJim Jagielski         {
1573*b1cdbd2cSJim Jagielski         }
1574*b1cdbd2cSJim Jagielski     }
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski     if ( m_bModuleIdentified )
1577*b1cdbd2cSJim Jagielski     {
1578*b1cdbd2cSJim Jagielski         Reference< XAcceleratorConfiguration > xDocAccelCfg( m_xDocAcceleratorManager );
1579*b1cdbd2cSJim Jagielski         Reference< XAcceleratorConfiguration > xModuleAccelCfg( m_xModuleAcceleratorManager );
1580*b1cdbd2cSJim Jagielski         Reference< XAcceleratorConfiguration > xGlobalAccelCfg( m_xGlobalAcceleratorManager );
1581*b1cdbd2cSJim Jagielski 
1582*b1cdbd2cSJim Jagielski         if ( !m_bAcceleratorCfg )
1583*b1cdbd2cSJim Jagielski         {
1584*b1cdbd2cSJim Jagielski             // Retrieve references on demand
1585*b1cdbd2cSJim Jagielski             m_bAcceleratorCfg = sal_True;
1586*b1cdbd2cSJim Jagielski             if ( !xDocAccelCfg.is() )
1587*b1cdbd2cSJim Jagielski             {
1588*b1cdbd2cSJim Jagielski                 Reference< XController > xController = m_xFrame->getController();
1589*b1cdbd2cSJim Jagielski                 Reference< XModel > xModel;
1590*b1cdbd2cSJim Jagielski                 if ( xController.is() )
1591*b1cdbd2cSJim Jagielski                 {
1592*b1cdbd2cSJim Jagielski                     xModel = xController->getModel();
1593*b1cdbd2cSJim Jagielski                     if ( xModel.is() )
1594*b1cdbd2cSJim Jagielski                     {
1595*b1cdbd2cSJim Jagielski                         Reference< XUIConfigurationManagerSupplier > xSupplier( xModel, UNO_QUERY );
1596*b1cdbd2cSJim Jagielski                         if ( xSupplier.is() )
1597*b1cdbd2cSJim Jagielski                         {
1598*b1cdbd2cSJim Jagielski                             Reference< XUIConfigurationManager > xDocUICfgMgr( xSupplier->getUIConfigurationManager(), UNO_QUERY );
1599*b1cdbd2cSJim Jagielski                             if ( xDocUICfgMgr.is() )
1600*b1cdbd2cSJim Jagielski                             {
1601*b1cdbd2cSJim Jagielski                                 xDocAccelCfg = Reference< XAcceleratorConfiguration >( xDocUICfgMgr->getShortCutManager(), UNO_QUERY );
1602*b1cdbd2cSJim Jagielski                                 m_xDocAcceleratorManager = xDocAccelCfg;
1603*b1cdbd2cSJim Jagielski                             }
1604*b1cdbd2cSJim Jagielski                         }
1605*b1cdbd2cSJim Jagielski                     }
1606*b1cdbd2cSJim Jagielski                 }
1607*b1cdbd2cSJim Jagielski             }
1608*b1cdbd2cSJim Jagielski 
1609*b1cdbd2cSJim Jagielski             if ( !xModuleAccelCfg.is() )
1610*b1cdbd2cSJim Jagielski             {
1611*b1cdbd2cSJim Jagielski                 Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier( getServiceFactory()->createInstance(
1612*b1cdbd2cSJim Jagielski                                                                                             SERVICENAME_MODULEUICONFIGURATIONMANAGERSUPPLIER ),
1613*b1cdbd2cSJim Jagielski                                                                                         UNO_QUERY );
1614*b1cdbd2cSJim Jagielski                 try
1615*b1cdbd2cSJim Jagielski                 {
1616*b1cdbd2cSJim Jagielski                     Reference< XUIConfigurationManager > xUICfgMgr = xModuleCfgMgrSupplier->getUIConfigurationManager( m_aModuleIdentifier );
1617*b1cdbd2cSJim Jagielski                     if ( xUICfgMgr.is() )
1618*b1cdbd2cSJim Jagielski                     {
1619*b1cdbd2cSJim Jagielski                         xModuleAccelCfg = Reference< XAcceleratorConfiguration >( xUICfgMgr->getShortCutManager(), UNO_QUERY );
1620*b1cdbd2cSJim Jagielski                         m_xModuleAcceleratorManager = xModuleAccelCfg;
1621*b1cdbd2cSJim Jagielski                     }
1622*b1cdbd2cSJim Jagielski                 }
1623*b1cdbd2cSJim Jagielski                 catch ( RuntimeException& )
1624*b1cdbd2cSJim Jagielski                 {
1625*b1cdbd2cSJim Jagielski                     throw;
1626*b1cdbd2cSJim Jagielski                 }
1627*b1cdbd2cSJim Jagielski                 catch ( Exception& )
1628*b1cdbd2cSJim Jagielski                 {
1629*b1cdbd2cSJim Jagielski                 }
1630*b1cdbd2cSJim Jagielski             }
1631*b1cdbd2cSJim Jagielski 
1632*b1cdbd2cSJim Jagielski             if ( !xGlobalAccelCfg.is() )
1633*b1cdbd2cSJim Jagielski             {
1634*b1cdbd2cSJim Jagielski                 xGlobalAccelCfg = Reference< XAcceleratorConfiguration >( getServiceFactory()->createInstance(
1635*b1cdbd2cSJim Jagielski                                                                             SERVICENAME_GLOBALACCELERATORCONFIGURATION ),
1636*b1cdbd2cSJim Jagielski                                                                           UNO_QUERY );
1637*b1cdbd2cSJim Jagielski                 m_xGlobalAcceleratorManager = xGlobalAccelCfg;
1638*b1cdbd2cSJim Jagielski             }
1639*b1cdbd2cSJim Jagielski         }
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski         KeyCode aEmptyKeyCode;
1642*b1cdbd2cSJim Jagielski         Sequence< rtl::OUString > aSeq( aMenuShortCuts.size() );
1643*b1cdbd2cSJim Jagielski         const sal_uInt32 nCount = aMenuShortCuts.size();
1644*b1cdbd2cSJim Jagielski         for ( sal_uInt32 i = 0; i < nCount; ++i )
1645*b1cdbd2cSJim Jagielski         {
1646*b1cdbd2cSJim Jagielski             aSeq[i] = aMenuShortCuts[i]->aMenuItemURL;
1647*b1cdbd2cSJim Jagielski             aMenuShortCuts[i]->aKeyCode = aEmptyKeyCode;
1648*b1cdbd2cSJim Jagielski         }
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski         if ( m_xGlobalAcceleratorManager.is() )
1651*b1cdbd2cSJim Jagielski             impl_RetrieveShortcutsFromConfiguration( xGlobalAccelCfg, aSeq, aMenuShortCuts );
1652*b1cdbd2cSJim Jagielski         if ( m_xModuleAcceleratorManager.is() )
1653*b1cdbd2cSJim Jagielski             impl_RetrieveShortcutsFromConfiguration( xModuleAccelCfg, aSeq, aMenuShortCuts );
1654*b1cdbd2cSJim Jagielski         if ( m_xDocAcceleratorManager.is() )
1655*b1cdbd2cSJim Jagielski             impl_RetrieveShortcutsFromConfiguration( xGlobalAccelCfg, aSeq, aMenuShortCuts );
1656*b1cdbd2cSJim Jagielski     }
1657*b1cdbd2cSJim Jagielski }
1658*b1cdbd2cSJim Jagielski 
RetrieveImageManagers()1659*b1cdbd2cSJim Jagielski void MenuBarManager::RetrieveImageManagers()
1660*b1cdbd2cSJim Jagielski {
1661*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::RetrieveImageManagers" );
1662*b1cdbd2cSJim Jagielski     if ( !m_xDocImageManager.is() )
1663*b1cdbd2cSJim Jagielski     {
1664*b1cdbd2cSJim Jagielski         Reference< XController > xController = m_xFrame->getController();
1665*b1cdbd2cSJim Jagielski         Reference< XModel > xModel;
1666*b1cdbd2cSJim Jagielski         if ( xController.is() )
1667*b1cdbd2cSJim Jagielski         {
1668*b1cdbd2cSJim Jagielski             xModel = xController->getModel();
1669*b1cdbd2cSJim Jagielski             if ( xModel.is() )
1670*b1cdbd2cSJim Jagielski             {
1671*b1cdbd2cSJim Jagielski                 Reference< XUIConfigurationManagerSupplier > xSupplier( xModel, UNO_QUERY );
1672*b1cdbd2cSJim Jagielski                 if ( xSupplier.is() )
1673*b1cdbd2cSJim Jagielski                 {
1674*b1cdbd2cSJim Jagielski                     Reference< XUIConfigurationManager > xDocUICfgMgr( xSupplier->getUIConfigurationManager(), UNO_QUERY );
1675*b1cdbd2cSJim Jagielski                     m_xDocImageManager = Reference< XImageManager >( xDocUICfgMgr->getImageManager(), UNO_QUERY );
1676*b1cdbd2cSJim Jagielski                     m_xDocImageManager->addConfigurationListener(
1677*b1cdbd2cSJim Jagielski                                             Reference< XUIConfigurationListener >(
1678*b1cdbd2cSJim Jagielski                                                 static_cast< OWeakObject* >( this ), UNO_QUERY ));
1679*b1cdbd2cSJim Jagielski                 }
1680*b1cdbd2cSJim Jagielski             }
1681*b1cdbd2cSJim Jagielski         }
1682*b1cdbd2cSJim Jagielski     }
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski     Reference< XModuleManager > xModuleManager;
1685*b1cdbd2cSJim Jagielski     if ( m_aModuleIdentifier.getLength() == 0 )
1686*b1cdbd2cSJim Jagielski         xModuleManager.set( getServiceFactory()->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY_THROW );
1687*b1cdbd2cSJim Jagielski 
1688*b1cdbd2cSJim Jagielski     try
1689*b1cdbd2cSJim Jagielski     {
1690*b1cdbd2cSJim Jagielski         if ( xModuleManager.is() )
1691*b1cdbd2cSJim Jagielski             m_aModuleIdentifier = xModuleManager->identify( Reference< XInterface >( m_xFrame, UNO_QUERY ) );
1692*b1cdbd2cSJim Jagielski     }
1693*b1cdbd2cSJim Jagielski     catch( Exception& )
1694*b1cdbd2cSJim Jagielski     {
1695*b1cdbd2cSJim Jagielski     }
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski     if ( !m_xModuleImageManager.is() )
1698*b1cdbd2cSJim Jagielski     {
1699*b1cdbd2cSJim Jagielski         Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier( getServiceFactory()->createInstance(
1700*b1cdbd2cSJim Jagielski                                                                                     SERVICENAME_MODULEUICONFIGURATIONMANAGERSUPPLIER ),
1701*b1cdbd2cSJim Jagielski                                                                                   UNO_QUERY );
1702*b1cdbd2cSJim Jagielski         Reference< XUIConfigurationManager > xUICfgMgr = xModuleCfgMgrSupplier->getUIConfigurationManager( m_aModuleIdentifier );
1703*b1cdbd2cSJim Jagielski         m_xModuleImageManager.set( xUICfgMgr->getImageManager(), UNO_QUERY );
1704*b1cdbd2cSJim Jagielski         m_xModuleImageManager->addConfigurationListener( Reference< XUIConfigurationListener >(
1705*b1cdbd2cSJim Jagielski                                                             static_cast< OWeakObject* >( this ), UNO_QUERY ));
1706*b1cdbd2cSJim Jagielski     }
1707*b1cdbd2cSJim Jagielski }
1708*b1cdbd2cSJim Jagielski 
FillMenuWithConfiguration(sal_uInt16 & nId,Menu * pMenu,const::rtl::OUString & rModuleIdentifier,const Reference<XIndexAccess> & rItemContainer,const Reference<XURLTransformer> & rTransformer)1709*b1cdbd2cSJim Jagielski void MenuBarManager::FillMenuWithConfiguration(
1710*b1cdbd2cSJim Jagielski     sal_uInt16&                             nId,
1711*b1cdbd2cSJim Jagielski     Menu*                               pMenu,
1712*b1cdbd2cSJim Jagielski     const ::rtl::OUString&              rModuleIdentifier,
1713*b1cdbd2cSJim Jagielski     const Reference< XIndexAccess >&    rItemContainer,
1714*b1cdbd2cSJim Jagielski     const Reference< XURLTransformer >& rTransformer )
1715*b1cdbd2cSJim Jagielski {
1716*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::FillMenuWithConfiguration" );
1717*b1cdbd2cSJim Jagielski     Reference< XDispatchProvider > xEmptyDispatchProvider;
1718*b1cdbd2cSJim Jagielski     MenuBarManager::FillMenu( nId, pMenu, rModuleIdentifier, rItemContainer, xEmptyDispatchProvider );
1719*b1cdbd2cSJim Jagielski 
1720*b1cdbd2cSJim Jagielski     // Merge add-on menu entries into the menu bar
1721*b1cdbd2cSJim Jagielski     MenuBarManager::MergeAddonMenus( static_cast< Menu* >( pMenu ),
1722*b1cdbd2cSJim Jagielski                                      AddonsOptions().GetMergeMenuInstructions(),
1723*b1cdbd2cSJim Jagielski                                      rModuleIdentifier );
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski     sal_Bool bHasDisabledEntries = SvtCommandOptions().HasEntries( SvtCommandOptions::CMDOPTION_DISABLED );
1726*b1cdbd2cSJim Jagielski     if ( bHasDisabledEntries )
1727*b1cdbd2cSJim Jagielski     {
1728*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = pMenu->GetItemCount();
1729*b1cdbd2cSJim Jagielski 	    for ( sal_uInt16 i = 0; i < nCount; i++ )
1730*b1cdbd2cSJim Jagielski         {
1731*b1cdbd2cSJim Jagielski             sal_uInt16 nID = pMenu->GetItemId( i );
1732*b1cdbd2cSJim Jagielski             if ( nID > 0 )
1733*b1cdbd2cSJim Jagielski             {
1734*b1cdbd2cSJim Jagielski                 PopupMenu* pPopupMenu = pMenu->GetPopupMenu( nID );
1735*b1cdbd2cSJim Jagielski                 if ( pPopupMenu )
1736*b1cdbd2cSJim Jagielski                 {
1737*b1cdbd2cSJim Jagielski                     if ( MustBeHidden( pPopupMenu, rTransformer ))
1738*b1cdbd2cSJim Jagielski                         pMenu->HideItem( nId );
1739*b1cdbd2cSJim Jagielski                 }
1740*b1cdbd2cSJim Jagielski             }
1741*b1cdbd2cSJim Jagielski         }
1742*b1cdbd2cSJim Jagielski     }
1743*b1cdbd2cSJim Jagielski }
1744*b1cdbd2cSJim Jagielski 
FillMenu(sal_uInt16 & nId,Menu * pMenu,const rtl::OUString & rModuleIdentifier,const Reference<XIndexAccess> & rItemContainer,const Reference<XDispatchProvider> & rDispatchProvider)1745*b1cdbd2cSJim Jagielski void MenuBarManager::FillMenu(
1746*b1cdbd2cSJim Jagielski     sal_uInt16&                               nId,
1747*b1cdbd2cSJim Jagielski     Menu*                                 pMenu,
1748*b1cdbd2cSJim Jagielski     const rtl::OUString&                  rModuleIdentifier,
1749*b1cdbd2cSJim Jagielski     const Reference< XIndexAccess >&      rItemContainer,
1750*b1cdbd2cSJim Jagielski     const Reference< XDispatchProvider >& rDispatchProvider )
1751*b1cdbd2cSJim Jagielski {
1752*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::FillMenu" );
1753*b1cdbd2cSJim Jagielski     // Fill menu bar with container contents
1754*b1cdbd2cSJim Jagielski     for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ )
1755*b1cdbd2cSJim Jagielski     {
1756*b1cdbd2cSJim Jagielski         Sequence< PropertyValue >       aProp;
1757*b1cdbd2cSJim Jagielski         rtl::OUString                   aCommandURL;
1758*b1cdbd2cSJim Jagielski         rtl::OUString                   aLabel;
1759*b1cdbd2cSJim Jagielski         rtl::OUString                   aHelpURL;
1760*b1cdbd2cSJim Jagielski         rtl::OUString                   aModuleIdentifier( rModuleIdentifier );
1761*b1cdbd2cSJim Jagielski 	    sal_Bool                        bShow(sal_True);
1762*b1cdbd2cSJim Jagielski 	    sal_Bool                        bEnabled(sal_True);
1763*b1cdbd2cSJim Jagielski         sal_uInt16                      nType = 0;
1764*b1cdbd2cSJim Jagielski         Reference< XIndexAccess >       xIndexContainer;
1765*b1cdbd2cSJim Jagielski         Reference< XDispatchProvider >  xDispatchProvider( rDispatchProvider );
1766*b1cdbd2cSJim Jagielski         sal_Int16 nStyle = 0;
1767*b1cdbd2cSJim Jagielski         try
1768*b1cdbd2cSJim Jagielski         {
1769*b1cdbd2cSJim Jagielski             if ( rItemContainer->getByIndex( n ) >>= aProp )
1770*b1cdbd2cSJim Jagielski             {
1771*b1cdbd2cSJim Jagielski                 for ( int i = 0; i < aProp.getLength(); i++ )
1772*b1cdbd2cSJim Jagielski                 {
1773*b1cdbd2cSJim Jagielski                     rtl::OUString aPropName = aProp[i].Name;
1774*b1cdbd2cSJim Jagielski                     if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_COMMANDURL, LEN_DESCRIPTOR_COMMANDURL ))
1775*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= aCommandURL;
1776*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_HELPURL, LEN_DESCRIPTOR_HELPURL ))
1777*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= aHelpURL;
1778*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_CONTAINER, LEN_DESCRIPTOR_CONTAINER ))
1779*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= xIndexContainer;
1780*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_LABEL, LEN_DESCRIPTOR_LABEL ))
1781*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= aLabel;
1782*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_TYPE, LEN_DESCRIPTOR_TYPE ))
1783*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= nType;
1784*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_MODULEIDENTIFIER, LEN_DESCRIPTOR_MODULEIDENTIFIER ))
1785*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= aModuleIdentifier;
1786*b1cdbd2cSJim Jagielski                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_DISPATCHPROVIDER, LEN_DESCRIPTOR_DISPATCHPROVIDER ))
1787*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= xDispatchProvider;
1788*b1cdbd2cSJim Jagielski                     else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_STYLE, LEN_DESCRIPTOR_STYLE ))
1789*b1cdbd2cSJim Jagielski                         aProp[i].Value >>= nStyle;
1790*b1cdbd2cSJim Jagielski                     else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_ISVISIBLE, LEN_DESCRIPTOR_ISVISIBLE ))
1791*b1cdbd2cSJim Jagielski 		                aProp[i].Value >>= bShow;
1792*b1cdbd2cSJim Jagielski                     else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_ENABLED, LEN_DESCRIPTOR_ENABLED ))
1793*b1cdbd2cSJim Jagielski 		                aProp[i].Value >>= bEnabled;
1794*b1cdbd2cSJim Jagielski                 }
1795*b1cdbd2cSJim Jagielski 
1796*b1cdbd2cSJim Jagielski                 if ( nType == ::com::sun::star::ui::ItemType::DEFAULT )
1797*b1cdbd2cSJim Jagielski                 {
1798*b1cdbd2cSJim Jagielski                     pMenu->InsertItem( nId, aLabel );
1799*b1cdbd2cSJim Jagielski                     pMenu->SetItemCommand( nId, aCommandURL );
1800*b1cdbd2cSJim Jagielski 
1801*b1cdbd2cSJim Jagielski                     if ( nStyle )
1802*b1cdbd2cSJim Jagielski                     {
1803*b1cdbd2cSJim Jagielski                         MenuItemBits nBits = pMenu->GetItemBits( nId );
1804*b1cdbd2cSJim Jagielski                         if ( nStyle & ::com::sun::star::ui::ItemStyle::ICON )
1805*b1cdbd2cSJim Jagielski                            nBits |= MIB_ICON;
1806*b1cdbd2cSJim Jagielski                         if ( nStyle & ::com::sun::star::ui::ItemStyle::TEXT )
1807*b1cdbd2cSJim Jagielski                            nBits |= MIB_TEXT;
1808*b1cdbd2cSJim Jagielski                         if ( nStyle & ::com::sun::star::ui::ItemStyle::RADIO_CHECK )
1809*b1cdbd2cSJim Jagielski                            nBits |= MIB_RADIOCHECK;
1810*b1cdbd2cSJim Jagielski                         pMenu->SetItemBits( nId, nBits );
1811*b1cdbd2cSJim Jagielski                     }
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski                     if ( !bShow )
1814*b1cdbd2cSJim Jagielski 		                pMenu->HideItem( nId );
1815*b1cdbd2cSJim Jagielski 
1816*b1cdbd2cSJim Jagielski                     if ( !bEnabled)
1817*b1cdbd2cSJim Jagielski                         pMenu->EnableItem( nId, sal_False );
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski                     if ( xIndexContainer.is() )
1820*b1cdbd2cSJim Jagielski                     {
1821*b1cdbd2cSJim Jagielski                         PopupMenu* pNewPopupMenu = new PopupMenu;
1822*b1cdbd2cSJim Jagielski                         pMenu->SetPopupMenu( nId, pNewPopupMenu );
1823*b1cdbd2cSJim Jagielski 
1824*b1cdbd2cSJim Jagielski                         if ( xDispatchProvider.is() )
1825*b1cdbd2cSJim Jagielski                         {
1826*b1cdbd2cSJim Jagielski 				            // Use attributes struct to transport special dispatch provider
1827*b1cdbd2cSJim Jagielski                             MenuConfiguration::Attributes* pAttributes = new MenuConfiguration::Attributes;
1828*b1cdbd2cSJim Jagielski                             pAttributes->xDispatchProvider = xDispatchProvider;
1829*b1cdbd2cSJim Jagielski                             pMenu->SetUserValue( nId, (sal_uIntPtr)( pAttributes ));
1830*b1cdbd2cSJim Jagielski                         }
1831*b1cdbd2cSJim Jagielski 
1832*b1cdbd2cSJim Jagielski                         // Use help command to transport module identifier
1833*b1cdbd2cSJim Jagielski                         if ( aModuleIdentifier.getLength() > 0 )
1834*b1cdbd2cSJim Jagielski                             pMenu->SetHelpCommand( nId, aModuleIdentifier );
1835*b1cdbd2cSJim Jagielski 
1836*b1cdbd2cSJim Jagielski                         ++nId;
1837*b1cdbd2cSJim Jagielski                         FillMenu( nId, pNewPopupMenu, aModuleIdentifier, xIndexContainer, xDispatchProvider );
1838*b1cdbd2cSJim Jagielski                     }
1839*b1cdbd2cSJim Jagielski                     else
1840*b1cdbd2cSJim Jagielski                         ++nId;
1841*b1cdbd2cSJim Jagielski                 }
1842*b1cdbd2cSJim Jagielski                 else
1843*b1cdbd2cSJim Jagielski                 {
1844*b1cdbd2cSJim Jagielski                     pMenu->InsertSeparator();
1845*b1cdbd2cSJim Jagielski                     ++nId;
1846*b1cdbd2cSJim Jagielski                 }
1847*b1cdbd2cSJim Jagielski             }
1848*b1cdbd2cSJim Jagielski         }
1849*b1cdbd2cSJim Jagielski         catch ( IndexOutOfBoundsException& )
1850*b1cdbd2cSJim Jagielski         {
1851*b1cdbd2cSJim Jagielski             break;
1852*b1cdbd2cSJim Jagielski         }
1853*b1cdbd2cSJim Jagielski     }
1854*b1cdbd2cSJim Jagielski }
1855*b1cdbd2cSJim Jagielski 
MergeAddonMenus(Menu * pMenuBar,const MergeMenuInstructionContainer & aMergeInstructionContainer,const::rtl::OUString & rModuleIdentifier)1856*b1cdbd2cSJim Jagielski void MenuBarManager::MergeAddonMenus(
1857*b1cdbd2cSJim Jagielski     Menu* pMenuBar,
1858*b1cdbd2cSJim Jagielski     const MergeMenuInstructionContainer& aMergeInstructionContainer,
1859*b1cdbd2cSJim Jagielski     const ::rtl::OUString& rModuleIdentifier )
1860*b1cdbd2cSJim Jagielski {
1861*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::MergeAddonMenus" );
1862*b1cdbd2cSJim Jagielski     // set start value for the item ID for the new addon menu items
1863*b1cdbd2cSJim Jagielski     sal_uInt16 nItemId = ADDONMENU_MERGE_ITEMID_START;
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski     const sal_uInt32 nCount = aMergeInstructionContainer.size();
1866*b1cdbd2cSJim Jagielski     for ( sal_uInt32 i = 0; i < nCount; i++ )
1867*b1cdbd2cSJim Jagielski     {
1868*b1cdbd2cSJim Jagielski         const MergeMenuInstruction& rMergeInstruction = aMergeInstructionContainer[i];
1869*b1cdbd2cSJim Jagielski 
1870*b1cdbd2cSJim Jagielski         if ( MenuBarMerger::IsCorrectContext( rMergeInstruction.aMergeContext, rModuleIdentifier ))
1871*b1cdbd2cSJim Jagielski         {
1872*b1cdbd2cSJim Jagielski             ::std::vector< ::rtl::OUString > aMergePath;
1873*b1cdbd2cSJim Jagielski 
1874*b1cdbd2cSJim Jagielski             // retrieve the merge path from the merge point string
1875*b1cdbd2cSJim Jagielski             MenuBarMerger::RetrieveReferencePath( rMergeInstruction.aMergePoint, aMergePath );
1876*b1cdbd2cSJim Jagielski 
1877*b1cdbd2cSJim Jagielski             // convert the sequence/sequence property value to a more convenient vector<>
1878*b1cdbd2cSJim Jagielski             AddonMenuContainer aMergeMenuItems;
1879*b1cdbd2cSJim Jagielski             MenuBarMerger::GetSubMenu( rMergeInstruction.aMergeMenu, aMergeMenuItems );
1880*b1cdbd2cSJim Jagielski 
1881*b1cdbd2cSJim Jagielski             // try to find the reference point for our merge operation
1882*b1cdbd2cSJim Jagielski             Menu* pMenu = pMenuBar;
1883*b1cdbd2cSJim Jagielski             ReferencePathInfo aResult = MenuBarMerger::FindReferencePath( aMergePath, pMenu );
1884*b1cdbd2cSJim Jagielski 
1885*b1cdbd2cSJim Jagielski             if ( aResult.eResult == RP_OK )
1886*b1cdbd2cSJim Jagielski             {
1887*b1cdbd2cSJim Jagielski                 // normal merge operation
1888*b1cdbd2cSJim Jagielski                 MenuBarMerger::ProcessMergeOperation( aResult.pPopupMenu,
1889*b1cdbd2cSJim Jagielski                                                       aResult.nPos,
1890*b1cdbd2cSJim Jagielski                                                       nItemId,
1891*b1cdbd2cSJim Jagielski                                                       rMergeInstruction.aMergeCommand,
1892*b1cdbd2cSJim Jagielski                                                       rMergeInstruction.aMergeCommandParameter,
1893*b1cdbd2cSJim Jagielski                                                       rModuleIdentifier,
1894*b1cdbd2cSJim Jagielski                                                       aMergeMenuItems );
1895*b1cdbd2cSJim Jagielski             }
1896*b1cdbd2cSJim Jagielski             else
1897*b1cdbd2cSJim Jagielski             {
1898*b1cdbd2cSJim Jagielski                 // fallback
1899*b1cdbd2cSJim Jagielski                 MenuBarMerger::ProcessFallbackOperation( aResult,
1900*b1cdbd2cSJim Jagielski                                                          nItemId,
1901*b1cdbd2cSJim Jagielski                                                          rMergeInstruction.aMergeCommand,
1902*b1cdbd2cSJim Jagielski                                                          rMergeInstruction.aMergeFallback,
1903*b1cdbd2cSJim Jagielski                                                          aMergePath,
1904*b1cdbd2cSJim Jagielski                                                          rModuleIdentifier,
1905*b1cdbd2cSJim Jagielski                                                          aMergeMenuItems );
1906*b1cdbd2cSJim Jagielski             }
1907*b1cdbd2cSJim Jagielski         }
1908*b1cdbd2cSJim Jagielski     }
1909*b1cdbd2cSJim Jagielski }
1910*b1cdbd2cSJim Jagielski 
SetItemContainer(const Reference<XIndexAccess> & rItemContainer)1911*b1cdbd2cSJim Jagielski void MenuBarManager::SetItemContainer( const Reference< XIndexAccess >& rItemContainer )
1912*b1cdbd2cSJim Jagielski {
1913*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::MenuBarManager::SetItemContainer" );
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski     ResetableGuard aGuard( m_aLock );
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski     Reference< XFrame > xFrame = m_xFrame;
1918*b1cdbd2cSJim Jagielski 
1919*b1cdbd2cSJim Jagielski     if ( !m_bModuleIdentified )
1920*b1cdbd2cSJim Jagielski     {
1921*b1cdbd2cSJim Jagielski         m_bModuleIdentified = sal_True;
1922*b1cdbd2cSJim Jagielski         Reference< XModuleManager > xModuleManager;
1923*b1cdbd2cSJim Jagielski         xModuleManager = Reference< XModuleManager >( getServiceFactory()->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY_THROW );
1924*b1cdbd2cSJim Jagielski 
1925*b1cdbd2cSJim Jagielski         try
1926*b1cdbd2cSJim Jagielski         {
1927*b1cdbd2cSJim Jagielski             m_aModuleIdentifier = xModuleManager->identify( xFrame );
1928*b1cdbd2cSJim Jagielski         }
1929*b1cdbd2cSJim Jagielski         catch( Exception& )
1930*b1cdbd2cSJim Jagielski         {
1931*b1cdbd2cSJim Jagielski         }
1932*b1cdbd2cSJim Jagielski     }
1933*b1cdbd2cSJim Jagielski 
1934*b1cdbd2cSJim Jagielski     // Clear MenuBarManager structures
1935*b1cdbd2cSJim Jagielski     {
1936*b1cdbd2cSJim Jagielski         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
1937*b1cdbd2cSJim Jagielski 
1938*b1cdbd2cSJim Jagielski         // Check active state as we cannot change our VCL menu during activation by the user
1939*b1cdbd2cSJim Jagielski         if ( m_bActive )
1940*b1cdbd2cSJim Jagielski         {
1941*b1cdbd2cSJim Jagielski             m_xDeferedItemContainer = rItemContainer;
1942*b1cdbd2cSJim Jagielski             return;
1943*b1cdbd2cSJim Jagielski         }
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski         RemoveListener();
1946*b1cdbd2cSJim Jagielski 	    std::vector< MenuItemHandler* >::iterator p;
1947*b1cdbd2cSJim Jagielski 	    for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
1948*b1cdbd2cSJim Jagielski 	    {
1949*b1cdbd2cSJim Jagielski 		    MenuItemHandler* pItemHandler = *p;
1950*b1cdbd2cSJim Jagielski 		    pItemHandler->xMenuItemDispatch.clear();
1951*b1cdbd2cSJim Jagielski 		    pItemHandler->xSubMenuManager.clear();
1952*b1cdbd2cSJim Jagielski 		    delete pItemHandler;
1953*b1cdbd2cSJim Jagielski 	    }
1954*b1cdbd2cSJim Jagielski         m_aMenuItemHandlerVector.clear();
1955*b1cdbd2cSJim Jagielski 
1956*b1cdbd2cSJim Jagielski         // Remove top-level parts
1957*b1cdbd2cSJim Jagielski 	    m_pVCLMenu->Clear();
1958*b1cdbd2cSJim Jagielski 
1959*b1cdbd2cSJim Jagielski         sal_uInt16          nId = 1;
1960*b1cdbd2cSJim Jagielski 
1961*b1cdbd2cSJim Jagielski         // Fill menu bar with container contents
1962*b1cdbd2cSJim Jagielski         FillMenuWithConfiguration( nId, (Menu *)m_pVCLMenu, m_aModuleIdentifier, rItemContainer, m_xURLTransformer );
1963*b1cdbd2cSJim Jagielski 
1964*b1cdbd2cSJim Jagielski         // Refill menu manager again
1965*b1cdbd2cSJim Jagielski         Reference< XDispatchProvider > xDispatchProvider;
1966*b1cdbd2cSJim Jagielski         FillMenuManager( m_pVCLMenu, xFrame, xDispatchProvider, m_aModuleIdentifier, sal_False, sal_True );
1967*b1cdbd2cSJim Jagielski 
1968*b1cdbd2cSJim Jagielski         // add itself as frame action listener
1969*b1cdbd2cSJim Jagielski         m_xFrame->addFrameActionListener( Reference< XFrameActionListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
1970*b1cdbd2cSJim Jagielski     }
1971*b1cdbd2cSJim Jagielski }
1972*b1cdbd2cSJim Jagielski 
GetPopupController(PopupControllerCache & rPopupController)1973*b1cdbd2cSJim Jagielski void MenuBarManager::GetPopupController( PopupControllerCache& rPopupController )
1974*b1cdbd2cSJim Jagielski {
1975*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::GetPopupController" );
1976*b1cdbd2cSJim Jagielski     String aPopupScheme = String::CreateFromAscii( "vnd.sun.star.popup:" );
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski     vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski     std::vector< MenuItemHandler* >::iterator p;
1981*b1cdbd2cSJim Jagielski     for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ )
1982*b1cdbd2cSJim Jagielski     {
1983*b1cdbd2cSJim Jagielski         MenuItemHandler* pItemHandler = *p;
1984*b1cdbd2cSJim Jagielski         if ( pItemHandler->xPopupMenuController.is() )
1985*b1cdbd2cSJim Jagielski         {
1986*b1cdbd2cSJim Jagielski             Reference< XDispatchProvider > xDispatchProvider( pItemHandler->xPopupMenuController, UNO_QUERY );
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski             PopupControllerEntry aPopupControllerEntry;
1989*b1cdbd2cSJim Jagielski             aPopupControllerEntry.m_xDispatchProvider = xDispatchProvider;
1990*b1cdbd2cSJim Jagielski 
1991*b1cdbd2cSJim Jagielski             // Just use the main part of the URL for popup menu controllers
1992*b1cdbd2cSJim Jagielski             sal_Int32     nQueryPart( 0 );
1993*b1cdbd2cSJim Jagielski             sal_Int32     nSchemePart( 0 );
1994*b1cdbd2cSJim Jagielski             rtl::OUString aMainURL( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.popup:" ));
1995*b1cdbd2cSJim Jagielski             rtl::OUString aMenuURL( pItemHandler->aMenuItemURL );
1996*b1cdbd2cSJim Jagielski 
1997*b1cdbd2cSJim Jagielski             nSchemePart = aMenuURL.indexOf( ':' );
1998*b1cdbd2cSJim Jagielski             if (( nSchemePart > 0 ) &&
1999*b1cdbd2cSJim Jagielski                 ( aMenuURL.getLength() > ( nSchemePart+1 )))
2000*b1cdbd2cSJim Jagielski             {
2001*b1cdbd2cSJim Jagielski                 nQueryPart  = aMenuURL.indexOf( '?', nSchemePart );
2002*b1cdbd2cSJim Jagielski                 if ( nQueryPart > 0 )
2003*b1cdbd2cSJim Jagielski                     aMainURL += aMenuURL.copy( nSchemePart, nQueryPart-nSchemePart );
2004*b1cdbd2cSJim Jagielski                 else if ( nQueryPart == -1 )
2005*b1cdbd2cSJim Jagielski                     aMainURL += aMenuURL.copy( nSchemePart+1 );
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski                 rPopupController.insert( PopupControllerCache::value_type(
2008*b1cdbd2cSJim Jagielski                                            aMainURL, aPopupControllerEntry ));
2009*b1cdbd2cSJim Jagielski             }
2010*b1cdbd2cSJim Jagielski         }
2011*b1cdbd2cSJim Jagielski         if ( pItemHandler->xSubMenuManager.is() )
2012*b1cdbd2cSJim Jagielski         {
2013*b1cdbd2cSJim Jagielski             MenuBarManager* pMenuBarManager = (MenuBarManager*)(pItemHandler->xSubMenuManager.get());
2014*b1cdbd2cSJim Jagielski             if ( pMenuBarManager )
2015*b1cdbd2cSJim Jagielski                 pMenuBarManager->GetPopupController( rPopupController );
2016*b1cdbd2cSJim Jagielski         }
2017*b1cdbd2cSJim Jagielski     }
2018*b1cdbd2cSJim Jagielski }
2019*b1cdbd2cSJim Jagielski 
2020*b1cdbd2cSJim Jagielski // #110897#
getServiceFactory()2021*b1cdbd2cSJim Jagielski const Reference< XMultiServiceFactory >& MenuBarManager::getServiceFactory()
2022*b1cdbd2cSJim Jagielski {
2023*b1cdbd2cSJim Jagielski 	// #110897#
2024*b1cdbd2cSJim Jagielski 	return mxServiceFactory;
2025*b1cdbd2cSJim Jagielski }
2026*b1cdbd2cSJim Jagielski 
AddMenu(MenuBarManager * pSubMenuManager,const::rtl::OUString & _sItemCommand,sal_uInt16 _nItemId)2027*b1cdbd2cSJim Jagielski void MenuBarManager::AddMenu(MenuBarManager* pSubMenuManager,const ::rtl::OUString& _sItemCommand,sal_uInt16 _nItemId)
2028*b1cdbd2cSJim Jagielski {
2029*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::AddMenu" );
2030*b1cdbd2cSJim Jagielski 	Reference< XStatusListener > xSubMenuManager( static_cast< OWeakObject *>( pSubMenuManager ), UNO_QUERY );
2031*b1cdbd2cSJim Jagielski     m_xFrame->addFrameActionListener( Reference< XFrameActionListener >( xSubMenuManager, UNO_QUERY ));
2032*b1cdbd2cSJim Jagielski 
2033*b1cdbd2cSJim Jagielski 	// store menu item command as we later have to know which menu is active (see Activate handler)
2034*b1cdbd2cSJim Jagielski 	pSubMenuManager->m_aMenuItemCommand = _sItemCommand;
2035*b1cdbd2cSJim Jagielski     Reference< XDispatch > xDispatch;
2036*b1cdbd2cSJim Jagielski 	MenuItemHandler* pMenuItemHandler = new MenuItemHandler(
2037*b1cdbd2cSJim Jagielski 												_nItemId,
2038*b1cdbd2cSJim Jagielski 												xSubMenuManager,
2039*b1cdbd2cSJim Jagielski 												xDispatch );
2040*b1cdbd2cSJim Jagielski     pMenuItemHandler->aMenuItemURL = _sItemCommand;
2041*b1cdbd2cSJim Jagielski 	m_aMenuItemHandlerVector.push_back( pMenuItemHandler );
2042*b1cdbd2cSJim Jagielski }
2043*b1cdbd2cSJim Jagielski 
FillItemCommand(::rtl::OUString & _rItemCommand,Menu * _pMenu,sal_uInt16 _nIndex) const2044*b1cdbd2cSJim Jagielski sal_uInt16 MenuBarManager::FillItemCommand(::rtl::OUString& _rItemCommand,Menu* _pMenu,sal_uInt16 _nIndex) const
2045*b1cdbd2cSJim Jagielski {
2046*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::FillItemCommand" );
2047*b1cdbd2cSJim Jagielski     sal_uInt16 nItemId = _pMenu->GetItemId( _nIndex );
2048*b1cdbd2cSJim Jagielski 
2049*b1cdbd2cSJim Jagielski 	_rItemCommand = _pMenu->GetItemCommand( nItemId );
2050*b1cdbd2cSJim Jagielski 	if ( !_rItemCommand.getLength() )
2051*b1cdbd2cSJim Jagielski 	{
2052*b1cdbd2cSJim Jagielski         const static ::rtl::OUString aSlotString( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
2053*b1cdbd2cSJim Jagielski 		_rItemCommand = aSlotString;
2054*b1cdbd2cSJim Jagielski 		_rItemCommand += ::rtl::OUString::valueOf( (sal_Int32)nItemId );
2055*b1cdbd2cSJim Jagielski 		_pMenu->SetItemCommand( nItemId, _rItemCommand );
2056*b1cdbd2cSJim Jagielski 	}
2057*b1cdbd2cSJim Jagielski     return nItemId;
2058*b1cdbd2cSJim Jagielski }
Init(const Reference<XFrame> & rFrame,AddonMenu * pAddonMenu,sal_Bool bDelete,sal_Bool bDeleteChildren,bool _bHandlePopUp)2059*b1cdbd2cSJim Jagielski void MenuBarManager::Init(const Reference< XFrame >& rFrame,AddonMenu* pAddonMenu,sal_Bool bDelete,sal_Bool bDeleteChildren,bool _bHandlePopUp)
2060*b1cdbd2cSJim Jagielski {
2061*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "MenuBarManager::Init" );
2062*b1cdbd2cSJim Jagielski 	m_bActive			= sal_False;
2063*b1cdbd2cSJim Jagielski 	m_bDeleteMenu		= bDelete;
2064*b1cdbd2cSJim Jagielski 	m_bDeleteChildren	= bDeleteChildren;
2065*b1cdbd2cSJim Jagielski 	m_pVCLMenu			= pAddonMenu;
2066*b1cdbd2cSJim Jagielski 	m_xFrame			= rFrame;
2067*b1cdbd2cSJim Jagielski 	m_bInitialized		= sal_False;
2068*b1cdbd2cSJim Jagielski 	m_bIsBookmarkMenu	= sal_True;
2069*b1cdbd2cSJim Jagielski 
2070*b1cdbd2cSJim Jagielski     rtl::OUString aModuleIdentifier;
2071*b1cdbd2cSJim Jagielski     m_xPopupMenuControllerFactory = frame::PopupMenuControllerFactory::create(
2072*b1cdbd2cSJim Jagielski         ::comphelper::getProcessComponentContext());
2073*b1cdbd2cSJim Jagielski 
2074*b1cdbd2cSJim Jagielski 	const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings();
2075*b1cdbd2cSJim Jagielski 	m_bWasHiContrast	= rSettings.GetHighContrastMode();
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski     Reference< XStatusListener > xStatusListener;
2078*b1cdbd2cSJim Jagielski     Reference< XDispatch > xDispatch;
2079*b1cdbd2cSJim Jagielski 	sal_uInt16 nItemCount = pAddonMenu->GetItemCount();
2080*b1cdbd2cSJim Jagielski     ::rtl::OUString aItemCommand;
2081*b1cdbd2cSJim Jagielski     m_aMenuItemHandlerVector.reserve(nItemCount);
2082*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < nItemCount; i++ )
2083*b1cdbd2cSJim Jagielski 	{
2084*b1cdbd2cSJim Jagielski         sal_uInt16 nItemId = FillItemCommand(aItemCommand,pAddonMenu, i );
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 		PopupMenu* pPopupMenu = pAddonMenu->GetPopupMenu( nItemId );
2087*b1cdbd2cSJim Jagielski 		if ( pPopupMenu )
2088*b1cdbd2cSJim Jagielski 		{
2089*b1cdbd2cSJim Jagielski 			// #110897#
2090*b1cdbd2cSJim Jagielski 			Reference< XDispatchProvider > xDispatchProvider;
2091*b1cdbd2cSJim Jagielski             MenuBarManager* pSubMenuManager = new MenuBarManager( getServiceFactory(), rFrame, m_xURLTransformer,xDispatchProvider, aModuleIdentifier, pPopupMenu, _bHandlePopUp ? sal_False : bDeleteChildren, _bHandlePopUp ? sal_False : bDeleteChildren );
2092*b1cdbd2cSJim Jagielski 
2093*b1cdbd2cSJim Jagielski 		    Reference< XStatusListener > xSubMenuManager( static_cast< OWeakObject *>( pSubMenuManager ), UNO_QUERY );
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski 		    // store menu item command as we later have to know which menu is active (see Acivate handler)
2096*b1cdbd2cSJim Jagielski 		    pSubMenuManager->m_aMenuItemCommand = aItemCommand;
2097*b1cdbd2cSJim Jagielski 
2098*b1cdbd2cSJim Jagielski 		    MenuItemHandler* pMenuItemHandler = new MenuItemHandler(
2099*b1cdbd2cSJim Jagielski 													    nItemId,
2100*b1cdbd2cSJim Jagielski 													    xSubMenuManager,
2101*b1cdbd2cSJim Jagielski 													    xDispatch );
2102*b1cdbd2cSJim Jagielski             m_aMenuItemHandlerVector.push_back( pMenuItemHandler );
2103*b1cdbd2cSJim Jagielski 		}
2104*b1cdbd2cSJim Jagielski 		else
2105*b1cdbd2cSJim Jagielski 		{
2106*b1cdbd2cSJim Jagielski 			if ( pAddonMenu->GetItemType( i ) != MENUITEM_SEPARATOR )
2107*b1cdbd2cSJim Jagielski 			{
2108*b1cdbd2cSJim Jagielski 				MenuConfiguration::Attributes* pAddonAttributes = (MenuConfiguration::Attributes *)(pAddonMenu->GetUserValue( nItemId ));
2109*b1cdbd2cSJim Jagielski 				MenuItemHandler* pMenuItemHandler = new MenuItemHandler( nItemId, xStatusListener, xDispatch );
2110*b1cdbd2cSJim Jagielski 
2111*b1cdbd2cSJim Jagielski 				if ( pAddonAttributes )
2112*b1cdbd2cSJim Jagielski 				{
2113*b1cdbd2cSJim Jagielski 					// read additional attributes from attributes struct and AddonMenu implementation will delete all attributes itself!!
2114*b1cdbd2cSJim Jagielski 					pMenuItemHandler->aTargetFrame = pAddonAttributes->aTargetFrame;
2115*b1cdbd2cSJim Jagielski 				}
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski                 pMenuItemHandler->aMenuItemURL = aItemCommand;
2118*b1cdbd2cSJim Jagielski                 if ( _bHandlePopUp )
2119*b1cdbd2cSJim Jagielski                 {
2120*b1cdbd2cSJim Jagielski                     // Check if we have to create a popup menu for a uno based popup menu controller.
2121*b1cdbd2cSJim Jagielski                     // We have to set an empty popup menu into our menu structure so the controller also
2122*b1cdbd2cSJim Jagielski                     // works with inplace OLE.
2123*b1cdbd2cSJim Jagielski                     if ( m_xPopupMenuControllerFactory.is() &&
2124*b1cdbd2cSJim Jagielski                         m_xPopupMenuControllerFactory->hasController( aItemCommand, rtl::OUString() ))
2125*b1cdbd2cSJim Jagielski                     {
2126*b1cdbd2cSJim Jagielski                         VCLXPopupMenu* pVCLXPopupMenu = new VCLXPopupMenu;
2127*b1cdbd2cSJim Jagielski                         PopupMenu* pCtlPopupMenu = (PopupMenu *)pVCLXPopupMenu->GetMenu();
2128*b1cdbd2cSJim Jagielski                         pAddonMenu->SetPopupMenu( pMenuItemHandler->nItemId, pCtlPopupMenu );
2129*b1cdbd2cSJim Jagielski                         pMenuItemHandler->xPopupMenu = Reference< com::sun::star::awt::XPopupMenu >( (OWeakObject *)pVCLXPopupMenu, UNO_QUERY );
2130*b1cdbd2cSJim Jagielski 
2131*b1cdbd2cSJim Jagielski                     }
2132*b1cdbd2cSJim Jagielski                 }
2133*b1cdbd2cSJim Jagielski 				m_aMenuItemHandlerVector.push_back( pMenuItemHandler );
2134*b1cdbd2cSJim Jagielski 			}
2135*b1cdbd2cSJim Jagielski 		}
2136*b1cdbd2cSJim Jagielski 	}
2137*b1cdbd2cSJim Jagielski 
2138*b1cdbd2cSJim Jagielski 	SetHdl();
2139*b1cdbd2cSJim Jagielski }
2140*b1cdbd2cSJim Jagielski 
SetHdl()2141*b1cdbd2cSJim Jagielski void MenuBarManager::SetHdl()
2142*b1cdbd2cSJim Jagielski {
2143*b1cdbd2cSJim Jagielski 	m_pVCLMenu->SetHighlightHdl( LINK( this, MenuBarManager, Highlight ));
2144*b1cdbd2cSJim Jagielski 	m_pVCLMenu->SetActivateHdl( LINK( this, MenuBarManager, Activate ));
2145*b1cdbd2cSJim Jagielski 	m_pVCLMenu->SetDeactivateHdl( LINK( this, MenuBarManager, Deactivate ));
2146*b1cdbd2cSJim Jagielski 	m_pVCLMenu->SetSelectHdl( LINK( this, MenuBarManager, Select ));
2147*b1cdbd2cSJim Jagielski 
2148*b1cdbd2cSJim Jagielski     if ( !m_xURLTransformer.is() && mxServiceFactory.is() )
2149*b1cdbd2cSJim Jagielski         m_xURLTransformer.set( mxServiceFactory->createInstance(
2150*b1cdbd2cSJim Jagielski                                                                 SERVICENAME_URLTRANSFORMER),
2151*b1cdbd2cSJim Jagielski                                                              UNO_QUERY );
2152*b1cdbd2cSJim Jagielski }
2153*b1cdbd2cSJim Jagielski 
2154*b1cdbd2cSJim Jagielski }
2155