diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-04-18 16:49:26 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-04-27 12:41:14 +0200 |
commit | 56dd851cfc77c362c3db5c0aae4a490c7f6782cc (patch) | |
tree | 0f5f6564e0b9af8123f4cebfe9a2f55c1bbbba57 /vcl | |
parent | 6afbe153ffd4cab27f0a7bb77f71f25923dc2e43 (diff) |
weld cluster of change tracking dialogs
Change-Id: I42ca7acb41699df91b91a9f59fc68cd30972a397
Reviewed-on: https://gerrit.libreoffice.org/70988
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 | 85 | ||||
-rw-r--r-- | vcl/source/treelist/treelistbox.cxx | 3 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 135 |
3 files changed, 189 insertions, 34 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index be45ec9bf0bc..6babd546a238 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -2389,6 +2389,10 @@ struct SalInstanceTreeIter : public weld::TreeIter : iter(pOrig ? pOrig->iter : nullptr) { } + SalInstanceTreeIter(SvTreeListEntry* pIter) + : iter(pIter) + { + } virtual bool equal(const TreeIter& rOther) const override { return iter == static_cast<const SalInstanceTreeIter&>(rOther).iter; @@ -2448,6 +2452,8 @@ private: DECL_LINK(ModelChangedHdl, SvTreeListBox*, void); DECL_LINK(VisibleRangeChangedHdl, SvTreeListBox*, void); DECL_LINK(CompareHdl, const SvSortData&, sal_Int32); + DECL_LINK(PopupMenuHdl, const CommandEvent&, bool); + public: SalInstanceTreeView(SvTabListBox* pTreeView, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceContainer(pTreeView, pBuilder, bTakeOwnership) @@ -2462,6 +2468,7 @@ public: m_xTreeView->SetDeselectHdl(LINK(this, SalInstanceTreeView, DeSelectHdl)); m_xTreeView->SetDoubleClickHdl(LINK(this, SalInstanceTreeView, DoubleClickHdl)); m_xTreeView->SetExpandingHdl(LINK(this, SalInstanceTreeView, ExpandingHdl)); + m_xTreeView->SetPopupMenuHdl(LINK(this, SalInstanceTreeView, PopupMenuHdl)); const long aTabPositions[] = { 0 }; m_xTreeView->SetTabs(SAL_N_ELEMENTS(aTabPositions), aTabPositions); LclHeaderTabListBox* pHeaderBox = dynamic_cast<LclHeaderTabListBox*>(m_xTreeView.get()); @@ -2548,21 +2555,15 @@ public: virtual void show() override { - LclHeaderTabListBox* pHeaderBox = dynamic_cast<LclHeaderTabListBox*>(m_xTreeView.get()); - if (HeaderBar* pHeaderBar = pHeaderBox ? pHeaderBox->GetHeaderBar() : nullptr) - { - pHeaderBar->Show(); - } + if (LclHeaderTabListBox* pHeaderBox = dynamic_cast<LclHeaderTabListBox*>(m_xTreeView.get())) + pHeaderBox->GetParent()->Show(); SalInstanceContainer::show(); } virtual void hide() override { - LclHeaderTabListBox* pHeaderBox = dynamic_cast<LclHeaderTabListBox*>(m_xTreeView.get()); - if (HeaderBar* pHeaderBar = pHeaderBox ? pHeaderBox->GetHeaderBar() : nullptr) - { - pHeaderBar->Hide(); - } + if (LclHeaderTabListBox* pHeaderBox = dynamic_cast<LclHeaderTabListBox*>(m_xTreeView.get())) + pHeaderBox->GetParent()->Hide(); SalInstanceContainer::hide(); } @@ -2625,6 +2626,12 @@ public: pEntry->SetTextColor(rColor); } + virtual void set_font_color(const weld::TreeIter& rIter, const Color& rColor) const override + { + const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); + rVclIter.iter->SetTextColor(rColor); + } + virtual void remove(int pos) override { disable_notify_events(); @@ -3237,10 +3244,20 @@ public: m_xTreeView->SetSelectionMode(eMode); } + virtual void all_foreach(const std::function<bool(weld::TreeIter&)>& func) override + { + SalInstanceTreeIter aVclIter(m_xTreeView->First()); + while (aVclIter.iter) + { + if (func(aVclIter)) + return; + aVclIter.iter = m_xTreeView->Next(aVclIter.iter); + } + } + virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override { - SalInstanceTreeIter aVclIter(nullptr); - aVclIter.iter = m_xTreeView->FirstSelected(); + SalInstanceTreeIter aVclIter(m_xTreeView->FirstSelected()); while (aVclIter.iter) { if (func(aVclIter)) @@ -3251,8 +3268,7 @@ public: virtual void visible_foreach(const std::function<bool(weld::TreeIter&)>& func) override { - SalInstanceTreeIter aVclIter(nullptr); - aVclIter.iter = m_xTreeView->GetFirstEntryInView(); + SalInstanceTreeIter aVclIter(m_xTreeView->GetFirstEntryInView()); while (aVclIter.iter) { if (func(aVclIter)) @@ -3279,6 +3295,20 @@ public: return SvTreeList::GetRelPos(rVclIter.iter); } + virtual int iter_compare(const weld::TreeIter& a, const weld::TreeIter& b) const override + { + const SalInstanceTreeIter& rVclIterA = static_cast<const SalInstanceTreeIter&>(a); + const SalInstanceTreeIter& rVclIterB = static_cast<const SalInstanceTreeIter&>(b); + const SvTreeList* pModel = m_xTreeView->GetModel(); + auto nAbsPosA = pModel->GetAbsPos(rVclIterA.iter); + auto nAbsPosB = pModel->GetAbsPos(rVclIterB.iter); + if (nAbsPosA < nAbsPosB) + return -1; + if (nAbsPosA > nAbsPosB) + return 1; + return 0; + } + virtual void move_subtree(weld::TreeIter& rNode, const weld::TreeIter* pNewParent, int nIndexInNewParent) override { SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rNode); @@ -3303,6 +3333,13 @@ public: set_sort_order(true); } + virtual void set_sort_func(const std::function<int(const weld::TreeIter&, const weld::TreeIter&)>& func) override + { + weld::TreeView::set_sort_func(func); + SvTreeList* pListModel = m_xTreeView->GetModel(); + pListModel->Resort(); + } + virtual void make_unsorted() override { m_xTreeView->SetStyle(m_xTreeView->GetStyle() & ~WB_SORT); @@ -3369,6 +3406,13 @@ public: virtual void set_sort_column(int nColumn) override { + if (nColumn == -1) + { + make_unsorted(); + m_nSortColumn = -1; + return; + } + if (nColumn != m_nSortColumn) { m_nSortColumn = nColumn; @@ -3396,6 +3440,7 @@ public: { static_cast<LclTabListBox&>(*m_xTreeView).SetModelChangedHdl(Link<SvTreeListBox*, void>()); } + m_xTreeView->SetPopupMenuHdl(Link<const CommandEvent&, bool>()); m_xTreeView->SetExpandingHdl(Link<SvTreeListBox*, bool>()); m_xTreeView->SetDoubleClickHdl(Link<SvTreeListBox*, bool>()); m_xTreeView->SetSelectHdl(Link<SvTreeListBox*, void>()); @@ -3410,6 +3455,10 @@ IMPL_LINK(SalInstanceTreeView, CompareHdl, const SvSortData&, rSortData, sal_Int const SvTreeListEntry* pRHS = rSortData.pRight; assert(pLHS && pRHS); + if (m_aCustomSort) + return m_aCustomSort(SalInstanceTreeIter(const_cast<SvTreeListEntry*>(pLHS)), + SalInstanceTreeIter(const_cast<SvTreeListEntry*>(pRHS))); + const SvLBoxString* pLeftTextItem; const SvLBoxString* pRightTextItem; @@ -3551,8 +3600,7 @@ IMPL_LINK_NOARG(SalInstanceTreeView, ExpandingHdl, SvTreeListBox*, bool) } } - SalInstanceTreeIter aIter(nullptr); - aIter.iter = pEntry; + SalInstanceTreeIter aIter(pEntry); bool bRet = signal_expanding(aIter); //expand disallowed, restore placeholder @@ -3564,6 +3612,11 @@ IMPL_LINK_NOARG(SalInstanceTreeView, ExpandingHdl, SvTreeListBox*, bool) return bRet; } +IMPL_LINK(SalInstanceTreeView, PopupMenuHdl, const CommandEvent&, rEvent, bool) +{ + return m_aPopupMenuHdl.Call(rEvent); +} + class SalInstanceSpinButton : public SalInstanceEntry, public virtual weld::SpinButton { private: diff --git a/vcl/source/treelist/treelistbox.cxx b/vcl/source/treelist/treelistbox.cxx index 9ebbb7aabfb0..2a6d7286a03d 100644 --- a/vcl/source/treelist/treelistbox.cxx +++ b/vcl/source/treelist/treelistbox.cxx @@ -3255,7 +3255,8 @@ void SvTreeListBox::SetHighlightRange( sal_uInt16 nStart, sal_uInt16 nEnd) void SvTreeListBox::Command(const CommandEvent& rCEvt) { - pImpl->Command(rCEvt); + if (!aPopupMenuHdl.Call(rCEvt)) + pImpl->Command(rCEvt); //pass at least alt press/release to parent impl if (rCEvt.GetCommand() == CommandEventId::ModKeyChange) Control::Command(rCEvt); diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 5f2884186c02..2bb5a83abaa1 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -1282,6 +1282,23 @@ protected: m_aFocusOutHdl.Call(*this); } + void ensureButtonPressSignal() + { + if (!m_nButtonPressSignalId) + m_nButtonPressSignalId = g_signal_connect(m_pWidget, "button-press-event", G_CALLBACK(signalButton), this); + } + + static gboolean signalPopupMenu(GtkWidget* pWidget, gpointer widget) + { + GtkInstanceWidget* pThis = static_cast<GtkInstanceWidget*>(widget); + SolarMutexGuard aGuard; + //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); + CommandEvent aCEvt(aPos, CommandEventId::ContextMenu, false); + return pThis->signal_popup_menu(aCEvt); + } + private: bool m_bTakeOwnership; bool m_bFrozen; @@ -1495,7 +1512,7 @@ public: virtual void connect_mouse_press(const Link<const MouseEvent&, bool>& rLink) override { - m_nButtonPressSignalId = g_signal_connect(m_pWidget, "button-press-event", G_CALLBACK(signalButton), this); + ensureButtonPressSignal(); weld::Widget::connect_mouse_press(rLink); } @@ -4757,6 +4774,11 @@ public: ::set_label(GTK_LABEL(m_pLabel), rText); } + virtual OUString get_label() const override + { + return ::get_label(GTK_LABEL(m_pLabel)); + } + virtual void set_image(VirtualDevice* pDevice) override { ensure_image_widget(); @@ -5366,8 +5388,10 @@ public: virtual void set_date(const Date& rDate) override { + disable_notify_events(); gtk_calendar_select_month(m_pCalendar, rDate.GetMonth() - 1, rDate.GetYear()); gtk_calendar_select_day(m_pCalendar, rDate.GetDay()); + enable_notify_events(); } virtual Date get_date() const override @@ -5780,7 +5804,7 @@ namespace namespace { - gint sort_func(GtkTreeModel* pModel, GtkTreeIter* a, GtkTreeIter* b, gpointer data) + gint default_sort_func(GtkTreeModel* pModel, GtkTreeIter* a, GtkTreeIter* b, gpointer data) { comphelper::string::NaturalStringSorter* pSorter = static_cast<comphelper::string::NaturalStringSorter*>(data); gchar* pName1; @@ -5830,6 +5854,10 @@ struct GtkInstanceTreeIter : public weld::TreeIter else memset(&iter, 0, sizeof(iter)); } + GtkInstanceTreeIter(const GtkTreeIter& rOrig) + { + memcpy(&iter, &rOrig, sizeof(iter)); + } virtual bool equal(const TreeIter& rOther) const override { return memcmp(&iter, &static_cast<const GtkInstanceTreeIter&>(rOther).iter, sizeof(GtkTreeIter)) == 0; @@ -5865,6 +5893,7 @@ private: gulong m_nVAdjustmentChangedSignalId; gulong m_nRowDeletedSignalId; gulong m_nRowInsertedSignalId; + gulong m_nPopupMenu; DECL_LINK(async_signal_changed, void*, void); @@ -5887,6 +5916,11 @@ private: pThis->signal_row_activated(); } + virtual bool signal_popup_menu(const CommandEvent& rCEvt) override + { + return m_aPopupMenuHdl.Call(rCEvt); + } + void insert_row(GtkTreeIter& iter, const GtkTreeIter* parent, int pos, const OUString* pId, const OUString* pText, const OUString* pIconName, const VirtualDevice* pDevice, const OUString* pExpanderName) { @@ -6132,6 +6166,19 @@ private: pThis->signal_model_changed(); } + static gint sortFunc(GtkTreeModel* pModel, GtkTreeIter* a, GtkTreeIter* b, gpointer widget) + { + GtkInstanceTreeView* pThis = static_cast<GtkInstanceTreeView*>(widget); + return pThis->sort_func(pModel, a, b); + } + + gint sort_func(GtkTreeModel* pModel, GtkTreeIter* a, GtkTreeIter* b) + { + if (m_aCustomSort) + return m_aCustomSort(GtkInstanceTreeIter(*a), GtkInstanceTreeIter(*b)); + return default_sort_func(pModel, a, b, m_xSorter.get()); + } + public: GtkInstanceTreeView(GtkTreeView* pTreeView, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) : GtkInstanceContainer(GTK_CONTAINER(pTreeView), pBuilder, bTakeOwnership) @@ -6145,6 +6192,7 @@ public: , m_nRowActivatedSignalId(g_signal_connect(pTreeView, "row-activated", G_CALLBACK(signalRowActivated), this)) , m_nTestExpandRowSignalId(g_signal_connect(pTreeView, "test-expand-row", G_CALLBACK(signalTestExpandRow), this)) , m_nVAdjustmentChangedSignalId(0) + , m_nPopupMenu(g_signal_connect(pTreeView, "popup-menu", G_CALLBACK(signalPopupMenu), this)) { m_pColumns = gtk_tree_view_get_columns(m_pTreeView); int nIndex(0); @@ -6219,7 +6267,7 @@ public: { GtkTreeViewColumn* pColumn = GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, nColumn)); assert(pColumn && "wrong count"); - return gtk_tree_view_column_get_fixed_width(pColumn) - gtk_tree_view_column_get_spacing(pColumn); + return gtk_tree_view_column_get_width(pColumn); } virtual OUString get_column_title(int nColumn) const override @@ -6260,12 +6308,23 @@ public: enable_notify_events(); } + void set_font_color(const GtkTreeIter& iter, const Color& rColor) const + { + GdkRGBA aColor{rColor.GetRed()/255.0, rColor.GetGreen()/255.0, rColor.GetBlue()/255.0, 0}; + gtk_tree_store_set(m_pTreeStore, const_cast<GtkTreeIter*>(&iter), m_nIdCol + 1, &aColor, -1); + } + virtual void set_font_color(int pos, const Color& rColor) const override { GtkTreeIter iter; gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_pTreeStore), &iter, nullptr, pos); - GdkRGBA aColor{rColor.GetRed()/255.0, rColor.GetGreen()/255.0, rColor.GetBlue()/255.0, 0}; - gtk_tree_store_set(m_pTreeStore, &iter, m_nIdCol + 1, &aColor, -1); + set_font_color(iter, rColor); + } + + virtual void set_font_color(const weld::TreeIter& rIter, const Color& rColor) const override + { + const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter); + set_font_color(rGtkIter.iter, rColor); } virtual void remove(int pos) override @@ -6346,6 +6405,7 @@ public: ::comphelper::getProcessComponentContext(), Application::GetSettings().GetUILanguageTag().getLocale())); GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore); + gtk_tree_sortable_set_sort_func(pSortable, m_nTextCol, sortFunc, this, nullptr); gtk_tree_sortable_set_sort_column_id(pSortable, m_nTextCol, GTK_SORT_ASCENDING); } @@ -6417,10 +6477,24 @@ public: virtual void set_sort_column(int nColumn) override { + if (nColumn == -1) + { + make_unsorted(); + return; + } GtkSortType eSortType; GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore); gtk_tree_sortable_get_sort_column_id(pSortable, nullptr, &eSortType); - gtk_tree_sortable_set_sort_column_id(pSortable, get_model_col(nColumn), eSortType); + int nSortCol = get_model_col(nColumn); + gtk_tree_sortable_set_sort_func(pSortable, nSortCol, sortFunc, this, nullptr); + gtk_tree_sortable_set_sort_column_id(pSortable, nSortCol, eSortType); + } + + virtual void set_sort_func(const std::function<int(const weld::TreeIter&, const weld::TreeIter&)>& func) override + { + weld::TreeView::set_sort_func(func); + GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore); + gtk_tree_sortable_sort_column_changed(pSortable); } virtual int n_children() const override @@ -6500,6 +6574,19 @@ public: return aRows; } + virtual void all_foreach(const std::function<bool(weld::TreeIter&)>& func) override + { + GtkInstanceTreeIter aGtkIter(nullptr); + if (get_iter_first(aGtkIter)) + { + do + { + if (func(aGtkIter)) + break; + } while (iter_next(aGtkIter)); + } + } + virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override { GtkInstanceTreeIter aGtkIter(nullptr); @@ -6727,6 +6814,23 @@ public: return nRet; } + virtual int iter_compare(const weld::TreeIter& a, const weld::TreeIter& b) const override + { + const GtkInstanceTreeIter& rGtkIterA = static_cast<const GtkInstanceTreeIter&>(a); + const GtkInstanceTreeIter& rGtkIterB = static_cast<const GtkInstanceTreeIter&>(b); + + GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore); + GtkTreePath* pathA = gtk_tree_model_get_path(pModel, const_cast<GtkTreeIter*>(&rGtkIterA.iter)); + GtkTreePath* pathB = gtk_tree_model_get_path(pModel, const_cast<GtkTreeIter*>(&rGtkIterB.iter)); + + int nRet = gtk_tree_path_compare(pathA, pathB); + + gtk_tree_path_free(pathB); + gtk_tree_path_free(pathA); + + return nRet; + } + // by copy and delete of old copy void move_subtree(GtkTreeIter& rFromIter, GtkTreeIter* pGtkParentIter, int nIndexInNewParent) { @@ -7211,8 +7315,15 @@ public: g_signal_handler_unblock(gtk_tree_view_get_selection(m_pTreeView), m_nChangedSignalId); } + virtual void connect_popup_menu(const Link<const CommandEvent&, bool>& rLink) override + { + ensureButtonPressSignal(); + weld::TreeView::connect_popup_menu(rLink); + } + virtual ~GtkInstanceTreeView() override { + g_signal_handler_disconnect(m_pTreeView, m_nPopupMenu); GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore); g_signal_handler_disconnect(pModel, m_nRowDeletedSignalId); g_signal_handler_disconnect(pModel, m_nRowInsertedSignalId); @@ -7875,16 +7986,6 @@ private: { return m_aPopupMenuHdl.Call(rCEvt); } - static gboolean signalPopupMenu(GtkWidget* pWidget, gpointer widget) - { - GtkInstanceDrawingArea* pThis = static_cast<GtkInstanceDrawingArea*>(widget); - SolarMutexGuard aGuard; - //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); - CommandEvent aCEvt(aPos, CommandEventId::ContextMenu, false); - return pThis->signal_popup_menu(aCEvt); - } public: GtkInstanceDrawingArea(GtkDrawingArea* pDrawingArea, GtkInstanceBuilder* pBuilder, const a11yref& rA11y, bool bTakeOwnership) : GtkInstanceWidget(GTK_WIDGET(pDrawingArea), pBuilder, bTakeOwnership) @@ -8664,7 +8765,7 @@ public: Application::GetSettings().GetUILanguageTag().getLocale())); GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeModel); gtk_tree_sortable_set_sort_column_id(pSortable, 0, GTK_SORT_ASCENDING); - gtk_tree_sortable_set_sort_func(pSortable, 0, sort_func, m_xSorter.get(), nullptr); + gtk_tree_sortable_set_sort_func(pSortable, 0, default_sort_func, m_xSorter.get(), nullptr); } virtual bool has_entry() const override |