summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorMaxim Monastirsky <momonasmon@gmail.com>2020-09-07 11:59:25 +0300
committerMaxim Monastirsky <momonasmon@gmail.com>2020-09-07 15:10:31 +0200
commitf1a7b8275e9c301bbfa3a7a0df3a5209ca3cff62 (patch)
treee8aedd7c5968babb590c3e2e7bf34d82943666ba /framework
parent00cffc20e40b2412c7e9867eed24c9834504e24f (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.hxx4
-rw-r--r--framework/source/uielement/menubarmanager.cxx37
-rw-r--r--framework/source/uielement/resourcemenucontroller.cxx11
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();