chart2/source/controller/main/ChartController_Window.cxx |    3 
 include/sfx2/dispatch.hxx                                |    4 
 sfx2/source/control/dispatch.cxx                         |  199 +++++++--------
 sw/source/uibase/uiview/viewling.cxx                     |    2 
 4 files changed, 108 insertions(+), 100 deletions(-)

New commits:
commit a951590bfb8d161096d87dbc953552f653318e92
Author:     Caolán McNamara <[email protected]>
AuthorDate: Thu Jan 27 14:49:29 2022 +0000
Commit:     Caolán McNamara <[email protected]>
CommitDate: Thu Jan 27 18:26:32 2022 +0100

    let SfxDispatcher::fillPopupMenu operate on css::awt::XPopupMenu
    
    rather than need to be passed its internal PopupMenu
    
    Change-Id: Iff1106b80b71602cf8b77361086517f0e8f11c6c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129052
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/chart2/source/controller/main/ChartController_Window.cxx 
b/chart2/source/controller/main/ChartController_Window.cxx
index 9d5a703b27a4..c63a01b337fc 100644
--- a/chart2/source/controller/main/ChartController_Window.cxx
+++ b/chart2/source/controller/main/ChartController_Window.cxx
@@ -1302,8 +1302,7 @@ void ChartController::execute_Command( const 
CommandEvent& rCEvt )
                     }
                 }
 
-                Menu* pPopupMenu = 
comphelper::getFromUnoTunnel<VCLXMenu>(xPopupMenu)->GetMenu();
-                boost::property_tree::ptree aMenu = 
SfxDispatcher::fillPopupMenu(pPopupMenu);
+                boost::property_tree::ptree aMenu = 
SfxDispatcher::fillPopupMenu(xPopupMenu);
                 boost::property_tree::ptree aRoot;
                 aRoot.add_child("menu", aMenu);
 
diff --git a/include/sfx2/dispatch.hxx b/include/sfx2/dispatch.hxx
index 6e87c89217f4..7b5e3611546e 100644
--- a/include/sfx2/dispatch.hxx
+++ b/include/sfx2/dispatch.hxx
@@ -32,7 +32,6 @@
 #include <boost/property_tree/ptree_fwd.hpp>
 #include <initializer_list>
 
-class Menu;
 class SfxSlotServer;
 class SfxRequest;
 class SfxViewFrame;
@@ -41,6 +40,7 @@ class SfxModule;
 class Point;
 struct SfxDispatcher_Impl;
 
+namespace com::sun::star::awt { class XPopupMenu; }
 namespace vcl { class Window; }
 
 enum class SfxDispatcherPopFlags
@@ -171,7 +171,7 @@ public:
     SAL_DLLPRIVATE void DoDeactivate_Impl( bool bMDI, SfxViewFrame const * 
pNew );
     SAL_DLLPRIVATE void InvalidateBindings_Impl(bool);
 
-    static boost::property_tree::ptree fillPopupMenu(Menu* pMenu);
+    static boost::property_tree::ptree 
fillPopupMenu(css::uno::Reference<css::awt::XPopupMenu>& rMenu);
 };
 
 #endif
diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx
index b0eee6eefb22..71f01cd76968 100644
--- a/sfx2/source/control/dispatch.cxx
+++ b/sfx2/source/control/dispatch.cxx
@@ -1705,6 +1705,109 @@ void SfxDispatcher::ExecutePopup( vcl::Window *pWin, 
const Point *pPos )
     }
 }
 
+namespace {
+
+boost::property_tree::ptree fillPopupMenu(Menu* pMenu)
+{
+    // Activate this menu first
+    pMenu->HandleMenuActivateEvent(pMenu);
+    pMenu->HandleMenuDeActivateEvent(pMenu);
+
+    boost::property_tree::ptree aTree;
+    // If last item inserted is some valid text
+    bool bIsLastItemText = false;
+    sal_uInt16 nCount = pMenu->GetItemCount();
+    for (sal_uInt16 nPos = 0; nPos < nCount; nPos++)
+    {
+        boost::property_tree::ptree aItemTree;
+        const MenuItemType aItemType = pMenu->GetItemType(nPos);
+
+        if (aItemType == MenuItemType::DONTKNOW)
+            continue;
+
+        if (aItemType == MenuItemType::SEPARATOR)
+        {
+            if (bIsLastItemText)
+                aItemTree.put("type", "separator");
+            bIsLastItemText = false;
+        }
+        else
+        {
+            const sal_uInt16 nItemId = pMenu->GetItemId(nPos);
+            OUString aCommandURL = pMenu->GetItemCommand(nItemId);
+
+            if (aCommandURL.isEmpty())
+            {
+                const SfxSlot *pSlot = SFX_SLOTPOOL().GetSlot(nItemId);
+                if (pSlot)
+                    aCommandURL = pSlot->GetCommandString();
+            }
+
+            const OUString aItemText = pMenu->GetItemText(nItemId);
+            Menu* pPopupSubmenu = pMenu->GetPopupMenu(nItemId);
+
+            if (!aItemText.isEmpty())
+                aItemTree.put("text", aItemText.toUtf8().getStr());
+
+            if (pPopupSubmenu)
+            {
+                boost::property_tree::ptree aSubmenu = 
::fillPopupMenu(pPopupSubmenu);
+                if (aSubmenu.empty())
+                    continue;
+
+                aItemTree.put("type", "menu");
+                if (!aCommandURL.isEmpty())
+                    aItemTree.put("command", aCommandURL.toUtf8().getStr());
+                aItemTree.push_back(std::make_pair("menu", aSubmenu));
+            }
+            else
+            {
+                // no point in exposing choices that don't have the .uno:
+                // command
+                if (aCommandURL.isEmpty())
+                    continue;
+
+                aItemTree.put("type", "command");
+                aItemTree.put("command", aCommandURL.toUtf8().getStr());
+            }
+
+            aItemTree.put("enabled", pMenu->IsItemEnabled(nItemId));
+
+            MenuItemBits aItemBits = pMenu->GetItemBits(nItemId);
+            bool bHasChecks = true;
+            if (aItemBits & MenuItemBits::CHECKABLE)
+                aItemTree.put("checktype", "checkmark");
+            else if (aItemBits & MenuItemBits::RADIOCHECK)
+                aItemTree.put("checktype", "radio");
+            else if (aItemBits & MenuItemBits::AUTOCHECK)
+                aItemTree.put("checktype", "auto");
+            else
+                bHasChecks = false;
+
+            if (bHasChecks)
+                aItemTree.put("checked", pMenu->IsItemChecked(nItemId));
+        }
+
+        if (!aItemTree.empty())
+        {
+            aTree.push_back(std::make_pair("", aItemTree));
+            if (aItemType != MenuItemType::SEPARATOR)
+                bIsLastItemText = true;
+        }
+    }
+
+    return aTree;
+}
+
+}
+
+boost::property_tree::ptree 
SfxDispatcher::fillPopupMenu(css::uno::Reference<css::awt::XPopupMenu>& 
rPopupMenu)
+{
+    VCLXMenu* pAwtMenu = comphelper::getFromUnoTunnel<VCLXMenu>(rPopupMenu);
+    PopupMenu* pVCLMenu = static_cast<PopupMenu*>(pAwtMenu->GetMenu());
+    return ::fillPopupMenu(pVCLMenu);
+}
+
 void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, 
const Point* pPos )
 {
     css::uno::Sequence< css::uno::Any > aArgs{
@@ -1735,9 +1838,7 @@ void SfxDispatcher::ExecutePopup( const OUString& 
rResName, vcl::Window* pWin, c
     xPopupController->setPopupMenu( xPopupMenu );
     if (comphelper::LibreOfficeKit::isActive())
     {
-        VCLXMenu* pAwtMenu = comphelper::getFromUnoTunnel<VCLXMenu>( 
xPopupMenu );
-        PopupMenu* pVCLMenu = static_cast< PopupMenu* >( pAwtMenu->GetMenu() );
-        boost::property_tree::ptree aMenu = fillPopupMenu(pVCLMenu);
+        boost::property_tree::ptree aMenu = fillPopupMenu(xPopupMenu);
         boost::property_tree::ptree aRoot;
         aRoot.add_child("menu", aMenu);
 
@@ -1972,96 +2073,4 @@ SfxModule* SfxDispatcher::GetModule() const
     }
 }
 
-boost::property_tree::ptree SfxDispatcher::fillPopupMenu(Menu* pMenu)
-{
-    // Activate this menu first
-    pMenu->HandleMenuActivateEvent(pMenu);
-    pMenu->HandleMenuDeActivateEvent(pMenu);
-
-    boost::property_tree::ptree aTree;
-    // If last item inserted is some valid text
-    bool bIsLastItemText = false;
-    sal_uInt16 nCount = pMenu->GetItemCount();
-    for (sal_uInt16 nPos = 0; nPos < nCount; nPos++)
-    {
-        boost::property_tree::ptree aItemTree;
-        const MenuItemType aItemType = pMenu->GetItemType(nPos);
-
-        if (aItemType == MenuItemType::DONTKNOW)
-            continue;
-
-        if (aItemType == MenuItemType::SEPARATOR)
-        {
-            if (bIsLastItemText)
-                aItemTree.put("type", "separator");
-            bIsLastItemText = false;
-        }
-        else
-        {
-            const sal_uInt16 nItemId = pMenu->GetItemId(nPos);
-            OUString aCommandURL = pMenu->GetItemCommand(nItemId);
-
-            if (aCommandURL.isEmpty())
-            {
-                const SfxSlot *pSlot = SFX_SLOTPOOL().GetSlot(nItemId);
-                if (pSlot)
-                    aCommandURL = pSlot->GetCommandString();
-            }
-
-            const OUString aItemText = pMenu->GetItemText(nItemId);
-            Menu* pPopupSubmenu = pMenu->GetPopupMenu(nItemId);
-
-            if (!aItemText.isEmpty())
-                aItemTree.put("text", aItemText.toUtf8().getStr());
-
-            if (pPopupSubmenu)
-            {
-                boost::property_tree::ptree aSubmenu = 
fillPopupMenu(pPopupSubmenu);
-                if (aSubmenu.empty())
-                    continue;
-
-                aItemTree.put("type", "menu");
-                if (!aCommandURL.isEmpty())
-                    aItemTree.put("command", aCommandURL.toUtf8().getStr());
-                aItemTree.push_back(std::make_pair("menu", aSubmenu));
-            }
-            else
-            {
-                // no point in exposing choices that don't have the .uno:
-                // command
-                if (aCommandURL.isEmpty())
-                    continue;
-
-                aItemTree.put("type", "command");
-                aItemTree.put("command", aCommandURL.toUtf8().getStr());
-            }
-
-            aItemTree.put("enabled", pMenu->IsItemEnabled(nItemId));
-
-            MenuItemBits aItemBits = pMenu->GetItemBits(nItemId);
-            bool bHasChecks = true;
-            if (aItemBits & MenuItemBits::CHECKABLE)
-                aItemTree.put("checktype", "checkmark");
-            else if (aItemBits & MenuItemBits::RADIOCHECK)
-                aItemTree.put("checktype", "radio");
-            else if (aItemBits & MenuItemBits::AUTOCHECK)
-                aItemTree.put("checktype", "auto");
-            else
-                bHasChecks = false;
-
-            if (bHasChecks)
-                aItemTree.put("checked", pMenu->IsItemChecked(nItemId));
-        }
-
-        if (!aItemTree.empty())
-        {
-            aTree.push_back(std::make_pair("", aItemTree));
-            if (aItemType != MenuItemType::SEPARATOR)
-                bIsLastItemText = true;
-        }
-    }
-
-    return aTree;
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/uiview/viewling.cxx 
b/sw/source/uibase/uiview/viewling.cxx
index 2c349138f765..93b2d5577da9 100644
--- a/sw/source/uibase/uiview/viewling.cxx
+++ b/sw/source/uibase/uiview/viewling.cxx
@@ -769,7 +769,7 @@ bool SwView::ExecSpellPopup(const Point& rPt)
                         {
                             if (SfxViewShell* pViewShell = 
SfxViewShell::Current())
                             {
-                                boost::property_tree::ptree aMenu = 
SfxDispatcher::fillPopupMenu(&xPopup->GetMenu());
+                                boost::property_tree::ptree aMenu = 
SfxDispatcher::fillPopupMenu(xMenuInterface);
                                 boost::property_tree::ptree aRoot;
                                 aRoot.add_child("menu", aMenu);
 

Reply via email to