37 #include <glib/gi18n.h> 38 #include <glib-object.h> 40 #include "gnc-sx-list-tree-model-adapter.h" 49 GncSxInstanceModel *instances;
51 GtkTreeModelSort *real;
61 static void gsltma_tree_model_interface_init (GtkTreeModelIface *tree_model);
62 static void gsltma_tree_sortable_interface_init (GtkTreeSortableIface *tree_sortable);
64 static void gnc_sx_list_tree_model_adapter_dispose (GObject *obj);
65 static void gnc_sx_list_tree_model_adapter_finalize (GObject *obj);
67 static guint gnc_sx_list_tree_model_adapter_signals[LAST_SIGNAL] = {0};
69 static GncSxInstances* gsltma_get_sx_instances_from_orig_iter (GncSxListTreeModelAdapter *model,
70 GtkTreeIter *orig_iter);
73 G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, gsltma_tree_model_interface_init)
74 G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_SORTABLE, gsltma_tree_sortable_interface_init))
77 gnc_sx_list_tree_model_adapter_class_init (GncSxListTreeModelAdapterClass *klass)
79 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
81 obj_class->dispose = gnc_sx_list_tree_model_adapter_dispose;
82 obj_class->finalize = gnc_sx_list_tree_model_adapter_finalize;
84 gnc_sx_list_tree_model_adapter_signals[MODEL_POPULATED] =
85 g_signal_new (
"model_populated",
86 G_TYPE_FROM_CLASS(obj_class),
90 g_cclosure_marshal_VOID__VOID,
94 static GtkTreeModelFlags
95 gsltma_get_flags (GtkTreeModel *tree_model)
97 return gtk_tree_model_get_flags (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real));
101 gsltma_get_n_columns (GtkTreeModel *tree_model)
103 return gtk_tree_model_get_n_columns (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real));
107 gsltma_get_column_type (GtkTreeModel *tree_model, gint index)
109 return gtk_tree_model_get_column_type (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
114 gsltma_get_iter (GtkTreeModel *tree_model,
118 return gtk_tree_model_get_iter (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
123 gsltma_get_path (GtkTreeModel *tree_model,
126 return gtk_tree_model_get_path (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
131 gsltma_get_value (GtkTreeModel *tree_model,
136 gtk_tree_model_get_value (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
137 iter, column, value);
141 gsltma_iter_next (GtkTreeModel *tree_model,
144 return gtk_tree_model_iter_next (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
149 gsltma_iter_children (GtkTreeModel *tree_model,
153 return gtk_tree_model_iter_children (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
158 gsltma_iter_has_child (GtkTreeModel *tree_model,
161 return gtk_tree_model_iter_has_child (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
166 gsltma_iter_n_children (GtkTreeModel *tree_model,
169 return gtk_tree_model_iter_n_children (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
174 gsltma_iter_nth_child (GtkTreeModel *tree_model,
179 return gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
184 gsltma_iter_parent (GtkTreeModel *tree_model,
188 return gtk_tree_model_iter_parent (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
193 gsltma_ref_node (GtkTreeModel *tree_model,
196 gtk_tree_model_ref_node (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
201 gsltma_unref_node (GtkTreeModel *tree_model,
204 gtk_tree_model_unref_node (GTK_TREE_MODEL(GNC_SX_LIST_TREE_MODEL_ADAPTER(tree_model)->real),
209 gsltma_tree_model_interface_init (GtkTreeModelIface *tree_model)
211 tree_model->get_flags = gsltma_get_flags;
212 tree_model->get_n_columns = gsltma_get_n_columns;
213 tree_model->get_column_type = gsltma_get_column_type;
214 tree_model->get_iter = gsltma_get_iter;
215 tree_model->get_path = gsltma_get_path;
216 tree_model->get_value = gsltma_get_value;
217 tree_model->iter_next = gsltma_iter_next;
218 tree_model->iter_children = gsltma_iter_children;
219 tree_model->iter_has_child = gsltma_iter_has_child;
220 tree_model->iter_n_children = gsltma_iter_n_children;
221 tree_model->iter_nth_child = gsltma_iter_nth_child;
222 tree_model->iter_parent = gsltma_iter_parent;
223 tree_model->ref_node = gsltma_ref_node;
224 tree_model->unref_node = gsltma_unref_node;
228 gsltma_get_sort_column_id (GtkTreeSortable *sortable,
229 gint *sort_column_id,
232 return gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE(GNC_SX_LIST_TREE_MODEL_ADAPTER(sortable)->real),
238 gsltma_set_sort_column_id (GtkTreeSortable *sortable,
242 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(GNC_SX_LIST_TREE_MODEL_ADAPTER(sortable)->real),
248 gsltma_set_sort_func (GtkTreeSortable *sortable,
250 GtkTreeIterCompareFunc func,
252 GDestroyNotify destroy)
254 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(GNC_SX_LIST_TREE_MODEL_ADAPTER(sortable)->real),
262 gsltma_set_default_sort_func (GtkTreeSortable *sortable,
263 GtkTreeIterCompareFunc func,
265 GDestroyNotify destroy)
267 gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE(GNC_SX_LIST_TREE_MODEL_ADAPTER(sortable)->real),
274 gsltma_has_default_sort_func (GtkTreeSortable *sortable)
276 return gtk_tree_sortable_has_default_sort_func (GTK_TREE_SORTABLE(GNC_SX_LIST_TREE_MODEL_ADAPTER(sortable)->real));
280 gsltma_tree_sortable_interface_init (GtkTreeSortableIface *tree_sortable)
282 tree_sortable->get_sort_column_id = gsltma_get_sort_column_id;
283 tree_sortable->set_sort_column_id = gsltma_set_sort_column_id;
284 tree_sortable->set_sort_func = gsltma_set_sort_func;
285 tree_sortable->set_default_sort_func = gsltma_set_default_sort_func;
286 tree_sortable->has_default_sort_func = gsltma_has_default_sort_func;
287 tree_sortable->get_sort_column_id = gsltma_get_sort_column_id;
288 tree_sortable->set_sort_column_id = gsltma_set_sort_column_id;
289 tree_sortable->set_sort_func = gsltma_set_sort_func;
290 tree_sortable->set_default_sort_func = gsltma_set_default_sort_func;
291 tree_sortable->has_default_sort_func = gsltma_has_default_sort_func;
295 gsltma_proxy_row_changed (GtkTreeModel *treemodel,
300 g_signal_emit_by_name (user_data,
"row-changed", arg1, arg2);
304 gsltma_proxy_row_deleted (GtkTreeModel *treemodel,
308 g_signal_emit_by_name (user_data,
"row-deleted", arg1);
312 gsltma_proxy_row_has_child_toggled (GtkTreeModel *treemodel,
317 g_signal_emit_by_name (user_data,
"row-has-child-toggled", arg1, arg2);
321 gsltma_proxy_row_inserted (GtkTreeModel *treemodel,
326 g_signal_emit_by_name (user_data,
"row-inserted", arg1, arg2);
330 gsltma_proxy_rows_reordered (GtkTreeModel *treemodel,
336 g_signal_emit_by_name (user_data,
"rows-reordered", arg1, arg2, arg3);
340 gsltma_proxy_sort_column_changed (GtkTreeSortable *sortable, gpointer user_data)
342 g_signal_emit_by_name (user_data,
"sort-column-changed");
346 _name_comparator (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
349 GncSxListTreeModelAdapter *adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
351 gchar *a_caseless, *b_caseless;
353 a_inst = gsltma_get_sx_instances_from_orig_iter (adapter, a);
354 b_inst = gsltma_get_sx_instances_from_orig_iter (adapter, b);
356 if (a_inst == NULL && b_inst == NULL)
return 0;
357 if (a_inst == NULL)
return 1;
358 if (b_inst == NULL)
return -1;
360 a_caseless = g_utf8_casefold (xaccSchedXactionGetName (a_inst->sx), -1);
361 b_caseless = g_utf8_casefold (xaccSchedXactionGetName (b_inst->sx), -1);
362 rtn = g_strcmp0 (a_caseless, b_caseless);
370 _freq_comparator (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
372 GncSxListTreeModelAdapter *adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
375 a_inst = gsltma_get_sx_instances_from_orig_iter (adapter, a);
376 b_inst = gsltma_get_sx_instances_from_orig_iter (adapter, b);
378 if (a_inst == NULL && b_inst == NULL)
return 0;
379 if (a_inst == NULL)
return 1;
380 if (b_inst == NULL)
return -1;
386 _safe_invalidable_date_compare (
const GDate *a,
const GDate *b)
388 if (!g_date_valid (a) && !g_date_valid (b))
392 if (!g_date_valid (a))
396 if (!g_date_valid (b))
400 return g_date_compare (a, b);
404 _last_occur_comparator (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
406 GncSxListTreeModelAdapter *adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
409 a_inst = gsltma_get_sx_instances_from_orig_iter (adapter, a);
410 b_inst = gsltma_get_sx_instances_from_orig_iter (adapter, b);
412 return _safe_invalidable_date_compare (xaccSchedXactionGetLastOccurDate (a_inst->sx),
413 xaccSchedXactionGetLastOccurDate (b_inst->sx));
417 _next_occur_comparator (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
419 GncSxListTreeModelAdapter *adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
422 a_inst = gsltma_get_sx_instances_from_orig_iter (adapter, a);
423 b_inst = gsltma_get_sx_instances_from_orig_iter (adapter, b);
425 return _safe_invalidable_date_compare (&a_inst->next_instance_date,
426 &b_inst->next_instance_date);
430 _enabled_comparator (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
432 GncSxListTreeModelAdapter *adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
435 a_inst = gsltma_get_sx_instances_from_orig_iter (adapter, a);
436 b_inst = gsltma_get_sx_instances_from_orig_iter (adapter, b);
438 if (xaccSchedXactionGetEnabled (a_inst->sx) && !xaccSchedXactionGetEnabled (b_inst->sx))
return 1;
439 if (!xaccSchedXactionGetEnabled (a_inst->sx) && xaccSchedXactionGetEnabled (b_inst->sx))
return -1;
444 gnc_sx_list_tree_model_adapter_init (GncSxListTreeModelAdapter *adapter)
446 adapter->orig = gtk_tree_store_new (5, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
447 adapter->real = GTK_TREE_MODEL_SORT(gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(adapter->orig)));
450 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(adapter->real), SXLTMA_COL_NAME,
451 _name_comparator, adapter, NULL);
452 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(adapter->real), SXLTMA_COL_ENABLED,
453 _enabled_comparator, adapter, NULL);
454 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(adapter->real), SXLTMA_COL_FREQUENCY,
455 _freq_comparator, adapter, NULL);
456 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(adapter->real), SXLTMA_COL_LAST_OCCUR,
457 _last_occur_comparator, adapter, NULL);
458 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(adapter->real), SXLTMA_COL_NEXT_OCCUR,
459 _next_occur_comparator, adapter, NULL);
461 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(adapter->real),
462 SXLTMA_COL_NAME, GTK_SORT_ASCENDING);
464 g_signal_connect (adapter->real,
"row-changed",
465 G_CALLBACK(gsltma_proxy_row_changed), adapter);
466 g_signal_connect (adapter->real,
"row-deleted",
467 G_CALLBACK(gsltma_proxy_row_deleted), adapter);
468 g_signal_connect (adapter->real,
"row-has-child-toggled",
469 G_CALLBACK(gsltma_proxy_row_has_child_toggled), adapter);
470 g_signal_connect (adapter->real,
"row-inserted",
471 G_CALLBACK(gsltma_proxy_row_inserted), adapter);
472 g_signal_connect (adapter->real,
"rows-reordered",
473 G_CALLBACK(gsltma_proxy_rows_reordered), adapter);
474 g_signal_connect (adapter->real,
"sort-column-changed",
475 G_CALLBACK(gsltma_proxy_sort_column_changed), adapter);
479 _format_conditional_date (
const GDate *date,
char *date_buf,
int buf_max_length)
481 if (date == NULL || !g_date_valid (date))
482 g_stpcpy (date_buf, _(
"never"));
488 gsltma_populate_tree_store (GncSxListTreeModelAdapter *model)
496 gchar *frequency_str;
502 _format_conditional_date (xaccSchedXactionGetLastOccurDate (instances->sx),
504 _format_conditional_date (&instances->next_instance_date,
507 gtk_tree_store_append (model->orig, &iter, NULL);
508 gtk_tree_store_set (model->orig, &iter,
509 SXLTMA_COL_NAME, xaccSchedXactionGetName (instances->sx),
510 SXLTMA_COL_ENABLED, xaccSchedXactionGetEnabled (instances->sx),
511 SXLTMA_COL_FREQUENCY, frequency_str,
512 SXLTMA_COL_LAST_OCCUR, last_occur_date_buf,
513 SXLTMA_COL_NEXT_OCCUR, next_occur_date_buf,
515 g_free (frequency_str);
517 g_signal_emit_by_name (model,
"model_populated");
521 gsltma_added_cb (GncSxInstanceModel *instances, SchedXaction *sx_added, gpointer user_data)
523 GncSxListTreeModelAdapter *model = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
524 gtk_tree_store_clear (model->orig);
525 gsltma_populate_tree_store (model);
529 gsltma_updated_cb (GncSxInstanceModel *instances, SchedXaction *sx_updated, gpointer user_data)
531 GncSxListTreeModelAdapter *model = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
533 gtk_tree_store_clear (model->orig);
534 gsltma_populate_tree_store (model);
538 gsltma_removing_cb (GncSxInstanceModel *instances, SchedXaction *sx_removing, gpointer user_data)
540 GncSxListTreeModelAdapter *model = GNC_SX_LIST_TREE_MODEL_ADAPTER(user_data);
541 gnc_sx_instance_model_remove_sx_instances (instances, sx_removing);
542 gtk_tree_store_clear (model->orig);
543 gsltma_populate_tree_store (model);
546 GncSxListTreeModelAdapter*
547 gnc_sx_list_tree_model_adapter_new (GncSxInstanceModel *instances)
549 GncSxListTreeModelAdapter *rtn;
551 rtn = GNC_SX_LIST_TREE_MODEL_ADAPTER(g_object_new (GNC_TYPE_SX_LIST_TREE_MODEL_ADAPTER, NULL));
552 rtn->instances = instances;
553 g_object_ref (G_OBJECT(rtn->instances));
555 gsltma_populate_tree_store (rtn);
557 g_signal_connect (G_OBJECT(rtn->instances),
"added",
558 (GCallback)gsltma_added_cb, (gpointer)rtn);
559 g_signal_connect (G_OBJECT(rtn->instances),
"updated",
560 (GCallback)gsltma_updated_cb, (gpointer)rtn);
561 g_signal_connect (G_OBJECT(rtn->instances),
"removing",
562 (GCallback)gsltma_removing_cb, (gpointer)rtn);
568 gsltma_get_sx_instances_from_orig_iter (GncSxListTreeModelAdapter *model, GtkTreeIter *orig_iter)
574 path = gtk_tree_model_get_path (GTK_TREE_MODEL(model->orig), orig_iter);
575 if (gtk_tree_path_get_depth (path) > 1)
577 gtk_tree_path_free (path);
580 indices = gtk_tree_path_get_indices (path);
583 gtk_tree_path_free (path);
588 gnc_sx_list_tree_model_adapter_get_sx_instances (GncSxListTreeModelAdapter *model, GtkTreeIter *sort_iter)
590 GtkTreeIter translated_iter;
591 gtk_tree_model_sort_convert_iter_to_child_iter (model->real,
594 return gsltma_get_sx_instances_from_orig_iter (model, &translated_iter);
598 gnc_sx_list_tree_model_adapter_dispose (GObject *obj)
600 GncSxListTreeModelAdapter *adapter;
602 g_return_if_fail (obj != NULL);
603 adapter = GNC_SX_LIST_TREE_MODEL_ADAPTER(obj);
605 if (adapter->disposed)
return;
606 adapter->disposed = TRUE;
608 g_object_unref (G_OBJECT(adapter->instances));
609 adapter->instances = NULL;
610 g_object_unref (G_OBJECT(adapter->real));
611 adapter->real = NULL;
612 g_object_unref (G_OBJECT(adapter->orig));
613 adapter->orig = NULL;
615 G_OBJECT_CLASS(gnc_sx_list_tree_model_adapter_parent_class)->dispose (obj);
619 gnc_sx_list_tree_model_adapter_finalize (GObject *obj)
621 g_return_if_fail (obj != NULL);
622 G_OBJECT_CLASS(gnc_sx_list_tree_model_adapter_parent_class)->finalize (obj);
GList * gnc_sx_get_schedule(const SchedXaction *sx)
size_t qof_print_gdate(char *buf, size_t bufflen, const GDate *gd)
Convenience; calls through to qof_print_date_dmy_buff().
void gnc_sx_instance_model_update_sx_instances(GncSxInstanceModel *model, SchedXaction *sx)
Regenerates and updates the GncSxInstances* for the given SX.
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.
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
GList * gnc_sx_instance_model_get_sx_instances_list(GncSxInstanceModel *model)
Returns the list of GncSxInstances in the model (Each element in the list has type GncSxInstances) ...