summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk3/gtk3gtkinst.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/gtk3/gtk3gtkinst.cxx')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx132
1 files changed, 106 insertions, 26 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 84295d62f64d..51b52a6626a6 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -5155,8 +5155,11 @@ private:
std::vector<gulong> m_aColumnSignalIds;
// map from toggle column to toggle visibility column
std::map<int, int> m_aToggleVisMap;
+ std::vector<GtkSortType> m_aSavedSortTypes;
+ std::vector<int> m_aSavedSortColumns;
+ std::vector<int> m_aViewColToModelCol;
+ std::vector<int> m_aModelColToViewCol;
gint m_nTextCol;
- gint m_nTextColHeader;
gint m_nImageCol;
gint m_nExpanderImageCol;
gint m_nIdCol;
@@ -5164,7 +5167,6 @@ private:
gulong m_nRowActivatedSignalId;
gulong m_nTestExpandRowSignalId;
gulong m_nVAdjustmentChangedSignalId;
- GtkSortType m_eSortType;
DECL_LINK(async_signal_changed, void*, void);
@@ -5379,13 +5381,22 @@ private:
pThis->signal_visible_range_changed();
}
+ int get_model_col(int viewcol) const
+ {
+ return m_aViewColToModelCol[viewcol];
+ }
+
+ int get_view_col(int modelcol) const
+ {
+ return m_aModelColToViewCol[modelcol];
+ }
+
public:
GtkInstanceTreeView(GtkTreeView* pTreeView, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pTreeView), pBuilder, bTakeOwnership)
, m_pTreeView(pTreeView)
, m_pTreeStore(GTK_TREE_STORE(gtk_tree_view_get_model(m_pTreeView)))
, m_nTextCol(-1)
- , m_nTextColHeader(-1)
, m_nImageCol(-1)
, m_nExpanderImageCol(-1)
, m_nChangedSignalId(g_signal_connect(gtk_tree_view_get_selection(pTreeView), "changed",
@@ -5393,10 +5404,9 @@ 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_eSortType(GTK_SORT_ASCENDING)
{
m_pColumns = gtk_tree_view_get_columns(m_pTreeView);
- int nIndex(0), nHeader(0);
+ int nIndex(0);
for (GList* pEntry = g_list_first(m_pColumns); pEntry; pEntry = g_list_next(pEntry))
{
GtkTreeViewColumn* pColumn = GTK_TREE_VIEW_COLUMN(pEntry->data);
@@ -5408,7 +5418,6 @@ public:
if (m_nTextCol == -1 && GTK_IS_CELL_RENDERER_TEXT(pCellRenderer))
{
m_nTextCol = nIndex;
- m_nTextColHeader = nHeader;
}
else if (GTK_IS_CELL_RENDERER_TOGGLE(pCellRenderer))
{
@@ -5424,10 +5433,11 @@ public:
else if (m_nImageCol == -1)
m_nImageCol = nIndex;
}
+ m_aModelColToViewCol.push_back(m_aViewColToModelCol.size());
++nIndex;
}
g_list_free(pRenderers);
- ++nHeader;
+ m_aViewColToModelCol.push_back(nIndex - 1);
}
m_nIdCol = nIndex++;
for (auto& a : m_aToggleVisMap)
@@ -5472,7 +5482,8 @@ public:
}
virtual void insert(weld::TreeIter* pParent, int pos, const OUString* pText, const OUString* pId, const OUString* pIconName,
- VirtualDevice* pImageSurface, const OUString* pExpanderName, bool bChildrenOnDemand) override
+ VirtualDevice* pImageSurface, const OUString* pExpanderName,
+ bool bChildrenOnDemand, weld::TreeIter* pRet) override
{
disable_notify_events();
GtkTreeIter iter;
@@ -5484,6 +5495,11 @@ public:
OUString sDummy("<dummy>");
insert_row(subiter, &iter, -1, nullptr, &sDummy, nullptr, nullptr, nullptr);
}
+ if (pRet)
+ {
+ GtkInstanceTreeIter* pGtkRetIter = static_cast<GtkInstanceTreeIter*>(pRet);
+ pGtkRetIter->iter = iter;
+ }
enable_notify_events();
}
@@ -5560,18 +5576,66 @@ public:
virtual void set_sort_order(bool bAscending) override
{
- m_eSortType = bAscending ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING;
+ GtkSortType eSortType = bAscending ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING;
+
+ gint sort_column_id(0);
GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore);
- gtk_tree_sortable_set_sort_column_id(pSortable, m_nTextCol, m_eSortType);
- GtkTreeViewColumn* pColumn = GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, m_nTextColHeader));
- assert(pColumn && "wrong count");
- if (gtk_tree_view_column_get_sort_indicator(pColumn))
- gtk_tree_view_column_set_sort_order(pColumn, m_eSortType);
+ gtk_tree_sortable_get_sort_column_id(pSortable, &sort_column_id, nullptr);
+ gtk_tree_sortable_set_sort_column_id(pSortable, sort_column_id, eSortType);
}
virtual bool get_sort_order() const override
{
- return m_eSortType == GTK_SORT_ASCENDING;
+ GtkSortType eSortType;
+
+ GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore);
+ gtk_tree_sortable_get_sort_column_id(pSortable, nullptr, &eSortType);
+ return eSortType == GTK_SORT_ASCENDING;
+ }
+
+ virtual void set_sort_indicator(TriState eState, int col) override
+ {
+ if (col == -1)
+ col = get_view_col(m_nTextCol);
+
+ GtkTreeViewColumn* pColumn = GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, col));
+ assert(pColumn && "wrong count");
+ if (eState == TRISTATE_INDET)
+ gtk_tree_view_column_set_sort_indicator(pColumn, false);
+ else
+ {
+ gtk_tree_view_column_set_sort_indicator(pColumn, true);
+ GtkSortType eSortType = eState == TRISTATE_TRUE ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING;
+ gtk_tree_view_column_set_sort_order(pColumn, eSortType);
+ }
+ }
+
+ virtual TriState get_sort_indicator(int col) const override
+ {
+ if (col == -1)
+ col = get_view_col(m_nTextCol);
+
+ GtkTreeViewColumn* pColumn = GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, col));
+ if (!gtk_tree_view_column_get_sort_indicator(pColumn))
+ return TRISTATE_INDET;
+ return gtk_tree_view_column_get_sort_order(pColumn) == GTK_SORT_ASCENDING ? TRISTATE_TRUE : TRISTATE_FALSE;
+ }
+
+ virtual int get_sort_column() const override
+ {
+ GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore);
+ gint sort_column_id(0);
+ if (!gtk_tree_sortable_get_sort_column_id(pSortable, &sort_column_id, nullptr))
+ return -1;
+ return get_view_col(sort_column_id);
+ }
+
+ virtual void set_sort_column(int nColumn) override
+ {
+ 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);
}
virtual int n_children() const override
@@ -5707,23 +5771,26 @@ public:
{
if (col == -1)
return get(pos, m_nTextCol);
- return get(pos, col);
+ return get(pos, get_model_col(col));
}
virtual void set_text(int pos, const OUString& rText, int col) override
{
if (col == -1)
col = m_nTextCol;
+ else
+ col = get_model_col(col);
return set(pos, col, rText);
}
virtual bool get_toggle(int pos, int col) const override
{
- return get_bool(pos, col);
+ return get_bool(pos, get_model_col(col));
}
virtual void set_toggle(int pos, bool bOn, int col) override
{
+ col = get_model_col(col);
// checkbuttons are invisible until toggled on or off
set(pos, m_aToggleVisMap[col], true);
return set(pos, col, bOn);
@@ -5959,6 +6026,8 @@ public:
const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter);
if (col == -1)
col = m_nTextCol;
+ else
+ col = get_model_col(col);
return get(rGtkIter.iter, col);
}
@@ -5967,18 +6036,21 @@ public:
GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter);
if (col == -1)
col = m_nTextCol;
+ else
+ col = get_model_col(col);
set(rGtkIter.iter, col, rText);
}
virtual OUString get_id(const weld::TreeIter& rIter) const override
{
const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter);
- GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore);
- gchar* pStr;
- gtk_tree_model_get(pModel, const_cast<GtkTreeIter*>(&rGtkIter.iter), m_nIdCol, &pStr, -1);
- OUString sRet(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8);
- g_free(pStr);
- return sRet;
+ return get(rGtkIter.iter, m_nIdCol);
+ }
+
+ virtual void set_id(weld::TreeIter& rIter, const OUString& rId) override
+ {
+ GtkInstanceTreeIter& rGtkIter = static_cast<GtkInstanceTreeIter&>(rIter);
+ set(rGtkIter.iter, m_nIdCol, rId);
}
virtual void set_expander_image(const weld::TreeIter& rIter, const OUString& rExpanderName) override
@@ -6000,8 +6072,14 @@ public:
gtk_tree_view_set_model(m_pTreeView, nullptr);
if (m_xSorter)
{
+ int nSortColumn;
+ GtkSortType eSortType;
GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore);
- gtk_tree_sortable_set_sort_column_id(pSortable, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, m_eSortType);
+ gtk_tree_sortable_get_sort_column_id(pSortable, &nSortColumn, &eSortType);
+ gtk_tree_sortable_set_sort_column_id(pSortable, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, eSortType);
+
+ m_aSavedSortColumns.push_back(nSortColumn);
+ m_aSavedSortTypes.push_back(eSortType);
}
enable_notify_events();
}
@@ -6012,7 +6090,9 @@ public:
if (m_xSorter)
{
GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeStore);
- gtk_tree_sortable_set_sort_column_id(pSortable, m_nTextCol, m_eSortType);
+ gtk_tree_sortable_set_sort_column_id(pSortable, m_aSavedSortColumns.back(), m_aSavedSortTypes.back());
+ m_aSavedSortTypes.pop_back();
+ m_aSavedSortColumns.pop_back();
}
gtk_tree_view_set_model(m_pTreeView, GTK_TREE_MODEL(m_pTreeStore));
GtkInstanceContainer::thaw();
@@ -6119,7 +6199,7 @@ public:
int starts_with(const OUString& rStr, int col, int nStartRow)
{
- return ::starts_with(GTK_TREE_MODEL(m_pTreeStore), rStr, col, nStartRow);
+ return ::starts_with(GTK_TREE_MODEL(m_pTreeStore), rStr, get_model_col(col), nStartRow);
}
virtual void disable_notify_events() override