include/sfx2/dispatch.hxx | 3 -- sfx2/source/control/dispatch.cxx | 4 +-- sfx2/source/notebookbar/SfxNotebookBar.cxx | 31 +++++++++++++++++++++++++---- 3 files changed, 30 insertions(+), 8 deletions(-)
New commits: commit c3e6d12301b42a44bd0d4584005686e324533b60 Author: Maxim Monastirsky <momonas...@gmail.com> Date: Thu Jan 19 11:20:25 2017 +0200 Using SfxDispatcher was not that good idea after all Being a context menu it will append verbs if OLE object is selected. Also most existing clients of context menu interception check only current selection context, not the menu URL (because it didn't work prior to 5.2, see release notes), so again we might get unwanted items. For now, just instantiate the menu controller directly. Change-Id: Idfca6a81c12bfb6623805d5337e313eb8611f4bc diff --git a/include/sfx2/dispatch.hxx b/include/sfx2/dispatch.hxx index 92d0b42..a172ced 100644 --- a/include/sfx2/dispatch.hxx +++ b/include/sfx2/dispatch.hxx @@ -148,8 +148,7 @@ public: SfxViewFrame* GetFrame() const; SfxModule* GetModule() const; - void ExecutePopup( const OUString &rResName, vcl::Window *pWin = nullptr, const Point *pPos = nullptr, - PopupMenuFlags nFlags = PopupMenuFlags::ExecuteDown ); + void ExecutePopup( const OUString &rResName, vcl::Window *pWin = nullptr, const Point *pPos = nullptr ); static void ExecutePopup( vcl::Window *pWin = nullptr, const Point *pPosPixel = nullptr ); bool IsAppDispatcher() const; diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx index fefdf6a..b56fa9c 100644 --- a/sfx2/source/control/dispatch.cxx +++ b/sfx2/source/control/dispatch.cxx @@ -1942,7 +1942,7 @@ void SfxDispatcher::ExecutePopup( vcl::Window *pWin, const Point *pPos ) } } -void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, const Point* pPos, PopupMenuFlags nFlags ) +void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, const Point* pPos ) { css::uno::Sequence< css::uno::Any > aArgs( 3 ); aArgs[0] <<= comphelper::makePropertyValue( "Value", rResName ); @@ -1987,7 +1987,7 @@ void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, c OUString aMenuURL = "private:resource/popupmenu/" + rResName; if (pVCLMenu && GetFrame()->GetViewShell()->TryContextMenuInterception(*pVCLMenu, aMenuURL, aEvent)) { - pVCLMenu->Execute(pWindow, Rectangle(aPos, aPos), nFlags); + pVCLMenu->Execute(pWindow, aPos); } } diff --git a/sfx2/source/notebookbar/SfxNotebookBar.cxx b/sfx2/source/notebookbar/SfxNotebookBar.cxx index 203c0f9..2ced9f9 100644 --- a/sfx2/source/notebookbar/SfxNotebookBar.cxx +++ b/sfx2/source/notebookbar/SfxNotebookBar.cxx @@ -11,11 +11,13 @@ #include <sfx2/dispatch.hxx> #include <sfx2/notebookbar/SfxNotebookBar.hxx> #include <unotools/viewoptions.hxx> +#include <toolkit/awt/vclxmenu.hxx> #include <vcl/notebookbar.hxx> #include <vcl/syswin.hxx> #include <vcl/tabctrl.hxx> #include <sfx2/viewfrm.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/propertyvalue.hxx> #include <com/sun/star/ui/ContextChangeEventMultiplexer.hpp> #include <com/sun/star/ui/XContextChangeEventMultiplexer.hpp> #include <com/sun/star/util/URLTransformer.hpp> @@ -23,6 +25,7 @@ #include <officecfg/Office/UI/Notebookbar.hxx> #include <com/sun/star/frame/XModuleManager.hpp> #include <com/sun/star/frame/ModuleManager.hpp> +#include <com/sun/star/frame/XPopupMenuController.hpp> #include <unotools/confignode.hxx> #include <comphelper/types.hxx> @@ -336,12 +339,32 @@ void SfxNotebookBar::RemoveListeners(SystemWindow* pSysWindow) IMPL_STATIC_LINK(SfxNotebookBar, OpenNotebookbarPopupMenu, NotebookBar*, pNotebookbar, void) { SfxViewFrame* pViewFrame = SfxViewFrame::Current(); - SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : nullptr; - if (pNotebookbar && pDispatcher) + if (pNotebookbar && pViewFrame) { + css::uno::Sequence<css::uno::Any> aArgs { + css::uno::makeAny(comphelper::makePropertyValue("Value", OUString("notebookbar"))), + css::uno::makeAny(comphelper::makePropertyValue("Frame", pViewFrame->GetFrame().GetFrameInterface())) }; + + css::uno::Reference<css::uno::XComponentContext> xContext = comphelper::getProcessComponentContext(); + css::uno::Reference<css::frame::XPopupMenuController> xPopupController( + xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.framework.ResourceMenuController", aArgs, xContext), css::uno::UNO_QUERY); + + css::uno::Reference<css::awt::XPopupMenu> xPopupMenu(xContext->getServiceManager()->createInstanceWithContext( + "com.sun.star.awt.PopupMenu", xContext), css::uno::UNO_QUERY); + + if (!xPopupController.is() || !xPopupMenu.is()) + return; + + xPopupController->setPopupMenu(xPopupMenu); + VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation(xPopupMenu); + PopupMenu* pVCLMenu = static_cast<PopupMenu*>(pAwtMenu->GetMenu()); Point aPos(0, NotebookbarTabControl::GetHeaderHeight()); - pDispatcher->ExecutePopup("notebookbar", pNotebookbar, &aPos, - PopupMenuFlags::ExecuteDown|PopupMenuFlags::NoMouseUpClose); + pVCLMenu->Execute(pNotebookbar, Rectangle(aPos, aPos),PopupMenuFlags::ExecuteDown|PopupMenuFlags::NoMouseUpClose); + + css::uno::Reference<css::lang::XComponent> xComponent(xPopupController, css::uno::UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits