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