28 #include <glib/gi18n.h>
36 #include "gnc-component-manager.h"
40 #include "gnc-icons.h"
52 static void gnc_tree_view_price_finalize (GObject *
object);
53 static void gnc_tree_view_price_destroy (GtkObject *
object);
60 #define GNC_TREE_VIEW_PRICE_GET_PRIVATE(o) \
61 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_TREE_VIEW_PRICE, GncTreeViewPricePrivate))
68 static GObjectClass *parent_class = NULL;
71 gnc_tree_view_price_get_type (
void)
73 static GType gnc_tree_view_price_type = 0;
75 if (gnc_tree_view_price_type == 0)
77 static const GTypeInfo our_info =
82 (GClassInitFunc) gnc_tree_view_price_class_init,
87 (GInstanceInitFunc) gnc_tree_view_price_init
90 gnc_tree_view_price_type = g_type_register_static (GNC_TYPE_TREE_VIEW,
95 return gnc_tree_view_price_type;
101 GObjectClass *o_class;
102 GtkObjectClass *object_class;
104 parent_class = g_type_class_peek_parent (klass);
106 o_class = G_OBJECT_CLASS (klass);
107 object_class = GTK_OBJECT_CLASS (klass);
110 o_class->finalize = gnc_tree_view_price_finalize;
113 object_class->destroy = gnc_tree_view_price_destroy;
124 gnc_tree_view_price_finalize (GObject *
object)
126 ENTER(
"view %p",
object);
130 if (G_OBJECT_CLASS (parent_class)->finalize)
131 (* G_OBJECT_CLASS (parent_class)->finalize) (
object);
136 gnc_tree_view_price_destroy (GtkObject *
object)
138 ENTER(
"view %p",
object);
142 if (GTK_OBJECT_CLASS (parent_class)->destroy)
143 (* GTK_OBJECT_CLASS (parent_class)->destroy) (
object);
153 get_prices (GtkTreeModel *f_model,
154 GtkTreeIter *f_iter_a,
155 GtkTreeIter *f_iter_b,
160 GtkTreeModel *tree_model;
161 GtkTreeIter iter_a, iter_b;
163 tree_model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
164 model = GNC_TREE_MODEL_PRICE(tree_model);
166 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
174 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
184 sort_ns_or_cm (GtkTreeModel *f_model,
185 GtkTreeIter *f_iter_a,
186 GtkTreeIter *f_iter_b)
189 GtkTreeModel *tree_model;
190 GtkTreeIter iter_a, iter_b;
194 tree_model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
195 model = GNC_TREE_MODEL_PRICE(tree_model);
197 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
200 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model),
228 curr_a = gnc_price_get_currency (price_a);
229 curr_b = gnc_price_get_currency (price_b);
233 if (result != 0)
return result;
237 if (result != 0)
return result;
240 ts_a = gnc_price_get_time (price_a);
241 ts_b = gnc_price_get_time (price_b);
249 gnc_price_get_value (price_b));
253 sort_by_name (GtkTreeModel *f_model,
254 GtkTreeIter *f_iter_a,
255 GtkTreeIter *f_iter_b,
260 if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
261 return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
263 return default_sort (price_a, price_b);
267 sort_by_date (GtkTreeModel *f_model,
268 GtkTreeIter *f_iter_a,
269 GtkTreeIter *f_iter_b,
276 if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
277 return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
280 ts_a = gnc_price_get_time (price_a);
281 ts_b = gnc_price_get_time (price_b);
287 return default_sort (price_a, price_b);
291 sort_by_source (GtkTreeModel *f_model,
292 GtkTreeIter *f_iter_a,
293 GtkTreeIter *f_iter_b,
299 if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
300 return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
304 gnc_price_get_source (price_b));
308 return default_sort (price_a, price_b);
312 sort_by_type (GtkTreeModel *f_model,
313 GtkTreeIter *f_iter_a,
314 GtkTreeIter *f_iter_b,
320 if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
321 return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
325 gnc_price_get_typestr (price_b));
329 return default_sort (price_a, price_b);
333 sort_by_value (GtkTreeModel *f_model,
334 GtkTreeIter *f_iter_a,
335 GtkTreeIter *f_iter_b,
343 if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
344 return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
351 comm_a = gnc_price_get_currency (price_a);
352 comm_b = gnc_price_get_currency (price_b);
353 if (comm_a && comm_b)
370 gnc_price_get_value (price_b));
374 return default_sort (price_a, price_b);
390 const gchar *first_property_name,
394 GtkTreeModel *model, *f_model, *s_model;
395 GtkTreeViewColumn *col;
398 const gchar *sample_text;
407 f_model = gtk_tree_model_filter_new (model, NULL);
408 g_object_unref(G_OBJECT(model));
409 s_model = gtk_tree_model_sort_new_with_model (f_model);
410 g_object_unref(G_OBJECT(f_model));
413 view = g_object_new (GNC_TYPE_TREE_VIEW_PRICE,
414 "name",
"price_tree", NULL);
415 gtk_tree_view_set_model (GTK_TREE_VIEW (view), s_model);
416 g_object_unref(G_OBJECT(s_model));
418 DEBUG(
"model ref count is %d", G_OBJECT(model)->ref_count);
419 DEBUG(
"f_model ref count is %d", G_OBJECT(f_model)->ref_count);
420 DEBUG(
"s_model ref count is %d", G_OBJECT(s_model)->ref_count);
423 sample_text2 = g_strdup_printf(
"%s%s", sample_text, sample_text);
425 view, _(
"Security"),
"security", NULL, sample_text2,
426 GNC_TREE_MODEL_PRICE_COL_COMMODITY,
427 GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
429 g_free(sample_text2);
431 view, _(
"Currency"),
"currency", NULL, sample_text,
432 GNC_TREE_MODEL_PRICE_COL_CURRENCY,
433 GNC_TREE_MODEL_PRICE_COL_VISIBILITY,
435 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
437 view, _(
"Date"),
"date", NULL,
"2005-05-20",
438 GNC_TREE_MODEL_PRICE_COL_DATE,
439 GNC_TREE_MODEL_PRICE_COL_VISIBILITY,
441 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
443 view, _(
"Source"),
"source", NULL,
"Finance::Quote",
444 GNC_TREE_MODEL_PRICE_COL_SOURCE,
445 GNC_TREE_MODEL_PRICE_COL_VISIBILITY,
447 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
449 view, _(
"Type"),
"type", NULL,
"last",
450 GNC_TREE_MODEL_PRICE_COL_TYPE,
451 GNC_TREE_MODEL_PRICE_COL_VISIBILITY,
453 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
455 view, _(
"Price"),
"price",
"100.00000",
456 GNC_TREE_MODEL_PRICE_COL_VALUE,
457 GNC_TREE_VIEW_COLUMN_COLOR_NONE,
458 GNC_TREE_MODEL_PRICE_COL_VISIBILITY,
460 g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1));
465 va_start (var_args, first_property_name);
466 g_object_set_valist (G_OBJECT(view), first_property_name, var_args);
471 if (!gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(s_model),
474 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model),
475 GNC_TREE_MODEL_PRICE_COL_COMMODITY,
479 gtk_widget_show(GTK_WIDGET(view));
481 return GTK_TREE_VIEW(view);
488 #define debug_path(fn, path) { \
489 gchar *path_string = gtk_tree_path_to_string(path); \
490 fn("tree path %s", path_string); \
491 g_free(path_string); \
500 GtkTreeModel *model, *f_model, *s_model;
501 GtkTreeIter iter, f_iter;
503 g_return_val_if_fail(GNC_IS_TREE_VIEW_PRICE(view), FALSE);
504 g_return_val_if_fail(price != NULL, FALSE);
505 g_return_val_if_fail(s_iter != NULL, FALSE);
507 ENTER(
"view %p, price %p", view, price);
510 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
511 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
512 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
515 LEAVE(
"model_get_iter_from_price failed");
520 gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER(f_model),
522 gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(s_model),
540 gnc_tree_view_price_cm_filter_func user_cm_fn;
541 gnc_tree_view_price_pc_filter_func user_pc_fn;
543 GDestroyNotify user_destroy;
547 gnc_tree_view_price_filter_destroy (gpointer data)
551 if (fd->user_destroy)
552 fd->user_destroy(fd->user_data);
557 gnc_tree_view_price_filter_helper (GtkTreeModel *model,
566 g_return_val_if_fail (GNC_IS_TREE_MODEL_PRICE (model), FALSE);
567 g_return_val_if_fail (iter != NULL, FALSE);
574 return fd->user_ns_fn(name_space, fd->user_data);
584 return fd->user_cm_fn(commodity, fd->user_data);
594 return fd->user_pc_fn(price, fd->user_data);
610 gnc_tree_view_price_cm_filter_func cm_func,
611 gnc_tree_view_price_pc_filter_func pc_func,
613 GDestroyNotify destroy)
615 GtkTreeModel *f_model, *s_model;
618 ENTER(
"view %p, ns func %p, cm func %p, pc func %p, data %p, destroy %p",
619 view, ns_func, cm_func, pc_func, data, destroy);
621 g_return_if_fail(GNC_IS_TREE_VIEW_PRICE(view));
622 g_return_if_fail((ns_func != NULL) || (cm_func != NULL));
625 fd->user_ns_fn = ns_func;
626 fd->user_cm_fn = cm_func;
627 fd->user_pc_fn = pc_func;
628 fd->user_data = data;
629 fd->user_destroy = destroy;
631 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
632 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
633 gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model),
634 gnc_tree_view_price_filter_helper,
636 gnc_tree_view_price_filter_destroy);
644 gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (f_model));
659 GtkTreeSelection *selection;
660 GtkTreeModel *model, *f_model, *s_model;
661 GtkTreeIter iter, f_iter, s_iter;
664 ENTER(
"view %p", view);
665 g_return_val_if_fail (GNC_IS_TREE_VIEW_PRICE (view), NULL);
667 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
668 if (!gtk_tree_selection_get_selected (selection, &s_model, &s_iter))
670 LEAVE(
"no price, get_selected failed");
674 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
677 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
678 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
681 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
684 LEAVE(
"price %p", price);
696 GtkTreeModel *model, *f_model, *s_model;
697 GtkTreePath *path, *f_path, *s_path, *parent_path;
698 GtkTreeSelection *selection;
700 ENTER(
"view %p, price %p", view, price);
703 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
704 gtk_tree_selection_unselect_all (selection);
709 s_model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
710 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
711 model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model));
716 LEAVE(
"get_path_from_price failed");
719 debug_path(
DEBUG, path);
721 f_path = gtk_tree_model_filter_convert_child_path_to_path (GTK_TREE_MODEL_FILTER (f_model),
723 gtk_tree_path_free(path);
726 LEAVE(
"no filter path");
729 debug_path(
DEBUG, f_path);
731 s_path = gtk_tree_model_sort_convert_child_path_to_path (GTK_TREE_MODEL_SORT (s_model),
733 gtk_tree_path_free(f_path);
736 LEAVE(
"no sort path");
741 parent_path = gtk_tree_path_copy (s_path);
742 if (gtk_tree_path_up (parent_path))
747 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(view), parent_path);
749 gtk_tree_path_free(parent_path);
751 gtk_tree_selection_select_path (selection, s_path);
752 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(view), s_path, NULL, FALSE, 0.0, 0.0);
753 debug_path(
LEAVE, s_path);
754 gtk_tree_path_free(s_path);
763 get_selected_prices_helper (GtkTreeModel *s_model,
768 GList **return_list = data;
769 GtkTreeModel *model, *f_model;
770 GtkTreeIter iter, f_iter;
773 gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (s_model),
776 f_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(s_model));
777 gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (f_model),
780 model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model));
784 *return_list = g_list_append(*return_list, price);
797 GtkTreeSelection *selection;
798 GList *return_list = NULL;
800 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));
801 gtk_tree_selection_selected_foreach(selection, get_selected_prices_helper, &return_list);
gboolean gnc_tree_model_price_get_iter_from_price(GncTreeModelPrice *model, GNCPrice *price, GtkTreeIter *iter)
gnc_commodity * gnc_tree_model_price_get_commodity(GncTreeModelPrice *model, GtkTreeIter *iter)
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
GtkTreeViewColumn * gnc_tree_view_add_text_column(GncTreeView *view, const gchar *column_title, const gchar *pref_name, const gchar *stock_icon_name, const gchar *sizing_text, gint model_data_column, gint model_visibility_column, GtkTreeIterCompareFunc column_sort_fn)
a simple price database for gnucash
utility functions for the GnuCash UI
int safe_utf8_collate(const char *da, const char *db)
GtkTreeModel implementation for gnucash price database.
common utilities for manipulating a GtkTreeView within gnucash
#define DEBUG(format, args...)
GNCPrice * gnc_tree_model_price_get_price(GncTreeModelPrice *model, GtkTreeIter *iter)
gboolean(* gnc_tree_view_price_ns_filter_func)(gnc_commodity_namespace *, gpointer data)
Use a 64-bit unsigned int timespec.
GNCPrice * gnc_tree_view_price_get_selected_price(GncTreeViewPrice *view)
GList * gnc_tree_view_price_get_selected_prices(GncTreeViewPrice *view)
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
gnc_commodity_namespace * gnc_tree_model_price_get_namespace(GncTreeModelPrice *model, GtkTreeIter *iter)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
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)
#define ENTER(format, args...)
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
gnc_commodity * gnc_default_currency(void)
gboolean gnc_tree_model_price_iter_is_namespace(GncTreeModelPrice *model, GtkTreeIter *iter)
gint timespec_cmp(const Timespec *ta, const Timespec *tb)
GtkTreeView implementation for gnucash price tree.
gboolean gnc_tree_model_price_iter_is_commodity(GncTreeModelPrice *model, GtkTreeIter *iter)
void gnc_tree_view_configure_columns(GncTreeView *view)
Gnome specific utility functions.
gboolean gnc_tree_model_price_iter_is_price(GncTreeModelPrice *model, GtkTreeIter *iter)
All type declarations for the whole Gnucash engine.
void gnc_tree_view_price_set_selected_price(GncTreeViewPrice *view, GNCPrice *price)
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
GtkTreeModel * gnc_tree_model_price_new(QofBook *book, GNCPriceDB *price_db)
#define gnc_leave_return_if_fail(test)
GtkTreePath * gnc_tree_model_price_get_path_from_price(GncTreeModelPrice *model, GNCPrice *price)
#define LEAVE(format, args...)
GtkTreeView * gnc_tree_view_price_new(QofBook *book, const gchar *first_property_name,...)
const gchar * QofLogModule