aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-05-20 13:19:42 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-05-20 13:19:42 +0800
commite714124dc7b940446165a901cdae6732dd647bfb (patch)
tree5013e4cbdcd4ca5f9b822dced52ee191bbb8403c
parentb2a435d9f208d5401e4561e6f106cae619a27c4f (diff)
downloadgsoc2013-evolution-e714124dc7b940446165a901cdae6732dd647bfb.tar.gz
gsoc2013-evolution-e714124dc7b940446165a901cdae6732dd647bfb.tar.zst
gsoc2013-evolution-e714124dc7b940446165a901cdae6732dd647bfb.zip
** See #57583.
2004-05-20 Not Zed <NotZed@Ximian.com> ** See #57583. * message-list.c (build_tree): save/restore the selection when we update. (message_list_set_selected): util to set the selected messages from a list of uids. (build_flat): same. I wonder if etree's unbroken enough to use it more directly? svn path=/trunk/; revision=26006
-rw-r--r--mail/ChangeLog9
-rw-r--r--mail/message-list.c41
-rw-r--r--mail/message-list.h1
3 files changed, 43 insertions, 8 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 0f2d5faf5a..79f79e9515 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,5 +1,14 @@
2004-05-20 Not Zed <NotZed@Ximian.com>
+ ** See #57583.
+
+ * message-list.c (build_tree): save/restore the selection when we
+ update.
+ (message_list_set_selected): util to set the selected messages
+ from a list of uids.
+ (build_flat): same. I wonder if etree's unbroken enough to use it
+ more directly?
+
** See #58693.
* mail-send-recv.c (mail_autoreceive_setup): add bounds checking
diff --git a/mail/message-list.c b/mail/message-list.c
index 1b0e657a38..38b389b062 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -2112,6 +2112,9 @@ find_next_undeleted (MessageList *ml)
/* only call if we have a tree model */
/* builds the tree structure */
+
+#define BROKEN_ETREE /* avoid some broken code in etree(?) by not using the incremental update */
+
static void build_subtree (MessageList *ml, ETreePath parent, CamelFolderThreadNode *c, int *row);
static void build_subtree_diff (MessageList *ml, ETreePath parent, ETreePath path, CamelFolderThreadNode *c, int *row);
@@ -2146,19 +2149,21 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c
if (ml->cursor_uid)
saveuid = find_next_undeleted(ml);
-#define BROKEN_ETREE /* avoid some broken code in etree(?) by not using the incremental update */
-
top = e_tree_model_node_get_first_child(etm, ml->tree_root);
#ifndef BROKEN_ETREE
if (top == NULL || changes == NULL) {
+#else
+ GPtrArray *selected = message_list_get_selected(ml);
#endif
e_tree_memory_freeze(E_TREE_MEMORY(etm));
clear_tree (ml);
build_subtree(ml, ml->tree_root, thread->tree, &row);
-
e_tree_memory_thaw(E_TREE_MEMORY(etm));
-#ifndef BROKEN_ETREE
+#ifdef BROKEN_ETREE
+ message_list_set_selected(ml, selected);
+ message_list_free_uids(ml, selected);
+#else
} else {
static int tree_equal(ETreeModel *etm, ETreePath ap, CamelFolderThreadNode *bp);
@@ -2167,7 +2172,6 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c
tree_equal(ml->model, top, thread->tree);
}
#endif
-
if (saveuid) {
ETreePath *node = g_hash_table_lookup (ml->uid_nodemap, saveuid);
if (node == NULL) {
@@ -2183,7 +2187,7 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c
ml->cursor_uid = NULL;
g_signal_emit (ml, message_list_signals[MESSAGE_SELECTED], 0, NULL);
}
-
+
#ifdef TIMEIT
gettimeofday(&end, NULL);
diff = end.tv_sec * 1000 + end.tv_usec/1000;
@@ -2464,6 +2468,8 @@ build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes)
if (changes) {
build_flat_diff(ml, changes);
} else {
+#else
+ GPtrArray *selected = message_list_get_selected(ml);
#endif
e_tree_memory_freeze(E_TREE_MEMORY(etm));
clear_tree (ml);
@@ -2475,8 +2481,10 @@ build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes)
camel_folder_ref_message_info(ml->folder, info);
}
e_tree_memory_thaw(E_TREE_MEMORY(etm));
-
-#ifndef BROKEN_ETREE
+#ifdef BROKEN_ETREE
+ message_list_set_selected(ml, selected);
+ message_list_free_uids(ml, selected);
+#else
}
#endif
@@ -2976,6 +2984,23 @@ message_list_get_selected(MessageList *ml)
}
void
+message_list_set_selected(MessageList *ml, GPtrArray *uids)
+{
+ int i;
+ ETreeSelectionModel *etsm;
+ ETreePath node;
+
+ etsm = (ETreeSelectionModel *)e_tree_get_selection_model(ml->tree);
+
+ for (i=0; i<uids->len; i++) {
+ node = g_hash_table_lookup(ml->uid_nodemap, uids->pdata[i]);
+ printf("reselecting uid '%s' %s\n", uids->pdata[i], node?"found":"not found");
+ if (node)
+ e_tree_selection_model_add_to_selection(etsm, node);
+ }
+}
+
+void
message_list_freeze(MessageList *ml)
{
ml->frozen++;
diff --git a/mail/message-list.h b/mail/message-list.h
index c4fed0537b..a6048527e3 100644
--- a/mail/message-list.h
+++ b/mail/message-list.h
@@ -179,6 +179,7 @@ void message_list_freeze(MessageList *ml);
void message_list_thaw(MessageList *ml);
GPtrArray *message_list_get_selected(MessageList *ml);
+void message_list_set_selected(MessageList *ml, GPtrArray *uids);
void message_list_free_uids(MessageList *ml, GPtrArray *uids);
/* select next/prev message helpers */