diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-03-26 16:27:17 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-03-28 22:07:06 +0100 |
commit | 3e078e17ee2144fb976a7e6b9227152113cea0d4 (patch) | |
tree | 01faab7d3c82c5b027b42a6722700736b249a775 /vcl | |
parent | 1e2868296730d3548574f61a3c6e323aa5c0598a (diff) |
weld SfxTemplateManagerDlg
like expert configuration change the gear menu not to display a down indicator
and use CommandEvent to distinguish mouse/non-mouse context menus
Change-Id: I64bb660a9c7dacb5b90b240d9d76d29324c5fd9f
Reviewed-on: https://gerrit.libreoffice.org/69893
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/app/customweld.cxx | 2 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 76 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 109 |
3 files changed, 155 insertions, 32 deletions
diff --git a/vcl/source/app/customweld.cxx b/vcl/source/app/customweld.cxx index 058ee0b7671d..4299bcffd27b 100644 --- a/vcl/source/app/customweld.cxx +++ b/vcl/source/app/customweld.cxx @@ -80,7 +80,7 @@ IMPL_LINK_NOARG(CustomWeld, DoStyleUpdated, weld::Widget&, void) m_rWidgetController.StyleUpdated(); } -IMPL_LINK(CustomWeld, DoPopupMenu, const Point&, rPos, bool) +IMPL_LINK(CustomWeld, DoPopupMenu, const CommandEvent&, rPos, bool) { return m_rWidgetController.ContextMenu(rPos); } diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index a2746d772b30..e19f988adb29 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -726,11 +726,9 @@ namespace return Image(rDevice.GetBitmapEx(Point(), rDevice.GetOutputSizePixel())); } - void insert_to_menu(PopupMenu* pMenu, int pos, const OUString& rId, const OUString& rStr, + sal_uInt16 insert_to_menu(sal_uInt16 nLastId, PopupMenu* pMenu, int pos, const OUString& rId, const OUString& rStr, const OUString* pIconName, const VirtualDevice* pImageSurface, bool bCheck) { - const auto nCount = pMenu->GetItemCount(); - const sal_uInt16 nLastId = nCount ? pMenu->GetItemId(nCount-1) : 0; const sal_uInt16 nNewid = nLastId + 1; pMenu->InsertItem(nNewid, rStr, bCheck ? MenuItemBits::CHECKABLE : MenuItemBits::NONE, OUStringToOString(rId, RTL_TEXTENCODING_UTF8), pos == -1 ? MENU_APPEND : pos); @@ -742,6 +740,7 @@ namespace { pMenu->SetItemImage(nNewid, createImage(*pImageSurface)); } + return nNewid; } } @@ -751,12 +750,15 @@ private: VclPtr<PopupMenu> m_xMenu; bool const m_bTakeOwnership; + sal_uInt16 m_nLastId; public: SalInstanceMenu(PopupMenu* pMenu, bool bTakeOwnership) : m_xMenu(pMenu) , m_bTakeOwnership(bTakeOwnership) { + const auto nCount = m_xMenu->GetItemCount(); + m_nLastId = nCount ? pMenu->GetItemId(nCount-1) : 0; } virtual OString popup_at_rect(weld::Widget* pParent, const tools::Rectangle &rRect) override { @@ -773,17 +775,24 @@ public: { m_xMenu->CheckItem(rIdent, bActive); } - virtual void show(const OString& rIdent, bool bShow) override + virtual void set_visible(const OString& rIdent, bool bShow) override { m_xMenu->ShowItem(m_xMenu->GetItemId(rIdent), bShow); } - + virtual void clear() override + { + m_xMenu->Clear(); + } virtual void insert(int pos, const OUString& rId, const OUString& rStr, const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) override { - insert_to_menu(m_xMenu, pos, rId, rStr, pIconName, pImageSurface, bCheck); + m_nLastId = insert_to_menu(m_nLastId, m_xMenu, pos, rId, rStr, pIconName, pImageSurface, bCheck); + } + virtual void insert_separator(int pos, const OUString& rId) override + { + auto nInsertPos = pos == -1 ? MENU_APPEND : pos; + m_xMenu->InsertSeparator(rId.toUtf8(), nInsertPos); } - virtual ~SalInstanceMenu() override { if (m_bTakeOwnership) @@ -1203,6 +1212,18 @@ public: return rHorzScrollBar.GetVisibleSize(); } + virtual void hadjustment_set_page_size(int size) override + { + ScrollBar& rHorzScrollBar = m_xScrolledWindow->getHorzScrollBar(); + return rHorzScrollBar.SetVisibleSize(size); + } + + virtual void hadjustment_set_page_increment(int size) override + { + ScrollBar& rHorzScrollBar = m_xScrolledWindow->getHorzScrollBar(); + return rHorzScrollBar.SetPageSize(size); + } + virtual void set_hpolicy(VclPolicyType eHPolicy) override { WinBits nWinBits = m_xScrolledWindow->GetStyle() & ~(WB_AUTOHSCROLL|WB_HSCROLL); @@ -1286,6 +1307,18 @@ public: return rVertScrollBar.GetVisibleSize(); } + virtual void vadjustment_set_page_size(int size) override + { + ScrollBar& rVertScrollBar = m_xScrolledWindow->getVertScrollBar(); + return rVertScrollBar.SetVisibleSize(size); + } + + virtual void vadjustment_set_page_increment(int size) override + { + ScrollBar& rVertScrollBar = m_xScrolledWindow->getVertScrollBar(); + return rVertScrollBar.SetPageSize(size); + } + virtual void set_vpolicy(VclPolicyType eVPolicy) override { WinBits nWinBits = m_xScrolledWindow->GetStyle() & ~(WB_AUTOVSCROLL|WB_VSCROLL); @@ -1530,6 +1563,7 @@ class SalInstanceMenuButton : public SalInstanceButton, public virtual weld::Men { private: VclPtr<::MenuButton> m_xMenuButton; + sal_uInt16 m_nLastId; DECL_LINK(MenuSelectHdl, ::MenuButton*, void); DECL_LINK(ActivateHdl, ::MenuButton*, void); @@ -1538,9 +1572,15 @@ public: SalInstanceMenuButton(::MenuButton* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceButton(pButton, pBuilder, bTakeOwnership) , m_xMenuButton(pButton) + , m_nLastId(0) { m_xMenuButton->SetActivateHdl(LINK(this, SalInstanceMenuButton, ActivateHdl)); m_xMenuButton->SetSelectHdl(LINK(this, SalInstanceMenuButton, MenuSelectHdl)); + if (PopupMenu* pMenu = m_xMenuButton->GetPopupMenu()) + { + const auto nCount = pMenu->GetItemCount(); + m_nLastId = nCount ? pMenu->GetItemId(nCount-1) : 0; + } } virtual void set_active(bool active) override @@ -1571,7 +1611,13 @@ public: virtual void insert_item(int pos, const OUString& rId, const OUString& rStr, const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) override { - insert_to_menu(m_xMenuButton->GetPopupMenu(), pos, rId, rStr, pIconName, pImageSurface, bCheck); + m_nLastId = insert_to_menu(m_nLastId, m_xMenuButton->GetPopupMenu(), pos, rId, rStr, pIconName, pImageSurface, bCheck); + } + + virtual void insert_separator(int pos, const OUString& rId) override + { + auto nInsertPos = pos == -1 ? MENU_APPEND : pos; + m_xMenuButton->GetPopupMenu()->InsertSeparator(rId.toUtf8(), nInsertPos); } virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override @@ -1598,6 +1644,12 @@ public: pMenu->SetItemText(pMenu->GetItemId(rIdent), rText); } + virtual void set_item_visible(const OString& rIdent, bool bShow) override + { + PopupMenu* pMenu = m_xMenuButton->GetPopupMenu(); + pMenu->ShowItem(pMenu->GetItemId(rIdent), bShow); + } + virtual void set_item_help_id(const OString& rIdent, const OString& rHelpId) override { PopupMenu* pMenu = m_xMenuButton->GetPopupMenu(); @@ -3649,7 +3701,7 @@ private: DECL_LINK(KeyPressHdl, const KeyEvent&, bool); DECL_LINK(KeyReleaseHdl, const KeyEvent&, bool); DECL_LINK(StyleUpdatedHdl, VclDrawingArea&, void); - DECL_LINK(PopupMenuHdl, const Point&, bool); + DECL_LINK(PopupMenuHdl, const CommandEvent&, bool); DECL_LINK(QueryTooltipHdl, tools::Rectangle&, OUString); // SalInstanceWidget has a generic listener for all these @@ -3761,7 +3813,7 @@ public: virtual ~SalInstanceDrawingArea() override { m_xDrawingArea->SetQueryTooltipHdl(Link<tools::Rectangle&, OUString>()); - m_xDrawingArea->SetPopupMenuHdl(Link<const Point&, bool>()); + m_xDrawingArea->SetPopupMenuHdl(Link<const CommandEvent&, bool>()); m_xDrawingArea->SetStyleUpdatedHdl(Link<VclDrawingArea&, void>()); m_xDrawingArea->SetMousePressHdl(Link<const MouseEvent&, bool>()); m_xDrawingArea->SetMouseMoveHdl(Link<const MouseEvent&, bool>()); @@ -3821,9 +3873,9 @@ IMPL_LINK_NOARG(SalInstanceDrawingArea, StyleUpdatedHdl, VclDrawingArea&, void) m_aStyleUpdatedHdl.Call(*this); } -IMPL_LINK(SalInstanceDrawingArea, PopupMenuHdl, const Point&, rPos, bool) +IMPL_LINK(SalInstanceDrawingArea, PopupMenuHdl, const CommandEvent&, rEvent, bool) { - return m_aPopupMenuHdl.Call(rPos); + return m_aPopupMenuHdl.Call(rEvent); } IMPL_LINK(SalInstanceDrawingArea, QueryTooltipHdl, tools::Rectangle&, rHelpArea, OUString) diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 0235b1b0f5b6..06f0836df779 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -1321,7 +1321,7 @@ private: return pThis->signal_key(pEvent); } - virtual bool signal_popup_menu(const Point&) + virtual bool signal_popup_menu(const CommandEvent&) { return false; } @@ -1390,7 +1390,8 @@ private: if (gdk_event_triggers_context_menu(reinterpret_cast<GdkEvent*>(pEvent)) && pEvent->type == GDK_BUTTON_PRESS) { //if handled for context menu, stop processing - if (signal_popup_menu(aPos)) + CommandEvent aCEvt(aPos, CommandEventId::ContextMenu, true); + if (signal_popup_menu(aCEvt)) return true; } @@ -2150,11 +2151,8 @@ private: GtkMenuItem* pMenuItem = GTK_MENU_ITEM(pItem); if (GtkWidget* pSubMenu = gtk_menu_item_get_submenu(pMenuItem)) gtk_container_foreach(GTK_CONTAINER(pSubMenu), collect, widget); - else - { - MenuHelper* pThis = static_cast<MenuHelper*>(widget); - pThis->add_to_map(pMenuItem); - } + MenuHelper* pThis = static_cast<MenuHelper*>(widget); + pThis->add_to_map(pMenuItem); } static void signalActivate(GtkMenuItem* pItem, gpointer widget) @@ -2189,7 +2187,7 @@ public: const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pMenuItem)); OString id(pStr, pStr ? strlen(pStr) : 0); auto iter = m_aMap.find(id); - g_signal_handlers_disconnect_by_data(iter->second, this); + g_signal_handlers_disconnect_by_data(pMenuItem, this); m_aMap.erase(iter); } @@ -2246,6 +2244,17 @@ public: gtk_menu_reorder_child(m_pMenu, pItem, pos); } + void insert_separator(int pos, const OUString& rId) + { + GtkWidget* pItem = gtk_separator_menu_item_new(); + gtk_buildable_set_name(GTK_BUILDABLE(pItem), OUStringToOString(rId, RTL_TEXTENCODING_UTF8).getStr()); + gtk_menu_shell_append(GTK_MENU_SHELL(m_pMenu), pItem); + gtk_widget_show(pItem); + add_to_map(GTK_MENU_ITEM(pItem)); + if (pos != -1) + gtk_menu_reorder_child(m_pMenu, pItem, pos); + } + void remove_item(const OString& rIdent) { GtkMenuItem* pMenuItem = m_aMap[rIdent]; @@ -2280,7 +2289,7 @@ public: return get_help_id(GTK_WIDGET(m_aMap.find(rIdent)->second)); } - void show_item(const OString& rIdent, bool bShow) + void set_item_visible(const OString& rIdent, bool bShow) { GtkWidget* pWidget = GTK_WIDGET(m_aMap[rIdent]); if (bShow) @@ -2289,6 +2298,17 @@ public: gtk_widget_hide(pWidget); } + void clear_items() + { + for (auto& a : m_aMap) + { + GtkMenuItem* pMenuItem = a.second; + g_signal_handlers_disconnect_by_data(pMenuItem, this); + gtk_widget_destroy(GTK_WIDGET(pMenuItem)); + } + m_aMap.clear(); + } + virtual ~MenuHelper() { for (auto& a : m_aMap) @@ -3339,6 +3359,16 @@ public: return gtk_adjustment_get_page_size(m_pHAdjustment); } + virtual void hadjustment_set_page_size(int size) override + { + gtk_adjustment_set_page_size(m_pHAdjustment, size); + } + + virtual void hadjustment_set_page_increment(int size) override + { + gtk_adjustment_set_page_increment(m_pHAdjustment, size); + } + virtual void set_hpolicy(VclPolicyType eHPolicy) override { GtkPolicyType eGtkVPolicy; @@ -3410,6 +3440,16 @@ public: return gtk_adjustment_get_page_size(m_pVAdjustment); } + virtual void vadjustment_set_page_size(int size) override + { + gtk_adjustment_set_page_size(m_pVAdjustment, size); + } + + virtual void vadjustment_set_page_increment(int size) override + { + gtk_adjustment_set_page_increment(m_pVAdjustment, size); + } + virtual void set_vpolicy(VclPolicyType eVPolicy) override { GtkPolicyType eGtkHPolicy; @@ -4551,6 +4591,11 @@ public: MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSurface, bCheck); } + virtual void insert_separator(int pos, const OUString& rId) override + { + MenuHelper::insert_separator(pos, rId); + } + virtual void remove_item(const OString& rId) override { MenuHelper::remove_item(rId); @@ -4571,6 +4616,11 @@ public: MenuHelper::set_item_label(rIdent, rLabel); } + virtual void set_item_visible(const OString& rIdent, bool bVisible) override + { + MenuHelper::set_item_visible(rIdent, bVisible); + } + virtual void set_item_help_id(const OString& rIdent, const OString& rHelpId) override { MenuHelper::set_item_help_id(rIdent, rHelpId); @@ -4648,6 +4698,18 @@ private: m_sActivated = OString(pStr, pStr ? strlen(pStr) : 0); } + void clear_extras() + { + if (m_aExtraItems.empty()) + return; + if (m_pTopLevelMenuButton) + { + for (auto a : m_aExtraItems) + m_pTopLevelMenuButton->remove_from_map(a); + } + m_aExtraItems.clear(); + } + public: GtkInstanceMenu(GtkMenu* pMenu, bool bTakeOwnership) : MenuHelper(pMenu, bTakeOwnership) @@ -4738,6 +4800,7 @@ public: } g_main_loop_unref(pLoop); g_signal_handler_disconnect(m_pMenu, nSignalId); + gtk_menu_detach(m_pMenu); return m_sActivated; } @@ -4752,9 +4815,20 @@ public: set_item_active(rIdent, bActive); } - virtual void show(const OString& rIdent, bool bShow) override + virtual void set_visible(const OString& rIdent, bool bShow) override + { + set_item_visible(rIdent, bShow); + } + + virtual void insert_separator(int pos, const OUString& rId) override + { + MenuHelper::insert_separator(pos, rId); + } + + virtual void clear() override { - show_item(rIdent, bShow); + clear_extras(); + clear_items(); } virtual void insert(int pos, const OUString& rId, const OUString& rStr, @@ -4806,11 +4880,7 @@ public: virtual ~GtkInstanceMenu() override { - if (m_pTopLevelMenuButton) - { - for (auto a : m_aExtraItems) - m_pTopLevelMenuButton->remove_from_map(a); - } + clear_extras(); } }; @@ -7467,9 +7537,9 @@ private: gtk_tooltip_set_tip_area(tooltip, &aGdkHelpArea); return true; } - virtual bool signal_popup_menu(const Point& rPos) override + virtual bool signal_popup_menu(const CommandEvent& rCEvt) override { - return m_aPopupMenuHdl.Call(rPos); + return m_aPopupMenuHdl.Call(rCEvt); } static gboolean signalPopupMenu(GtkWidget* pWidget, gpointer widget) { @@ -7478,7 +7548,8 @@ private: //center it when we don't know where else to use Point aPos(gtk_widget_get_allocated_width(pWidget) / 2, gtk_widget_get_allocated_height(pWidget) / 2); - return pThis->signal_popup_menu(aPos); + CommandEvent aCEvt(aPos, CommandEventId::ContextMenu, false); + return pThis->signal_popup_menu(aCEvt); } public: GtkInstanceDrawingArea(GtkDrawingArea* pDrawingArea, GtkInstanceBuilder* pBuilder, const a11yref& rA11y, bool bTakeOwnership) |