correct a spelling mistake
[claws.git] / src / editaddress.c
index eea5c8c9f0133a605ac29df45a769b17ad53585f..d1af13e19b9a9cd83160dabe2b2eb3262354a5af 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2001 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include "addressitem.h"
 #include "addritem.h"
 #include "addrbook.h"
+#include "manage_window.h"
+#include "gtkutils.h"
+#include "codeconv.h"
 
 #include "prefs_common.h"
 
-/*
-static struct _AddressEdit_dlg {
-       GtkWidget *window;
-       GtkWidget *name_entry;
-       GtkWidget *addr_entry;
-       GtkWidget *rem_entry;
-       GtkWidget *ok_btn;
-       GtkWidget *cancel_btn;
-} addredit;
-*/
-
 static struct _PersonEdit_dlg {
        GtkWidget *window;
        GtkWidget *notebook;
@@ -60,19 +52,19 @@ static struct _PersonEdit_dlg {
        GtkWidget *statusbar;
        gint status_cid;
 
-       // Basic data tab
+       /* Basic data tab */
        GtkWidget *entry_name;
        GtkWidget *entry_first;
        GtkWidget *entry_last;
        GtkWidget *entry_nick;
 
-       // EMail data tab
+       /* EMail data tab */
        GtkWidget *entry_email;
        GtkWidget *entry_alias;
        GtkWidget *entry_remarks;
        GtkWidget *clist_email;
 
-       // Attribute data tab
+       /* Attribute data tab */
        GtkWidget *entry_atname;
        GtkWidget *entry_atvalue;
        GtkWidget *clist_attrib;
@@ -109,170 +101,6 @@ typedef enum {
 #define PAGE_EMAIL             1
 #define PAGE_ATTRIBUTES        2
 
-/*
-#define SET_LABEL_AND_ENTRY(str, entry, top) \
-{ \
-       label = gtk_label_new(str); \
-       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), \
-                        GTK_FILL, 0, 0, 0); \
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
- \
-       entry = gtk_entry_new(); \
-       gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
-                        GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
-}
-
-static void edit_address_ok(GtkWidget *widget, gboolean *cancelled)
-{
-       *cancelled = FALSE;
-       gtk_main_quit();
-}
-
-static void edit_address_cancel(GtkWidget *widget, gboolean *cancelled)
-{
-       *cancelled = TRUE;
-       gtk_main_quit();
-}
-
-static gint edit_address_delete_event(GtkWidget *widget, GdkEventAny *event,
-                                     gboolean *cancelled)
-{
-       *cancelled = TRUE;
-       gtk_main_quit();
-
-       return TRUE;
-}
-
-static void edit_address_key_pressed(GtkWidget *widget, GdkEventKey *event,
-                                    gboolean *cancelled)
-{
-       if (event && event->keyval == GDK_Escape) {
-               *cancelled = TRUE;
-               gtk_main_quit();
-       }
-}
-
-static void addressbook_edit_address_create(gboolean *cancelled)
-{
-       GtkWidget *window;
-       GtkWidget *vbox;
-       GtkWidget *table;
-       GtkWidget *label;
-       GtkWidget *name_entry;
-       GtkWidget *addr_entry;
-       GtkWidget *rem_entry;
-       GtkWidget *hbbox;
-       GtkWidget *ok_btn;
-       GtkWidget *cancel_btn;
-
-       debug_print("Creating edit_address window...\n");
-
-       window = gtk_window_new(GTK_WINDOW_DIALOG);
-       gtk_widget_set_usize(window, 400, -1);
-       gtk_container_set_border_width(GTK_CONTAINER(window), 8);
-       gtk_window_set_title(GTK_WINDOW(window), _("Edit address"));
-       gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
-       gtk_window_set_modal(GTK_WINDOW(window), TRUE); 
-       gtk_signal_connect(GTK_OBJECT(window), "delete_event",
-                          GTK_SIGNAL_FUNC(edit_address_delete_event),
-                          cancelled);
-       gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
-                          GTK_SIGNAL_FUNC(edit_address_key_pressed),
-                          cancelled);
-
-       vbox = gtk_vbox_new(FALSE, 8);
-       gtk_container_add(GTK_CONTAINER(window), vbox);
-
-       table = gtk_table_new(3, 2, FALSE);
-       gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
-       gtk_table_set_row_spacings(GTK_TABLE(table), 8);
-       gtk_table_set_col_spacings(GTK_TABLE(table), 8);
-
-       SET_LABEL_AND_ENTRY(_("Name"),    name_entry, 0);
-       SET_LABEL_AND_ENTRY(_("Address"), addr_entry, 1);
-       SET_LABEL_AND_ENTRY(_("Remarks"), rem_entry,  2);
-
-       gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
-                               &cancel_btn, _("Cancel"), NULL, NULL);
-       gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
-       gtk_widget_grab_default(ok_btn);
-
-       gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
-                          GTK_SIGNAL_FUNC(edit_address_ok), cancelled);
-       gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
-                          GTK_SIGNAL_FUNC(edit_address_cancel), cancelled);
-
-       gtk_widget_show_all(vbox);
-
-       addredit.window     = window;
-       addredit.name_entry = name_entry;
-       addredit.addr_entry = addr_entry;
-       addredit.rem_entry  = rem_entry;
-       addredit.ok_btn     = ok_btn;
-       addredit.cancel_btn = cancel_btn;
-}
-
-AddressItem *addressbook_edit_address(AddressItem *item)
-{
-       static gboolean cancelled;
-       const gchar *str;
-
-       if (!addredit.window)
-               addressbook_edit_address_create(&cancelled);
-       gtk_widget_grab_focus(addredit.ok_btn);
-       gtk_widget_grab_focus(addredit.name_entry);
-       gtk_widget_show(addredit.window);
-       manage_window_set_transient(GTK_WINDOW(addredit.window));
-
-       gtk_entry_set_text(GTK_ENTRY(addredit.name_entry), "");
-       gtk_entry_set_text(GTK_ENTRY(addredit.addr_entry), "");
-       gtk_entry_set_text(GTK_ENTRY(addredit.rem_entry),  "");
-
-       if (item) {
-               if (ADDRESS_OBJECT_NAME(item))
-                       gtk_entry_set_text(GTK_ENTRY(addredit.name_entry),
-                                          ADDRESS_OBJECT_NAME(item));
-               if (item->address)
-                       gtk_entry_set_text(GTK_ENTRY(addredit.addr_entry),
-                                          item->address);
-               if (item->remarks)
-                       gtk_entry_set_text(GTK_ENTRY(addredit.rem_entry),
-                                          item->remarks);
-       }
-
-       gtk_main();
-       gtk_widget_hide(addredit.window);
-       if (cancelled == TRUE) return NULL;
-
-       str = gtk_entry_get_text(GTK_ENTRY(addredit.name_entry));
-       if (*str == '\0') return NULL;
-
-       if (!item) {
-               item = mgu_create_address();
-               ADDRESS_OBJECT_TYPE(item) = ADDR_ITEM;
-       }
-
-       g_free(ADDRESS_OBJECT_NAME(item));
-       ADDRESS_OBJECT_NAME(item) = g_strdup(str);
-
-       str = gtk_entry_get_text(GTK_ENTRY(addredit.addr_entry));
-       g_free(item->address);
-       if (*str == '\0')
-               item->address = NULL;
-       else
-               item->address = g_strdup(str);
-
-       str = gtk_entry_get_text(GTK_ENTRY(addredit.rem_entry));
-       g_free(item->remarks);
-       if (*str == '\0')
-               item->remarks = NULL;
-       else
-               item->remarks = g_strdup(str);
-
-       return item;
-}
-*/
-
 static void edit_person_status_show( gchar *msg ) {
        if( personeditdlg.statusbar != NULL ) {
                gtk_statusbar_pop( GTK_STATUSBAR(personeditdlg.statusbar), personeditdlg.status_cid );
@@ -358,13 +186,13 @@ static void edit_person_switch_page( GtkNotebook *notebook, GtkNotebookPage *pag
 /*
 * Load clist with a copy of person's email addresses.
 */
-void edit_person_load_email( ItemPerson *person ) {
+static void edit_person_load_email( ItemPerson *person ) {
        GList *node = person->listEMail;
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_email);
        gchar *text[ EMAIL_N_COLS ];
        while( node ) {
                ItemEMail *emorig = ( ItemEMail * ) node->data;
-               ItemEMail *email = addritem_copy_item_email( emorig );
+               ItemEMail *email = addritem_copyfull_item_email( emorig );
                gint row;
                text[ EMAIL_COL_EMAIL   ] = email->address;
                text[ EMAIL_COL_ALIAS   ] = email->obj.name;
@@ -416,13 +244,13 @@ static void edit_person_email_delete( gpointer data ) {
        ItemEMail *email = gtk_clist_get_row_data( clist, row );
        edit_person_email_clear( NULL );
        if( email ) {
-               // Remove list entry
+               /* Remove list entry */
                gtk_clist_remove( clist, row );
                addritem_free_item_email( email );
                email = NULL;
        }
 
-       // Position hilite bar
+       /* Position hilite bar */
        email = gtk_clist_get_row_data( clist, row );
        if( ! email ) {
                personeditdlg.rowIndEMail = -1 + row;
@@ -491,10 +319,28 @@ static void edit_person_email_add( gpointer data ) {
        }
 }
 
+/*
+* Comparison using cell contents (text in first column). Used for sort
+* address index widget.
+*/
+static gint edit_person_attrib_compare_func(
+       GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2 )
+{
+       GtkCell *cell1 = ((GtkCListRow *)ptr1)->cell;
+       GtkCell *cell2 = ((GtkCListRow *)ptr2)->cell;
+       gchar *name1 = NULL, *name2 = NULL;
+
+       if( cell1 ) name1 = cell1->u.text;
+       if( cell2 ) name2 = cell2->u.text;
+       if( ! name1 ) return ( name2 != NULL );
+       if( ! name2 ) return -1;
+       return strcasecmp( name1, name2 );
+}
+
 /*
 * Load clist with a copy of person's email addresses.
 */
-void edit_person_load_attrib( ItemPerson *person ) {
+static void edit_person_load_attrib( ItemPerson *person ) {
        GList *node = person->listAttrib;
        GtkCList *clist = GTK_CLIST(personeditdlg.clist_attrib);
        gchar *text[ ATTRIB_N_COLS ];
@@ -527,13 +373,13 @@ static void edit_person_attrib_delete( gpointer data ) {
        UserAttribute *attrib = gtk_clist_get_row_data( clist, row );
        edit_person_attrib_clear( NULL );
        if( attrib ) {
-               // Remove list entry
+               /* Remove list entry */
                gtk_clist_remove( clist, row );
                addritem_free_attribute( attrib );
                attrib = NULL;
        }
 
-       // Position hilite bar
+       /* Position hilite bar */
        attrib = gtk_clist_get_row_data( clist, row );
        if( ! attrib ) {
                personeditdlg.rowIndAttrib = -1 + row;
@@ -602,6 +448,7 @@ static void edit_person_attrib_add( gpointer data ) {
 static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
        GtkWidget *window;
        GtkWidget *vbox;
+       GtkWidget *vnbox;
        GtkWidget *notebook;
        GtkWidget *hbbox;
        GtkWidget *ok_btn;
@@ -611,7 +458,7 @@ static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
 
        window = gtk_window_new(GTK_WINDOW_DIALOG);
        gtk_widget_set_usize(window, EDITPERSON_WIDTH, EDITPERSON_HEIGHT );
-       gtk_container_set_border_width(GTK_CONTAINER(window), 0);
+       /* gtk_container_set_border_width(GTK_CONTAINER(window), 0); */
        gtk_window_set_title(GTK_WINDOW(window), _("Edit Person Data"));
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_modal(GTK_WINDOW(window), TRUE); 
@@ -622,27 +469,32 @@ static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
                           GTK_SIGNAL_FUNC(edit_person_key_pressed),
                           cancelled);
 
-       vbox = gtk_vbox_new( FALSE, 6 );
-       gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH);
-       gtk_widget_show( vbox );
-       gtk_container_add( GTK_CONTAINER( window ), vbox );
+       vbox = gtk_vbox_new(FALSE, 4);
+       /* gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH); */
+       gtk_widget_show(vbox);
+       gtk_container_add(GTK_CONTAINER(window), vbox);
 
-       // Notebook
+       vnbox = gtk_vbox_new(FALSE, 4);
+       gtk_container_set_border_width(GTK_CONTAINER(vnbox), 4);
+       gtk_widget_show(vnbox);
+       gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
+
+       /* Notebook */
        notebook = gtk_notebook_new();
-       gtk_widget_show( notebook );
-       gtk_box_pack_start( GTK_BOX( vbox ), notebook, TRUE, TRUE, 0 );
-       gtk_container_set_border_width( GTK_CONTAINER( notebook ), 6 );
+       gtk_widget_show(notebook);
+       gtk_box_pack_start(GTK_BOX(vnbox), notebook, TRUE, TRUE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
 
-       // Status line
+       /* Status line */
        hsbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, BORDER_WIDTH);
        statusbar = gtk_statusbar_new();
        gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, BORDER_WIDTH);
 
-       // Button panel
+       /* Button panel */
        gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
                                &cancel_btn, _("Cancel"), NULL, NULL);
-       gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
+       gtk_box_pack_end(GTK_BOX(vnbox), hbbox, FALSE, FALSE, 0);
        gtk_widget_grab_default(ok_btn);
 
        gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
@@ -663,7 +515,7 @@ static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
 
 }
 
-void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
+static void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
        GtkWidget *vbox;
        GtkWidget *table;
        GtkWidget *label;
@@ -671,7 +523,8 @@ void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
        GtkWidget *entry_fn;
        GtkWidget *entry_ln;
        GtkWidget *entry_nn;
-       gint top;
+       const gchar *locale;
+       gint top = 0;
 
        vbox = gtk_vbox_new( FALSE, 8 );
        gtk_widget_show( vbox );
@@ -690,41 +543,34 @@ void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
 
-       // First row
-       top = 0;
-       label = gtk_label_new(_("Display Name"));
-       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-
-       entry_name = gtk_entry_new();
-       gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
-
-       // Next row
-       ++top;
-       label = gtk_label_new(_("First Name"));
-       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-
-       entry_fn = gtk_entry_new();
-       gtk_table_attach(GTK_TABLE(table), entry_fn, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
-
-       // Next row
-       ++top;
-       label = gtk_label_new(_("Last Name"));
-       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-
-       entry_ln = gtk_entry_new();
-       gtk_table_attach(GTK_TABLE(table), entry_ln, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
+#define ATTACH_ROW(text, entry) \
+{ \
+       label = gtk_label_new(text); \
+       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), \
+                        GTK_FILL, 0, 0, 0); \
+       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); \
+ \
+       entry = gtk_entry_new(); \
+       gtk_table_attach(GTK_TABLE(table), entry, 1, 2, top, (top + 1), \
+                        GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0); \
+       top++; \
+}
 
-       // Next row
-       ++top;
-       label = gtk_label_new(_("Nick Name"));
-       gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       ATTACH_ROW(_("Display Name"), entry_name);
+       locale = conv_get_current_locale();
+       if (locale &&
+           (!g_strncasecmp(locale, "ja", 2) ||
+            !g_strncasecmp(locale, "ko", 2) ||
+            !g_strncasecmp(locale, "zh", 2))) {
+               ATTACH_ROW(_("Last Name"), entry_ln);
+               ATTACH_ROW(_("First Name"), entry_fn);
+       } else {
+               ATTACH_ROW(_("First Name"), entry_fn);
+               ATTACH_ROW(_("Last Name"), entry_ln);
+       }
+       ATTACH_ROW(_("Nickname"), entry_nn);
 
-       entry_nn = gtk_entry_new();
-       gtk_table_attach(GTK_TABLE(table), entry_nn, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
+#undef ATTACH_ROW
 
        gtk_widget_show_all(vbox);
 
@@ -734,7 +580,7 @@ void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
        personeditdlg.entry_nick  = entry_nn;
 }
 
-void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
+static void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        GtkWidget *vbox;
        GtkWidget *hbox;
        GtkWidget *vboxl;
@@ -756,10 +602,13 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        GtkWidget *entry_remarks;
        gint top;
 
-       gchar *titles[ EMAIL_N_COLS ] = { _("E-Mail Address"), _("Alias"), _("Remarks") };
-       gchar *text;
+       gchar *titles[ EMAIL_N_COLS ];
        gint i;
 
+       titles[ EMAIL_COL_EMAIL   ] = _("E-Mail Address");
+       titles[ EMAIL_COL_ALIAS   ] = _("Alias");
+       titles[ EMAIL_COL_REMARKS ] = _("Remarks");
+
        vbox = gtk_vbox_new( FALSE, 8 );
        gtk_widget_show( vbox );
        gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
@@ -771,16 +620,15 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
                GTK_NOTEBOOK( personeditdlg.notebook ),
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
 
-       // Split into two areas
+       /* Split into two areas */
        hbox = gtk_hbox_new( FALSE, 0 );
        gtk_container_add( GTK_CONTAINER( vbox ), hbox );
 
-       // EMail list
+       /* Address list */
        vboxl = gtk_vbox_new( FALSE, 4 );
        gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
        gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
 
-       // Address list
        clist_swin = gtk_scrolled_window_new( NULL, NULL );
        gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
@@ -796,14 +644,14 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        for( i = 0; i < EMAIL_N_COLS; i++ )
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
 
-       // Data entry area
+       /* Data entry area */
        table = gtk_table_new( 4, 2, FALSE);
        gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
        gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 4);
 
-       // First row
+       /* First row */
        top = 0;
        label = gtk_label_new(_("E-Mail Address"));
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
@@ -812,7 +660,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        entry_email = gtk_entry_new();
        gtk_table_attach(GTK_TABLE(table), entry_email, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
 
-       // Next row
+       /* Next row */
        ++top;
        label = gtk_label_new(_("Alias"));
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
@@ -821,7 +669,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        entry_alias = gtk_entry_new();
        gtk_table_attach(GTK_TABLE(table), entry_alias, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
 
-       // Next row
+       /* Next row */
        ++top;
        label = gtk_label_new(_("Remarks"));
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
@@ -830,7 +678,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        entry_remarks = gtk_entry_new();
        gtk_table_attach(GTK_TABLE(table), entry_remarks, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
 
-       // Button box
+       /* Button box */
        vboxb = gtk_vbox_new( FALSE, 4 );
        gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
 
@@ -840,7 +688,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
        gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
 
-       // Buttons
+       /* Buttons */
        buttonUp = gtk_button_new_with_label( _( "Move Up" ) );
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonUp );
 
@@ -861,7 +709,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
 
        gtk_widget_show_all(vbox);
 
-       // Event handlers
+       /* Event handlers */
        gtk_signal_connect( GTK_OBJECT(clist), "select_row",
                        GTK_SIGNAL_FUNC( edit_person_email_list_selected), NULL );
        gtk_signal_connect( GTK_OBJECT(buttonUp), "clicked",
@@ -883,7 +731,7 @@ void addressbook_edit_person_page_email( gint pageNum, gchar *pageLbl ) {
        personeditdlg.entry_remarks = entry_remarks;
 }
 
-void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
+static void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        GtkWidget *vbox;
        GtkWidget *hbox;
        GtkWidget *vboxl;
@@ -902,10 +750,12 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        GtkWidget *entry_value;
        gint top;
 
-       gchar *titles[ ATTRIB_N_COLS ] = { _("Name"), _("Value") };
-       gchar *text;
+       gchar *titles[ ATTRIB_N_COLS ];
        gint i;
 
+       titles[ ATTRIB_COL_NAME  ] = _("Name");
+       titles[ ATTRIB_COL_VALUE ] = _("Value");
+
        vbox = gtk_vbox_new( FALSE, 8 );
        gtk_widget_show( vbox );
        gtk_container_add( GTK_CONTAINER( personeditdlg.notebook ), vbox );
@@ -917,16 +767,15 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
                GTK_NOTEBOOK( personeditdlg.notebook ),
                gtk_notebook_get_nth_page( GTK_NOTEBOOK( personeditdlg.notebook ), pageNum ), label );
 
-       // Split into two areas
+       /* Split into two areas */
        hbox = gtk_hbox_new( FALSE, 0 );
        gtk_container_add( GTK_CONTAINER( vbox ), hbox );
 
-       // Attribute list
+       /* Attribute list */
        vboxl = gtk_vbox_new( FALSE, 4 );
        gtk_container_add( GTK_CONTAINER( hbox ), vboxl );
        gtk_container_set_border_width( GTK_CONTAINER(vboxl), 4 );
 
-       // Address list
        clist_swin = gtk_scrolled_window_new( NULL, NULL );
        gtk_container_add( GTK_CONTAINER(vboxl), clist_swin );
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clist_swin),
@@ -938,18 +787,20 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        gtk_clist_set_selection_mode( GTK_CLIST(clist), GTK_SELECTION_BROWSE );
        gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_NAME, ATTRIB_COL_WIDTH_NAME );
        gtk_clist_set_column_width( GTK_CLIST(clist), ATTRIB_COL_VALUE, ATTRIB_COL_WIDTH_VALUE );
+       gtk_clist_set_compare_func( GTK_CLIST(clist), edit_person_attrib_compare_func );
+       gtk_clist_set_auto_sort( GTK_CLIST(clist), TRUE );
 
        for( i = 0; i < ATTRIB_N_COLS; i++ )
                GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button, GTK_CAN_FOCUS);
 
-       // Data entry area
+       /* Data entry area */
        table = gtk_table_new( 4, 2, FALSE);
        gtk_box_pack_start(GTK_BOX(vboxl), table, FALSE, FALSE, 0);
        gtk_container_set_border_width( GTK_CONTAINER(table), 4 );
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 4);
 
-       // First row
+       /* First row */
        top = 0;
        label = gtk_label_new(_("Name"));
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
@@ -958,7 +809,7 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        entry_name = gtk_entry_new();
        gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
 
-       // Next row
+       /* Next row */
        ++top;
        label = gtk_label_new(_("Value"));
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, top, (top + 1), GTK_FILL, 0, 0, 0);
@@ -967,7 +818,7 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        entry_value = gtk_entry_new();
        gtk_table_attach(GTK_TABLE(table), entry_value, 1, 2, top, (top + 1), GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
 
-       // Button box
+       /* Button box */
        vboxb = gtk_vbox_new( FALSE, 4 );
        gtk_box_pack_start(GTK_BOX(hbox), vboxb, FALSE, FALSE, 2);
 
@@ -977,7 +828,7 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        gtk_container_set_border_width( GTK_CONTAINER(vbuttonbox), 4 );
        gtk_container_add( GTK_CONTAINER(vboxb), vbuttonbox );
 
-       // Buttons
+       /* Buttons */
        buttonDel = gtk_button_new_with_label( _( "Delete" ) );
        gtk_container_add( GTK_CONTAINER(vbuttonbox), buttonDel );
 
@@ -992,7 +843,7 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
 
        gtk_widget_show_all(vbox);
 
-       // Event handlers
+       /* Event handlers */
        gtk_signal_connect( GTK_OBJECT(clist), "select_row",
                        GTK_SIGNAL_FUNC( edit_person_attrib_list_selected), NULL );
        gtk_signal_connect( GTK_OBJECT(buttonDel), "clicked",
@@ -1025,7 +876,7 @@ static GList *edit_person_build_email_list() {
        GList *listEMail = NULL;
        ItemEMail *email;
        gint row = 0;
-       while( email = gtk_clist_get_row_data( clist, row ) ) {
+       while( (email = gtk_clist_get_row_data( clist, row )) ) {
                listEMail = g_list_append( listEMail, email );
                row++;
        }
@@ -1040,7 +891,7 @@ static GList *edit_person_build_attrib_list() {
        GList *listAttrib = NULL;
        UserAttribute *attrib;
        gint row = 0;
-       while( attrib = gtk_clist_get_row_data( clist, row ) ) {
+       while( (attrib = gtk_clist_get_row_data( clist, row )) ) {
                listAttrib = g_list_append( listAttrib, attrib );
                row++;
        }
@@ -1069,7 +920,7 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
        gtk_widget_show(personeditdlg.window);
        manage_window_set_transient(GTK_WINDOW(personeditdlg.window));
 
-       // Clear all fields
+       /* Clear all fields */
        personeditdlg.rowIndEMail = -1;
        personeditdlg.rowIndAttrib = -1;
        edit_person_status_show( "" );
@@ -1097,7 +948,7 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
                personeditdlg.editNew = TRUE;
        }
 
-       // Select appropriate start page
+       /* Select appropriate start page */
        if( pgMail ) {
                gtk_notebook_set_page( GTK_NOTEBOOK(personeditdlg.notebook), PAGE_EMAIL );
        }
@@ -1124,14 +975,14 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
 
        cn = g_strdup( gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 ) );
        if( person ) {
-               // Update email/attribute list
+               /* Update email/attribute list */
                addrbook_update_address_list( abf, person, listEMail );
                addrbook_update_attrib_list( abf, person, listAttrib );
        }
        else {
-               // Create new person and email/attribute list
+               /* Create new person and email/attribute list */
                if( cn == NULL || *cn == '\0' ) {
-                       // Wasting our time
+                       /* Wasting our time */
                        if( listEMail == NULL && listAttrib == NULL ) cancelled = TRUE;
                }
                if( ! cancelled ) {
@@ -1141,7 +992,7 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
        }
 
        if( ! cancelled ) {
-               // Set person stuff
+               /* Set person stuff */
                addritem_person_set_common_name( person, cn );
                addritem_person_set_first_name( person,
                        gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_first), 0, -1 ) );