summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/app/customweld.cxx2
-rw-r--r--vcl/source/app/salvtables.cxx76
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx109
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)