35 static QofLogModule log_module = GNC_MOD_GUI;
36 static GtkTreeModel *account_types_tree_model = NULL;
38 #define TYPE_MASK "type-mask" 42 gnc_tree_model_account_types_finalize (GObject *
object);
47 gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface);
58 G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
59 gnc_tree_model_account_types_tree_model_init))
62 gnc_tree_model_account_types_class_init (GncTreeModelAccountTypesClass * klass)
64 GObjectClass *object_class = G_OBJECT_CLASS (klass);
66 object_class->finalize = gnc_tree_model_account_types_finalize;
70 gnc_tree_model_account_types_init (GncTreeModelAccountTypes * model)
72 while (model->stamp == 0)
74 model->stamp = g_random_int ();
79 gnc_tree_model_account_types_finalize (GObject *
object)
81 g_return_if_fail (
object != NULL);
82 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (
object));
84 G_OBJECT_CLASS (gnc_tree_model_account_types_parent_class)->finalize (
object);
88 gnc_tree_model_account_types_new (guint32 selected)
90 GncTreeModelAccountTypes *model = g_object_new (GNC_TYPE_TREE_MODEL_ACCOUNT_TYPES, NULL);
91 model->selected = selected;
93 return GTK_TREE_MODEL (model);
97 gnc_tree_model_account_types_master(
void)
99 if (!account_types_tree_model)
100 account_types_tree_model = gnc_tree_model_account_types_new(0);
101 return account_types_tree_model;
106 gnc_tree_model_account_types_is_valid (GtkTreeModel *model,
107 GtkTreeIter *iter, gpointer data)
110 GObject *f_model = G_OBJECT (data);
111 guint32 valid_types = GPOINTER_TO_UINT (g_object_get_data (
112 f_model, TYPE_MASK));
114 gtk_tree_model_get (model, iter,
115 GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE, &type, -1);
116 return (valid_types & (1 << type)) ? TRUE : FALSE;
120 gnc_tree_model_account_types_filter_using_mask (guint32 types)
122 GtkTreeModel *f_model;
124 f_model = gtk_tree_model_filter_new (gnc_tree_model_account_types_master (),
126 g_object_set_data (G_OBJECT (f_model), TYPE_MASK, GUINT_TO_POINTER (types));
127 gtk_tree_model_filter_set_visible_func (
128 GTK_TREE_MODEL_FILTER (f_model), gnc_tree_model_account_types_is_valid,
135 gnc_tree_model_account_types_set_mask (GtkTreeModel *f_model,
138 g_return_if_fail (f_model);
140 g_object_set_data (G_OBJECT (f_model), TYPE_MASK, GUINT_TO_POINTER (types));
141 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
145 gnc_tree_model_account_types_get_mask (GtkTreeModel *f_model)
147 g_return_val_if_fail (f_model, 0);
149 return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (f_model), TYPE_MASK));
153 gnc_tree_model_account_types_get_selection (GtkTreeSelection *sel)
155 GtkTreeModel *f_model, *model;
161 g_return_val_if_fail(GTK_IS_TREE_SELECTION(sel), 0);
162 view = gtk_tree_selection_get_tree_view(sel);
163 g_return_val_if_fail (view, 0);
167 list = gtk_tree_selection_get_selected_rows(sel, &f_model);
169 f_model = gtk_tree_view_get_model(view);
171 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
172 if (model != account_types_tree_model)
173 PERR(
"TreeSelection's TreeModel is not the account-types Model");
176 for (node = list; node; node = node->next)
178 path = gtk_tree_model_filter_convert_path_to_child_path(
179 GTK_TREE_MODEL_FILTER(f_model), (GtkTreePath*)node->data);
180 if (!path || gtk_tree_path_get_depth(path) != 1)
182 PERR(
"Invalid Account-types TreePath.");
185 bits |= (1 << gtk_tree_path_get_indices(path)[0]);
189 g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
196 gnc_tree_model_account_types_get_selection_single(GtkTreeSelection *sel)
199 guint32 selected = gnc_tree_model_account_types_get_selection(sel);
202 if (selected & (1 << i))
208 gnc_tree_model_account_types_get_active_combo (GtkComboBox *combo)
210 GtkTreeModelSort *s_model;
211 GtkTreeModelFilter *f_model;
216 g_return_val_if_fail (GTK_IS_COMBO_BOX(combo), 0);
218 if (gtk_combo_box_get_active_iter (combo, &iter))
220 s_model = GTK_TREE_MODEL_SORT(gtk_combo_box_get_model (combo));
221 f_model = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model (s_model));
223 if (gtk_tree_model_filter_get_model (f_model) != account_types_tree_model)
224 PERR(
"TreeSelection's TreeModel is not the account-types Model");
227 GtkTreePath *s_path = gtk_tree_model_get_path (GTK_TREE_MODEL(s_model), &iter);
228 GtkTreePath *f_path = gtk_tree_model_sort_convert_path_to_child_path (s_model, s_path);
229 GtkTreePath *path = gtk_tree_model_filter_convert_path_to_child_path (f_model, f_path);
231 gtk_tree_path_free (f_path);
232 gtk_tree_path_free (s_path);
234 if (!path || gtk_tree_path_get_depth (path) != 1)
236 PERR(
"Invalid Account-types TreePath.");
237 gtk_tree_path_free (path);
240 bits |= (1 << gtk_tree_path_get_indices (path)[0]);
241 gtk_tree_path_free (path);
251 gnc_tree_model_account_types_set_selection (GtkTreeSelection *sel,
255 GtkTreeModelFilter *f_model;
259 g_return_if_fail(GTK_IS_TREE_SELECTION(sel));
260 view = gtk_tree_selection_get_tree_view(sel);
261 g_return_if_fail (view);
262 f_model = GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(view));
263 g_return_if_fail(gtk_tree_model_filter_get_model(f_model) ==
264 account_types_tree_model);
265 gtk_tree_selection_unselect_all(sel);
266 path = gtk_tree_path_new_first();
270 if (selected & (1 << i))
272 GtkTreePath *f_path = gtk_tree_model_filter_convert_child_path_to_path(
274 gtk_tree_selection_select_path(sel, f_path);
275 gtk_tree_view_scroll_to_cell(view, f_path, NULL, FALSE, 0.0, 0.0);
276 gtk_tree_path_free(f_path);
278 gtk_tree_path_next(path);
280 gtk_tree_path_free(path);
284 gnc_tree_model_account_types_set_active_combo (GtkComboBox *combo,
288 GtkTreeModelFilter *f_model;
289 GtkTreeModelSort *s_model;
292 g_return_if_fail (GTK_IS_COMBO_BOX(combo));
294 s_model = GTK_TREE_MODEL_SORT(gtk_combo_box_get_model (combo));
295 f_model = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model (s_model));
296 g_return_if_fail (gtk_tree_model_filter_get_model (f_model) ==
297 account_types_tree_model);
299 gtk_combo_box_set_active (combo, -1);
301 path = gtk_tree_path_new_first ();
305 if (selected & (1 << i))
308 GtkTreePath *f_path = gtk_tree_model_filter_convert_child_path_to_path (f_model, path);
309 GtkTreePath *s_path = gtk_tree_model_sort_convert_child_path_to_path (s_model, f_path);
311 gtk_tree_model_get_iter (GTK_TREE_MODEL(s_model), &iter, s_path);
312 gtk_combo_box_set_active_iter (combo, &iter);
313 gtk_tree_path_free (f_path);
314 gtk_tree_path_free (s_path);
316 gtk_tree_path_next (path);
318 gtk_tree_path_free (path);
323 static GtkTreeModelFlags
324 gnc_tree_model_account_types_get_flags (GtkTreeModel * tree_model)
326 return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
330 gnc_tree_model_account_types_get_n_columns (GtkTreeModel * tree_model)
332 return GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS;
336 gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model,
339 g_return_val_if_fail(GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model),
341 g_return_val_if_fail((index < GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS)
342 && (index >= 0), G_TYPE_INVALID);
346 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
348 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
349 return G_TYPE_STRING;
350 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
351 return G_TYPE_BOOLEAN;
353 g_assert_not_reached ();
354 return G_TYPE_INVALID;
359 gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model,
360 GtkTreeIter * iter, GtkTreePath * path)
362 GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
365 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
366 g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
368 i = gtk_tree_path_get_indices (path)[0];
372 iter->stamp = model->stamp;
373 iter->user_data = GINT_TO_POINTER (i);
382 gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model,
385 GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
388 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), NULL);
389 g_return_val_if_fail (iter != NULL, NULL);
390 g_return_val_if_fail (iter->stamp == model->stamp, NULL);
392 path = gtk_tree_path_new ();
394 gtk_tree_path_append_index (path, GPOINTER_TO_INT (iter->user_data));
400 gnc_tree_model_account_types_get_value (GtkTreeModel * tree_model,
401 GtkTreeIter * iter,
int column,
404 GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
406 g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model));
407 g_return_if_fail (iter != NULL);
408 g_return_if_fail (iter->stamp == model->stamp);
412 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
413 g_value_init (value, G_TYPE_INT);
414 g_value_set_int (value, GPOINTER_TO_INT (iter->user_data));
416 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
417 g_value_init (value, G_TYPE_STRING);
419 GPOINTER_TO_INT (iter->user_data)));
421 case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
422 g_value_init (value, G_TYPE_BOOLEAN);
423 g_value_set_boolean (value, model->selected &
424 (1 << GPOINTER_TO_INT (iter->user_data)));
427 g_assert_not_reached ();
432 gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model,
435 GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
437 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
438 g_return_val_if_fail (iter != NULL, FALSE);
439 g_return_val_if_fail (iter->stamp == model->stamp, FALSE);
443 iter->user_data = GINT_TO_POINTER(
444 GPOINTER_TO_INT(iter->user_data) + 1);
453 gnc_tree_model_account_types_iter_children (GtkTreeModel * tree_model,
455 GtkTreeIter * parent)
458 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES(tree_model), FALSE);
463 iter->stamp = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp;
464 iter->user_data = GINT_TO_POINTER (0);
470 gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model,
477 gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model,
480 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), -1);
485 g_return_val_if_fail (
486 GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp == iter->stamp, -1);
492 gnc_tree_model_account_types_iter_nth_child (GtkTreeModel * tree_model,
494 GtkTreeIter * parent,
int n)
496 GncTreeModelAccountTypes *model;
498 g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), FALSE);
503 model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
507 iter->stamp = model->stamp;
508 iter->user_data = GINT_TO_POINTER (n);
517 gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model,
525 gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface)
527 iface->get_flags = gnc_tree_model_account_types_get_flags;
528 iface->get_n_columns = gnc_tree_model_account_types_get_n_columns;
529 iface->get_column_type = gnc_tree_model_account_types_get_column_type;
530 iface->get_iter = gnc_tree_model_account_types_get_iter;
531 iface->get_path = gnc_tree_model_account_types_get_path;
532 iface->get_value = gnc_tree_model_account_types_get_value;
533 iface->iter_next = gnc_tree_model_account_types_iter_next;
534 iface->iter_children = gnc_tree_model_account_types_iter_children;
535 iface->iter_has_child = gnc_tree_model_account_types_iter_has_child;
536 iface->iter_n_children = gnc_tree_model_account_types_iter_n_children;
537 iface->iter_nth_child = gnc_tree_model_account_types_iter_nth_child;
538 iface->iter_parent = gnc_tree_model_account_types_iter_parent;
stop here; the following types just aren't ready for prime time
#define PERR(format, args...)
Log a serious error.
G_DEFINE_TYPE_WITH_CODE(GncMainWindow, gnc_main_window, GTK_TYPE_APPLICATION_WINDOW, G_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW, gnc_window_main_window_init)) static guint main_window_signals[LAST_SIGNAL]
A holding place for all the signals generated by the main window code.
Account handling public routines.
GNCAccountType
The account types are used to determine how the transaction data in the account is displayed...
GtkTreeModel implementation to display account types in a GtkTreeView.
const char * xaccAccountGetTypeStr(GNCAccountType type)
The xaccAccountGetTypeStr() routine returns a string suitable for use in the GUI/Interface.