diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-11-18 14:36:25 +0100 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2019-11-23 15:38:44 +0100 |
commit | e2294e59a1eccf231190e06c3c532dd8c18689e2 (patch) | |
tree | 344d1291c9b927c498b3cf94de7f63dcde6e97fd | |
parent | b5fc479359a14a5b9a1b634f02a9a18e80ae3d0c (diff) |
Dispatch: Make fillPopupMenu() method accessible from other modules.
No functional change.
Change-Id: Ifaa6ff038277ef5702ac38d90c7461d664b0aee4
-rw-r--r-- | include/sfx2/dispatch.hxx | 4 | ||||
-rw-r--r-- | sfx2/source/control/dispatch.cxx | 189 |
2 files changed, 96 insertions, 97 deletions
diff --git a/include/sfx2/dispatch.hxx b/include/sfx2/dispatch.hxx index 97f5dae19ecf..231d5eee1483 100644 --- a/include/sfx2/dispatch.hxx +++ b/include/sfx2/dispatch.hxx @@ -29,6 +29,8 @@ #include <o3tl/typed_flags_set.hxx> #include <o3tl/span.hxx> +#include <boost/property_tree/ptree.hpp> +#include <vcl/menu.hxx> #include <initializer_list> class SfxSlotServer; @@ -168,6 +170,8 @@ public: SAL_DLLPRIVATE void DoActivate_Impl( bool bMDI ); SAL_DLLPRIVATE void DoDeactivate_Impl( bool bMDI, SfxViewFrame const * pNew ); SAL_DLLPRIVATE void InvalidateBindings_Impl(bool); + + static boost::property_tree::ptree fillPopupMenu(Menu* pMenu); }; #endif diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx index a05abc6cb7cf..9edf43c4ecd6 100644 --- a/sfx2/source/control/dispatch.cxx +++ b/sfx2/source/control/dispatch.cxx @@ -145,103 +145,6 @@ 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. */ @@ -2077,4 +1980,96 @@ 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: */ |