diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-05-16 15:17:38 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-05-17 12:43:13 +0200 |
commit | 8a35ae3e6c5c45aa1426cfd81472b309d02a1b48 (patch) | |
tree | b634b7d9ef93599b5139528a2fcd4a99c3372a0d /vcl | |
parent | 4c2034b808fed4f9dfd715d8a4813e788a7e97a4 (diff) |
weld SvxIMapDlg
Change-Id: I5418176a015e61ef8eee4c2acd8e84b008f76f82
Reviewed-on: https://gerrit.libreoffice.org/72249
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/salvtables.cxx | 62 | ||||
-rw-r--r-- | vcl/source/window/builder.cxx | 2 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 108 |
3 files changed, 168 insertions, 4 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index b55b735f0f8f..9c8ccc804953 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -867,6 +867,58 @@ public: } }; +class SalInstanceToolbar : public SalInstanceWidget, public virtual weld::Toolbar +{ +private: + VclPtr<ToolBox> m_xToolBox; + + DECL_LINK(ClickHdl, ToolBox*, void); +public: + SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceWidget(pToolBox, pBuilder, bTakeOwnership) + , m_xToolBox(pToolBox) + { + m_xToolBox->SetSelectHdl(LINK(this, SalInstanceToolbar, ClickHdl)); + } + + virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override + { + m_xToolBox->EnableItem(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), bSensitive); + } + + virtual bool get_item_sensitive(const OString& rIdent) const override + { + return m_xToolBox->IsItemEnabled(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent))); + } + + virtual void set_item_active(const OString& rIdent, bool bActive) override + { + m_xToolBox->CheckItem(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), bActive); + } + + virtual bool get_item_active(const OString& rIdent) const override + { + return m_xToolBox->IsItemChecked(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent))); + } + + virtual void insert_separator(int pos, const OUString& /*rId*/) override + { + auto nInsertPos = pos == -1 ? ToolBox::APPEND : pos; + m_xToolBox->InsertSeparator(nInsertPos, 5); + } + + virtual ~SalInstanceToolbar() override + { + m_xToolBox->SetSelectHdl(Link<ToolBox*, void>()); + } +}; + +IMPL_LINK_NOARG(SalInstanceToolbar, ClickHdl, ToolBox*, void) +{ + sal_uInt16 nItemId = m_xToolBox->GetCurItemId(); + signal_clicked(m_xToolBox->GetItemCommand(nItemId).toUtf8()); +} + class SalInstanceSizeGroup : public weld::SizeGroup { private: @@ -4261,9 +4313,9 @@ public: weld::Widget::connect_key_release(rLink); } - virtual void set_text_cursor() override + virtual void set_cursor(PointerStyle ePointerStyle) override { - m_xDrawingArea->SetPointer(PointerStyle::Text); + m_xDrawingArea->SetPointer(ePointerStyle); } virtual a11yref get_accessible_parent() override @@ -5108,6 +5160,12 @@ public: return pMenu ? std::make_unique<SalInstanceMenu>(pMenu, bTakeOwnership) : nullptr; } + virtual std::unique_ptr<weld::Toolbar> weld_toolbar(const OString &id, bool bTakeOwnership) override + { + ToolBox* pToolBox = m_xBuilder->get<ToolBox>(id); + return pToolBox ? std::make_unique<SalInstanceToolbar>(pToolBox, this, bTakeOwnership) : nullptr; + } + virtual std::unique_ptr<weld::SizeGroup> create_size_group() override { return std::make_unique<SalInstanceSizeGroup>(); diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index fe67aec4b06b..3e0aabd0a4ca 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -2161,6 +2161,8 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & nItemId = pToolBox->GetItemCount() + 1; //TODO: ImplToolItems::size_type -> sal_uInt16! pToolBox->InsertItem(nItemId, extractLabel(rMap), nBits); + if (aCommand.isEmpty() && !m_bLegacy) + aCommand = OUString::fromUtf8(id); pToolBox->SetItemCommand(nItemId, aCommand); } diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 0d60969bff8d..d29fa4f4ef1a 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -5331,6 +5331,100 @@ public: } }; +class GtkInstanceToolbar : public GtkInstanceWidget, public virtual weld::Toolbar +{ +private: + GtkToolbar* m_pToolbar; + + std::map<OString, GtkToolButton*> m_aMap; + + static void collect(GtkWidget* pItem, gpointer widget) + { + GtkToolButton* pToolItem = GTK_TOOL_BUTTON(pItem); + GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget); + pThis->add_to_map(pToolItem); + } + + void add_to_map(GtkToolButton* pToolItem) + { + const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pToolItem)); + OString id(pStr, pStr ? strlen(pStr) : 0); + m_aMap[id] = pToolItem; + g_signal_connect(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this); + } + + static void signalItemClicked(GtkToolButton* pItem, gpointer widget) + { + GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget); + SolarMutexGuard aGuard; + pThis->signal_item_clicked(pItem); + } + + void signal_item_clicked(GtkToolButton* pItem) + { + const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pItem)); + signal_clicked(OString(pStr, pStr ? strlen(pStr) : 0)); + } + +public: + GtkInstanceToolbar(GtkToolbar* pToolbar, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) + : GtkInstanceWidget(GTK_WIDGET(pToolbar), pBuilder, bTakeOwnership) + , m_pToolbar(pToolbar) + { + gtk_container_foreach(GTK_CONTAINER(pToolbar), collect, this); + } + + void disable_item_notify_events() + { + for (auto& a : m_aMap) + g_signal_handlers_block_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this); + } + + void enable_item_notify_events() + { + for (auto& a : m_aMap) + g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this); + } + + virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override + { + disable_item_notify_events(); + gtk_widget_set_sensitive(GTK_WIDGET(m_aMap[rIdent]), bSensitive); + enable_item_notify_events(); + } + + virtual bool get_item_sensitive(const OString& rIdent) const override + { + return gtk_widget_get_sensitive(GTK_WIDGET(m_aMap.find(rIdent)->second)); + } + + 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); + 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)); + } + + virtual void insert_separator(int pos, const OUString& rId) override + { + GtkToolItem* pItem = gtk_separator_tool_item_new(); + gtk_buildable_set_name(GTK_BUILDABLE(pItem), OUStringToOString(rId, RTL_TEXTENCODING_UTF8).getStr()); + gtk_toolbar_insert(m_pToolbar, pItem, pos); + gtk_widget_show(GTK_WIDGET(pItem)); + } + + virtual ~GtkInstanceToolbar() override + { + for (auto& a : m_aMap) + g_signal_handlers_disconnect_by_data(a.second, this); + } +}; + class GtkInstanceLinkButton : public GtkInstanceContainer, public virtual weld::LinkButton { private: @@ -8445,9 +8539,10 @@ public: m_xDevice->EnableRTL(bRTL); } - virtual void set_text_cursor() override + virtual void set_cursor(PointerStyle ePointerStyle) override { - set_cursor(GTK_WIDGET(m_pDrawingArea), "text"); + GdkCursor *pCursor = GtkSalFrame::getDisplay()->getCursor(ePointerStyle); + gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(m_pDrawingArea)), pCursor); } virtual void queue_draw() override @@ -10231,6 +10326,15 @@ public: return std::make_unique<GtkInstanceMenu>(pMenu, bTakeOwnership); } + virtual std::unique_ptr<weld::Toolbar> weld_toolbar(const OString &id, bool bTakeOwnership) override + { + GtkToolbar* pToolbar = GTK_TOOLBAR(gtk_builder_get_object(m_pBuilder, id.getStr())); + if (!pToolbar) + return nullptr; + auto_add_parentless_widgets_to_container(GTK_WIDGET(pToolbar)); + return std::make_unique<GtkInstanceToolbar>(pToolbar, this, bTakeOwnership); + } + virtual std::unique_ptr<weld::SizeGroup> create_size_group() override { return std::make_unique<GtkInstanceSizeGroup>(); |