aboutsummaryrefslogtreecommitdiffstats
path: root/mail/message-list.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/message-list.c')
-rw-r--r--mail/message-list.c525
1 files changed, 100 insertions, 425 deletions
diff --git a/mail/message-list.c b/mail/message-list.c
index c7361087b8..466d4c5777 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -36,17 +36,8 @@
#include <gconf/gconf-client.h>
-#include <camel/camel-exception.h>
-#include <camel/camel-file-utils.h>
-#include <camel/camel-folder.h>
-#include <camel/camel-folder-thread.h>
-#include <camel/camel-folder-summary.h>
-#include <camel/camel-vee-folder.h>
-#include <camel/camel-string-utils.h>
-
-#include <libedataserver/e-memory.h>
-
#include "e-util/e-icon-factory.h"
+#include "e-util/e-poolv.h"
#include "e-util/e-profile-event.h"
#include "e-util/e-util-private.h"
#include "e-util/e-util.h"
@@ -84,12 +75,15 @@
#endif
#ifdef G_OS_WIN32
-/* Undefine the similar macro from <pthread.h>,it doesn't check if
- * localtime() returns NULL.
- */
+#ifdef gmtime_r
+#undef gmtime_r
+#endif
+#ifdef localtime_r
#undef localtime_r
+#endif
-/* The localtime() in Microsoft's C library is MT-safe */
+/* The gmtime() and localtime() in Microsoft's C library are MT-safe */
+#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):0)
#define localtime_r(tp,tmp) (localtime(tp)?(*(tmp)=*localtime(tp),(tmp)):0)
#endif
@@ -207,11 +201,6 @@ static gint on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent
static gchar *filter_date (time_t date);
static gchar *filter_size (gint size);
-static void folder_changed (CamelObject *o, gpointer event_data, gpointer user_data);
-
-static void save_hide_state(MessageList *ml);
-static void load_hide_state(MessageList *ml);
-
/* note: @changes is owned/freed by the caller */
/*static void mail_do_regenerate_messagelist (MessageList *list, const gchar *search, const gchar *hideexpr, CamelFolderChangeInfo *changes);*/
static void mail_regen_list(MessageList *ml, const gchar *search, const gchar *hideexpr, CamelFolderChangeInfo *changes);
@@ -219,6 +208,10 @@ static void mail_regen_cancel(MessageList *ml);
static void clear_info(gchar *key, ETreePath *node, MessageList *ml);
+static void folder_changed (CamelFolder *folder,
+ CamelFolderChangeInfo *info,
+ MessageList *ml);
+
enum {
MESSAGE_SELECTED,
MESSAGE_LIST_BUILT,
@@ -273,7 +266,7 @@ e_mail_address_new (const gchar *address)
cia = camel_internet_address_new ();
if (camel_address_unformat (CAMEL_ADDRESS (cia), address) == -1) {
- camel_object_unref (cia);
+ g_object_unref (cia);
return NULL;
}
camel_internet_address_get (cia, 0, &name, &addr);
@@ -286,7 +279,7 @@ e_mail_address_new (const gchar *address)
new->wname = NULL;
}
- camel_object_unref (cia);
+ g_object_unref (cia);
return new;
}
@@ -509,7 +502,7 @@ clear_selection(MessageList *ml, struct _MLSelection *selection)
selection->uids = NULL;
}
if (selection->folder) {
- camel_object_unref(selection->folder);
+ g_object_unref (selection->folder);
selection->folder = NULL;
}
g_free(selection->folder_uri);
@@ -893,7 +886,7 @@ message_list_copy(MessageList *ml, gboolean cut)
p->clipboard.uids = uids;
p->clipboard.folder = ml->folder;
- camel_object_ref(p->clipboard.folder);
+ g_object_ref (p->clipboard.folder);
p->clipboard.folder_uri = g_strdup(ml->folder_uri);
gtk_selection_owner_set(p->invisible, GDK_SELECTION_CLIPBOARD, gtk_get_current_event_time());
} else {
@@ -1973,7 +1966,6 @@ void
message_list_save_state (MessageList *ml)
{
save_tree_state (ml);
- save_hide_state (ml);
}
static void
@@ -1982,6 +1974,7 @@ message_list_setup_etree (MessageList *message_list, gboolean outgoing)
/* build the spec based on the folder, and possibly from a saved file */
/* otherwise, leave default */
if (message_list->folder) {
+ CamelStore *parent_store;
gchar *path;
gchar *name;
gint data = 1;
@@ -1992,7 +1985,8 @@ message_list_setup_etree (MessageList *message_list, gboolean outgoing)
g_object_set (message_list, "uniform_row_height", TRUE, NULL);
- name = camel_service_get_name (CAMEL_SERVICE (message_list->folder->parent_store), TRUE);
+ parent_store = camel_folder_get_parent_store (message_list->folder);
+ name = camel_service_get_name (CAMEL_SERVICE (parent_store), TRUE);
d(printf ("folder name is '%s'\n", name));
path = mail_config_folder_to_cachename (message_list->folder, "et-expanded-");
@@ -2040,14 +2034,22 @@ ml_selection_clear_event(GtkWidget *widget, GdkEventSelection *event, MessageLis
}
static void
-ml_selection_received(GtkWidget *widget, GtkSelectionData *data, guint time, MessageList *ml)
+ml_selection_received (GtkWidget *widget,
+ GtkSelectionData *selection_data,
+ guint time,
+ MessageList *ml)
{
- if (data->target != gdk_atom_intern ("x-uid-list", FALSE)) {
+ GdkAtom target;
+
+ target = gtk_selection_data_get_target (selection_data);
+
+ if (target != gdk_atom_intern ("x-uid-list", FALSE)) {
d(printf("Unknown selection received by message-list\n"));
return;
}
- em_utils_selection_get_uidlist(data, ml->folder, FALSE, NULL);
+ em_utils_selection_get_uidlist (
+ selection_data, ml->folder, FALSE, NULL);
}
static void
@@ -2096,10 +2098,14 @@ struct _drop_msg {
static gchar *
ml_drop_async_desc (struct _drop_msg *m)
{
+ const gchar *full_name;
+
+ full_name = camel_folder_get_full_name (m->folder);
+
if (m->move)
- return g_strdup_printf(_("Moving messages into folder %s"), m->folder->full_name);
+ return g_strdup_printf(_("Moving messages into folder %s"), full_name);
else
- return g_strdup_printf(_("Copying messages into folder %s"), m->folder->full_name);
+ return g_strdup_printf(_("Copying messages into folder %s"), full_name);
}
static void
@@ -2138,11 +2144,9 @@ ml_drop_async_done (struct _drop_msg *m)
static void
ml_drop_async_free (struct _drop_msg *m)
{
- g_object_unref(m->context);
- camel_object_unref(m->folder);
-
- g_free(m->selection->data);
- g_free(m->selection);
+ g_object_unref (m->context);
+ g_object_unref (m->folder);
+ gtk_selection_data_free (m->selection);
}
static MailMsgInfo ml_drop_async_info = {
@@ -2161,30 +2165,39 @@ ml_drop_action(struct _drop_msg *m)
}
static void
-ml_tree_drag_data_received (ETree *tree, gint row, ETreePath path, gint col,
- GdkDragContext *context, gint x, gint y,
- GtkSelectionData *data, guint info,
- guint time, MessageList *ml)
+ml_tree_drag_data_received (ETree *tree,
+ gint row,
+ ETreePath path,
+ gint col,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ MessageList *ml)
{
struct _drop_msg *m;
- /* this means we are receiving no data */
- if (!ml->folder || data->data == NULL || data->length == -1)
+ if (ml->folder == NULL)
+ return;
+
+ if (gtk_selection_data_get_data (selection_data) == NULL)
+ return;
+
+ if (gtk_selection_data_get_length (selection_data) == -1)
return;
m = mail_msg_new(&ml_drop_async_info);
m->context = context;
g_object_ref(context);
m->folder = ml->folder;
- camel_object_ref(m->folder);
+ g_object_ref (m->folder);
m->action = context->action;
m->info = info;
/* need to copy, goes away once we exit */
- m->selection = g_malloc0(sizeof(*m->selection));
- m->selection->data = g_malloc(data->length);
- memcpy(m->selection->data, data->data, data->length);
- m->selection->length = data->length;
+ m->selection = gtk_selection_data_copy (selection_data);
ml_drop_action(m);
}
@@ -2306,16 +2319,9 @@ message_list_init (MessageList *message_list)
(GDestroyNotify) NULL,
(GDestroyNotify) e_poolv_destroy);
- message_list->hidden = NULL;
- message_list->hidden_pool = NULL;
- message_list->hide_before = ML_HIDE_NONE_START;
- message_list->hide_after = ML_HIDE_NONE_END;
-
message_list->search = NULL;
message_list->ensure_uid = NULL;
- message_list->hide_lock = g_mutex_new();
-
message_list->uid_nodemap = g_hash_table_new (g_str_hash, g_str_equal);
message_list->async_event = mail_async_event_new();
@@ -2370,8 +2376,9 @@ message_list_destroy(GtkObject *object)
message_list->uid_nodemap = NULL;
}
- camel_object_unhook_event(message_list->folder, "folder_changed", folder_changed, message_list);
- camel_object_unref (message_list->folder);
+ g_signal_handlers_disconnect_by_func (
+ message_list->folder, folder_changed, message_list);
+ g_object_unref (message_list->folder);
message_list->folder = NULL;
}
@@ -2492,19 +2499,11 @@ message_list_finalize (GObject *object)
if (message_list->thread_tree)
camel_folder_thread_messages_unref(message_list->thread_tree);
- if (message_list->hidden) {
- g_hash_table_destroy(message_list->hidden);
- e_mempool_destroy(message_list->hidden_pool);
- message_list->hidden = NULL;
- message_list->hidden_pool = NULL;
- }
-
g_free(message_list->search);
g_free(message_list->ensure_uid);
g_free(message_list->frozen_search);
g_free(message_list->cursor_uid);
- g_mutex_free(message_list->hide_lock);
g_mutex_free (message_list->regen_lock);
g_free(message_list->folder_uri);
@@ -2576,8 +2575,8 @@ message_list_class_init (MessageListClass *class)
PROP_SHELL_BACKEND,
g_param_spec_object (
"shell-backend",
- _("Shell Backend"),
- _("The mail shell backend"),
+ "Shell Backend",
+ "The mail shell backend",
E_TYPE_SHELL_BACKEND,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
@@ -3534,22 +3533,25 @@ main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
}
static void
-folder_changed (CamelObject *o, gpointer event_data, gpointer user_data)
+folder_changed (CamelFolder *folder,
+ CamelFolderChangeInfo *info,
+ MessageList *ml)
{
CamelFolderChangeInfo *changes;
- MessageList *ml = MESSAGE_LIST (user_data);
if (ml->priv->destroyed)
return;
- if (event_data) {
+ if (info != NULL) {
changes = camel_folder_change_info_new();
- camel_folder_change_info_cat(changes, (CamelFolderChangeInfo *)event_data);
+ camel_folder_change_info_cat (changes, info);
} else {
changes = NULL;
}
- mail_async_event_emit(ml->async_event, MAIL_ASYNC_GUI, (MailAsyncFunc)main_folder_changed, o, changes, user_data);
+ mail_async_event_emit (
+ ml->async_event, MAIL_ASYNC_GUI, (MailAsyncFunc)
+ main_folder_changed, folder, changes, ml);
}
/**
@@ -3590,7 +3592,6 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g
if (message_list->folder != NULL) {
save_tree_state (message_list);
- save_hide_state (message_list);
}
e_tree_memory_freeze(E_TREE_MEMORY(etm));
@@ -3604,9 +3605,9 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g
}
if (message_list->folder) {
- camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed",
- folder_changed, message_list);
- camel_object_unref (message_list->folder);
+ g_signal_handlers_disconnect_by_func (
+ message_list->folder, folder_changed, message_list);
+ g_object_unref (message_list->folder);
message_list->folder = NULL;
}
@@ -3630,7 +3631,7 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g
gint strikeout_col = -1;
ECell *cell;
- camel_object_ref (folder);
+ g_object_ref (folder);
message_list->folder = folder;
message_list->just_set_folder = TRUE;
@@ -3656,14 +3657,15 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const g
/* Build the etree suitable for this folder */
message_list_setup_etree (message_list, outgoing);
- camel_object_hook_event (folder, "folder_changed", folder_changed, message_list);
+ g_signal_connect (
+ folder, "changed",
+ G_CALLBACK (folder_changed), message_list);
gconf = mail_config_get_gconf_client ();
hide_deleted = !gconf_client_get_bool (gconf, "/apps/evolution/mail/display/show_deleted", NULL);
message_list->hidedeleted = hide_deleted && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
message_list->hidejunk = folder_store_supports_vjunk_folder (message_list->folder) && !(folder->folder_flags & CAMEL_FOLDER_IS_JUNK) && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
- load_hide_state (message_list);
if (message_list->frozen == 0)
mail_regen_list (message_list, message_list->search, NULL, NULL);
}
@@ -4005,229 +4007,6 @@ message_list_ensure_message (MessageList *ml, const gchar *uid)
ml->ensure_uid = g_strdup (uid);
}
-/* returns the number of messages displayable *after* expression hiding has taken place */
-guint
-message_list_length (MessageList *ml)
-{
- return ml->hide_unhidden;
-}
-
-struct _glibsuxcrap {
- guint count;
- CamelFolder *folder;
-};
-
-static void
-glib_crapback(gpointer key, gpointer data, gpointer x)
-{
- struct _glibsuxcrap *y = x;
- CamelMessageInfo *mi;
-
- if (y->count)
- return;
-
- mi = camel_folder_get_message_info(y->folder, key);
- if (mi) {
- y->count++;
- camel_folder_free_message_info(y->folder, mi);
- }
-}
-
-/* returns 0 or 1 depending if there are hidden messages */
-guint
-message_list_hidden(MessageList *ml)
-{
- guint hidden = 0;
-
- MESSAGE_LIST_LOCK (ml, hide_lock);
- if (ml->hidden && ml->folder) {
- /* this is a hack, should probably just maintain the hidden table better */
- struct _glibsuxcrap x = { 0, ml->folder };
- g_hash_table_foreach(ml->hidden, glib_crapback, &x);
- hidden = x.count;
- }
- MESSAGE_LIST_UNLOCK (ml, hide_lock);
-
- return hidden;
-}
-
-/* add a new expression to hide, or set the range.
- @expr: A new search expression - all matching messages will be hidden. May be %NULL.
- @lower: Use ML_HIDE_NONE_START to specify no messages hidden from the start of the list.
- @upper: Use ML_HIDE_NONE_END to specify no message hidden from the end of the list.
-
- For either @upper or @lower, use ML_HIDE_SAME, to keep the previously set hide range.
- If either range is negative, then the range is taken from the end of the available list
- of messages, once other hiding has been performed. Use message_list_length() to find out
- how many messages are available for hiding.
-
- Example: hide_add(ml, NULL, -100, ML_HIDE_NONE_END) -> hide all but the last (most recent)
- 100 messages.
-*/
-void
-message_list_hide_add (MessageList *ml, const gchar *expr, guint lower, guint upper)
-{
- MESSAGE_LIST_LOCK (ml, hide_lock);
-
- if (lower != ML_HIDE_SAME)
- ml->hide_before = lower;
- if (upper != ML_HIDE_SAME)
- ml->hide_after = upper;
-
- MESSAGE_LIST_UNLOCK (ml, hide_lock);
-
- mail_regen_list (ml, ml->search, expr, NULL);
-}
-
-/* hide specific uid's */
-void
-message_list_hide_uids (MessageList *ml, GPtrArray *uids)
-{
- gint i;
- gchar *uid;
-
- /* first see if we need to do any work, if so, then do it all at once */
- for (i = 0; i < uids->len; i++) {
- if (g_hash_table_lookup (ml->uid_nodemap, uids->pdata[i])) {
- MESSAGE_LIST_LOCK (ml, hide_lock);
- if (ml->hidden == NULL) {
- ml->hidden = g_hash_table_new (g_str_hash, g_str_equal);
- ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE);
- }
-
- uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]);
- g_hash_table_insert (ml->hidden, uid, uid);
- for (; i < uids->len; i++) {
- if (g_hash_table_lookup (ml->uid_nodemap, uids->pdata[i])) {
- uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]);
- g_hash_table_insert (ml->hidden, uid, uid);
- }
- }
- MESSAGE_LIST_UNLOCK (ml, hide_lock);
- /* save this here incase the user pops up another window, so they are consistent */
- save_hide_state(ml);
- if (ml->frozen == 0)
- mail_regen_list (ml, ml->search, NULL, NULL);
- break;
- }
- }
-}
-
-/* no longer hide any messages */
-void
-message_list_hide_clear (MessageList *ml)
-{
- MESSAGE_LIST_LOCK (ml, hide_lock);
- if (ml->hidden) {
- g_hash_table_destroy (ml->hidden);
- e_mempool_destroy (ml->hidden_pool);
- ml->hidden = NULL;
- ml->hidden_pool = NULL;
- }
- ml->hide_before = ML_HIDE_NONE_START;
- ml->hide_after = ML_HIDE_NONE_END;
- MESSAGE_LIST_UNLOCK (ml, hide_lock);
-
- if (ml->thread_tree) {
- camel_folder_thread_messages_unref(ml->thread_tree);
- ml->thread_tree = NULL;
- }
-
- /* save this here incase the user pops up another window, so they are consistent */
- save_hide_state(ml);
- if (ml->frozen == 0)
- mail_regen_list (ml, ml->search, NULL, NULL);
-}
-
-#define HIDE_STATE_VERSION (1)
-
-/* version 1 file is:
- uintf 1
- uintf hide_before
- uintf hide_after
- string* uids
-*/
-
-static void
-load_hide_state (MessageList *ml)
-{
- gchar *filename;
- FILE *in;
- gint32 version, lower, upper;
-
- MESSAGE_LIST_LOCK(ml, hide_lock);
- if (ml->hidden) {
- g_hash_table_destroy (ml->hidden);
- e_mempool_destroy (ml->hidden_pool);
- ml->hidden = NULL;
- ml->hidden_pool = NULL;
- }
- ml->hide_before = ML_HIDE_NONE_START;
- ml->hide_after = ML_HIDE_NONE_END;
-
- filename = mail_config_folder_to_cachename(ml->folder, "hidestate-");
- in = g_fopen(filename, "rb");
- if (in) {
- camel_file_util_decode_fixed_int32 (in, &version);
- if (version == HIDE_STATE_VERSION) {
- ml->hidden = g_hash_table_new(g_str_hash, g_str_equal);
- ml->hidden_pool = e_mempool_new(512, 256, E_MEMPOOL_ALIGN_BYTE);
- camel_file_util_decode_fixed_int32 (in, &lower);
- ml->hide_before = lower;
- camel_file_util_decode_fixed_int32 (in, &upper);
- ml->hide_after = upper;
- while (!feof(in)) {
- gchar *olduid, *uid;
-
- if (camel_file_util_decode_string (in, &olduid) != -1) {
- uid = e_mempool_strdup(ml->hidden_pool, olduid);
- g_free (olduid);
- g_hash_table_insert(ml->hidden, uid, uid);
- }
- }
- }
- fclose(in);
- }
- g_free(filename);
-
- MESSAGE_LIST_UNLOCK(ml, hide_lock);
-}
-
-static void
-hide_save_1 (gchar *uid, gchar *keydata, FILE *out)
-{
- camel_file_util_encode_string (out, uid);
-}
-
-/* save the hide state. Note that messages are hidden by uid, if the uid's change, then
- this will become invalid, but is easy to reset in the ui */
-static void
-save_hide_state (MessageList *ml)
-{
- gchar *filename;
- FILE *out;
-
- if (ml->folder == NULL)
- return;
-
- MESSAGE_LIST_LOCK(ml, hide_lock);
-
- filename = mail_config_folder_to_cachename(ml->folder, "hidestate-");
- if (ml->hidden == NULL && ml->hide_before == ML_HIDE_NONE_START && ml->hide_after == ML_HIDE_NONE_END) {
- g_unlink(filename);
- } else if ((out = g_fopen (filename, "wb"))) {
- camel_file_util_encode_fixed_int32 (out, HIDE_STATE_VERSION);
- camel_file_util_encode_fixed_int32 (out, ml->hide_before);
- camel_file_util_encode_fixed_int32 (out, ml->hide_after);
- if (ml->hidden)
- g_hash_table_foreach(ml->hidden, (GHFunc)hide_save_1, out);
- fclose(out);
- }
- g_free (filename);
-
- MESSAGE_LIST_UNLOCK(ml, hide_lock);
-}
-
struct sort_column_data {
ETableCol *col;
gboolean ascending;
@@ -4369,8 +4148,7 @@ ml_sort_uids_by_tree (MessageList *ml, GPtrArray *uids)
g_ptr_array_add (sort_data.sort_columns, data);
}
- if (uids->len - camel_folder_summary_cache_size (ml->folder->summary) > 50)
- camel_folder_summary_reload_from_db (ml->folder->summary, NULL);
+ camel_folder_summary_prepare_fetch_all (ml->folder->summary, NULL);
for (i = 0; i < uids->len; i++) {
gchar *uid;
@@ -4437,7 +4215,7 @@ regen_list_desc (struct _regen_list_msg *m)
static void
regen_list_exec (struct _regen_list_msg *m)
{
- GPtrArray *uids, *uidnew, *showuids, *searchuids = NULL;
+ GPtrArray *uids, *searchuids = NULL;
CamelMessageInfo *info;
ETreePath cursor;
ETree *tree;
@@ -4530,122 +4308,33 @@ regen_list_exec (struct _regen_list_msg *m)
if (camel_exception_is_set (&m->base.ex))
return;
- /* perform hiding */
- if (m->hideexpr && camel_folder_has_search_capability(m->folder)) {
- uidnew = camel_folder_search_by_expression (m->ml->folder, m->hideexpr, &m->base.ex);
- /* well, lets not abort just because this faileld ... */
- camel_exception_clear (&m->base.ex);
-
- if (uidnew) {
- MESSAGE_LIST_LOCK(m->ml, hide_lock);
-
- if (m->ml->hidden == NULL) {
- m->ml->hidden = g_hash_table_new (g_str_hash, g_str_equal);
- m->ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE);
- }
-
- for (i = 0; i < uidnew->len; i++) {
- if (g_hash_table_lookup (m->ml->hidden, uidnew->pdata[i]) == NULL) {
- gchar *uid = e_mempool_strdup (m->ml->hidden_pool, uidnew->pdata[i]);
- g_hash_table_insert (m->ml->hidden, uid, uid);
- }
- }
-
- MESSAGE_LIST_UNLOCK(m->ml, hide_lock);
-
- camel_folder_search_free (m->ml->folder, uidnew);
- }
- }
-
- MESSAGE_LIST_LOCK(m->ml, hide_lock);
-
- m->ml->hide_unhidden = uids->len;
-
- /* what semantics do we want from hide_before, hide_after?
- probably <0 means measure from the end of the list */
-
- /* perform uid hiding */
- if (m->ml->hidden || m->ml->hide_before != ML_HIDE_NONE_START || m->ml->hide_after != ML_HIDE_NONE_END) {
- gint start, end;
- uidnew = g_ptr_array_new ();
-
- /* first, hide matches */
- if (m->ml->hidden) {
- gint subtr = 0;
-
- for (i = 0; i < uids->len; i++) {
- if (g_hash_table_lookup (m->ml->hidden, uids->pdata[i]) == NULL)
- g_ptr_array_add (uidnew, uids->pdata[i]);
- else if (m->last_row >= 0) {
- /* if we are going to hide message above last selected row, then we should
- decrease our last row number, to put cursor on a proper place. */
- ETreePath node = g_hash_table_lookup (m->ml->uid_nodemap, (const gchar *) uids->pdata[i]);
-
- if (node && m->last_row > e_tree_table_adapter_row_of_node (e_tree_get_table_adapter (tree), node))
- subtr ++;
- }
- }
-
- m->last_row -= subtr;
- }
-
- /* then calculate the subrange visible and chop it out */
- m->ml->hide_unhidden = uidnew->len;
-
- if (m->ml->hide_before != ML_HIDE_NONE_START || m->ml->hide_after != ML_HIDE_NONE_END) {
- GPtrArray *uid2 = g_ptr_array_new ();
-
- start = m->ml->hide_before;
- if (start < 0)
- start += m->ml->hide_unhidden;
- end = m->ml->hide_after;
- if (end < 0)
- end += m->ml->hide_unhidden;
-
- start = MAX(start, 0);
- end = MIN(end, uidnew->len);
- for (i = start; i < end; i++) {
- g_ptr_array_add (uid2, uidnew->pdata[i]);
- }
-
- g_ptr_array_free (uidnew, TRUE);
- uidnew = uid2;
- }
- showuids = uidnew;
- } else {
- uidnew = NULL;
- showuids = uids;
- }
-
- MESSAGE_LIST_UNLOCK(m->ml, hide_lock);
-
e_profile_event_emit("list.threaduids", m->folder->full_name, 0);
- /* camel_folder_summary_reload_from_db (m->folder->summary, NULL); */
+ /* camel_folder_summary_prepare_fetch_all (m->folder->summary, NULL); */
if (!camel_operation_cancel_check(m->base.cancel)) {
/* update/build a new tree */
if (m->dotree) {
- ml_sort_uids_by_tree (m->ml, showuids);
+ ml_sort_uids_by_tree (m->ml, uids);
if (m->tree)
- camel_folder_thread_messages_apply (m->tree, showuids);
+ camel_folder_thread_messages_apply (m->tree, uids);
else
- m->tree = camel_folder_thread_messages_new (m->folder, showuids, m->thread_subject);
+ m->tree = camel_folder_thread_messages_new (m->folder, uids, m->thread_subject);
} else {
- camel_folder_sort_uids (m->ml->folder, showuids);
+ CamelException ex;
+
+ camel_folder_sort_uids (m->ml->folder, uids);
m->summary = g_ptr_array_new ();
- if (showuids->len > camel_folder_summary_cache_size (m->folder->summary) ) {
- CamelException ex;
- camel_exception_init (&ex);
- camel_folder_summary_reload_from_db (m->folder->summary, &ex);
- if (camel_exception_is_set (&ex)) {
- g_warning ("Exception while reloading: %s\n", camel_exception_get_description (&ex));
- camel_exception_clear (&ex);
- }
+ camel_exception_init (&ex);
+ camel_folder_summary_prepare_fetch_all (m->folder->summary, &ex);
+ if (camel_exception_is_set (&ex)) {
+ g_warning ("Exception while reloading: %s\n", camel_exception_get_description (&ex));
+ camel_exception_clear (&ex);
}
- for (i = 0; i < showuids->len; i++) {
- info = camel_folder_get_message_info (m->folder, showuids->pdata[i]);
+
+ for (i = 0; i < uids->len; i++) {
+ info = camel_folder_get_message_info (m->folder, uids->pdata[i]);
if (info)
g_ptr_array_add(m->summary, info);
}
@@ -4654,9 +4343,6 @@ regen_list_exec (struct _regen_list_msg *m)
m->complete = TRUE;
}
- if (uidnew)
- g_ptr_array_free (uidnew, TRUE);
-
if (searchuids)
camel_folder_search_free (m->folder, searchuids);
else
@@ -4752,17 +4438,11 @@ regen_list_done (struct _regen_list_msg *m)
}
}
-#if GTK_CHECK_VERSION(2,19,7)
if (gtk_widget_get_visible (GTK_WIDGET (m->ml))) {
-#else
- if (GTK_WIDGET_VISIBLE (GTK_WIDGET (m->ml))) {
-#endif
- if (message_list_length (m->ml) <= 0) {
+ if (e_tree_row_count (E_TREE (m->ml)) <= 0) {
/* space is used to indicate no search too */
if (m->ml->search && *m->ml->search && strcmp (m->ml->search, " ") != 0)
e_tree_set_info_message (tree, _("No message satisfies your search criteria. Either clear search with Search->Clear menu item or change it."));
- else if (m->ml->hidden)
- e_tree_set_info_message (tree, _("There are only hidden messages in this folder. Use View->Show Hidden Messages to show them."));
else
e_tree_set_info_message (tree, _("There are no messages in this folder."));
} else
@@ -4794,7 +4474,7 @@ regen_list_free (struct _regen_list_msg *m)
g_free (m->search);
g_free (m->hideexpr);
- camel_object_unref (m->folder);
+ g_object_unref (m->folder);
if (m->changes)
camel_folder_change_info_free (m->changes);
@@ -4908,8 +4588,7 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
m->hidedel = ml->hidedeleted;
m->hidejunk = ml->hidejunk;
m->thread_subject = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/thread_subject", NULL);
- m->folder = ml->folder;
- camel_object_ref(m->folder);
+ m->folder = g_object_ref (ml->folder);
m->last_row = -1;
m->expand_state = NULL;
@@ -4921,12 +4600,8 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
camel_folder_thread_messages_ref(m->tree);
}
- if (message_list_length (ml) <= 0) {
-#if GTK_CHECK_VERSION(2,19,7)
+ if (e_tree_row_count (E_TREE (ml)) <= 0) {
if (gtk_widget_get_visible (GTK_WIDGET (ml))) {
-#else
- if (GTK_WIDGET_VISIBLE (GTK_WIDGET (ml))) {
-#endif
/* there is some info why the message list is empty, let it be something useful */
gchar *txt = g_strconcat (_("Generating message list"), "..." , NULL);