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