Fix some memory leaks
[claws.git] / src / editaddress.c
index 64bbf882c5b4fa9bea54ac597fa7341b0ec8bec0..31644e91f83829bc91b562424957256b6aaa169d 100644 (file)
 
 #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;
@@ -63,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;
@@ -112,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 );
@@ -332,8 +157,11 @@ static void edit_person_set_window_title( gint pageNum ) {
                        sTitle = g_strdup( _title_edit_ );
                }
                else {
-                       sTitle = g_strdup_printf( "%s - %s", _title_edit_,
-                                       gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 ) );
+                       gchar *name;
+                       name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 );
+                       sTitle = g_strdup_printf( "%s - %s", _title_edit_, name );
+                       g_free( name );
+                                       
                }
                gtk_window_set_title( GTK_WINDOW(personeditdlg.window), sTitle );
                g_free( sTitle );
@@ -361,13 +189,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;
@@ -419,13 +247,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;
@@ -435,12 +263,12 @@ static void edit_person_email_delete( gpointer data ) {
 
 static ItemEMail *edit_person_email_edit( gboolean *error, ItemEMail *email ) {
        ItemEMail *retVal = NULL;
-       gchar *sEmail, *sAlias, *sRemarks;
+       gchar *sEmail, *sAlias, *sRemarks, *tEmail;
        *error = TRUE;
-       sEmail = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_email), 0, -1 );
+       tEmail = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_email), 0, -1 );
        sAlias = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_alias), 0, -1 );
        sRemarks = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_remarks), 0, -1 );
-       sEmail = mgu_email_check_empty( sEmail );
+       sEmail = mgu_email_check_empty( tEmail );
        if( sEmail ) {
                if( email == NULL ) {
                        email = addritem_create_item_email();
@@ -454,6 +282,10 @@ static ItemEMail *edit_person_email_edit( gboolean *error, ItemEMail *email ) {
        else {
                edit_person_status_show( _( "An E-Mail address must be supplied." ) );
        }
+       g_free( tEmail );
+       g_free( sEmail );
+       g_free( sAlias );
+       g_free( sRemarks );
        return retVal;
 }
 
@@ -494,10 +326,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 ];
@@ -530,13 +380,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;
@@ -546,12 +396,12 @@ static void edit_person_attrib_delete( gpointer data ) {
 
 static UserAttribute *edit_person_attrib_edit( gboolean *error, UserAttribute *attrib ) {
        UserAttribute *retVal = NULL;
-       gchar *sName, *sValue;
+       gchar *sName, *sValue, *tName, *tValue;
        *error = TRUE;
-       sName = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atname), 0, -1 );
-       sValue = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atvalue), 0, -1 );
-       sName = mgu_email_check_empty( sName );
-       sValue = mgu_email_check_empty( sValue );
+       tName = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atname), 0, -1 );
+       tValue = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_atvalue), 0, -1 );
+       sName = mgu_email_check_empty( tName );
+       sValue = mgu_email_check_empty( tValue );
        if( sName && sValue ) {
                if( attrib == NULL ) {
                        attrib = addritem_create_attribute();
@@ -564,6 +414,10 @@ static UserAttribute *edit_person_attrib_edit( gboolean *error, UserAttribute *a
        else {
                edit_person_status_show( _( "A Name and Value must be supplied." ) );
        }
+       g_free( tName );
+       g_free( sName );
+       g_free( tValue );
+       g_free( sValue );
        return retVal;
 }
 
@@ -615,7 +469,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); 
@@ -627,7 +481,7 @@ static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
                           cancelled);
 
        vbox = gtk_vbox_new(FALSE, 4);
-       //gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH);
+       /* gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER_WIDTH); */
        gtk_widget_show(vbox);
        gtk_container_add(GTK_CONTAINER(window), vbox);
 
@@ -636,19 +490,19 @@ static void addressbook_edit_person_dialog_create( gboolean *cancelled ) {
        gtk_widget_show(vnbox);
        gtk_box_pack_start(GTK_BOX(vbox), vnbox, TRUE, TRUE, 0);
 
-       // Notebook
+       /* Notebook */
        notebook = gtk_notebook_new();
        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(vnbox), hbbox, FALSE, FALSE, 0);
@@ -672,7 +526,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;
@@ -725,7 +579,7 @@ void addressbook_edit_person_page_basic( gint pageNum, gchar *pageLbl ) {
                ATTACH_ROW(_("First Name"), entry_fn);
                ATTACH_ROW(_("Last Name"), entry_ln);
        }
-       ATTACH_ROW(_("Nick Name"), entry_nn);
+       ATTACH_ROW(_("Nickname"), entry_nn);
 
 #undef ATTACH_ROW
 
@@ -737,7 +591,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;
@@ -759,9 +613,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 *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 );
@@ -773,16 +631,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),
@@ -798,14 +655,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);
@@ -814,7 +671,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);
@@ -823,7 +680,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);
@@ -832,7 +689,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);
 
@@ -842,7 +699,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 );
 
@@ -863,7 +720,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",
@@ -885,7 +742,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;
@@ -904,9 +761,12 @@ void addressbook_edit_person_page_attrib( gint pageNum, gchar *pageLbl ) {
        GtkWidget *entry_value;
        gint top;
 
-       gchar *titles[ ATTRIB_N_COLS ] = { _("Name"), _("Value") };
+       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 );
@@ -918,16 +778,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),
@@ -939,18 +798,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);
@@ -959,7 +820,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);
@@ -968,7 +829,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);
 
@@ -978,7 +839,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 );
 
@@ -993,7 +854,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",
@@ -1070,7 +931,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( "" );
@@ -1098,7 +959,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 );
        }
@@ -1123,16 +984,16 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
                return NULL;
        }
 
-       cn = g_strdup( gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_name), 0, -1 ) );
+       cn = 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 ) {
@@ -1142,14 +1003,18 @@ ItemPerson *addressbook_edit_person( AddressBookFile *abf, ItemFolder *parent, I
        }
 
        if( ! cancelled ) {
-               // Set person stuff
+               /* Set person stuff */
+               gchar *name;
                addritem_person_set_common_name( person, cn );
-               addritem_person_set_first_name( person,
-                       gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_first), 0, -1 ) );
-               addritem_person_set_last_name( person,
-                       gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_last), 0, -1 ) );
-               addritem_person_set_nick_name( person,
-                       gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_nick), 0, -1 ) );
+               name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_first), 0, -1 ); 
+               addritem_person_set_first_name( person, name );
+               g_free( name );
+               name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_last), 0, -1 );
+               addritem_person_set_last_name( person, name );
+               g_free( name );
+               name = gtk_editable_get_chars( GTK_EDITABLE(personeditdlg.entry_nick), 0, -1 );
+               addritem_person_set_nick_name( person, name );
+               g_free( name );
        }
        g_free( cn );