sfx2/source/control/dispatch.cxx |   99 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)

New commits:
commit d57994a20b012c67db47d488409ee14fb11b9751
Author: Pranav Kant <pran...@collabora.com>
Date:   Mon Apr 11 17:03:45 2016 +0530

    lok context menu: Include uno commands for submenus too
    
    Change-Id: I4ba49ba94a3270a5d53754320e5fbd49e3f5c848

diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx
index 0b9555a..e578d2d 100644
--- a/sfx2/source/control/dispatch.cxx
+++ b/sfx2/source/control/dispatch.cxx
@@ -26,6 +26,8 @@
 #include <stdarg.h>
 #include <stdlib.h>
 
+#include <boost/property_tree/json_parser.hpp>
+
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
 #include <com/sun/star/frame/XLayoutManager.hpp>
@@ -140,6 +142,103 @@ struct SfxDispatcher_Impl
     std::deque< std::deque<SfxToDo_Impl> > aToDoCopyStack;
 };
 
+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;
+    }
+
+} // end anonymous namespace
+
+
 /** This method checks if the stack of the SfxDispatchers is flushed, or if
     push- or pop- commands are pending.
 */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to