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