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
This commit is contained in:
committed by
Chris Lahey
parent
0f85f30ab1
commit
5083cd6bdc
@ -1,3 +1,18 @@
|
||||
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.
|
||||
|
||||
2001-04-12 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* session.c (auth_callback): If the service is NULL, just use the
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -950,6 +950,9 @@ subscribe_dialog_gui_init (SubscribeDialog *sc)
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
folder_etree_value_at,
|
||||
folder_etree_set_value_at,
|
||||
folder_etree_is_editable,
|
||||
|
||||
Reference in New Issue
Block a user