diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-01-27 14:49:29 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-01-27 18:26:32 +0100 |
commit | a951590bfb8d161096d87dbc953552f653318e92 (patch) | |
tree | c35cc0e0c8f21a85b873112edab3892d21a98996 /sfx2/source | |
parent | 40456ff3d26c7edc2eb49c14077b2cbfa492af3c (diff) |
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 <caolanm@redhat.com>
Diffstat (limited to 'sfx2/source')
-rw-r--r-- | sfx2/source/control/dispatch.cxx | 199 |
1 files changed, 104 insertions, 95 deletions
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: */ |