static gint default_sort (GNCPrice *price_a, GNCPrice *price_b) { gnc_commodity *curr_a, *curr_b; Timespec ts_a, ts_b; gint result; /* Primary sort (i.e. commodity name) handled by the tree structure. */ /* secondary sort: currency */ curr_a = gnc_price_get_currency (price_a); curr_b = gnc_price_get_currency (price_b); result = safe_utf8_collate (gnc_commodity_get_namespace (curr_a), gnc_commodity_get_namespace (curr_b)); if (result != 0) return result; result = safe_utf8_collate (gnc_commodity_get_mnemonic (curr_a), gnc_commodity_get_mnemonic (curr_b)); if (result != 0) return result; /* tertiary sort: time */ ts_a = gnc_price_get_time (price_a); ts_b = gnc_price_get_time (price_b); result = timespec_cmp (&ts_a, &ts_b); if (result) /* Reverse the result to present the most recent quote first. */ return -result; /* last sort: value */ return gnc_numeric_compare (gnc_price_get_value (price_a), gnc_price_get_value (price_b)); }
static gint sort_ns_or_cm (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b) { GncTreeModelPrice *model; GtkTreeModel *tree_model; GtkTreeIter iter_a, iter_b; gnc_commodity_namespace *ns_a, *ns_b; gnc_commodity *comm_a, *comm_b; tree_model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); model = GNC_TREE_MODEL_PRICE(tree_model); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model), &iter_a, f_iter_a); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model), &iter_b, f_iter_b); if (gnc_tree_model_price_iter_is_namespace (model, &iter_a)) { ns_a = gnc_tree_model_price_get_namespace (model, &iter_a); ns_b = gnc_tree_model_price_get_namespace (model, &iter_b); return safe_utf8_collate (gnc_commodity_namespace_get_name (ns_a), gnc_commodity_namespace_get_name (ns_b)); } comm_a = gnc_tree_model_price_get_commodity (model, &iter_a); comm_b = gnc_tree_model_price_get_commodity (model, &iter_b); return safe_utf8_collate (gnc_commodity_get_mnemonic (comm_a), gnc_commodity_get_mnemonic (comm_b)); }
static gint default_sort (gnc_commodity *comm_a, gnc_commodity *comm_b) { gint fraction_a, fraction_b, result; result = safe_utf8_collate (gnc_commodity_get_namespace (comm_a), gnc_commodity_get_namespace (comm_b)); if (result != 0) return result; result = safe_utf8_collate (gnc_commodity_get_mnemonic (comm_a), gnc_commodity_get_mnemonic (comm_b)); if (result != 0) return result; result = safe_utf8_collate (gnc_commodity_get_fullname (comm_a), gnc_commodity_get_fullname (comm_b)); if (result != 0) return result; result = safe_utf8_collate (gnc_commodity_get_cusip (comm_a), gnc_commodity_get_cusip (comm_b)); if (result != 0) return result; fraction_a = gnc_commodity_get_fraction (comm_a); fraction_b = gnc_commodity_get_fraction (comm_b); if (fraction_a < fraction_b) return -1; if (fraction_b < fraction_a) return 1; return 0; }
static gint sort_by_commodity_string (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { GtkTreeModel *model; GtkTreeIter iter_a, iter_b; gnc_commodity *comm_a, *comm_b; gchar *str1, *str2; gint column = GPOINTER_TO_INT(user_data); gint result; if (!get_commodities_w_iters(f_model, f_iter_a, f_iter_b, &model, &iter_a, &iter_b, &comm_a, &comm_b)) return sort_namespace (f_model, f_iter_a, f_iter_b); /* Get the strings. */ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter_a, column, &str1, -1); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter_b, column, &str2, -1); result = safe_utf8_collate(str1, str2); g_free(str1); g_free(str2); if (result != 0) return result; return default_sort(comm_a, comm_b); }
static gint sort_namespace (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b) { GncTreeModelCommodity *model; GtkTreeModel *tree_model; GtkTreeIter iter_a, iter_b; gnc_commodity_namespace *ns_a, *ns_b; tree_model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); model = GNC_TREE_MODEL_COMMODITY(tree_model); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model), &iter_a, f_iter_a); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(f_model), &iter_b, f_iter_b); ns_a = gnc_tree_model_commodity_get_namespace (model, &iter_a); ns_b = gnc_tree_model_commodity_get_namespace (model, &iter_b); return safe_utf8_collate (gnc_commodity_namespace_get_gui_name (ns_a), gnc_commodity_namespace_get_gui_name (ns_b)); }
static gint sort_by_string (GtkTreeModel *f_model, GtkTreeIter *f_iter1, GtkTreeIter *f_iter2, gpointer user_data) { GtkTreeModel *model; GtkTreeIter iter1, iter2; const GncOwner *owner1, *owner2; gchar *str1, *str2; gint column = GPOINTER_TO_INT(user_data); gint result; model = sort_cb_setup_w_iters(f_model, f_iter1, f_iter2, &iter1, &iter2, &owner1, &owner2); /* Get the strings. */ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter1, column, &str1, -1); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, column, &str2, -1); result = safe_utf8_collate(str1, str2); g_free(str1); g_free(str2); if (result != 0) return result; return gncOwnerCompare(owner1, owner2); }
static gint sort_by_value (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { gnc_commodity *comm_a, *comm_b; GNCPrice *price_a, *price_b; gboolean result; gint value; if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b)) return sort_ns_or_cm (f_model, f_iter_a, f_iter_b); /* * Sorted by commodity because of the tree structure. Now sort by * currency so we're only comparing numbers in the same currency * denomination. */ comm_a = gnc_price_get_currency (price_a); comm_b = gnc_price_get_currency (price_b); if (comm_a && comm_b) { value = safe_utf8_collate (gnc_commodity_get_namespace (comm_a), gnc_commodity_get_namespace (comm_b)); if (value != 0) return value; value = safe_utf8_collate (gnc_commodity_get_mnemonic (comm_a), gnc_commodity_get_mnemonic (comm_b)); if (value != 0) return value; } /* * Now do the actual price comparison now we're sure that its an * apples to apples comparison. */ result = gnc_numeric_compare (gnc_price_get_value (price_a), gnc_price_get_value (price_b)); if (result) return result; return default_sort (price_a, price_b); }
static gint sort_by_type (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { GNCPrice *price_a, *price_b; gint result; if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b)) return sort_ns_or_cm (f_model, f_iter_a, f_iter_b); /* sort by source first */ result = safe_utf8_collate (gnc_price_get_typestr (price_a), gnc_price_get_typestr (price_b)); if (result != 0) return result; return default_sort (price_a, price_b); }