[Libreoffice-commits] core.git: framework/inc framework/source

Maxim Monastirsky (via logerrit) logerrit at kemper.freedesktop.org
Mon Sep 7 13:11:07 UTC 2020


 framework/inc/uielement/menubarmanager.hxx            |    4 +
 framework/source/uielement/menubarmanager.cxx         |   37 +++++++++---------
 framework/source/uielement/resourcemenucontroller.cxx |   11 +++--
 3 files changed, 30 insertions(+), 22 deletions(-)

New commits:
commit f1a7b8275e9c301bbfa3a7a0df3a5209ca3cff62
Author:     Maxim Monastirsky <momonasmon at gmail.com>
AuthorDate: Mon Sep 7 11:59:25 2020 +0300
Commit:     Maxim Monastirsky <momonasmon at gmail.com>
CommitDate: Mon Sep 7 15:10:31 2020 +0200

    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 at gmail.com>

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();


More information about the Libreoffice-commits mailing list