36 static GtkTreeModel *account_types_tree_model = NULL;
38 #define TYPE_MASK "type-mask"
46 gnc_tree_model_account_types_finalize (GObject *
object);
51 gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface);
58 #define GNC_TREE_MODEL_ACCOUNT_TYPES_GET_PRIVATE(o) \
59 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_MODEL_ACCOUNT_TYPES, \
60 GncTreeModelAccountTypesPrivate))
62 static GObjectClass *parent_class = NULL;
65 gnc_tree_model_account_types_get_type (
void)
67 static GType gnc_tree_model_account_types_type = 0;
69 if (gnc_tree_model_account_types_type == 0)
71 static const GTypeInfo our_info =
76 (GClassInitFunc) gnc_tree_model_account_types_class_init,
81 (GInstanceInitFunc) gnc_tree_model_account_types_init
84 static const GInterfaceInfo tree_model_info =
86 (GInterfaceInitFunc) gnc_tree_model_account_types_tree_model_init,
91 gnc_tree_model_account_types_type =
92 g_type_register_static (G_TYPE_OBJECT,
93 "GncTreeModelAccountTypes",
96 g_type_add_interface_static (gnc_tree_model_account_types_type,
97 GTK_TYPE_TREE_MODEL, &tree_model_info);
100 return gnc_tree_model_account_types_type;
106 GObjectClass *object_class = G_OBJECT_CLASS (klass);
108 parent_class = g_type_class_peek_parent (klass);
110 object_class->finalize = gnc_tree_model_account_types_finalize;
118 while (model->stamp == 0)
120 model->stamp = g_random_int ();
125 gnc_tree_model_account_types_finalize (GObject *
object)
127 g_return_if_fail (
object != NULL);
128 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (
object));
130 G_OBJECT_CLASS (parent_class)->finalize (
object);
134 gnc_tree_model_account_types_new (guint32 selected)
139 model = g_object_new (GNC_TYPE_TREE_MODEL_ACCOUNT_TYPES, NULL);
140 priv = GNC_TREE_MODEL_ACCOUNT_TYPES_GET_PRIVATE(model);
141 priv->selected = selected;
143 return GTK_TREE_MODEL (model);
146 static GtkTreeModel *
147 gnc_tree_model_account_types_master(
void)
149 if (!account_types_tree_model)
150 account_types_tree_model = gnc_tree_model_account_types_new(0);
151 return account_types_tree_model;
156 gnc_tree_model_account_types_is_valid (GtkTreeModel *model,
157 GtkTreeIter *iter, gpointer data)
160 GObject *f_model = G_OBJECT (data);
161 guint32 valid_types = GPOINTER_TO_UINT (g_object_get_data (
162 f_model, TYPE_MASK));
164 gtk_tree_model_get (model, iter,
165 GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE, &type, -1);
166 return (valid_types & (1 << type)) ? TRUE : FALSE;
170 gnc_tree_model_account_types_filter_using_mask (guint32 types)
172 GtkTreeModel *f_model;
174 f_model = gtk_tree_model_filter_new (gnc_tree_model_account_types_master (),
176 g_object_set_data (G_OBJECT (f_model), TYPE_MASK, GUINT_TO_POINTER (types));
177 gtk_tree_model_filter_set_visible_func (
178 GTK_TREE_MODEL_FILTER (f_model), gnc_tree_model_account_types_is_valid,
185 gnc_tree_model_account_types_set_mask (GtkTreeModel *f_model,
188 g_return_if_fail (f_model);
190 g_object_set_data (G_OBJECT (f_model), TYPE_MASK, GUINT_TO_POINTER (types));
191 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
195 gnc_tree_model_account_types_get_mask (GtkTreeModel *f_model)
197 g_return_val_if_fail (f_model, 0);
199 return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (f_model), TYPE_MASK));
203 gnc_tree_model_account_types_get_selection (GtkTreeSelection *sel)
205 GtkTreeModel *f_model, *model;
211 g_return_val_if_fail(GTK_IS_TREE_SELECTION(sel), 0);
212 view = gtk_tree_selection_get_tree_view(sel);
213 g_return_val_if_fail (view, 0);
217 list = gtk_tree_selection_get_selected_rows(sel, &f_model);
219 f_model = gtk_tree_view_get_model(view);
221 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
222 if (model != account_types_tree_model)
223 PERR(
"TreeSelection's TreeModel is not the account-types Model");
226 for (node = list; node; node = node->next)
228 path = gtk_tree_model_filter_convert_path_to_child_path(
229 GTK_TREE_MODEL_FILTER(f_model), (GtkTreePath*)node->data);
230 if (!path || gtk_tree_path_get_depth(path) != 1)
232 PERR(
"Invalid Account-types TreePath.");
235 bits |= (1 << gtk_tree_path_get_indices(path)[0]);
239 g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
246 gnc_tree_model_account_types_get_selection_single(GtkTreeSelection *sel)
249 guint32 selected = gnc_tree_model_account_types_get_selection(sel);
252 if (selected & (1 << i))
258 gnc_tree_model_account_types_set_selection (GtkTreeSelection *sel,
261 GtkTreePath *path, *f_path;
262 GtkTreeModelFilter *f_model;
266 g_return_if_fail(GTK_IS_TREE_SELECTION(sel));
267 view = gtk_tree_selection_get_tree_view(sel);
268 g_return_if_fail (view);
269 f_model = GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(view));
270 g_return_if_fail(gtk_tree_model_filter_get_model(f_model) ==
271 account_types_tree_model);
272 gtk_tree_selection_unselect_all(sel);
273 path = gtk_tree_path_new_first();
277 if (selected & (1 << i))
279 f_path = gtk_tree_model_filter_convert_child_path_to_path(
281 gtk_tree_selection_select_path(sel, f_path);
282 gtk_tree_view_scroll_to_cell(view, f_path, NULL, FALSE, 0.0, 0.0);
284 gtk_tree_path_next(path);
286 gtk_tree_path_free(path);
292 static GtkTreeModelFlags
293 gnc_tree_model_account_types_get_flags (GtkTreeModel * tree_model)
295 return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
299 gnc_tree_model_account_types_get_n_columns (GtkTreeModel * tree_model)
301 return GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS;
305 gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model,
308 g_return_val_if_fail(GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model),
310 g_return_val_if_fail((index < GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS)
311 && (index >= 0), G_TYPE_INVALID);
315 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
317 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
318 return G_TYPE_STRING;
319 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
320 return G_TYPE_BOOLEAN;
322 g_assert_not_reached ();
323 return G_TYPE_INVALID;
328 gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model,
329 GtkTreeIter * iter, GtkTreePath * path)
334 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
335 g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
337 i = gtk_tree_path_get_indices (path)[0];
341 iter->stamp = model->stamp;
342 iter->user_data = GINT_TO_POINTER (i);
351 gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model,
357 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), NULL);
358 g_return_val_if_fail (iter != NULL, NULL);
359 g_return_val_if_fail (iter->stamp == model->stamp, NULL);
361 path = gtk_tree_path_new ();
363 gtk_tree_path_append_index (path, GPOINTER_TO_INT (iter->user_data));
369 gnc_tree_model_account_types_get_value (GtkTreeModel * tree_model,
370 GtkTreeIter * iter,
int column,
376 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model));
377 g_return_if_fail (iter != NULL);
378 g_return_if_fail (iter->stamp == model->stamp);
380 priv = GNC_TREE_MODEL_ACCOUNT_TYPES_GET_PRIVATE(model);
383 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
384 g_value_init (value, G_TYPE_INT);
385 g_value_set_int (value, GPOINTER_TO_INT (iter->user_data));
387 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
388 g_value_init (value, G_TYPE_STRING);
390 GPOINTER_TO_INT (iter->user_data)));
392 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
393 g_value_init (value, G_TYPE_BOOLEAN);
394 g_value_set_boolean (value, priv->selected &
395 (1 << GPOINTER_TO_INT (iter->user_data)));
398 g_assert_not_reached ();
403 gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model,
408 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
409 g_return_val_if_fail (iter != NULL, FALSE);
410 g_return_val_if_fail (iter->stamp == model->stamp, FALSE);
412 if (GPOINTER_TO_INT (iter->user_data) < NUM_ACCOUNT_TYPES - 1)
414 iter->user_data = GINT_TO_POINTER(
415 GPOINTER_TO_INT(iter->user_data) + 1);
424 gnc_tree_model_account_types_iter_children (GtkTreeModel * tree_model,
426 GtkTreeIter * parent)
429 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES(tree_model), FALSE);
434 iter->stamp = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp;
435 iter->user_data = GINT_TO_POINTER (0);
441 gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model,
448 gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model,
451 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), -1);
456 g_return_val_if_fail (
457 GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp == iter->stamp, -1);
463 gnc_tree_model_account_types_iter_nth_child (GtkTreeModel * tree_model,
465 GtkTreeIter * parent,
int n)
469 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), FALSE);
474 model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
478 iter->stamp = model->stamp;
479 iter->user_data = GINT_TO_POINTER (n);
488 gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model,
496 gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface)
498 iface->get_flags = gnc_tree_model_account_types_get_flags;
499 iface->get_n_columns = gnc_tree_model_account_types_get_n_columns;
500 iface->get_column_type = gnc_tree_model_account_types_get_column_type;
501 iface->get_iter = gnc_tree_model_account_types_get_iter;
502 iface->get_path = gnc_tree_model_account_types_get_path;
503 iface->get_value = gnc_tree_model_account_types_get_value;
504 iface->iter_next = gnc_tree_model_account_types_iter_next;
505 iface->iter_children = gnc_tree_model_account_types_iter_children;
506 iface->iter_has_child = gnc_tree_model_account_types_iter_has_child;
507 iface->iter_n_children = gnc_tree_model_account_types_iter_n_children;
508 iface->iter_nth_child = gnc_tree_model_account_types_iter_nth_child;
509 iface->iter_parent = gnc_tree_model_account_types_iter_parent;
#define PERR(format, args...)
Account handling public routines.
GtkTreeModel implementation to display account types in a GtkTreeView.
const char * xaccAccountGetTypeStr(GNCAccountType type)
const gchar * QofLogModule