diff options
author | Maxim Monastirsky <momonasmon@gmail.com> | 2020-09-07 11:59:25 +0300 |
---|---|---|
committer | Maxim Monastirsky <momonasmon@gmail.com> | 2020-09-07 15:10:31 +0200 |
commit | f1a7b8275e9c301bbfa3a7a0df3a5209ca3cff62 (patch) | |
tree | e8aedd7c5968babb590c3e2e7bf34d82943666ba /framework | |
parent | 00cffc20e40b2412c7e9867eed24c9834504e24f (diff) |
Pass correct module id and dispatch provider to the window menu
This matters in a merged menu bar (e.g. insert chart), where the
Window menu belongs to the container rather than to the embedded
object. (Same as for the File menu, see also commit
94a7a71b070d3911b39d1026ba266768b71ba8a6 - "MenuBarManager:
Actually use xPopupMenuDispatchProvider".)
Change-Id: Ia502674b778554378546f5629ea44bbb17c830ea
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102158
Tested-by: Jenkins
Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com>
Diffstat (limited to 'framework')
-rw-r--r-- | framework/inc/uielement/menubarmanager.hxx | 4 | ||||
-rw-r--r-- | framework/source/uielement/menubarmanager.cxx | 37 | ||||
-rw-r--r-- | framework/source/uielement/resourcemenucontroller.cxx | 11 |
3 files changed, 30 insertions, 22 deletions
diff --git a/framework/inc/uielement/menubarmanager.hxx b/framework/inc/uielement/menubarmanager.hxx index 67f5d95dd87c..9cb47eedc7d3 100644 --- a/framework/inc/uielement/menubarmanager.hxx +++ b/framework/inc/uielement/menubarmanager.hxx @@ -162,7 +162,9 @@ class MenuBarManager final : static void MergeAddonMenus( Menu* pMenuBar, const MergeMenuInstructionContainer&, const OUString& aModuleIdentifier ); MenuItemHandler* GetMenuItemHandler( sal_uInt16 nItemId ); - bool CreatePopupMenuController( MenuItemHandler* pMenuItemHandler ); + bool CreatePopupMenuController( MenuItemHandler* pMenuItemHandler, + const css::uno::Reference< css::frame::XDispatchProvider >& rDispatchProvider, + const OUString& rModuleIdentifier ); void AddMenu(MenuBarManager* pSubMenuManager,const OUString& _sItemCommand,sal_uInt16 _nItemId); sal_uInt16 FillItemCommand(OUString& _rItemCommand, Menu* _pMenu,sal_uInt16 _nIndex) const; void SetHdl(); diff --git a/framework/source/uielement/menubarmanager.cxx b/framework/source/uielement/menubarmanager.cxx index 6bcee628e1df..46e32ae1f2a2 100644 --- a/framework/source/uielement/menubarmanager.cxx +++ b/framework/source/uielement/menubarmanager.cxx @@ -43,7 +43,7 @@ #include <com/sun/star/util/URLTransformer.hpp> #include <comphelper/processfactory.hxx> -#include <comphelper/propertyvalue.hxx> +#include <comphelper/propertysequence.hxx> #include <svtools/menuoptions.hxx> #include <svtools/javainteractionhandler.hxx> #include <uno/current_context.hxx> @@ -683,7 +683,7 @@ IMPL_LINK( MenuBarManager, Activate, Menu *, pMenu, bool ) m_xPopupMenuControllerFactory->hasController( menuItemHandler->aMenuItemURL, m_aModuleIdentifier ) ) { if( xMenuItemDispatch.is() || menuItemHandler->aMenuItemURL != ".uno:RecentFileList" ) - bPopupMenu = CreatePopupMenuController(menuItemHandler.get()); + bPopupMenu = CreatePopupMenuController(menuItemHandler.get(), m_xDispatchProvider, m_aModuleIdentifier); } else if ( menuItemHandler->xPopupMenuController.is() ) { @@ -880,7 +880,9 @@ OUString MenuBarManager::RetrieveLabelFromCommand(const OUString& rCmdURL) return vcl::CommandInfoProvider::GetMenuLabelForCommand(aProperties); } -bool MenuBarManager::CreatePopupMenuController( MenuItemHandler* pMenuItemHandler ) +bool MenuBarManager::CreatePopupMenuController( MenuItemHandler* pMenuItemHandler, + const css::uno::Reference< css::frame::XDispatchProvider >& rDispatchProvider, + const OUString& rModuleIdentifier ) { OUString aItemCommand( pMenuItemHandler->aMenuItemURL ); @@ -888,10 +890,12 @@ bool MenuBarManager::CreatePopupMenuController( MenuItemHandler* pMenuItemHandle if ( !m_xPopupMenuControllerFactory.is() ) return false; - Sequence< Any > aSeq( 3 ); - aSeq[0] <<= comphelper::makePropertyValue( "ModuleIdentifier", m_aModuleIdentifier ); - aSeq[1] <<= comphelper::makePropertyValue( "Frame", m_xFrame ); - aSeq[2] <<= comphelper::makePropertyValue( "InToolbar", !m_bHasMenuBar ); + auto aSeq( comphelper::InitAnyPropertySequence( { + { "DispatchProvider", makeAny(rDispatchProvider) }, + { "ModuleIdentifier", makeAny(rModuleIdentifier) }, + { "Frame", makeAny(m_xFrame) }, + { "InToolbar", makeAny(!m_bHasMenuBar) } + } ) ); Reference< XPopupMenuController > xPopupMenuController( m_xPopupMenuControllerFactory->createInstanceWithArgumentsAndContext( @@ -992,8 +996,14 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF pMenu->SetHelpCommand( nItemId, "" ); } + // Retrieve possible attributes struct + Reference< XDispatchProvider > xPopupMenuDispatchProvider( rDispatchProvider ); + MenuAttributes* pAttributes = static_cast<MenuAttributes *>(pMenu->GetUserValue( nItemId )); + if ( pAttributes ) + xPopupMenuDispatchProvider = pAttributes->xDispatchProvider; + if ( m_xPopupMenuControllerFactory.is() && - m_xPopupMenuControllerFactory->hasController( aItemCommand, m_aModuleIdentifier ) + m_xPopupMenuControllerFactory->hasController( aItemCommand, aModuleIdentifier ) ) { // Check if we have to create a popup menu for a uno based popup menu controller. @@ -1007,20 +1017,13 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF if ( bAccessibilityEnabled || pMenu->IsMenuBar()) { - if ( CreatePopupMenuController( pItemHandler )) + if ( CreatePopupMenuController( pItemHandler, xPopupMenuDispatchProvider, aModuleIdentifier )) pItemHandler->xPopupMenuController->updatePopupMenu(); } lcl_CheckForChildren(pMenu, nItemId); } else { - Reference< XDispatchProvider > xPopupMenuDispatchProvider( rDispatchProvider ); - - // Retrieve possible attributes struct - MenuAttributes* pAttributes = static_cast<MenuAttributes *>(pMenu->GetUserValue( nItemId )); - if ( pAttributes ) - xPopupMenuDispatchProvider = pAttributes->xDispatchProvider; - // Check if this is the tools menu. Add menu item if needed if ( aItemCommand == aCmdToolsMenu && AddonMenuManager::HasAddonMenuElements() ) { @@ -1068,7 +1071,7 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF pMenu->SetPopupMenu( pItemHandler->nItemId, pPopupMenu ); pItemHandler->xPopupMenu = pVCLXPopupMenu; - if ( bAccessibilityEnabled && CreatePopupMenuController( pItemHandler.get() ) ) + if ( bAccessibilityEnabled && CreatePopupMenuController( pItemHandler.get(), m_xDispatchProvider, m_aModuleIdentifier ) ) { pItemHandler->xPopupMenuController->updatePopupMenu(); } diff --git a/framework/source/uielement/resourcemenucontroller.cxx b/framework/source/uielement/resourcemenucontroller.cxx index 6b10e152909b..d28e51c1fc2d 100644 --- a/framework/source/uielement/resourcemenucontroller.cxx +++ b/framework/source/uielement/resourcemenucontroller.cxx @@ -73,6 +73,7 @@ private: bool m_bToolbarContainer; sal_uInt16 m_nNewMenuId; rtl::Reference< framework::MenuBarManager > m_xMenuBarManager; + css::uno::Reference< css::frame::XDispatchProvider > m_xDispatchProvider; css::uno::Reference< css::container::XIndexAccess > m_xMenuContainer; css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager; void addVerbs( const css::uno::Sequence< css::embed::VerbDescriptor >& rVerbs ); @@ -114,6 +115,8 @@ ResourceMenuController::ResourceMenuController( const css::uno::Reference< css:: aPropValue.Value >>= m_xFrame; else if ( aPropValue.Name == "ModuleIdentifier" ) aPropValue.Value >>= m_aModuleName; + else if ( aPropValue.Name == "DispatchProvider" ) + aPropValue.Value >>= m_xDispatchProvider; else if ( aPropValue.Name == "IsContextMenu" ) aPropValue.Value >>= m_bContextMenu; else if ( aPropValue.Name == "InToolbar" ) @@ -222,8 +225,7 @@ void ResourceMenuController::updatePopupMenu() m_nNewMenuId = 1; // Now fill the menu with the configuration data. - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY ); - framework::MenuBarManager::FillMenu( m_nNewMenuId, comphelper::getUnoTunnelImplementation<VCLXMenu>( m_xPopupMenu )->GetMenu(), m_aModuleName, m_xMenuContainer, xDispatchProvider ); + framework::MenuBarManager::FillMenu( m_nNewMenuId, comphelper::getUnoTunnelImplementation<VCLXMenu>( m_xPopupMenu )->GetMenu(), m_aModuleName, m_xMenuContainer, m_xDispatchProvider ); // For context menus, add object verbs. if ( m_bContextMenu ) @@ -231,6 +233,7 @@ void ResourceMenuController::updatePopupMenu() css::util::URL aObjectMenuURL; aObjectMenuURL.Complete = ".uno:ObjectMenue"; m_xURLTransformer->parseStrict( aObjectMenuURL ); + css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY ); css::uno::Reference< css::frame::XDispatch > xDispatch( xDispatchProvider->queryDispatch( aObjectMenuURL, OUString(), 0 ) ); if ( xDispatch.is() ) { @@ -277,9 +280,8 @@ void ResourceMenuController::itemActivated( const css::awt::MenuEvent& /*rEvent* if ( !m_xMenuBarManager.is() ) { VCLXMenu* pAwtMenu = comphelper::getUnoTunnelImplementation<VCLXMenu>( m_xPopupMenu ); - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY ); m_xMenuBarManager.set( new framework::MenuBarManager( - m_xContext, m_xFrame, m_xURLTransformer, xDispatchProvider, m_aModuleName, pAwtMenu->GetMenu(), false, !m_bContextMenu && !m_bInToolbar ) ); + m_xContext, m_xFrame, m_xURLTransformer, m_xDispatchProvider, m_aModuleName, pAwtMenu->GetMenu(), false, !m_bContextMenu && !m_bInToolbar ) ); m_xFrame->addFrameActionListener( m_xMenuBarManager.get() ); } } @@ -335,6 +337,7 @@ void ResourceMenuController::disposing() m_xConfigManager.clear(); m_xModuleConfigManager.clear(); m_xMenuContainer.clear(); + m_xDispatchProvider.clear(); if ( m_xMenuBarManager.is() ) { m_xMenuBarManager->dispose(); |