37#include <glib/gi18n.h>
38#include <gdk/gdkkeysyms.h>
46#include "gnc-cell-renderer-label.h"
47#include "gnc-cell-renderer-text-view.h"
50#include "dialog-utils.h"
55#define STATE_KEY "state-key"
58#define STATE_KEY_SORT_COLUMN "sort_column"
59#define STATE_KEY_SORT_ORDER "sort_order"
60#define STATE_KEY_COLUMN_ORDER "column_order"
65#define STATE_KEY_SUFF_VISIBLE "visible"
66#define STATE_KEY_SUFF_WIDTH "width"
72 PROP_SHOW_COLUMN_MENU,
78static QofLogModule log_module = GNC_MOD_GUI;
81static void gnc_tree_view_constructed (GObject *
object);
82static void gnc_tree_view_finalize (GObject *
object);
83static void gnc_tree_view_destroy (GtkWidget *widget);
84static void gnc_tree_view_set_property (GObject *
object,
88static void gnc_tree_view_get_property (GObject *
object,
92static gboolean gnc_tree_view_drop_ok_cb (GtkTreeView *view,
93 GtkTreeViewColumn *column,
94 GtkTreeViewColumn *prev_column,
95 GtkTreeViewColumn *next_column,
97static void gnc_tree_view_build_column_menu (GncTreeView *view);
98static void gnc_tree_view_select_column_cb (GtkTreeViewColumn *column,
100static gchar *gnc_tree_view_get_sort_order (GncTreeView *view);
101static gchar *gnc_tree_view_get_sort_column (GncTreeView *view);
102static gchar **gnc_tree_view_get_column_order (GncTreeView *view,
110 GtkTreeViewColumn *column_menu_column;
111 GtkWidget *column_menu;
112 gboolean show_column_menu;
113 GtkWidget *column_menu_icon_box;
116 GtkTreeModel *sort_model;
119 GFunc editing_started_cb;
120 GFunc editing_finished_cb;
121 gpointer editing_cb_data;
124 gchar *state_section;
125 gboolean seen_state_visibility;
126 gulong columns_changed_cb_id;
127 gulong sort_column_changed_cb_id;
128 gulong size_allocate_cb_id;
131G_DEFINE_TYPE_WITH_CODE(GncTreeView, gnc_tree_view, GTK_TYPE_TREE_VIEW,
132 G_ADD_PRIVATE(GncTreeView))
134#define GNC_TREE_VIEW_GET_PRIVATE(o) \
135 ((GncTreeViewPrivate*)gnc_tree_view_get_instance_private((GncTreeView*)o))
155gnc_tree_view_class_init (GncTreeViewClass *klass)
157 GObjectClass *gobject_class;
158 GtkWidgetClass *gtkwidget_class;
160 gobject_class = G_OBJECT_CLASS(klass);
161 gtkwidget_class = GTK_WIDGET_CLASS(klass);
163 gobject_class->set_property = gnc_tree_view_set_property;
164 gobject_class->get_property = gnc_tree_view_get_property;
166 g_object_class_install_property (gobject_class,
168 g_param_spec_string (
"state-section",
170 "The section name in the saved state to use for (re)storing the treeview's visual state (visible columns, sort order,...",
173 g_object_class_install_property (gobject_class,
174 PROP_SHOW_COLUMN_MENU,
175 g_param_spec_boolean (
"show-column-menu",
177 "Show the column menu so user can change what columns are visible.",
182 gobject_class->constructed = gnc_tree_view_constructed;
183 gobject_class->finalize = gnc_tree_view_finalize;
186 gtkwidget_class->destroy = gnc_tree_view_destroy;
190gnc_tree_view_update_grid_lines (gpointer prefs, gchar* pref, gpointer user_data)
192 GncTreeView *view = user_data;
193 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
197gnc_tree_view_select_column_icon_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
199 GncTreeView *view = user_data;
201 GtkStyleContext *stylectxt = gtk_widget_get_style_context (widget);
205 if (event->button != 1)
208 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
210 gtk_style_context_get_padding (stylectxt, GTK_STATE_FLAG_NORMAL, &padding);
212 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
214 if (event->x < (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.left))
215 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
219 if (event->x > (gtk_widget_get_allocated_width (widget) -
220 (gtk_widget_get_allocated_width (priv->column_menu_icon_box) + padding.right)))
221 gnc_tree_view_select_column_cb (priv->column_menu_column, view);
236gnc_tree_view_init (GncTreeView *view)
239 GtkTreeViewColumn *column;
240 GtkWidget *sep, *icon;
242 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
243 priv->column_menu = NULL;
244 priv->show_column_menu = FALSE;
245 priv->sort_model = NULL;
246 priv->state_section = NULL;
247 priv->seen_state_visibility = FALSE;
248 priv->columns_changed_cb_id = 0;
249 priv->sort_column_changed_cb_id = 0;
250 priv->size_allocate_cb_id = 0;
253 gtk_widget_set_name (GTK_WIDGET(view),
"gnc-id-tree-view");
256 gtk_tree_view_set_column_drag_function (GTK_TREE_VIEW(view),
257 gnc_tree_view_drop_ok_cb, NULL, NULL);
260 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(view), gnc_tree_view_get_grid_lines_pref ());
262 gnc_tree_view_update_grid_lines, view);
264 gnc_tree_view_update_grid_lines, view);
269 icon = gtk_image_new_from_icon_name (
"pan-down-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
271 priv->column_menu_icon_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
272 gtk_box_set_homogeneous (GTK_BOX(priv->column_menu_icon_box), FALSE);
274 gtk_widget_set_margin_start (GTK_WIDGET(icon), 5);
276 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), icon, FALSE, FALSE, 0);
278 sep = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
279 gtk_box_pack_end (GTK_BOX(priv->column_menu_icon_box), sep, FALSE, FALSE, 0);
281 gtk_widget_show_all (priv->column_menu_icon_box);
285 g_object_set (G_OBJECT(column),
287 "widget", priv->column_menu_icon_box,
292 priv->column_menu_column = column;
296 GtkWidget *mybox = gtk_widget_get_parent (icon);
297 GtkWidget *walign = gtk_widget_get_parent (mybox);
298 GtkWidget *box = gtk_widget_get_parent (walign);
299 GtkWidget *button = gtk_widget_get_parent (box);
301 if (!GTK_IS_BUTTON(button))
304 g_signal_connect (G_OBJECT(column),
"clicked",
305 G_CALLBACK(gnc_tree_view_select_column_cb),
313 gtk_widget_set_events (button, GDK_BUTTON_PRESS_MASK);
315 g_signal_connect (G_OBJECT(button),
"button_press_event",
316 G_CALLBACK(gnc_tree_view_select_column_icon_cb),
320 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
330gnc_tree_view_constructed (GObject *obj)
334 G_OBJECT_CLASS (gnc_tree_view_parent_class)->constructed (obj);
348gnc_tree_view_finalize (GObject *
object)
350 ENTER(
"view %p",
object);
351 g_return_if_fail (
object != NULL);
352 g_return_if_fail (GNC_IS_TREE_VIEW(
object));
356 G_OBJECT_CLASS(gnc_tree_view_parent_class)->finalize (
object);
372gnc_tree_view_destroy (GtkWidget *widget)
377 ENTER(
"view %p", widget);
378 g_return_if_fail (widget != NULL);
379 g_return_if_fail (GNC_IS_TREE_VIEW(widget));
381 view = GNC_TREE_VIEW(widget);
384 gnc_tree_view_update_grid_lines, view);
386 gnc_tree_view_update_grid_lines, view);
388 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
390 if (priv->state_section)
394 g_free (priv->state_section);
395 priv->state_section = NULL;
397 if (priv->column_menu)
399 DEBUG(
"removing column selection menu");
400 g_object_unref (priv->column_menu);
401 priv->column_menu = NULL;
404 GTK_WIDGET_CLASS(gnc_tree_view_parent_class)->destroy (widget);
425gnc_tree_view_get_property (GObject *
object,
430 GncTreeView *view = GNC_TREE_VIEW(
object);
433 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
436 case PROP_STATE_SECTION:
437 g_value_set_string (value, priv->state_section);
439 case PROP_SHOW_COLUMN_MENU:
440 g_value_set_boolean (value, priv->show_column_menu);
443 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
458gnc_tree_view_set_property (GObject *
object,
463 GncTreeView *view = GNC_TREE_VIEW(
object);
467 case PROP_STATE_SECTION:
470 case PROP_SHOW_COLUMN_MENU:
474 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
502static GtkTreeViewColumn *
503view_column_find_by_model_id (GncTreeView *view,
506 GtkTreeViewColumn *column, *found = NULL;
507 GList *column_list, *tmp;
511 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
512 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
515 id = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
521 g_list_free (column_list);
541 GtkTreeViewColumn *column, *found = NULL;
542 GList *column_list, *tmp;
546 column_list = gtk_tree_view_get_columns(GTK_TREE_VIEW(view));
547 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
550 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
551 if (!name || (strcmp(name, wanted) != 0))
556 g_list_free (column_list);
597gnc_tree_view_drop_ok_cb (GtkTreeView *view,
598 GtkTreeViewColumn *column,
599 GtkTreeViewColumn *prev_column,
600 GtkTreeViewColumn *next_column,
603 const gchar *pref_name;
608 if (prev_column == NULL)
613 if (next_column == NULL)
621 pref_name = g_object_get_data (G_OBJECT(prev_column), PREF_NAME);
658gnc_tree_view_column_visible (GncTreeView *view,
659 GtkTreeViewColumn *column,
660 const gchar *pref_name)
664 const gchar *col_name = pref_name;
666 ENTER(
"column %p, name %s", column, pref_name ? pref_name :
"(null)");
667 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
670 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
672 LEAVE(
"1, first column");
675 col_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
676 DEBUG(
"col_name is %s", col_name ? col_name :
"(null)");
681 LEAVE(
"1, no pref name");
686 if (priv->state_section)
689 gchar *key = g_strdup_printf (
"%s_%s", col_name, STATE_KEY_SUFF_VISIBLE);
691 if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
693 visible = g_key_file_get_boolean (state_file, priv->state_section, key, NULL);
695 LEAVE(
"%d, state defined visibility", visible);
702 (g_object_get_data (G_OBJECT(column), DEFAULT_VISIBLE) != NULL) : FALSE;
703 LEAVE(
"defaults says %d", visible);
718gnc_tree_view_update_visibility (GtkTreeViewColumn *column,
723 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
724 g_return_if_fail (GNC_IS_TREE_VIEW(view));
727 visible = gnc_tree_view_column_visible (view, column, NULL);
728 gtk_tree_view_column_set_visible (column, visible);
729 LEAVE(
"made %s", visible ?
"visible" :
"invisible");
743gnc_tree_view_get_sort_order (GncTreeView *view)
745 GtkTreeModel *s_model;
748 gchar *order_str = NULL;
750 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
754 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
758 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
760 order_str = g_strdup (order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
761 DEBUG(
"current sort_order is %s", order_str);
775gnc_tree_view_get_sort_column (GncTreeView *view)
777 GtkTreeModel *s_model;
778 GtkTreeViewColumn *column;
783 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
787 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
791 column = view_column_find_by_model_id (view, current);
795 name = g_object_get_data (G_OBJECT(column), PREF_NAME);
796 DEBUG(
"current sort column is %s", name ? name :
"(NULL)");
797 return g_strdup (name);
813gnc_tree_view_get_column_order (GncTreeView *view,
819 gchar *col_names = NULL;
820 gchar **col_str_list;
825 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
826 for (tmp = columns; tmp; tmp = g_list_next(tmp))
828 GtkTreeViewColumn *column = tmp->data;
829 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
831 col_names = g_strdup (name);
834 gchar *col_names_prev = col_names;
835 col_names = g_strjoin (
";", col_names_prev, name, NULL);
836 g_free (col_names_prev);
841 col_str_list = g_strsplit (col_names,
";", 0);
844 g_list_free (columns);
847 LEAVE(
"column order get");
863gnc_tree_view_set_sort_order (GncTreeView *view,
866 GtkTreeModel *s_model;
867 GtkSortType order = GTK_SORT_ASCENDING;
870 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
873 if (g_strcmp0 (name,
"descending") == 0)
874 order = GTK_SORT_DESCENDING;
875 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
877 current = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
878 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
880 DEBUG(
"sort_order set to %s", order == GTK_SORT_ASCENDING ?
"ascending" :
"descending");
892gnc_tree_view_set_sort_column (GncTreeView *view,
895 GtkTreeModel *s_model;
896 GtkTreeViewColumn *column;
898 gint model_column, current;
900 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
907 gtk_tree_sortable_set_sort_column_id (
908 GTK_TREE_SORTABLE(s_model), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
914 GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), MODEL_COLUMN));
915 if (model_column == GNC_TREE_VIEW_COLUMN_DATA_NONE)
918 if (!gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(s_model),
920 order = GTK_SORT_ASCENDING;
922 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(s_model),
923 model_column, order);
924 DEBUG(
"sort column set to %s", name);
940gnc_tree_view_set_column_order (GncTreeView *view,
941 gchar **column_names,
944 GtkTreeViewColumn *column, *prev;
952 for (idx = 0; idx < length; idx++)
954 const gchar *name = column_names [idx];
958 columns = g_slist_append (columns, column);
962 for (prev = NULL, tmp = columns; tmp; tmp = g_slist_next (tmp))
965 gtk_tree_view_move_column_after (GTK_TREE_VIEW(view), column, prev);
970 g_slist_free (columns);
971 LEAVE(
"column order set");
988 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
989 if (!priv->state_section)
991 LEAVE(
"no state section");
995 g_key_file_remove_group (state_file, priv->state_section, NULL);
996 g_free (priv->state_section);
997 priv->state_section = NULL;
1010 const gchar *section)
1013 GKeyFile *state_file;
1015 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1017 ENTER(
"view %p, section %s", view, section);
1019 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1022 if (priv->state_section)
1027 LEAVE(
"cleared state section");
1032 priv->state_section = g_strdup (section);
1035 if (g_key_file_has_group (state_file, priv->state_section))
1037 gsize num_keys, idx;
1038 gchar **keys = g_key_file_get_keys (state_file, priv->state_section, &num_keys, NULL);
1039 for (idx = 0; idx < num_keys; idx++)
1041 gchar *key = keys[idx];
1042 if (g_strcmp0 (key, STATE_KEY_SORT_COLUMN) == 0)
1044 gchar *name = g_key_file_get_string (state_file, priv->state_section,
1046 gnc_tree_view_set_sort_column (view, name);
1049 else if (g_strcmp0 (key, STATE_KEY_SORT_ORDER) == 0)
1051 gchar *name = g_key_file_get_string (state_file, priv->state_section,
1053 gnc_tree_view_set_sort_order (view, name);
1056 else if (g_strcmp0 (key, STATE_KEY_COLUMN_ORDER) == 0)
1059 gchar **columns = g_key_file_get_string_list (state_file, priv->state_section,
1060 key, &length, NULL);
1061 gnc_tree_view_set_column_order (view, columns, length);
1062 g_strfreev (columns);
1068 gboolean known = FALSE;
1069 gchar *column_name = g_strdup (key);
1070 gchar *type_name = g_strrstr (column_name,
"_");
1072 if (type_name != NULL)
1074 *type_name++ =
'\0';
1076 if (g_strcmp0 (type_name, STATE_KEY_SUFF_VISIBLE) == 0)
1082 if (!g_object_get_data (G_OBJECT (column), ALWAYS_VISIBLE))
1084 gtk_tree_view_column_set_visible (column,
1085 g_key_file_get_boolean (state_file, priv->state_section, key, NULL));
1089 else if (g_strcmp0 (type_name, STATE_KEY_SUFF_WIDTH) == 0)
1091 gint width = g_key_file_get_integer (state_file, priv->state_section, key, NULL);
1096 if (width && (width != gtk_tree_view_column_get_width (column)))
1098 gtk_tree_view_column_set_fixed_width (column, width);
1103 DEBUG (
"Ignored key %s", key);
1105 g_free (column_name);
1113 gnc_tree_view_build_column_menu (view);
1114 LEAVE (
"set state section");
1128 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1130 priv = GNC_TREE_VIEW_GET_PRIVATE (view);
1131 return priv->state_section;
1138 ENTER(
"view %p", view);
1139 g_return_if_fail (view != NULL);
1140 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1142 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1144 if (priv->state_section)
1147 GList *column_list, *tmp;
1150 gchar *sort_column = gnc_tree_view_get_sort_column (view);
1151 gchar *sort_order = gnc_tree_view_get_sort_order (view);
1152 gchar **col_order = gnc_tree_view_get_column_order (view, &num_cols);
1155 if (sort_column && (g_strcmp0 (sort_column,
"name") != 0))
1156 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, sort_column);
1157 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL))
1158 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_COLUMN, NULL);
1159 g_free (sort_column);
1163 if (g_strcmp0 (sort_order,
"descending") == 0)
1164 g_key_file_set_string (state_file, priv->state_section, STATE_KEY_SORT_ORDER, sort_order);
1165 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL))
1166 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_SORT_ORDER, NULL);
1167 g_free (sort_order);
1169 if (col_order && (num_cols > 0))
1170 g_key_file_set_string_list (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER,
1171 (
const gchar**) col_order, num_cols);
1172 else if (g_key_file_has_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL))
1173 g_key_file_remove_key (state_file, priv->state_section, STATE_KEY_COLUMN_ORDER, NULL);
1175 g_strfreev (col_order);
1179 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1180 for (tmp = column_list; tmp; tmp = g_list_next (tmp))
1182 GtkTreeViewColumn *column = tmp->data;
1184 const gchar *name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1188 if (!g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1190 key = g_strjoin (
"_", name, STATE_KEY_SUFF_VISIBLE, NULL);
1191 g_key_file_set_boolean (state_file, priv->state_section, key,
1192 gtk_tree_view_column_get_visible (column));
1196 key = g_strjoin (
"_", name, STATE_KEY_SUFF_WIDTH, NULL);
1197 if (g_object_get_data (G_OBJECT(column),
"default-width") &&
1198 (GPOINTER_TO_INT((g_object_get_data (G_OBJECT(column),
"default-width")))
1199 != gtk_tree_view_column_get_width (column)))
1201 g_key_file_set_integer (state_file, priv->state_section, key,
1202 gtk_tree_view_column_get_width (column));
1204 else if (g_key_file_has_key (state_file, priv->state_section, key, NULL))
1205 g_key_file_remove_key (state_file, priv->state_section, key, NULL);
1208 g_list_free (column_list);
1240gnc_tree_view_create_menu_item (GtkTreeViewColumn *column,
1245 const gchar *column_name, *pref_name;
1250 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1251 if (!priv->state_section)
1257 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1265 if (!priv->column_menu)
1267 priv->column_menu = gtk_menu_new();
1268 g_object_ref_sink (priv->column_menu);
1272 column_name = g_object_get_data (G_OBJECT(column), REAL_TITLE);
1274 column_name = gtk_tree_view_column_get_title (column);
1275 widget = gtk_check_menu_item_new_with_label (column_name);
1276 gtk_menu_shell_append (GTK_MENU_SHELL(priv->column_menu), widget);
1279 if (g_object_get_data (G_OBJECT(column), ALWAYS_VISIBLE))
1281 g_object_set_data (G_OBJECT(widget), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1282 gtk_widget_set_sensitive (widget, FALSE);
1285 binding = g_object_bind_property (G_OBJECT(widget),
"active", G_OBJECT(column),
"visible", 0);
1286 g_object_set_data (G_OBJECT(widget),
"column-binding", binding);
1289 key = g_strdup_printf (
"%s_%s", pref_name, STATE_KEY_SUFF_VISIBLE);
1290 g_object_set_data_full (G_OBJECT(widget), STATE_KEY, key, g_free);
1295column_menu_sort (GtkTreeViewColumn *columna, GtkTreeViewColumn *columnb)
1297 const gchar *column_namea = g_object_get_data (G_OBJECT(columna), REAL_TITLE);
1298 const gchar *column_nameb = g_object_get_data (G_OBJECT(columnb), REAL_TITLE);
1301 column_namea = gtk_tree_view_column_get_title (columna);
1304 column_nameb = gtk_tree_view_column_get_title (columnb);
1321gnc_tree_view_build_column_menu (GncTreeView *view)
1326 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1328 ENTER(
"view %p", view);
1329 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1332 if (priv->column_menu)
1334 g_object_unref (priv->column_menu);
1335 priv->column_menu = NULL;
1338 if (priv->show_column_menu && priv->state_section)
1341 if (priv->column_menu_column)
1342 gtk_tree_view_column_set_visible (priv->column_menu_column, TRUE);
1345 column_list = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1346 column_list = g_list_sort (column_list, (GCompareFunc)column_menu_sort);
1347 g_list_foreach (column_list, (GFunc)gnc_tree_view_create_menu_item, view);
1348 g_list_free (column_list);
1353 if (priv->column_menu_column)
1354 gtk_tree_view_column_set_visible (priv->column_menu_column, FALSE);
1356 LEAVE(
"menu: show %d, section %s", priv->show_column_menu,
1357 priv->state_section ? priv->state_section :
"(null)");
1370gnc_tree_view_update_column_menu_item (GtkCheckMenuItem *checkmenuitem,
1375 g_return_if_fail (GTK_IS_CHECK_MENU_ITEM(checkmenuitem));
1376 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1378 if (g_object_get_data (G_OBJECT(checkmenuitem), ALWAYS_VISIBLE))
1384 GBinding *binding = g_object_get_data (G_OBJECT(checkmenuitem),
"column-binding");
1385 GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(g_binding_dup_target (binding));
1387 visible = gtk_tree_view_column_get_visible (column);
1388 g_object_unref(column);
1390 gtk_check_menu_item_set_active (checkmenuitem, visible);
1406gnc_tree_view_select_column_cb (GtkTreeViewColumn *column,
1412 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN(column));
1413 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1415 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1416 menu = priv->column_menu;
1421 gtk_container_foreach (GTK_CONTAINER(menu),
1422 (GtkCallback)gnc_tree_view_update_column_menu_item,
1426 gtk_widget_show_all (menu);
1429 gtk_menu_popup_at_pointer (GTK_MENU(priv->column_menu), NULL);
1434 gchar *first_column_name,
1437 GtkTreeViewColumn *column;
1438 GList *columns, *tmp;
1439 gchar *name, *pref_name;
1442 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1444 va_start (args, first_column_name);
1445 name = first_column_name;
1448 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1449 for (tmp = columns; tmp; tmp = g_list_next (tmp))
1452 pref_name = g_object_get_data (G_OBJECT(column), PREF_NAME);
1453 if (pref_name != NULL)
1454 gtk_tree_view_column_set_expand (column, FALSE);
1456 g_list_free(columns);
1459 while (name != NULL)
1464 gtk_tree_view_column_set_expand (column, TRUE);
1466 name = va_arg (args, gchar*);
1477update_control_cell_renderers_background (GncTreeView *view, GtkTreeViewColumn *col,
1478 gint column, GtkTreeCellDataFunc func )
1481 GtkCellRenderer *cell;
1484 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(col));
1487 for (node = renderers; node; node = node->next)
1491 gtk_tree_view_column_add_attribute (col, cell,
"cell-background", column);
1493 gtk_tree_view_column_set_cell_data_func (col, cell, func, view, NULL);
1495 g_list_free (renderers);
1506 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1508 ENTER(
"view %p, column %d, func %p", view, column, func);
1509 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1511 update_control_cell_renderers_background (view, priv->column_menu_column, column, func);
1524 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1526 ENTER(
"view %p, sort_model %p", view, s_model);
1527 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1529 priv->sort_model = s_model;
1546 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1548 ENTER(
"view %p, show menu %d", view, visible);
1549 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1550 priv->show_column_menu = visible;
1551 gnc_tree_view_build_column_menu (view);
1566 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), FALSE);
1568 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1569 return (priv->show_column_menu);
1579gnc_tree_view_count_visible_columns (GncTreeView *view)
1581 GList *columns, *node;
1584 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1585 for (node = columns; node; node = node->next)
1587 GtkTreeViewColumn *col = GTK_TREE_VIEW_COLUMN(node->data);
1589 if (g_object_get_data (G_OBJECT(col), DEFAULT_VISIBLE) ||
1590 g_object_get_data (G_OBJECT(col), ALWAYS_VISIBLE))
1593 g_list_free (columns);
1601 GtkTreeViewColumn *column;
1603 gboolean hide_menu_column;
1605 g_return_if_fail (GNC_IS_TREE_VIEW(view));
1610 columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(view));
1611 g_list_foreach (columns, (GFunc)gnc_tree_view_update_visibility, view);
1612 g_list_free (columns);
1614 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1615 if (priv->state_section)
1616 priv->seen_state_visibility = TRUE;
1620 hide_menu_column = (gnc_tree_view_count_visible_columns (view) == 1);
1621 column = gtk_tree_view_get_column (GTK_TREE_VIEW(view), 0);
1622 gtk_tree_view_column_set_expand (column, hide_menu_column);
1623 gtk_tree_view_column_set_visible (priv->column_menu_column, !hide_menu_column);
1659gnc_tree_view_column_properties (GncTreeView *view,
1660 GtkTreeViewColumn *column,
1661 const gchar *pref_name,
1665 GtkTreeIterCompareFunc column_sort_fn)
1668 GtkTreeModel *s_model;
1674 g_object_set_data (G_OBJECT(column), PREF_NAME, (gpointer)pref_name);
1675 if (data_column == 0)
1676 g_object_set_data (G_OBJECT(column), ALWAYS_VISIBLE, GINT_TO_POINTER(1));
1677 g_object_set_data (G_OBJECT(column), MODEL_COLUMN,
1678 GINT_TO_POINTER(data_column));
1681 visible = gnc_tree_view_column_visible (view, NULL, pref_name);
1684 g_object_set (G_OBJECT(column),
1686 "resizable", resizable && pref_name != NULL,
1687 "reorderable", pref_name != NULL,
1691 if (default_width == 0)
1694 g_object_set (G_OBJECT(column),
1695 "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE,
1705 width = default_width + 10;
1710 g_object_set (G_OBJECT(column),
1711 "sizing", GTK_TREE_VIEW_COLUMN_FIXED,
1712 "fixed-width", width,
1719 g_object_set_data (G_OBJECT(column),
1720 "default-width", GINT_TO_POINTER(width));
1723 s_model = gtk_tree_view_get_model (GTK_TREE_VIEW(view));
1724 if (GTK_IS_TREE_SORTABLE(s_model))
1726 gtk_tree_view_column_set_sort_column_id (column, data_column);
1729 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(s_model),
1730 data_column, column_sort_fn,
1731 GINT_TO_POINTER(data_column),
1737 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
1738 if (priv->sort_model != NULL)
1740 gtk_tree_view_column_set_sort_column_id (column, data_column);
1743 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(priv->sort_model),
1744 data_column, column_sort_fn,
1753 gnc_tree_view_create_menu_item (column, view);
1769 const gchar *column_title,
1770 const gchar *column_short_title,
1771 const gchar *pref_name,
1772 gint model_data_column,
1773 gint model_visibility_column,
1774 GtkTreeIterCompareFunc column_sort_fn,
1775 renderer_toggled toggle_edited_cb)
1777 GtkTreeViewColumn *column;
1778 GtkCellRenderer *renderer;
1780 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1782 renderer = gtk_cell_renderer_toggle_new ();
1783 if (!toggle_edited_cb)
1785 gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE(renderer), FALSE);
1788 gtk_tree_view_column_new_with_attributes (column_short_title,
1790 "active", model_data_column,
1794 g_object_set_data_full (G_OBJECT(column), REAL_TITLE,
1795 g_strdup(column_title), g_free);
1796 if (toggle_edited_cb)
1797 g_signal_connect (G_OBJECT(renderer),
"toggled",
1798 G_CALLBACK(toggle_edited_cb), view);
1800 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1801 gtk_tree_view_column_add_attribute (column, renderer,
1802 "visible", model_visibility_column);
1805 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1806 0, FALSE, column_sort_fn);
1811 gtk_widget_set_tooltip_text (gtk_tree_view_column_get_button (column), column_title);
1817renderer_editing_canceled_cb (GtkCellRenderer *renderer, gpointer user_data)
1819 GncTreeView *view = user_data;
1821 if (priv->editing_finished_cb)
1822 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1826renderer_editing_started_cb (GtkCellRenderer *renderer,
1827 GtkCellEditable *editable, gchar *path, gpointer user_data)
1829 GncTreeView *view = user_data;
1831 if (priv->editing_started_cb)
1832 (priv->editing_started_cb)(view, priv->editing_cb_data);
1836renderer_edited_cb (GtkCellRendererText *renderer, gchar *path,
1837 gchar *new_text, gpointer user_data)
1839 GncTreeView *view = user_data;
1841 if (priv->editing_finished_cb)
1842 (priv->editing_finished_cb)(view, priv->editing_cb_data);
1846static GtkTreeViewColumn *
1847add_text_column_variant (GncTreeView *view, GtkCellRenderer *renderer,
1848 const gchar *column_title,
1849 const gchar *pref_name,
1850 const gchar *icon_name,
1851 const gchar *sizing_text,
1852 gint model_data_column,
1853 gint model_visibility_column,
1854 GtkTreeIterCompareFunc column_sort_fn)
1856 GtkTreeViewColumn *column;
1857 PangoLayout* layout;
1858 int default_width, title_width;
1860 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1862 column = gtk_tree_view_column_new ();
1863 gtk_tree_view_column_set_title (column, column_title);
1868 GtkCellRenderer *renderer_pix = gtk_cell_renderer_pixbuf_new ();
1869 g_object_set (renderer_pix,
"icon-name", icon_name, NULL);
1870 gtk_tree_view_column_pack_start (column, renderer_pix, FALSE);
1874 gtk_tree_view_column_pack_start (column, renderer, TRUE);
1877 g_signal_connect (G_OBJECT(renderer),
"editing-canceled",
1878 (GCallback)renderer_editing_canceled_cb, view);
1880 g_signal_connect (G_OBJECT(renderer),
"editing-started",
1881 (GCallback)renderer_editing_started_cb, view);
1883 g_signal_connect (G_OBJECT(renderer),
"edited",
1884 (GCallback)renderer_edited_cb, view);
1887 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
1888 gtk_tree_view_column_add_attribute (column, renderer,
1889 "text", model_data_column);
1890 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
1891 gtk_tree_view_column_add_attribute (column, renderer,
1892 "visible", model_visibility_column);
1895 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
1896 pango_layout_get_pixel_size (layout, &title_width, NULL);
1897 g_object_unref (layout);
1898 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
1899 pango_layout_get_pixel_size (layout, &default_width, NULL);
1900 g_object_unref (layout);
1901 default_width = MAX(default_width, title_width);
1903 default_width += 10;
1904 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
1905 default_width, TRUE, column_sort_fn);
1922 const gchar *column_title,
1923 const gchar *pref_name,
1924 const gchar *icon_name,
1925 const gchar *sizing_text,
1926 gint model_data_column,
1927 gint model_visibility_column,
1928 GtkTreeIterCompareFunc column_sort_fn)
1930 GtkCellRenderer *renderer;
1932 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1934 renderer = gtk_cell_renderer_text_new ();
1936 return add_text_column_variant (view, renderer,
1937 column_title, pref_name,
1938 icon_name, sizing_text,
1940 model_visibility_column,
1954 const gchar *column_title,
1955 const gchar *pref_name,
1956 const gchar *icon_name,
1957 const gchar *sizing_text,
1958 gint model_data_column,
1959 gint model_visibility_column,
1960 GtkTreeIterCompareFunc column_sort_fn)
1962 GtkCellRenderer *renderer;
1964 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
1966 renderer = gnc_cell_renderer_text_view_new ();
1968 return add_text_column_variant (view, renderer,
1969 column_title, pref_name,
1970 icon_name, sizing_text,
1972 model_visibility_column,
1986 const gchar *column_title,
1987 const gchar *pref_name,
1988 const gchar *sizing_text,
1989 gint model_data_column,
1990 gint model_visibility_column,
1991 GtkTreeIterCompareFunc column_sort_fn)
1993 GtkTreeViewColumn *column;
1994 PangoLayout* layout;
1995 int default_width, title_width;
1996 GtkCellRenderer *renderer;
1998 g_return_val_if_fail (GNC_IS_TREE_VIEW(view), NULL);
2000 renderer = gtk_cell_renderer_pixbuf_new ();
2002 column = gtk_tree_view_column_new ();
2003 gtk_tree_view_column_set_title (column, column_title);
2006 gtk_tree_view_column_pack_start (column, renderer, TRUE);
2009 if (model_data_column != GNC_TREE_VIEW_COLUMN_DATA_NONE)
2010 gtk_tree_view_column_add_attribute (column, renderer,
2011 "icon-name", model_data_column);
2012 if (model_visibility_column != GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS)
2013 gtk_tree_view_column_add_attribute (column, renderer,
2014 "visible", model_visibility_column);
2017 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), column_title);
2018 pango_layout_get_pixel_size (layout, &title_width, NULL);
2019 g_object_unref (layout);
2020 layout = gtk_widget_create_pango_layout (GTK_WIDGET(view), sizing_text);
2021 pango_layout_get_pixel_size (layout, &default_width, NULL);
2022 g_object_unref (layout);
2023 default_width = MAX(default_width, title_width);
2025 default_width += 10;
2026 gnc_tree_view_column_properties (view, column, pref_name, model_data_column,
2027 default_width, TRUE, column_sort_fn);
2037 GtkCellRenderer *cr = NULL;
2039 g_return_val_if_fail (GTK_TREE_VIEW_COLUMN(column), NULL);
2042 renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(column));
2043 if (g_list_length (renderers) > 0)
2044 cr = GTK_CELL_RENDERER(renderers->data);
2045 g_list_free (renderers);
2062 const gchar *column_title,
2063 const gchar *pref_name,
2064 const gchar *sizing_text,
2065 gint model_data_column,
2066 gint model_color_column,
2067 gint model_visibility_column,
2068 GtkTreeIterCompareFunc column_sort_fn)
2070 GtkTreeViewColumn *column;
2071 GtkCellRenderer *renderer;
2072 gfloat alignment = 1.0;
2077 renderer = gnc_cell_renderer_label_new ();
2078 column = add_text_column_variant (view, renderer, column_title, pref_name,
2079 NULL, sizing_text, model_data_column,
2080 model_visibility_column, column_sort_fn);
2083 if (gtk_widget_get_direction (GTK_WIDGET(view)) == GTK_TEXT_DIR_RTL)
2086 g_object_set (G_OBJECT(column),
"alignment", alignment, NULL);
2087 g_object_set (G_OBJECT(renderer),
"xalign", alignment, NULL);
2090 if (model_color_column != GNC_TREE_VIEW_COLUMN_COLOR_NONE)
2091 gtk_tree_view_column_add_attribute (column, renderer,
2092 "foreground", model_color_column);
2107 GtkTreeViewColumn *column)
2109 int n = gtk_tree_view_get_n_columns (GTK_TREE_VIEW(view));
2114 return gtk_tree_view_insert_column (GTK_TREE_VIEW(view), column, n);
2118get_column_next_to (GtkTreeView *tv, GtkTreeViewColumn **col, gboolean backward)
2121 GtkTreeViewColumn *c = NULL;
2123 gboolean wrapped = FALSE;
2125 cols = gtk_tree_view_get_columns (tv);
2126 g_return_val_if_fail (cols != NULL, FALSE);
2128 node = g_list_find (cols, *col);
2129 g_return_val_if_fail (node, FALSE);
2132 node = backward ? node->prev : node->next;
2136 node = backward ? g_list_last (cols) : cols;
2138 c = GTK_TREE_VIEW_COLUMN (node->data);
2139 if (c && gtk_tree_view_column_get_visible (c))
2141 if (c == *col)
break;
2151gnc_tree_view_path_is_valid (GncTreeView *view, GtkTreePath *path)
2153 GtkTreeView *tv = GTK_TREE_VIEW(view);
2154 GtkTreeModel *s_model;
2157 s_model = gtk_tree_view_get_model (tv);
2158 return gtk_tree_model_get_iter (s_model, &iter, path);
2162gnc_tree_view_keynav (GncTreeView *view, GtkTreeViewColumn **col,
2163 GtkTreePath *path, GdkEventKey *event)
2165 GtkTreeView *tv = GTK_TREE_VIEW(view);
2169 if (event->type != GDK_KEY_PRESS)
return;
2171 switch (event->keyval)
2174 case GDK_KEY_ISO_Left_Tab:
2175 case GDK_KEY_KP_Tab:
2176 shifted =
event->state & GDK_SHIFT_MASK;
2177 if (get_column_next_to (tv, col, shifted))
2180 depth = gtk_tree_path_get_depth (path);
2183 if (!gtk_tree_path_prev (path) && depth > 1)
2185 gtk_tree_path_up (path);
2188 else if (gtk_tree_view_row_expanded (tv, path))
2190 gtk_tree_path_down (path);
2194 gtk_tree_path_next (path);
2195 if (!gnc_tree_view_path_is_valid (view, path) && depth > 2)
2197 gtk_tree_path_prev (path);
2198 gtk_tree_path_up (path);
2199 gtk_tree_path_next (path);
2201 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2203 gtk_tree_path_prev (path);
2204 gtk_tree_path_up (path);
2205 gtk_tree_path_next (path);
2211 case GDK_KEY_Return:
2212 case GDK_KEY_KP_Enter:
2213 if (gtk_tree_view_row_expanded (tv, path))
2215 gtk_tree_path_down (path);
2219 depth = gtk_tree_path_get_depth (path);
2220 gtk_tree_path_next (path);
2221 if (!gnc_tree_view_path_is_valid (view, path) && depth > 1)
2223 gtk_tree_path_prev (path);
2224 gtk_tree_path_up (path);
2225 gtk_tree_path_next (path);
2238 if (!view && !editing_started_cb)
2241 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2243 priv->editing_started_cb = editing_started_cb;
2244 priv->editing_cb_data = editing_cb_data;
2252 if (!view && !editing_finished_cb)
2255 priv = GNC_TREE_VIEW_GET_PRIVATE(view);
2257 priv->editing_finished_cb = editing_finished_cb;
2258 priv->editing_cb_data = editing_cb_data;
All type declarations for the whole Gnucash engine.
Gnome specific utility functions.
Generic api to store and retrieve preferences.
Functions to load, save and get gui state.
common utilities for manipulating a GtkTreeView within gnucash
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
void gnc_tree_view_configure_columns(GncTreeView *view)
Make all the correct columns visible, respecting their default visibility setting,...
void gnc_tree_view_set_editing_finished_cb(GncTreeView *view, GFunc editing_finished_cb, gpointer editing_cb_data)
Setup a callback for when the user finishes editing so appropriate actions can be taken like enable t...
GtkCellRenderer * gnc_tree_view_column_get_renderer(GtkTreeViewColumn *column)
Return the "main" cell renderer from a GtkTreeViewColumn added to a GncTreeView my one of the conveni...
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new text column to a GncTreeView base view.
void gnc_tree_view_remove_state_information(GncTreeView *view)
Completely wipe the treeview's state information (column visibility, width, sorting order,...
GtkTreeViewColumn * gnc_tree_view_add_toggle_column(GncTreeView *view, const gchar *column_title, const gchar *column_short_title, const gchar *pref_name, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn, renderer_toggled toggle_edited_cb)
This function adds a new toggle column to a GncTreeView base view.
GtkTreeViewColumn * gnc_tree_view_add_numeric_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_color_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new numeric column to a GncTreeView base view.
void gnc_tree_view_set_control_column_background(GncTreeView *view, gint column, GtkTreeCellDataFunc func)
This function links the cell backgrounds of the two control columns to a column in the model that has...
void gnc_tree_view_set_editing_started_cb(GncTreeView *view, GFunc editing_started_cb, gpointer editing_cb_data)
Setup a callback for when the user starts editing so appropriate actions can be taken like disable th...
void gnc_tree_view_save_state(GncTreeView *view)
This function is called to write the treeview's state information (column visibility,...
void gnc_tree_view_set_show_column_menu(GncTreeView *view, gboolean visible)
This function is called to set the "show-column-menu" property on this view.
GtkTreeViewColumn * gnc_tree_view_add_text_view_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new text view column to a GncTreeView base view.
GtkTreeViewColumn * gnc_tree_view_add_pix_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
This function adds a new pixbuf view column to a GncTreeView base view.
const gchar * gnc_tree_view_get_state_section(GncTreeView *view)
Get the name of the state section this tree view is associated with.
void gnc_tree_view_set_state_section(GncTreeView *view, const gchar *section)
Set up or remove an association between a saved state section and the display of a view.
void gnc_tree_view_expand_columns(GncTreeView *view, gchar *first_column_name,...)
This function set the columns that will be allocated the free space in the view.
gboolean gnc_tree_view_get_show_column_menu(GncTreeView *view)
This function is called to get the current value of the "show-column-menu" property.
gint gnc_tree_view_append_column(GncTreeView *view, GtkTreeViewColumn *column)
Add a column to a view based upon a GncTreeView.
void gnc_tree_view_set_sort_user_data(GncTreeView *view, GtkTreeModel *s_model)
This allows the columns to be setup without the model connected.
GtkTreeViewColumn * gnc_tree_view_find_column_by_name(GncTreeView *view, const gchar *wanted)
Find a tree column given the "pref name" used with saved state.
void gnc_gobject_tracking_remember(GObject *object)
Tell gnucash to remember this object in the database.
void gnc_gobject_tracking_forget(GObject *object)
Tell gnucash to remember this object in the database.
int safe_utf8_collate(const char *da, const char *db)
Collate two UTF-8 strings.
#define DEBUG(format, args...)
Print a debugging message.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
Remove a function that was registered for a callback when the given preference changed.
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
Register a callback that gets triggered when the given preference changes.