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