diff options
author | Christopher James Lahey <clahey@ximian.com> | 2001-04-13 08:45:42 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2001-04-13 08:45:42 +0800 |
commit | 5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24 (patch) | |
tree | e359381400b5c7e0e9496674f5fab8e4970eaaf8 /mail/message-list.c | |
parent | 0f85f30ab1145a7ed3c6ee7b2e2216874dc2074f (diff) | |
download | gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar.gz gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar.bz2 gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar.lz gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar.xz gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.tar.zst gsoc2013-evolution-5083cd6bdc9d4e666cd9077b3e11f353d1a2cd24.zip |
Updated this function to be a correct full ordering.
2001-04-12 Christopher James Lahey <clahey@ximian.com>
* message-list.c (e_mail_address_new): Updated this function to be
a correct full ordering.
(ml_has_get_node_by_id, ml_get_node_by_id): Implemented these
functions.
(find_next_undeleted): Changed this to find next sorted undeleted
message. Also, changed it so that if the current message is not
deleted, it returns NULL.
(build_tree, build_flat): Changed these to only set the cursor if
the cursor is changed.
* subscribe-dialog.c: Changed this to pass NULL, NULL for
has_get_node_by_id and get_node_by_id.
svn path=/trunk/; revision=9290
Diffstat (limited to 'mail/message-list.c')
-rw-r--r-- | mail/message-list.c | 184 |
1 files changed, 112 insertions, 72 deletions
diff --git a/mail/message-list.c b/mail/message-list.c index ebd5d3b40d..d3ff04d649 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -91,6 +91,8 @@ #define PARENT_TYPE (e_tree_scrolled_get_type ()) +/* #define SMART_ADDRESS_COMPARE */ + #ifdef SMART_ADDRESS_COMPARE struct _EMailAddress { ENameWestern *wname; @@ -156,7 +158,7 @@ static GtkTargetEntry drag_types[] = { }; static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); -#ifdef SMART_ADDRESS_SORT +#ifdef SMART_ADDRESS_COMPARE static EMailAddress * e_mail_address_new (const char *address) { @@ -205,50 +207,52 @@ e_mail_address_compare (gconstpointer address1, gconstpointer address2) g_return_val_if_fail (addr1 != NULL, 1); g_return_val_if_fail (addr2 != NULL, -1); - if (!addr1->wname || !addr2->wname) { + if (!addr1->wname && !addr2->wname) { /* have to compare addresses, one or both don't have names */ g_return_val_if_fail (addr1->address != NULL, 1); g_return_val_if_fail (addr2->address != NULL, -1); - retval = g_strcasecmp (addr1->address, addr2->address); - } else { - if (!addr1->wname->last && !addr2->wname->last) { - /* neither has a last name - default to address? */ - /* FIXME: what do we compare next? */ - g_return_val_if_fail (addr1->address != NULL, 1); - g_return_val_if_fail (addr2->address != NULL, -1); - - retval = g_strcasecmp (addr1->address, addr2->address); - } else { - /* compare last names */ - if (!addr1->wname->last) - retval = -1; - else if (!addr2->wname->last) - retval = 1; - else { - retval = g_strcasecmp (addr1->wname->last, addr2->wname->last); - if (!retval) { - /* last names are identical - compare first names */ - if (!addr1->wname->first) - retval = -1; - else if (!addr2->wname->first) - retval = 1; - else { - retval = g_strcasecmp (addr1->wname->first, addr2->wname->first); - if (!retval) { - /* first names are identical - compare addresses */ - g_return_val_if_fail (addr1->address != NULL, 1); - g_return_val_if_fail (addr2->address != NULL, -1); - - retval = g_strcasecmp (addr1->address, addr2->address); - } - } - } - } - } + return g_strcasecmp (addr1->address, addr2->address); } - - return retval; + + if (!addr1->wname) + return -1; + if (!addr2->wname) + return 1; + + if (!addr1->wname->last && !addr2->wname->last) { + /* neither has a last name - default to address? */ + /* FIXME: what do we compare next? */ + g_return_val_if_fail (addr1->address != NULL, 1); + g_return_val_if_fail (addr2->address != NULL, -1); + + return g_strcasecmp (addr1->address, addr2->address); + } + + if (!addr1->wname->last) + return -1; + if (!addr2->wname->last) + return 1; + + retval = g_strcasecmp (addr1->wname->last, addr2->wname->last); + if (retval) + return retval; + + /* last names are identical - compare first names */ + + if (!addr1->wname->first && !addr2->wname->first) + return g_strcasecmp (addr1->address, addr2->address); + + if (!addr1->wname->first) + return -1; + if (!addr2->wname->first) + return 1; + + retval = g_strcasecmp (addr1->wname->first, addr2->wname->first); + if (retval) + return retval; + + return g_strcasecmp (addr1->address, addr2->address); } #endif /* SMART_ADDRESS_COMPARE */ @@ -510,6 +514,31 @@ ml_get_save_id (ETreeModel *etm, ETreePath path, void *data) return g_strdup (camel_message_info_uid(info)); } +/* + * SimpleTableModel::has_save_id + */ +static gboolean +ml_has_get_node_by_id (ETreeModel *etm, void *data) +{ + return TRUE; +} + +/* + * SimpleTableModel::get_save_id + */ +static ETreePath +ml_get_node_by_id (ETreeModel *etm, char *save_id, void *data) +{ + MessageList *ml; + + ml = data; + + if (!strcmp (save_id, "root")) + return e_tree_model_get_root (etm); + + return g_hash_table_lookup(ml->uid_nodemap, save_id); +} + static void * ml_duplicate_value (ETreeModel *etm, int col, const void *value, void *data) { @@ -529,6 +558,7 @@ ml_duplicate_value (ETreeModel *etm, int col, const void *value, void *data) case COL_SUBJECT: case COL_TO: return g_strdup (value); + default: g_assert_not_reached (); } @@ -1179,7 +1209,10 @@ message_list_construct (MessageList *message_list) ml_has_save_id, ml_get_save_id, - + + ml_has_get_node_by_id, + ml_get_node_by_id, + ml_tree_value_at, ml_tree_set_value_at, ml_tree_is_cell_editable, @@ -1288,22 +1321,40 @@ clear_tree (MessageList *ml) /* we try and find something that isn't deleted in our tree there is actually no assurance that we'll find somethign that will still be there next time, but its probably going to work most of the time */ -static const char *find_next_undeleted(MessageList *ml, ETreePath *node) +static char *find_next_undeleted(MessageList *ml) { - ETreePath *child; - - child = e_tree_model_node_get_first_child(ml->model, node); - if (child) { - const char *ret = find_next_undeleted(ml, child); - if (ret) - return ret; + ETreePath node; + int last; + int vrow; + ETree *et = ml->tree; + CamelMessageInfo *info; + + node = g_hash_table_lookup(ml->uid_nodemap, ml->cursor_uid); + if (node == NULL) + return NULL; + + info = get_message_info (ml, node); + if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { + return NULL; } - while (node) { - CamelMessageInfo *info = e_tree_memory_node_get_data(E_TREE_MEMORY(ml->model), node); - if ((info->flags & CAMEL_MESSAGE_DELETED) == 0) { - return camel_message_info_uid(info); + + last = e_tree_row_count (ml->tree); + + /* model_to_view_row etc simply dont work for sorted views. Sigh. */ + vrow = e_tree_row_of_node (et, node); + + /* We already checked this node. */ + vrow ++; + + while (vrow < last) { + CamelMessageInfo *info; + + node = e_tree_node_at_row (et, vrow); + info = get_message_info (ml, node); + if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { + return g_strdup (camel_message_info_uid(info)); } - node = e_tree_model_node_get_next(ml->model, node); + vrow ++; } return NULL; @@ -1344,10 +1395,7 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c if (ml->cursor_uid) { if (ml->hidedeleted) { - ETreePath *node = g_hash_table_lookup(ml->uid_nodemap, ml->cursor_uid); - saveuid = g_strdup(find_next_undeleted(ml, node)); - } else { - saveuid = g_strdup(ml->cursor_uid); + saveuid = find_next_undeleted(ml); } } @@ -1383,10 +1431,6 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c e_tree_set_cursor(ml->tree, node); } g_free(saveuid); - } else if (ml->cursor_uid) { - g_free(ml->cursor_uid); - ml->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)ml, message_list_signals[MESSAGE_SELECTED], NULL); } #ifdef TIMEIT @@ -1665,10 +1709,7 @@ build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes) if (ml->cursor_uid) { if (ml->hidedeleted) { - ETreePath *node = g_hash_table_lookup(ml->uid_nodemap, ml->cursor_uid); - saveuid = g_strdup(find_next_undeleted(ml, node)); - } else { - saveuid = g_strdup(ml->cursor_uid); + saveuid = find_next_undeleted(ml); } } @@ -1702,10 +1743,6 @@ build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes) e_tree_set_cursor(ml->tree, node); } g_free(saveuid); - } else if (ml->cursor_uid) { - g_free(ml->cursor_uid); - ml->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)ml, message_list_signals[MESSAGE_SELECTED], NULL); } #ifdef TIMEIT @@ -1943,10 +1980,13 @@ on_cursor_activated_cmd (ETree *tree, int row, ETreePath path, gpointer user_dat MessageList *message_list; message_list = MESSAGE_LIST (user_data); - + message_list->cursor_row = row; g_free(message_list->cursor_uid); - message_list->cursor_uid = g_strdup(get_message_uid(message_list, path)); + if (path == NULL) + message_list->cursor_uid = NULL; + else + message_list->cursor_uid = g_strdup(get_message_uid(message_list, path)); if (!message_list->idle_id) { message_list->idle_id = |