summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-10-11 13:02:57 +0100
committerCaolán McNamara <caolanm@redhat.com>2019-10-13 16:16:24 +0200
commit226fcda0a888c4959b1f895de31856f1624f04ee (patch)
tree6c13e9ff0231f9f3fc744884937e3849b641773e /vcl
parentb2e5f9ead2bb7f2979afe4ba13e3950e8a3cc278 (diff)
weld ConditionalFormattingDialog
Change-Id: I87c03555c5555b12a1be997e368a96d9b07d2b63 Reviewed-on: https://gerrit.libreoffice.org/80689 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/salvtables.cxx59
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx79
2 files changed, 132 insertions, 6 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index d12c3464c75d..6cf9e010178c 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -923,14 +923,17 @@ class SalInstanceToolbar : public SalInstanceWidget, public virtual weld::Toolba
{
private:
VclPtr<ToolBox> m_xToolBox;
+ std::map<sal_uInt16, VclPtr<vcl::Window>> m_aFloats;
DECL_LINK(ClickHdl, ToolBox*, void);
+ DECL_LINK(DropdownClick, ToolBox*, void);
public:
SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership)
: SalInstanceWidget(pToolBox, pBuilder, bTakeOwnership)
, m_xToolBox(pToolBox)
{
m_xToolBox->SetSelectHdl(LINK(this, SalInstanceToolbar, ClickHdl));
+ m_xToolBox->SetDropdownClickHdl(LINK(this, SalInstanceToolbar, DropdownClick));
}
virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override
@@ -945,7 +948,19 @@ public:
virtual void set_item_active(const OString& rIdent, bool bActive) override
{
- m_xToolBox->CheckItem(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), bActive);
+ sal_uInt16 nItemId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent));
+ m_xToolBox->CheckItem(nItemId, bActive);
+
+ if (m_xToolBox->GetItemBits(nItemId) & ToolBoxItemBits::DROPDOWN)
+ {
+ auto pFloat = m_aFloats[nItemId];
+ if (!pFloat)
+ return;
+ if (bActive)
+ vcl::Window::GetDockingManager()->StartPopupMode(m_xToolBox, pFloat, FloatWinPopupFlags::GrabFocus);
+ else
+ vcl::Window::GetDockingManager()->EndPopupMode(pFloat);
+ }
}
virtual bool get_item_active(const OString& rIdent) const override
@@ -953,6 +968,17 @@ public:
return m_xToolBox->IsItemChecked(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)));
}
+ virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) override
+ {
+ SalInstanceWidget* pPopoverWidget = dynamic_cast<SalInstanceWidget*>(pPopover);
+
+ vcl::Window* pFloat = pPopoverWidget ? pPopoverWidget->getWidget() : nullptr;
+ if (pFloat)
+ pFloat->EnableDocking();
+
+ m_aFloats[m_xToolBox->GetItemId(OUString::fromUtf8(rIdent))] = pFloat;
+ }
+
virtual void insert_separator(int pos, const OUString& /*rId*/) override
{
auto nInsertPos = pos == -1 ? ToolBox::APPEND : pos;
@@ -961,6 +987,7 @@ public:
virtual ~SalInstanceToolbar() override
{
+ m_xToolBox->SetDropdownClickHdl(Link<ToolBox*, void>());
m_xToolBox->SetSelectHdl(Link<ToolBox*, void>());
}
};
@@ -971,6 +998,12 @@ IMPL_LINK_NOARG(SalInstanceToolbar, ClickHdl, ToolBox*, void)
signal_clicked(m_xToolBox->GetItemCommand(nItemId).toUtf8());
}
+IMPL_LINK_NOARG(SalInstanceToolbar, DropdownClick, ToolBox*, void)
+{
+ sal_uInt16 nItemId = m_xToolBox->GetCurItemId();
+ set_item_active(m_xToolBox->GetItemCommand(nItemId).toUtf8(), true);
+}
+
class SalInstanceSizeGroup : public weld::SizeGroup
{
private:
@@ -994,9 +1027,10 @@ public:
class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container
{
-private:
+protected:
VclPtr<vcl::Window> m_xContainer;
+private:
void implResetDefault(const vcl::Window* _pWindow)
{
vcl::Window* pChildLoop = _pWindow->GetWindow(GetWindowType::FirstChild);
@@ -1060,6 +1094,21 @@ std::unique_ptr<weld::Container> SalInstanceWidget::weld_parent() const
return std::make_unique<SalInstanceContainer>(pParent, m_pBuilder, false);
}
+class SalInstanceBox : public SalInstanceContainer, public virtual weld::Box
+{
+public:
+ SalInstanceBox(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, bool bTakeOwnership)
+ : SalInstanceContainer(pContainer, pBuilder, bTakeOwnership)
+ {
+ }
+ virtual void reorder_child(weld::Widget* pWidget, int nNewPosition) override
+ {
+ SalInstanceWidget* pVclWidget = dynamic_cast<SalInstanceWidget*>(pWidget);
+ assert(pVclWidget);
+ pVclWidget->getWidget()->reorderWithinParent(nNewPosition);
+ }
+};
+
namespace
{
void CollectChildren(const vcl::Window& rCurrent, const basegfx::B2IPoint& rTopLeft, weld::ScreenShotCollection& rControlDataCollection)
@@ -5809,6 +5858,12 @@ public:
return pContainer ? std::make_unique<SalInstanceContainer>(pContainer, this, bTakeOwnership) : nullptr;
}
+ virtual std::unique_ptr<weld::Box> weld_box(const OString &id, bool bTakeOwnership) override
+ {
+ vcl::Window* pContainer = m_xBuilder->get<vcl::Window>(id);
+ return pContainer ? std::make_unique<SalInstanceBox>(pContainer, this, bTakeOwnership) : nullptr;
+ }
+
virtual std::unique_ptr<weld::Frame> weld_frame(const OString &id, bool bTakeOwnership) override
{
VclFrame* pFrame = m_xBuilder->get<VclFrame>(id);
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 59066bde6502..38fc905c8091 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3208,6 +3208,27 @@ std::unique_ptr<weld::Container> GtkInstanceWidget::weld_parent() const
return std::make_unique<GtkInstanceContainer>(GTK_CONTAINER(pParent), m_pBuilder, false);
}
+class GtkInstanceBox : public GtkInstanceContainer, public virtual weld::Box
+{
+private:
+ GtkBox* m_pBox;
+
+public:
+ GtkInstanceBox(GtkBox* pBox, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
+ : GtkInstanceContainer(GTK_CONTAINER(pBox), pBuilder, bTakeOwnership)
+ , m_pBox(pBox)
+ {
+ }
+
+ virtual void reorder_child(weld::Widget* pWidget, int nNewPosition) override
+ {
+ GtkInstanceWidget* pGtkWidget = dynamic_cast<GtkInstanceWidget*>(pWidget);
+ assert(pGtkWidget);
+ GtkWidget* pChild = pGtkWidget->getWidget();
+ gtk_box_reorder_child(m_pBox, pChild, nNewPosition);
+ }
+};
+
namespace
{
void set_cursor(GtkWidget* pWidget, const char *pName)
@@ -6671,6 +6692,21 @@ private:
GtkToolbar* m_pToolbar;
std::map<OString, GtkToolButton*> m_aMap;
+ std::map<OString, std::unique_ptr<GtkInstanceMenuButton>> m_aMenuButtonMap;
+
+ // at the time of writing there is no gtk_menu_tool_button_set_popover available
+ // though there will be in the future
+ // https://gitlab.gnome.org/GNOME/gtk/commit/03e30431a8af9a947a0c4ccab545f24da16bfe17?w=1
+ static void find_menu_button(GtkWidget *pWidget, gpointer user_data)
+ {
+ if (g_strcmp0(gtk_widget_get_name(pWidget), "GtkMenuButton") == 0)
+ {
+ GtkWidget **ppToggleButton = static_cast<GtkWidget**>(user_data);
+ *ppToggleButton = pWidget;
+ }
+ else if (GTK_IS_CONTAINER(pWidget))
+ gtk_container_forall(GTK_CONTAINER(pWidget), find_menu_button, user_data);
+ }
static void collect(GtkWidget* pItem, gpointer widget)
{
@@ -6678,15 +6714,22 @@ private:
{
GtkToolButton* pToolItem = GTK_TOOL_BUTTON(pItem);
GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget);
- pThis->add_to_map(pToolItem);
+
+ GtkMenuButton* pMenuButton = nullptr;
+ if (GTK_IS_MENU_TOOL_BUTTON(pItem))
+ find_menu_button(pItem, &pMenuButton);
+
+ pThis->add_to_map(pToolItem, pMenuButton);
}
}
- void add_to_map(GtkToolButton* pToolItem)
+ void add_to_map(GtkToolButton* pToolItem, GtkMenuButton* pMenuButton)
{
const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pToolItem));
OString id(pStr, pStr ? strlen(pStr) : 0);
m_aMap[id] = pToolItem;
+ if (pMenuButton)
+ m_aMenuButtonMap[id] = std::make_unique<GtkInstanceMenuButton>(pMenuButton, m_pBuilder, false);
g_signal_connect(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this);
}
@@ -6738,13 +6781,27 @@ public:
virtual void set_item_active(const OString& rIdent, bool bActive) override
{
disable_item_notify_events();
- gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_aMap[rIdent]), bActive);
+
+ auto aFind = m_aMenuButtonMap.find(rIdent);
+ if (aFind != m_aMenuButtonMap.end())
+ aFind->second->set_active(bActive);
+ else
+ {
+ GtkToolButton* pToolButton = m_aMap.find(rIdent)->second;
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton), bActive);
+ }
+
enable_item_notify_events();
}
virtual bool get_item_active(const OString& rIdent) const override
{
- return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(m_aMap.find(rIdent)->second));
+ auto aFind = m_aMenuButtonMap.find(rIdent);
+ if (aFind != m_aMenuButtonMap.end())
+ return aFind->second->get_active();
+
+ GtkToolButton* pToolButton = m_aMap.find(rIdent)->second;
+ return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton));
}
virtual void insert_separator(int pos, const OUString& rId) override
@@ -6755,6 +6812,11 @@ public:
gtk_widget_show(GTK_WIDGET(pItem));
}
+ virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) override
+ {
+ m_aMenuButtonMap[rIdent]->set_popover(pPopover);
+ }
+
virtual ~GtkInstanceToolbar() override
{
for (auto& a : m_aMap)
@@ -11864,6 +11926,15 @@ public:
return std::make_unique<GtkInstanceContainer>(pContainer, this, bTakeOwnership);
}
+ virtual std::unique_ptr<weld::Box> weld_box(const OString &id, bool bTakeOwnership) override
+ {
+ GtkBox* pBox = GTK_BOX(gtk_builder_get_object(m_pBuilder, id.getStr()));
+ if (!pBox)
+ return nullptr;
+ auto_add_parentless_widgets_to_container(GTK_WIDGET(pBox));
+ return std::make_unique<GtkInstanceBox>(pBox, this, bTakeOwnership);
+ }
+
virtual std::unique_ptr<weld::Frame> weld_frame(const OString &id, bool bTakeOwnership) override
{
GtkFrame* pFrame = GTK_FRAME(gtk_builder_get_object(m_pBuilder, id.getStr()));