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_by_name (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { GNCPrice *price_a, *price_b; 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); return default_sort (price_a, price_b); }
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_source (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 = gnc_price_get_source (price_a) < gnc_price_get_source (price_b); if (result != 0) return result; return default_sort (price_a, price_b); }
static gint sort_by_quote_flag (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { gnc_commodity *comm_a, *comm_b; gboolean flag_a, flag_b; if (!get_commodities (f_model, f_iter_a, f_iter_b, NULL, &comm_a, &comm_b)) return sort_namespace (f_model, f_iter_a, f_iter_b); flag_a = gnc_commodity_get_quote_flag(comm_a); flag_b = gnc_commodity_get_quote_flag(comm_b); if (flag_a < flag_b) return -1; else if (flag_a > flag_b) return 1; return default_sort(comm_a, comm_b); }
static gint sort_by_date (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { GNCPrice *price_a, *price_b; Timespec ts_a, ts_b; gboolean 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 time first */ 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; return default_sort (price_a, price_b); }
static gint sort_by_fraction (GtkTreeModel *f_model, GtkTreeIter *f_iter_a, GtkTreeIter *f_iter_b, gpointer user_data) { gnc_commodity *comm_a, *comm_b; gint fraction_a, fraction_b; if (!get_commodities (f_model, f_iter_a, f_iter_b, NULL, &comm_a, &comm_b)) return sort_namespace (f_model, f_iter_a, f_iter_b); 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 default_sort(comm_a, comm_b); }