aboutsummaryrefslogtreecommitdiffstats
path: root/mail/message-list.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@helixcode.com>2000-11-21 06:58:39 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2000-11-21 06:58:39 +0800
commitba1dbc4a96583a0b89a2002e620c628c57096fb7 (patch)
treeb290885e5cce79c7cb537bb1cfc482736a83a9ae /mail/message-list.c
parent8cbf1e03665306e425030345eef9f66fbc6141af (diff)
downloadgsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar.gz
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar.bz2
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar.lz
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar.xz
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.tar.zst
gsoc2013-evolution-ba1dbc4a96583a0b89a2002e620c628c57096fb7.zip
New comparison function that will replace address_compare if/when we ever
2000-11-20 Jeffrey Stedfast <fejj@helixcode.com> * message-list.c (e_mail_address_compare): New comparison function that will replace address_compare if/when we ever go to save the preparsed addresses in the ETable rather than parsing them each time. Also fixed it so that we should get better sorting when addresses don't contain name parts (I was checking for NULL but not '\0'). svn path=/trunk/; revision=6615
Diffstat (limited to 'mail/message-list.c')
-rw-r--r--mail/message-list.c170
1 files changed, 101 insertions, 69 deletions
diff --git a/mail/message-list.c b/mail/message-list.c
index 6fc97de969..f4aa692309 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -81,6 +81,13 @@
#define PARENT_TYPE (bonobo_object_get_type ())
+struct _EMailAddress {
+ ENameWestern *wname;
+ gchar *address;
+};
+
+typedef struct _EMailAddress EMailAddress;
+
static BonoboObjectClass *message_list_parent_class;
static POA_GNOME_Evolution_MessageList__vepv evolution_message_list_vepv;
@@ -139,81 +146,108 @@ static GtkTargetEntry drag_types[] = {
};
static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]);
-static gint
-address_compare (gconstpointer address1, gconstpointer address2)
+static EMailAddress *
+e_mail_address_new (const char *address)
{
- CamelInternetAddress *ia1, *ia2;
- const char *name1, *name2;
- const char *addr1, *addr2;
- gint retval = 0;
-
- ia1 = camel_internet_address_new ();
- ia2 = camel_internet_address_new ();
+ CamelInternetAddress *cia;
+ EMailAddress *new;
+ const char *name, *addr;
- camel_address_decode (CAMEL_ADDRESS (ia1), (const char *) address1);
- camel_address_decode (CAMEL_ADDRESS (ia2), (const char *) address2);
+ cia = camel_internet_address_new ();
+ camel_address_decode (CAMEL_ADDRESS (cia), address);
+ camel_internet_address_get (cia, 0, &name, &addr);
- if (!camel_internet_address_get (ia1, 0, &name1, &addr1)) {
- camel_object_unref (CAMEL_OBJECT (ia1));
- camel_object_unref (CAMEL_OBJECT (ia2));
- return 1;
+ new = g_new (EMailAddress, 1);
+ new->address = g_strdup (addr);
+ if (name && *name) {
+ new->wname = e_name_western_parse (name);
+ } else {
+ new->wname = NULL;
}
- if (!camel_internet_address_get (ia2, 0, &name2, &addr2)) {
- camel_object_unref (CAMEL_OBJECT (ia1));
- camel_object_unref (CAMEL_OBJECT (ia2));
- return -1;
- }
+ camel_object_unref (CAMEL_OBJECT (cia));
+
+ return new;
+}
+
+static void
+e_mail_address_free (EMailAddress *addr)
+{
+ g_return_if_fail (addr != NULL);
+
+ g_free (addr->address);
+ if (addr->wname)
+ e_name_western_free (addr->wname);
+ g_free (addr);
+}
+
+static gint
+e_mail_address_compare (gconstpointer address1, gconstpointer address2)
+{
+ const EMailAddress *addr1 = address1;
+ const EMailAddress *addr2 = address2;
+ gint retval;
+
+ g_return_val_if_fail (addr1 != NULL, 1);
+ g_return_val_if_fail (addr2 != NULL, -1);
- if (!name1 && !name2) {
- /* if neither has a name we should compare addresses */
- retval = g_strcasecmp (addr1, addr2);
+ 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 (!name1)
- retval = -1;
- else if (!name2)
- retval = 1;
- else {
- ENameWestern *wname1, *wname2;
-
- wname1 = e_name_western_parse (name1);
- wname2 = e_name_western_parse (name2);
+ 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);
- if (!wname1->last && !wname2->last) {
- /* neither has a last name */
- retval = g_strcasecmp (name1, name2);
- } else {
- /* compare last names */
- if (!wname1->last)
- retval = -1;
- else if (!wname2->last)
- retval = 1;
- else {
- retval = g_strcasecmp (wname1->last, wname2->last);
- if (!retval) {
- /* last names are identical - compare first names */
- if (!wname1->first)
- retval = -1;
- else if (!wname2->first)
- retval = 1;
- else {
- retval = g_strcasecmp (wname1->first, wname2->first);
- if (!retval) {
- /* first names are identical - compare addresses */
- retval = g_strcasecmp (addr1, addr2);
- }
+ 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);
}
}
}
}
-
- e_name_western_free (wname1);
- e_name_western_free (wname2);
}
}
- camel_object_unref (CAMEL_OBJECT (ia1));
- camel_object_unref (CAMEL_OBJECT (ia2));
+ return retval;
+}
+
+static gint
+address_compare (gconstpointer address1, gconstpointer address2)
+{
+ EMailAddress *addr1, *addr2;
+ gint retval;
+
+ addr1 = e_mail_address_new (address1);
+ addr2 = e_mail_address_new (address2);
+ retval = e_mail_address_compare (addr1, addr2);
+ e_mail_address_free (addr1);
+ e_mail_address_free (addr2);
return retval;
}
@@ -830,10 +864,10 @@ message_list_create_extras (void)
e_table_extras_add_pixbuf(extras, "score", states_pixmaps [11].pixbuf);
e_table_extras_add_pixbuf(extras, "attachment", states_pixmaps [4].pixbuf);
e_table_extras_add_pixbuf(extras, "flagged", states_pixmaps [5].pixbuf);
-
+
e_table_extras_add_compare(extras, "address_compare", address_compare);
e_table_extras_add_compare(extras, "subject_compare", subject_compare);
-
+
for (i = 0; i < 3; i++)
images [i] = states_pixmaps [i].pixbuf;
@@ -851,10 +885,9 @@ message_list_create_extras (void)
images[i] = states_pixmaps [i + 5].pixbuf;
e_table_extras_add_cell(extras, "render_score", e_cell_toggle_new (0, 7, images));
-
- cell = e_cell_text_new (
- NULL, GTK_JUSTIFY_LEFT);
+ /* date cell */
+ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
gtk_object_set (GTK_OBJECT (cell),
"text_filter", filter_date,
NULL);
@@ -868,10 +901,9 @@ message_list_create_extras (void)
"color_column", COL_COLOUR,
NULL);
e_table_extras_add_cell(extras, "render_date", cell);
-
- cell = e_cell_text_new (
- NULL, GTK_JUSTIFY_LEFT);
-
+
+ /* text cell */
+ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
gtk_object_set (GTK_OBJECT (cell),
"strikeout_column", COL_DELETED,
NULL);