+
+
+static gint
+cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
+ gpointer user_data)
+{
+ gint col_id;
+ gint t1, t2;
+ gint val1, val2;
+ gchar *s1, *s2;
+ gint cmp;
+
+ static int counter = 0;
+ col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_COLUMN));
+
+ if (!(++counter % 100)) {
+ GObject *header_view = g_object_get_data(G_OBJECT(user_data),
+ MODEST_HEADER_VIEW_PTR);
+ g_signal_emit (header_view,
+ signals[STATUS_UPDATE_SIGNAL],
+ 0, _("Sorting..."), 0, 0);
+ }
+ switch (col_id) {
+
+ /* first one, we decide based on the time */
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN:
+ case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE:
+
+ gtk_tree_model_get (tree_model, iter1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
+ &t1,-1);
+ gtk_tree_model_get (tree_model, iter2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
+ &t2,-1);
+ return t1 - t2;
+
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT:
+ case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
+ gtk_tree_model_get (tree_model, iter1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
+ &t1,-1);
+ gtk_tree_model_get (tree_model, iter2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
+ &t2,-1);
+ return t1 - t2;
+
+
+ /* next ones, we try the search criteria first, if they're the same, then we use 'sent date' */
+ /* FIXME: what about received-date? */
+ case MODEST_HEADER_VIEW_COLUMN_SUBJECT: {
+
+ gtk_tree_model_get (tree_model, iter1,
+ TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ -1);
+ gtk_tree_model_get (tree_model, iter2,
+ TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ -1);
+
+ /* the prefix ('Re:', 'Fwd:' etc.) we ignore */
+ cmp = modest_text_utils_utf8_strcmp (s1 + modest_text_utils_get_subject_prefix_len(s1),
+ s2 + modest_text_utils_get_subject_prefix_len(s2),
+ TRUE);
+ g_free (s1);
+ g_free (s2);
+
+ return cmp ? cmp : t1 - t2;
+ }
+
+ case MODEST_HEADER_VIEW_COLUMN_FROM:
+
+ gtk_tree_model_get (tree_model, iter1,
+ TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ -1);
+ gtk_tree_model_get (tree_model, iter2,
+ TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ -1);
+ cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE);
+ g_free (s1);
+ g_free (s2);
+
+ return cmp ? cmp : t1 - t2;
+
+ case MODEST_HEADER_VIEW_COLUMN_TO:
+
+ gtk_tree_model_get (tree_model, iter1,
+ TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ -1);
+ gtk_tree_model_get (tree_model, iter2,
+ TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ -1);
+ cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE);
+ g_free (s1);
+ g_free (s2);
+
+ return cmp ? cmp : t1 - t2;
+
+ case MODEST_HEADER_VIEW_COLUMN_ATTACH:
+
+ gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, -1);
+ gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, -1);
+
+ cmp = (val1 & TNY_HEADER_FLAG_ATTACHMENTS) -
+ (val2 & TNY_HEADER_FLAG_ATTACHMENTS);
+
+ return cmp ? cmp : t1 - t2;
+
+ case MODEST_HEADER_VIEW_COLUMN_MSGTYPE:
+ gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1);
+ gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1);
+ cmp = (val1 & TNY_HEADER_FLAG_SEEN) - (val2 & TNY_HEADER_FLAG_SEEN);
+
+ return cmp ? cmp : t1 - t2;
+
+ default:
+ return &iter1 - &iter2; /* oughhhh */
+ }
+}