diff options
-rw-r--r-- | extras/source/glade/libreoffice-catalog.xml.in | 3 | ||||
-rw-r--r-- | include/toolkit/awt/vclxmenu.hxx | 1 | ||||
-rw-r--r-- | include/vcl/button.hxx | 1 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu | 4 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/notebookbar.ui | 2 | ||||
-rw-r--r-- | sc/uiconfig/scalc/ui/notebookbar_groups.ui | 120 | ||||
-rw-r--r-- | svtools/Library_svt.mk | 1 | ||||
-rw-r--r-- | svtools/source/control/managedmenubutton.cxx | 122 | ||||
-rw-r--r-- | toolkit/source/awt/vclxmenu.cxx | 7 | ||||
-rw-r--r-- | vcl/source/window/builder.cxx | 13 |
10 files changed, 170 insertions, 104 deletions
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in index 82f9ab484240..b842df22279d 100644 --- a/extras/source/glade/libreoffice-catalog.xml.in +++ b/extras/source/glade/libreoffice-catalog.xml.in @@ -850,5 +850,8 @@ <glade-widget-class title="Vertical box hiding childs depending on context" name="sfxlo-ContextVBox" generic-name="ContextVBox" parent="GtkBox" icon-name="widget-gtk-box"/> + <glade-widget-class title="Managed Menu Button" name="svtlo-ManagedMenuButton" + generic-name="ManagedMenuButton" parent="GtkButton" + icon-name="widget-gtk-button"/> </glade-widget-classes> </glade-catalog> diff --git a/include/toolkit/awt/vclxmenu.hxx b/include/toolkit/awt/vclxmenu.hxx index afdd52b94333..e678d8b5d945 100644 --- a/include/toolkit/awt/vclxmenu.hxx +++ b/include/toolkit/awt/vclxmenu.hxx @@ -71,6 +71,7 @@ protected: DECL_LINK( MenuEventListener, VclMenuEvent&, void ); void ImplCreateMenu( bool bPopup ); + void ImplAddListener(); public: VCLXMenu(); diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx index d8588dca30f5..b511db38f67c 100644 --- a/include/vcl/button.hxx +++ b/include/vcl/button.hxx @@ -76,6 +76,7 @@ public: /// Setup handler for UNO commands so that commands like .uno:Something are handled automagically by this button. void SetCommandHandler(const OUString& aCommand); + const OUString GetCommand() const { return maCommand; } static OUString GetStandardText( StandardButtonType eButton ); diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu index 3621837a8f27..5ac0c6cbc821 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu @@ -2189,7 +2189,7 @@ </node> <node oor:name=".uno:ColumnOperations" oor:op="replace"> <prop oor:name="Label" oor:type="xs:string"> - <value xml:lang="en-US">Column Operations</value> + <value xml:lang="en-US">Column</value> </prop> <prop oor:name="Properties" oor:type="xs:int"> <value>1</value> @@ -2197,7 +2197,7 @@ </node> <node oor:name=".uno:RowOperations" oor:op="replace"> <prop oor:name="Label" oor:type="xs:string"> - <value xml:lang="en-US">Row Operations</value> + <value xml:lang="en-US">Row</value> </prop> <prop oor:name="Properties" oor:type="xs:int"> <value>1</value> diff --git a/sc/uiconfig/scalc/ui/notebookbar.ui b/sc/uiconfig/scalc/ui/notebookbar.ui index 8772510c20aa..f922d4ba7a2a 100644 --- a/sc/uiconfig/scalc/ui/notebookbar.ui +++ b/sc/uiconfig/scalc/ui/notebookbar.ui @@ -1381,7 +1381,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="GtkButton" id="ConditionalFormatMenu"> + <object class="svtlo-ManagedMenuButton" id="ConditionalFormatMenu"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> diff --git a/sc/uiconfig/scalc/ui/notebookbar_groups.ui b/sc/uiconfig/scalc/ui/notebookbar_groups.ui index 5011d96a80c0..a23f08d47ad7 100644 --- a/sc/uiconfig/scalc/ui/notebookbar_groups.ui +++ b/sc/uiconfig/scalc/ui/notebookbar_groups.ui @@ -148,6 +148,7 @@ <object class="GtkMenuItem" id="stylemenudefault"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Default&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Default</property> <property name="use_underline">True</property> </object> @@ -162,6 +163,7 @@ <object class="GtkMenuItem" id="stylemenuacc1"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Accent%201&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Accent 1</property> <property name="use_underline">True</property> </object> @@ -170,6 +172,7 @@ <object class="GtkMenuItem" id="stylemenuacc2"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Accent%202&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Accent 2</property> <property name="use_underline">True</property> </object> @@ -178,6 +181,7 @@ <object class="GtkMenuItem" id="stylemenuacc3"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Accent%203&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Accent 3</property> <property name="use_underline">True</property> </object> @@ -192,6 +196,7 @@ <object class="GtkMenuItem" id="stylemenuhed1"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Heading%201&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Heading 1</property> <property name="use_underline">True</property> </object> @@ -200,6 +205,7 @@ <object class="GtkMenuItem" id="stylemenuhed2"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Heading%202&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Heading 2</property> <property name="use_underline">True</property> </object> @@ -214,6 +220,7 @@ <object class="GtkMenuItem" id="stylemenustatg"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Good&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Good</property> <property name="use_underline">True</property> </object> @@ -222,6 +229,7 @@ <object class="GtkMenuItem" id="stylemenustatn"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Neutral&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Neutral</property> <property name="use_underline">True</property> </object> @@ -230,6 +238,7 @@ <object class="GtkMenuItem" id="stylemenustatb"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Bad&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Bad</property> <property name="use_underline">True</property> </object> @@ -238,6 +247,7 @@ <object class="GtkMenuItem" id="stylemenustatw"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Warning&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Warning</property> <property name="use_underline">True</property> </object> @@ -246,6 +256,7 @@ <object class="GtkMenuItem" id="stylemenustate"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Error&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Error</property> <property name="use_underline">True</property> </object> @@ -260,6 +271,7 @@ <object class="GtkMenuItem" id="stylemenutxtn"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Note&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Note</property> <property name="use_underline">True</property> </object> @@ -268,16 +280,12 @@ <object class="GtkMenuItem" id="stylemenutxtf"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="action_name">.uno:StyleApply?Style:string=Footnote&FamilyName:string=CellStyles</property> <property name="label" translatable="yes">Footnote</property> <property name="use_underline">True</property> </object> </child> </object> - <object class="GtkImage" id="tablecolumnsi"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="pixbuf">cmd/lc_entirecolumn.png</property> - </object> <object class="GtkMenu" id="tablemenu"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -330,94 +338,6 @@ </object> </child> </object> - <object class="GtkImage" id="tablerowsi"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="pixbuf">cmd/lc_entirerow.png</property> - </object> - <object class="GtkMenu" id="tcolumnmenu"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - <object class="GtkMenu" id="trowmenu"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkMenuItem" id="rowmenuaddup"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:InsertRowsBefore</property> - <property name="label" translatable="yes">Insert Rows Above</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenuadddown"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:InsertRowsAfter</property> - <property name="label" translatable="yes">Insert Rows Below</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="rowmenusep1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenudel"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:DeleteRows</property> - <property name="label" translatable="yes">Delete Rows</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenuselect"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:EntireRow</property> - <property name="label" translatable="yes">Select Rows</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="rowmenusep2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenuheight"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:SetRowHeight</property> - <property name="label" translatable="yes">Row Height...</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenuoptimalrow"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:SetOptimalRowHeight</property> - <property name="label" translatable="yes">Optimal Row Height</property> - <property name="use_underline">True</property> - </object> - </child> - <child> - <object class="GtkMenuItem" id="rowmenudistribute"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="action_name">.uno:DistributeRows</property> - <property name="label" translatable="yes">Distribute Rows Evenly</property> - <property name="use_underline">True</property> - </object> - </child> - </object> <object class="GtkImage" id="undoi"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -805,7 +725,7 @@ <property name="can_focus">False</property> <property name="spacing">3</property> <child> - <object class="GtkButton" id="paragraphstyleb:stylemenu"> + <object class="svtlo-ManagedMenuButton" id="paragraphstyleb:stylemenu"> <property name="label" translatable="yes">Style</property> <property name="width_request">70</property> <property name="visible">True</property> @@ -1406,14 +1326,13 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="GtkButton" id="tablerowsb:trowmenu"> - <property name="label" translatable="yes">Row</property> + <object class="svtlo-ManagedMenuButton" id="tablerowsb"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="valign">center</property> <property name="vexpand">True</property> - <property name="image">tablerowsi</property> + <property name="action_name">.uno:RowOperations</property> <property name="relief">none</property> <property name="xalign">0</property> </object> @@ -1424,14 +1343,13 @@ </packing> </child> <child> - <object class="GtkButton" id="tablecolumnsb:tcolumnmenu"> - <property name="label" translatable="yes">Column</property> + <object class="svtlo-ManagedMenuButton" id="tablecolumnsb"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="valign">center</property> <property name="vexpand">True</property> - <property name="image">tablecolumnsi</property> + <property name="action_name">.uno:ColumnOperations</property> <property name="relief">none</property> <property name="xalign">0</property> </object> @@ -1535,7 +1453,7 @@ </packing> </child> <child> - <object class="GtkButton" id="conditionalb"> + <object class="svtlo-ManagedMenuButton" id="conditionalb"> <property name="label" translatable="yes">Conditional</property> <property name="height_request">24</property> <property name="visible">True</property> diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk index f778453846ee..2f3ca6a97a3a 100644 --- a/svtools/Library_svt.mk +++ b/svtools/Library_svt.mk @@ -122,6 +122,7 @@ $(eval $(call gb_Library_add_exception_objects,svt,\ svtools/source/control/hyperlabel \ svtools/source/control/indexentryres \ svtools/source/control/inettbc \ + svtools/source/control/managedmenubutton \ svtools/source/control/roadmap \ svtools/source/control/ruler \ svtools/source/control/scriptedtext \ diff --git a/svtools/source/control/managedmenubutton.cxx b/svtools/source/control/managedmenubutton.cxx new file mode 100644 index 000000000000..45e9d98ca1a8 --- /dev/null +++ b/svtools/source/control/managedmenubutton.cxx @@ -0,0 +1,122 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <comphelper/processfactory.hxx> +#include <comphelper/propertyvalue.hxx> +#include <toolkit/awt/vclxmenu.hxx> +#include <vcl/builderfactory.hxx> +#include <vcl/menu.hxx> +#include <vcl/menubtn.hxx> + +#include <com/sun/star/frame/theDesktop.hpp> +#include <com/sun/star/frame/ModuleManager.hpp> +#include <com/sun/star/frame/thePopupMenuControllerFactory.hpp> +#include <com/sun/star/frame/XPopupMenuController.hpp> + +namespace { + +class ManagedMenuButton : public MenuButton +{ +public: + ManagedMenuButton(vcl::Window* pParent, WinBits nStyle); + ~ManagedMenuButton() override; + + void Activate() override; + void dispose() override; + +private: + rtl::Reference<VCLXPopupMenu> m_xPopupMenu; + css::uno::Reference<css::frame::XPopupMenuController> m_xPopupController; +}; + +ManagedMenuButton::ManagedMenuButton(vcl::Window* pParent, WinBits nStyle) + : MenuButton(pParent, nStyle) +{ + SetImageAlign(ImageAlign::Left); +} + +ManagedMenuButton::~ManagedMenuButton() +{ + disposeOnce(); +} + +void ManagedMenuButton::dispose() +{ + css::uno::Reference<css::lang::XComponent> xComponent(m_xPopupController, css::uno::UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + + m_xPopupMenu.clear(); + m_xPopupController.clear(); + MenuButton::dispose(); +} + +void ManagedMenuButton::Activate() +{ + if (!GetPopupMenu()) + SetPopupMenu(VclPtr<PopupMenu>::Create()); + + MenuButton::Activate(); + + if (m_xPopupController.is()) + { + m_xPopupController->updatePopupMenu(); + return; + } + + if (!m_xPopupMenu.is()) + m_xPopupMenu.set(new VCLXPopupMenu(GetPopupMenu())); + + // FIXME: get the frame from the parent VclBuilder. + css::uno::Reference<css::uno::XComponentContext> xContext(comphelper::getProcessComponentContext()); + css::uno::Reference<css::frame::XDesktop2> xDesktop(css::frame::theDesktop::get(xContext)); + css::uno::Reference<css::frame::XFrame> xFrame(xDesktop->getActiveFrame()); + if (!xFrame.is()) + return; + + OUString aModuleName; + try + { + css::uno::Reference<css::frame::XModuleManager> xModuleManager(css::frame::ModuleManager::create(xContext)); + aModuleName = xModuleManager->identify(xFrame); + } + catch( const css::uno::Exception& ) + {} + + css::uno::Sequence<css::uno::Any> aArgs { + css::uno::makeAny(comphelper::makePropertyValue("ModuleIdentifier", aModuleName)), + css::uno::makeAny(comphelper::makePropertyValue("Frame", css::uno::makeAny(xFrame))), + css::uno::makeAny(comphelper::makePropertyValue("InToolbar", css::uno::makeAny(true))) + }; + + const OUString aCommand(GetCommand()); + if (!aCommand.isEmpty() && GetPopupMenu()->GetItemCount() == 0) + { + css::uno::Reference<css::frame::XUIControllerFactory> xPopupMenuControllerFactory = + css::frame::thePopupMenuControllerFactory::get(xContext); + + if (xPopupMenuControllerFactory->hasController(aCommand, aModuleName)) + m_xPopupController.set(xPopupMenuControllerFactory->createInstanceWithArgumentsAndContext( + aCommand, aArgs, xContext), css::uno::UNO_QUERY); + } + + // No registered controller found, use one the can handle arbitrary menus (e.g. defined in .ui file). + if (!m_xPopupController.is()) + m_xPopupController.set(xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + "com.sun.star.comp.framework.ResourceMenuController", aArgs, xContext), css::uno::UNO_QUERY); + + if (m_xPopupController.is()) + m_xPopupController->setPopupMenu(m_xPopupMenu.get()); +} + +} + +VCL_BUILDER_FACTORY_ARGS(ManagedMenuButton, WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_FLATBUTTON) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/toolkit/source/awt/vclxmenu.cxx b/toolkit/source/awt/vclxmenu.cxx index bcf081c89ee1..2650fa802cbd 100644 --- a/toolkit/source/awt/vclxmenu.cxx +++ b/toolkit/source/awt/vclxmenu.cxx @@ -79,6 +79,12 @@ void VCLXMenu::ImplCreateMenu( bool bPopup ) mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) ); } +void VCLXMenu::ImplAddListener() +{ + assert(mpMenu); + mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) ); +} + IMPL_LINK( VCLXMenu, MenuEventListener, VclMenuEvent&, rMenuEvent, void ) { DBG_ASSERT( rMenuEvent.GetMenu() && mpMenu, "Menu???" ); @@ -858,6 +864,7 @@ VCLXPopupMenu::VCLXPopupMenu() VCLXPopupMenu::VCLXPopupMenu( PopupMenu* pPopMenu ) : VCLXMenu( static_cast<Menu *>(pPopMenu) ) { + ImplAddListener(); } extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index d6225023c4fc..c627cf1a9726 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -1790,6 +1790,13 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & pFunction(xWindow, xParent, rMap); if (xWindow->GetType() == WINDOW_PUSHBUTTON) setupFromActionName(static_cast<Button*>(xWindow.get()), rMap, m_xFrame); + else if (xWindow->GetType() == WINDOW_MENUBUTTON) + { + OString sMenu = extractCustomProperty(rMap); + if (!sMenu.isEmpty()) + m_pParserState->m_aButtonMenuMaps.push_back(ButtonMenuMap(id, sMenu)); + setupFromActionName(static_cast<Button*>(xWindow.get()), rMap, m_xFrame); + } } } } @@ -2721,17 +2728,23 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, con if (rClass == "GtkMenuItem") { OUString sLabel(OStringToOUString(convertMnemonicMarkup(extractLabel(rProps)), RTL_TEXTENCODING_UTF8)); + OUString aCommand(OStringToOUString(extractActionName(rProps), RTL_TEXTENCODING_UTF8)); pParent->InsertItem(nNewId, sLabel, MenuItemBits::TEXT, rID); + pParent->SetItemCommand(nNewId, aCommand); } else if (rClass == "GtkCheckMenuItem") { OUString sLabel(OStringToOUString(convertMnemonicMarkup(extractLabel(rProps)), RTL_TEXTENCODING_UTF8)); + OUString aCommand(OStringToOUString(extractActionName(rProps), RTL_TEXTENCODING_UTF8)); pParent->InsertItem(nNewId, sLabel, MenuItemBits::CHECKABLE, rID); + pParent->SetItemCommand(nNewId, aCommand); } else if (rClass == "GtkRadioMenuItem") { OUString sLabel(OStringToOUString(convertMnemonicMarkup(extractLabel(rProps)), RTL_TEXTENCODING_UTF8)); + OUString aCommand(OStringToOUString(extractActionName(rProps), RTL_TEXTENCODING_UTF8)); pParent->InsertItem(nNewId, sLabel, MenuItemBits::CHECKABLE | MenuItemBits::RADIOCHECK, rID); + pParent->SetItemCommand(nNewId, aCommand); } else if (rClass == "GtkSeparatorMenuItem") |