aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/e-table-sorting-utils.c153
-rw-r--r--e-util/e-table-sorting-utils.h2
2 files changed, 101 insertions, 54 deletions
diff --git a/e-util/e-table-sorting-utils.c b/e-util/e-table-sorting-utils.c
index 23303ea418..b5e7930462 100644
--- a/e-util/e-table-sorting-utils.c
+++ b/e-util/e-table-sorting-utils.c
@@ -45,36 +45,49 @@ etsu_compare (ETableModel *source,
gint j;
gint sort_count = e_table_sort_info_sorting_get_count (sort_info);
gint comp_val = 0;
- gint ascending = 1;
+ GtkSortType sort_type = GTK_SORT_ASCENDING;
for (j = 0; j < sort_count; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth (sort_info, j);
ETableCol *col;
+
col = e_table_header_get_column_by_col_idx (full_header, column.column);
- if (col == NULL)
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
- comp_val = (*col->compare)(e_table_model_value_at (source, col->compare_col, row1),
- e_table_model_value_at (source, col->compare_col, row2),
- cmp_cache);
- ascending = column.ascending;
+ if (col == NULL) {
+ gint last = e_table_header_count (full_header) - 1;
+ col = e_table_header_get_column (full_header, last);
+ }
+
+ comp_val = (*col->compare) (
+ e_table_model_value_at (
+ source, col->compare_col, row1),
+ e_table_model_value_at (
+ source, col->compare_col, row2),
+ cmp_cache);
+ if (column.ascending)
+ sort_type = GTK_SORT_ASCENDING;
+ else
+ sort_type = GTK_SORT_DESCENDING;
if (comp_val != 0)
break;
}
+
if (comp_val == 0) {
if (row1 < row2)
comp_val = -1;
if (row1 > row2)
comp_val = 1;
}
- if (!ascending)
+
+ if (sort_type == GTK_SORT_DESCENDING)
comp_val = -comp_val;
+
return comp_val;
}
typedef struct {
gint cols;
gpointer *vals;
- gint *ascending;
+ GtkSortType *sort_type;
GCompareDataFunc *compare;
gpointer cmp_cache;
} ETableSortClosure;
@@ -99,10 +112,14 @@ e_sort_callback (gconstpointer data1,
gint j;
gint sort_count = closure->cols;
gint comp_val = 0;
- gint ascending = 1;
+ GtkSortType sort_type = GTK_SORT_ASCENDING;
+
for (j = 0; j < sort_count; j++) {
- comp_val = (*(closure->compare[j]))(closure->vals[closure->cols * row1 + j], closure->vals[closure->cols * row2 + j], closure->cmp_cache);
- ascending = closure->ascending[j];
+ comp_val = (*(closure->compare[j])) (
+ closure->vals[closure->cols * row1 + j],
+ closure->vals[closure->cols * row2 + j],
+ closure->cmp_cache);
+ sort_type = closure->sort_type[j];
if (comp_val != 0)
break;
}
@@ -112,8 +129,10 @@ e_sort_callback (gconstpointer data1,
if (row1 > row2)
comp_val = 1;
}
- if (!ascending)
+
+ if (sort_type == GTK_SORT_DESCENDING)
comp_val = -comp_val;
+
return comp_val;
}
@@ -130,40 +149,44 @@ e_table_sorting_utils_sort (ETableModel *source,
gint cols;
ETableSortClosure closure;
- g_return_if_fail (source != NULL);
g_return_if_fail (E_IS_TABLE_MODEL (source));
- g_return_if_fail (sort_info != NULL);
g_return_if_fail (E_IS_TABLE_SORT_INFO (sort_info));
- g_return_if_fail (full_header != NULL);
g_return_if_fail (E_IS_TABLE_HEADER (full_header));
total_rows = e_table_model_row_count (source);
cols = e_table_sort_info_sorting_get_count (sort_info);
closure.cols = cols;
- closure.vals = g_new (gpointer , total_rows * cols);
- closure.ascending = g_new (int, cols);
+ closure.vals = g_new (gpointer, total_rows * cols);
+ closure.sort_type = g_new (GtkSortType, cols);
closure.compare = g_new (GCompareDataFunc, cols);
closure.cmp_cache = e_table_sorting_utils_create_cmp_cache ();
for (j = 0; j < cols; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth (sort_info, j);
ETableCol *col;
+
col = e_table_header_get_column_by_col_idx (full_header, column.column);
- if (col == NULL)
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
+ if (col == NULL) {
+ gint last = e_table_header_count (full_header) - 1;
+ col = e_table_header_get_column (full_header, last);
+ }
+
for (i = 0; i < rows; i++) {
closure.vals[map_table[i] * cols + j] = e_table_model_value_at (source, col->compare_col, map_table[i]);
}
closure.compare[j] = col->compare;
- closure.ascending[j] = column.ascending;
+ if (column.ascending)
+ closure.sort_type[j] = GTK_SORT_ASCENDING;
+ else
+ closure.sort_type[j] = GTK_SORT_DESCENDING;
}
g_qsort_with_data (
map_table, rows, sizeof (gint), e_sort_callback, &closure);
g_free (closure.vals);
- g_free (closure.ascending);
+ g_free (closure.sort_type);
g_free (closure.compare);
e_table_sorting_utils_free_cmp_cache (closure.cmp_cache);
}
@@ -171,27 +194,30 @@ e_table_sorting_utils_sort (ETableModel *source,
gboolean
e_table_sorting_utils_affects_sort (ETableSortInfo *sort_info,
ETableHeader *full_header,
- gint col)
+ gint compare_col)
{
gint j;
gint cols;
- g_return_val_if_fail (sort_info != NULL, TRUE);
g_return_val_if_fail (E_IS_TABLE_SORT_INFO (sort_info), TRUE);
- g_return_val_if_fail (full_header != NULL, TRUE);
g_return_val_if_fail (E_IS_TABLE_HEADER (full_header), TRUE);
cols = e_table_sort_info_sorting_get_count (sort_info);
for (j = 0; j < cols; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth (sort_info, j);
- ETableCol *tablecol;
- tablecol = e_table_header_get_column_by_col_idx (full_header, column.column);
- if (tablecol == NULL)
- tablecol = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
- if (col == tablecol->compare_col)
+ ETableCol *col;
+
+ col = e_table_header_get_column_by_col_idx (full_header, column.column);
+ if (col == NULL) {
+ gint last = e_table_header_count (full_header) - 1;
+ col = e_table_header_get_column (full_header, last);
+ }
+
+ if (compare_col == col->compare_col)
return TRUE;
}
+
return FALSE;
}
@@ -262,23 +288,35 @@ etsu_tree_compare (ETreeModel *source,
gint j;
gint sort_count = e_table_sort_info_sorting_get_count (sort_info);
gint comp_val = 0;
- gint ascending = 1;
+ GtkSortType sort_type = GTK_SORT_ASCENDING;
for (j = 0; j < sort_count; j++) {
ETableSortColumn column = e_table_sort_info_sorting_get_nth (sort_info, j);
ETableCol *col;
+
col = e_table_header_get_column_by_col_idx (full_header, column.column);
- if (col == NULL)
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
- comp_val = (*col->compare)(e_tree_model_value_at (source, path1, col->compare_col),
- e_tree_model_value_at (source, path2, col->compare_col),
- cmp_cache);
- ascending = column.ascending;
+ if (col == NULL) {
+ gint last = e_table_header_count (full_header) - 1;
+ col = e_table_header_get_column (full_header, last);
+ }
+
+ comp_val = (*col->compare) (
+ e_tree_model_value_at (
+ source, path1, col->compare_col),
+ e_tree_model_value_at (
+ source, path2, col->compare_col),
+ cmp_cache);
+ if (column.ascending)
+ sort_type = GTK_SORT_ASCENDING;
+ else
+ sort_type = GTK_SORT_DESCENDING;
if (comp_val != 0)
break;
}
- if (!ascending)
+
+ if (sort_type == GTK_SORT_DESCENDING)
comp_val = -comp_val;
+
return comp_val;
}
@@ -306,18 +344,16 @@ e_table_sorting_utils_tree_sort (ETreeModel *source,
gint i, j;
gint *map;
ETreePath *map_copy;
- g_return_if_fail (source != NULL);
+
g_return_if_fail (E_IS_TREE_MODEL (source));
- g_return_if_fail (sort_info != NULL);
g_return_if_fail (E_IS_TABLE_SORT_INFO (sort_info));
- g_return_if_fail (full_header != NULL);
g_return_if_fail (E_IS_TABLE_HEADER (full_header));
cols = e_table_sort_info_sorting_get_count (sort_info);
closure.cols = cols;
closure.vals = g_new (gpointer , count * cols);
- closure.ascending = g_new (int, cols);
+ closure.sort_type = g_new (GtkSortType, cols);
closure.compare = g_new (GCompareDataFunc, cols);
closure.cmp_cache = e_table_sorting_utils_create_cmp_cache ();
@@ -326,14 +362,19 @@ e_table_sorting_utils_tree_sort (ETreeModel *source,
ETableCol *col;
col = e_table_header_get_column_by_col_idx (full_header, column.column);
- if (col == NULL)
- col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
+ if (col == NULL) {
+ gint last = e_table_header_count (full_header) - 1;
+ col = e_table_header_get_column (full_header, last);
+ }
for (i = 0; i < count; i++) {
closure.vals[i * cols + j] = e_tree_model_sort_value_at (source, map_table[i], col->compare_col);
}
- closure.ascending[j] = column.ascending;
closure.compare[j] = col->compare;
+ if (column.ascending)
+ closure.sort_type[j] = GTK_SORT_ASCENDING;
+ else
+ closure.sort_type[j] = GTK_SORT_DESCENDING;
}
map = g_new (int, count);
@@ -356,7 +397,7 @@ e_table_sorting_utils_tree_sort (ETreeModel *source,
g_free (map_copy);
g_free (closure.vals);
- g_free (closure.ascending);
+ g_free (closure.sort_type);
g_free (closure.compare);
e_table_sorting_utils_free_cmp_cache (closure.cmp_cache);
}
@@ -410,7 +451,9 @@ e_table_sorting_utils_tree_insert (ETreeModel *source,
closure.full_header = full_header;
closure.cmp_cache = e_table_sorting_utils_create_cmp_cache ();
- e_bsearch (&path, map_table, count, sizeof (ETreePath), e_sort_tree_callback, &closure, &start, &end);
+ e_bsearch (
+ &path, map_table, count, sizeof (ETreePath),
+ e_sort_tree_callback, &closure, &start, &end);
e_table_sorting_utils_free_cmp_cache (closure.cmp_cache);
@@ -431,7 +474,11 @@ e_table_sorting_utils_tree_insert (ETreeModel *source,
gpointer
e_table_sorting_utils_create_cmp_cache (void)
{
- return g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) camel_pstring_free, g_free);
+ return g_hash_table_new_full (
+ (GHashFunc) g_str_hash,
+ (GEqualFunc) g_str_equal,
+ (GDestroyNotify) camel_pstring_free,
+ (GDestroyNotify) g_free);
}
/**
@@ -467,7 +514,8 @@ e_table_sorting_utils_add_to_cmp_cache (gpointer cmp_cache,
g_return_if_fail (cmp_cache != NULL);
g_return_if_fail (key != NULL);
- g_hash_table_insert (cmp_cache, (gchar *) camel_pstring_strdup (key), value);
+ g_hash_table_insert (
+ cmp_cache, (gchar *) camel_pstring_strdup (key), value);
}
/**
@@ -475,9 +523,8 @@ e_table_sorting_utils_add_to_cmp_cache (gpointer cmp_cache,
* @cmp_cache: a compare cache
* @key: unique key to a cache
*
- * Lookups for a key in a compare cache, which is passed in GCompareDataFunc as 'data'.
- * Returns %NULL when not found or the cache wasn't provided, otherwise value stored
- * with a key.
+ * Looks ups @key in @cmp_cache, which is passed in GCompareDataFunc as 'data'.
+ * Returns %NULL when not found or the cache wasn't provided.
**/
const gchar *
e_table_sorting_utils_lookup_cmp_cache (gpointer cmp_cache,
@@ -485,7 +532,7 @@ e_table_sorting_utils_lookup_cmp_cache (gpointer cmp_cache,
{
g_return_val_if_fail (key != NULL, NULL);
- if (!cmp_cache)
+ if (cmp_cache == NULL)
return NULL;
return g_hash_table_lookup (cmp_cache, key);
diff --git a/e-util/e-table-sorting-utils.h b/e-util/e-table-sorting-utils.h
index 2d5ccb4363..b1132d22b8 100644
--- a/e-util/e-table-sorting-utils.h
+++ b/e-util/e-table-sorting-utils.h
@@ -37,7 +37,7 @@ G_BEGIN_DECLS
gboolean e_table_sorting_utils_affects_sort
(ETableSortInfo *sort_info,
ETableHeader *full_header,
- gint col);
+ gint compare_col);
void e_table_sorting_utils_sort (ETableModel *source,
ETableSortInfo *sort_info,