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