2007-09-28 [colin] 3.0.1cvs45
[claws.git] / src / addressbook.c
index eacbc6aa9e22118680f620ef0f8069109c951185..a674115361398918020c4fa8198aee5c595ed655 100644 (file)
@@ -4,7 +4,7 @@
  *
  * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -13,8 +13,8 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
  */
 
 #ifdef HAVE_CONFIG_H
@@ -424,79 +424,79 @@ static GtkTargetList *addressbook_target_list = NULL;
 
 static GtkItemFactoryEntry addressbook_entries[] =
 {
-       {N_("/_Book"),                  NULL,           NULL, 0, "<Branch>"},
-       {N_("/_Book/New _Book"),        "<control>B",   addressbook_new_book_cb,        0, NULL},
-       {N_("/_Book/New _Folder"),      "<control>R",   addressbook_new_folder_cb,      0, NULL},
-       {N_("/_Book/New _vCard"),       "<control><shift>D",    addressbook_new_vcard_cb,       0, NULL},
+       {N_("/_Book"),                  NULL,           NULL, 0, "<Branch>", NULL},
+       {N_("/_Book/New _Book"),        "<control>B",   addressbook_new_book_cb,        0, NULL, NULL},
+       {N_("/_Book/New _Folder"),      "<control>R",   addressbook_new_folder_cb,      0, NULL, NULL},
+       {N_("/_Book/New _vCard"),       "<control><shift>D",    addressbook_new_vcard_cb,       0, NULL, NULL},
 #ifdef USE_JPILOT
-       {N_("/_Book/New _JPilot"),      "<control>J",   addressbook_new_jpilot_cb,      0, NULL},
+       {N_("/_Book/New _JPilot"),      "<control>J",   addressbook_new_jpilot_cb,      0, NULL, NULL},
 #endif
 #ifdef USE_LDAP
-       {N_("/_Book/New LDAP _Server"), "<control><shift>S",    addressbook_new_ldap_cb,        0, NULL},
+       {N_("/_Book/New LDAP _Server"), "<control><shift>S",    addressbook_new_ldap_cb,        0, NULL, NULL},
 #endif
-       {N_("/_Book/---"),              NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Book/_Edit book"),       NULL,           addressbook_treenode_edit_cb,   0, NULL},
-       {N_("/_Book/_Delete book"),     NULL,           addressbook_treenode_delete_cb, 0, NULL},
-       {N_("/_Book/---"),              NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Book/_Save"),            "<control>S",   addressbook_file_save_cb,       0, NULL},
-       {N_("/_Book/_Close"),           "<control>W",   close_cb,                       0, NULL},
-       {N_("/_Address"),                       NULL,           NULL, 0, "<Branch>"},
-       {N_("/_Address/_Select all"),   "<control>A",   addressbook_select_all_cb,      0, NULL},
-       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Address/C_ut"),          "<control>X",   addressbook_clip_cut_cb,        0, NULL},
-       {N_("/_Address/_Copy"),         "<control>C",   addressbook_clip_copy_cb,       0, NULL},
-       {N_("/_Address/_Paste"),        "<control>V",   addressbook_clip_paste_cb,      0, NULL},
-       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Address/_Edit"),         "<control>Return",addressbook_edit_address_cb,    0, NULL},
-       {N_("/_Address/_Delete"),       "<control>D",   addressbook_delete_address_cb,  0, NULL},
-       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Address/New _Address"),  "<control>N",   addressbook_new_address_cb,     0, NULL},
-       {N_("/_Address/New _Group"),    "<control>G",   addressbook_new_group_cb,       0, NULL},
-       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Address/_Mail To"),      NULL,           addressbook_mail_to_cb,         0, NULL},
-       {N_("/_Tools"),                 NULL,           NULL, 0, "<Branch>"},
-       {N_("/_Tools/Import _LDIF file..."), NULL,      addressbook_import_ldif_cb,     0, NULL},
-       {N_("/_Tools/Import M_utt file..."), NULL,      addressbook_import_mutt_cb,     0, NULL},
-       {N_("/_Tools/Import _Pine file..."), NULL,      addressbook_import_pine_cb,     0, NULL},
-       {N_("/_Tools/---"),             NULL,           NULL, 0, "<Separator>"},
-       {N_("/_Tools/Export _HTML..."), NULL,           addressbook_export_html_cb,     0, NULL},
-       {N_("/_Tools/Export LDI_F..."), NULL,           addressbook_export_ldif_cb,     0, NULL},
-       {N_("/_Help"),                  NULL,           NULL, 0, "<Branch>"},
-       {N_("/_Help/_About"),           NULL,           about_show, 0, NULL}
+       {N_("/_Book/---"),              NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Book/_Edit book"),       NULL,           addressbook_treenode_edit_cb,   0, NULL, NULL},
+       {N_("/_Book/_Delete book"),     NULL,           addressbook_treenode_delete_cb, 0, NULL, NULL},
+       {N_("/_Book/---"),              NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Book/_Save"),            "<control>S",   addressbook_file_save_cb,       0, NULL, NULL},
+       {N_("/_Book/_Close"),           "<control>W",   close_cb,                       0, NULL, NULL},
+       {N_("/_Address"),                       NULL,           NULL, 0, "<Branch>", NULL},
+       {N_("/_Address/_Select all"),   "<control>A",   addressbook_select_all_cb,      0, NULL, NULL},
+       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Address/C_ut"),          "<control>X",   addressbook_clip_cut_cb,        0, NULL, NULL},
+       {N_("/_Address/_Copy"),         "<control>C",   addressbook_clip_copy_cb,       0, NULL, NULL},
+       {N_("/_Address/_Paste"),        "<control>V",   addressbook_clip_paste_cb,      0, NULL, NULL},
+       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Address/_Edit"),         "<control>Return",addressbook_edit_address_cb,    0, NULL, NULL},
+       {N_("/_Address/_Delete"),       "<control>D",   addressbook_delete_address_cb,  0, NULL, NULL},
+       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Address/New _Address"),  "<control>N",   addressbook_new_address_cb,     0, NULL, NULL},
+       {N_("/_Address/New _Group"),    "<control>G",   addressbook_new_group_cb,       0, NULL, NULL},
+       {N_("/_Address/---"),           NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Address/_Mail To"),      NULL,           addressbook_mail_to_cb,         0, NULL, NULL},
+       {N_("/_Tools"),                 NULL,           NULL, 0, "<Branch>", NULL},
+       {N_("/_Tools/Import _LDIF file..."), NULL,      addressbook_import_ldif_cb,     0, NULL, NULL},
+       {N_("/_Tools/Import M_utt file..."), NULL,      addressbook_import_mutt_cb,     0, NULL, NULL},
+       {N_("/_Tools/Import _Pine file..."), NULL,      addressbook_import_pine_cb,     0, NULL, NULL},
+       {N_("/_Tools/---"),             NULL,           NULL, 0, "<Separator>", NULL},
+       {N_("/_Tools/Export _HTML..."), NULL,           addressbook_export_html_cb,     0, NULL, NULL},
+       {N_("/_Tools/Export LDI_F..."), NULL,           addressbook_export_ldif_cb,     0, NULL, NULL},
+       {N_("/_Help"),                  NULL,           NULL, 0, "<Branch>", NULL},
+       {N_("/_Help/_About"),           NULL,           about_show, 0, NULL, NULL}
 };
 
 static GtkItemFactoryEntry addressbook_tree_popup_entries[] =
 {
-       {N_("/_Edit"),          NULL, addressbook_treenode_edit_cb,   0, NULL},
-       {N_("/_Delete"),        NULL, addressbook_treenode_delete_cb, 0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-       {N_("/New _Book"),      NULL, addressbook_new_book_cb,      0, NULL},
-       {N_("/New _Folder"),    NULL, addressbook_new_folder_cb,      0, NULL},
-       {N_("/New _Group"),     NULL, addressbook_new_group_cb,      0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-       {N_("/C_ut"),           NULL, addressbook_treenode_cut_cb,    0, NULL},
-       {N_("/_Copy"),          NULL, addressbook_treenode_copy_cb,   0, NULL},
-       {N_("/_Paste"),         NULL, addressbook_treenode_paste_cb,  0, NULL}
+       {N_("/_Edit"),          NULL, addressbook_treenode_edit_cb,   0, NULL, NULL},
+       {N_("/_Delete"),        NULL, addressbook_treenode_delete_cb, 0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+       {N_("/New _Book"),      NULL, addressbook_new_book_cb,      0, NULL, NULL},
+       {N_("/New _Folder"),    NULL, addressbook_new_folder_cb,      0, NULL, NULL},
+       {N_("/New _Group"),     NULL, addressbook_new_group_cb,      0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+       {N_("/C_ut"),           NULL, addressbook_treenode_cut_cb,    0, NULL, NULL},
+       {N_("/_Copy"),          NULL, addressbook_treenode_copy_cb,   0, NULL, NULL},
+       {N_("/_Paste"),         NULL, addressbook_treenode_paste_cb,  0, NULL, NULL}
 };
 
 static GtkItemFactoryEntry addressbook_list_popup_entries[] =
 {
-       {N_("/_Select all"),    NULL, addressbook_select_all_cb, 0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-       {N_("/_Edit"),          NULL, addressbook_edit_address_cb,   0, NULL},
-       {N_("/_Delete"),        NULL, addressbook_delete_address_cb, 0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-       {N_("/New _Address"),   NULL, addressbook_new_address_cb,    0, NULL},
-       {N_("/New _Group"),     NULL, addressbook_new_group_cb,      0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-       {N_("/C_ut"),           NULL, addressbook_clip_cut_cb,       0, NULL},
-       {N_("/_Copy"),          NULL, addressbook_clip_copy_cb,      0, NULL},
-       {N_("/_Paste"),         NULL, addressbook_clip_paste_cb,     0, NULL},
-       {"/---",                NULL, NULL, 0, "<Separator>"},
-/*     {N_("/Pa_ste Address"), NULL, addressbook_clip_paste_address_cb, 0, NULL},*/
-       {N_("/_Mail To"),       NULL, addressbook_mail_to_cb,            0, NULL},
+       {N_("/_Select all"),    NULL, addressbook_select_all_cb, 0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+       {N_("/_Edit"),          NULL, addressbook_edit_address_cb,   0, NULL, NULL},
+       {N_("/_Delete"),        NULL, addressbook_delete_address_cb, 0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+       {N_("/New _Address"),   NULL, addressbook_new_address_cb,    0, NULL, NULL},
+       {N_("/New _Group"),     NULL, addressbook_new_group_cb,      0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+       {N_("/C_ut"),           NULL, addressbook_clip_cut_cb,       0, NULL, NULL},
+       {N_("/_Copy"),          NULL, addressbook_clip_copy_cb,      0, NULL, NULL},
+       {N_("/_Paste"),         NULL, addressbook_clip_paste_cb,     0, NULL, NULL},
+       {"/---",                NULL, NULL, 0, "<Separator>", NULL},
+/*     {N_("/Pa_ste Address"), NULL, addressbook_clip_paste_address_cb, 0, NULL, NULL},*/
+       {N_("/_Mail To"),       NULL, addressbook_mail_to_cb,            0, NULL, NULL},
 #ifdef USE_LDAP
-       {N_("/_Browse Entry"),  NULL, addressbook_browse_entry_cb,       0, NULL},
+       {N_("/_Browse Entry"),  NULL, addressbook_browse_entry_cb,       0, NULL, NULL},
 #endif 
 };
 
@@ -745,7 +745,7 @@ static gint list_case_sort(
                        name2 = GTK_CELL_TEXT (row2->cell[sort_column_number])->text;
                if( ! name1 ) return ( name2 != NULL );
                if( ! name2 ) return -1;
-               return strcasecmp( name1, name2 );
+               return g_utf8_collate( name1, name2 );
        } else {
                /* Order groups before person */
                if( aio1->type == ITEMTYPE_GROUP ) {
@@ -1131,15 +1131,15 @@ static void addressbook_create(void)
                         G_CALLBACK(addressbook_lup_clicked), NULL);
 
        to_btn = gtk_button_new_with_label
-               (prefs_common.trans_hdr ? _("To:") : "To:");
+               (prefs_common_translated_header_name("To:"));
        GTK_WIDGET_SET_FLAGS(to_btn, GTK_CAN_DEFAULT);
        gtk_box_pack_start(GTK_BOX(hbbox), to_btn, TRUE, TRUE, 0);
        cc_btn = gtk_button_new_with_label
-               (prefs_common.trans_hdr ? _("Cc:") : "Cc:");
+               (prefs_common_translated_header_name("Cc:"));
        GTK_WIDGET_SET_FLAGS(cc_btn, GTK_CAN_DEFAULT);
        gtk_box_pack_start(GTK_BOX(hbbox), cc_btn, TRUE, TRUE, 0);
        bcc_btn = gtk_button_new_with_label
-               (prefs_common.trans_hdr ? _("Bcc:") : "Bcc:");
+               (prefs_common_translated_header_name("Bcc:"));
        GTK_WIDGET_SET_FLAGS(bcc_btn, GTK_CAN_DEFAULT);
        gtk_box_pack_start(GTK_BOX(hbbox), bcc_btn, TRUE, TRUE, 0);
 
@@ -1467,7 +1467,7 @@ static void addressbook_del_clicked(GtkButton *button, gpointer data)
                                        addritem_folder_remove_person(ADAPTER_FOLDER(pobj)->itemFolder, item);
                                item = addrbook_remove_person( abf, item );
 #ifdef USE_LDAP
-                               if (ds->type == ADDR_IF_LDAP) {
+                               if (ds && ds->type == ADDR_IF_LDAP) {
                                        LdapServer *server = ds->rawDataSource;
                                        ldapsvr_set_modified(server, TRUE);
                                        ldapsvr_update_book(server, item);
@@ -1821,10 +1821,10 @@ static void addressbook_tree_selected(GtkCTree *ctree, GtkCTreeNode *node,
 
                        /* Load folders into the tree */
                        rootFolder = addrindex_ds_get_root_folder( ds );
-                       if( ds->type == ADDR_IF_JPILOT ) {
+                       if( ds && ds->type == ADDR_IF_JPILOT ) {
                                aot = ADDR_CATEGORY;
                        }
-                       else if( ds->type == ADDR_IF_LDAP ) {
+                       else if( ds && ds->type == ADDR_IF_LDAP ) {
                                aot = ADDR_LDAP_QUERY;
                        }
                        else {
@@ -1926,7 +1926,7 @@ static void addressbook_list_menu_setup( void ) {
                        if( ! addrselect_test_empty( _addressSelect_ ) ) canCut = TRUE;
                        canDelete = canEdit;
                }
-               if( iface->type == ADDR_IF_LDAP ) {
+               if( iface && iface->type == ADDR_IF_LDAP ) {
                        if( obj ) canBrowse = TRUE;
                        canEdit = TRUE;
                        canDelete = TRUE;
@@ -2260,7 +2260,7 @@ static void addressbook_list_row_selected( GtkCTree *clist,
 
        aio = gtk_ctree_node_get_row_data( clist, node );
        if( aio ) {
-               /* printf( "list select: %d : '%s'\n", aio->type, aio->name ); */
+               /* g_print( "list select: %d : '%s'\n", aio->type, aio->name ); */
                addressbook_list_select_add( aio, ds );
        }
 
@@ -2279,7 +2279,7 @@ static void addressbook_list_row_unselected( GtkCTree *ctree,
 
        aio = gtk_ctree_node_get_row_data( ctree, node );
        if( aio != NULL ) {
-               /* printf( "list unselect: %d : '%s'\n", aio->type, aio->name ); */
+               /* g_print( "list unselect: %d : '%s'\n", aio->type, aio->name ); */
                addressbook_list_select_remove( aio );
        }
 
@@ -2813,12 +2813,12 @@ static void addressbook_treenode_delete_cb(
 
                adapter->itemFolder = NULL;
                /*
-               printf( "remove folder for ::%s::\n", obj->name );
-               printf( "      folder name ::%s::\n", ADDRITEM_NAME(folder) );
-               printf( "-------------- remove results\n" );
+               g_print( "remove folder for ::%s::\n", obj->name );
+               g_print( "      folder name ::%s::\n", ADDRITEM_NAME(folder) );
+               g_print( "-------------- remove results\n" );
                */
                addrindex_remove_results( ds, folder );
-               /* printf( "-------------- remove node\n" ); */
+               /* g_print( "-------------- remove node\n" ); */
                gtk_ctree_remove_node( ctree, node );
                return;
        }
@@ -2927,7 +2927,7 @@ static ItemFolder * addressbook_setup_subf(
        /* Setup a query */
        if( *title == '\0' || strlen( title ) < 1 ) return NULL;
 
-       if( ds->type == ADDR_IF_LDAP ) {
+       if( ds && ds->type == ADDR_IF_LDAP ) {
 #if USE_LDAP
                aoType = ADDR_LDAP_QUERY;
 #endif
@@ -3003,7 +3003,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
 
        abf = ds->rawDataSource;
        if( abf == NULL ) {
-               printf("no addressbook file\n");
+               g_print("no addressbook file\n");
                return;
        }
 
@@ -3013,7 +3013,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
                        ItemPerson *person;
                        ItemFolder *folder = NULL;
 #ifdef USE_LDAP
-                       if (abf->type == ADDR_IF_LDAP) {
+                       if (abf && abf->type == ADDR_IF_LDAP) {
                                GtkCTreeNode *parentNode;
                                ds = addressbook_find_datasource( GTK_CTREE_NODE( addrbook.treeSelected ) );
                                if( ds == NULL ) return;
@@ -3040,7 +3040,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
                                                                  addressbook_new_address_from_book_post_cb,
                                                                  TRUE );
 #ifdef USE_LDAP
-                       if (abf->type == ADDR_IF_LDAP) {
+                       if (abf && abf->type == ADDR_IF_LDAP) {
                                LdapServer *server = ds->rawDataSource;
                                ldapsvr_set_modified(server, TRUE);
                                ldapsvr_update_book(server, NULL);
@@ -3048,6 +3048,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
                                        alertpanel( _("Add address(es)"),
                                                addressbook_err2string(_lutErrorsLDAP_, server->retVal),
                                                GTK_STOCK_CLOSE, NULL, NULL );
+                                       server->retVal = LDAPRC_SUCCESS;
                                        return;
                                }
                        }
@@ -3061,7 +3062,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
                ItemFolder *folder = ADAPTER_FOLDER(pobj)->itemFolder;
                ItemPerson *person;
 #ifdef USE_LDAP
-               if (abf->type == ADDR_IF_LDAP) {
+               if (abf && abf->type == ADDR_IF_LDAP) {
                        GtkCTreeNode *parentNode;
                        ds = addressbook_find_datasource( GTK_CTREE_NODE( addrbook.treeSelected ) );
                        if( ds == NULL ) return;
@@ -3089,7 +3090,7 @@ static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *
                                                          addressbook_new_address_from_folder_post_cb,
                                                          TRUE );
 #ifdef USE_LDAP
-               if (abf->type == ADDR_IF_LDAP) {
+               if (abf && abf->type == ADDR_IF_LDAP) {
                        LdapServer *server = ds->rawDataSource;
                        ldapsvr_set_modified(server, TRUE);
                        ldapsvr_update_book(server, NULL);
@@ -3262,7 +3263,7 @@ static void addressbook_edit_address( gpointer data, guint action, GtkWidget *wi
                                                                                   (prefs_common.addressbook_use_editaddress_dialog||force_focus) )
                                  != NULL ) { 
 #ifdef USE_LDAP
-                               if (abf->type == ADDR_IF_LDAP) {
+                               if (abf && abf->type == ADDR_IF_LDAP) {
                                        ldapsvr_set_modified( (LdapServer *) abf, TRUE );
                                        person->status = UPDATE_ENTRY;
                                }
@@ -3281,7 +3282,7 @@ static void addressbook_edit_address( gpointer data, guint action, GtkWidget *wi
                                                                          (prefs_common.addressbook_use_editaddress_dialog||force_focus) )
                        != NULL ) {
 #ifdef USE_LDAP
-                               if (abf->type == ADDR_IF_LDAP) {
+                               if (abf && abf->type == ADDR_IF_LDAP) {
                                        ldapsvr_set_modified( (LdapServer *) abf, TRUE );
                                        person->status = UPDATE_ENTRY;
                                }
@@ -3403,6 +3404,9 @@ static void addressbook_folder_load_one_person(
        gchar *text[N_LIST_COLS];
        gboolean flgFirst = TRUE, haveAddr = FALSE;
        GList *node;
+#ifdef USE_LDAP
+       AddressBookFile *abf = addressbook_get_book_file();
+#endif
 
        if( person == NULL ) return;
 
@@ -3423,9 +3427,19 @@ static void addressbook_folder_load_one_person(
                        if( str ) {
                                text[COL_NAME] = str;
                        }
-                       else if( person->nickName ) {
-                               text[COL_NAME] = person->nickName;
+#ifdef USE_LDAP
+                       else if( abf && abf->type == ADDR_IF_LDAP && 
+                                person && person->nickName ) {
+                               if (person->nickName) {
+                                       if (strcmp(person->nickName, "") != 0) {
+                                               text[COL_NAME] = person->nickName;
+                                       }
+                                       else {
+                                               text[COL_NAME] = ADDRITEM_NAME(person);
+                                       }
+                               }
                        }
+#endif
                        else {
                                text[COL_NAME] = ADDRITEM_NAME(person);
                        }
@@ -3641,10 +3655,10 @@ static AddressDataSource *addressbook_find_datasource( GtkCTreeNode *node ) {
                if( GTK_CTREE_ROW(node)->level < 2 ) return NULL;
                ao = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), node );
                if( ao ) {
-                       /* printf( "ao->type = %d\n", ao->type ); */
+                       /* g_print( "ao->type = %d\n", ao->type ); */
                        if( ao->type == ADDR_DATASOURCE ) {
                                AdapterDSource *ads = ADAPTER_DSOURCE(ao);
-                               /* printf( "found it\n" ); */
+                               /* g_print( "found it\n" ); */
                                ds = ads->dataSource;
                                break;
                        }
@@ -3678,7 +3692,7 @@ static void addressbook_set_clist( AddressObject *obj, gboolean refresh ) {
        }
 
        if( obj->type == ADDR_INTERFACE ) {
-               /* printf( "set_clist: loading datasource...\n" ); */
+               /* g_print( "set_clist: loading datasource...\n" ); */
                /* addressbook_node_load_datasource( GTK_CTREE(clist), obj ); */
                return;
        }
@@ -4111,7 +4125,7 @@ void addressbook_export_to_file( void ) {
 
 static gboolean addressbook_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       if (event && event->keyval == GDK_Return)
+       if (event && (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter))
                addressbook_lup_clicked(NULL, NULL);
        return FALSE;
 }
@@ -4268,7 +4282,7 @@ static void addressbook_search_idle( gpointer data ) {
        gint queryID;
 
        queryID = GPOINTER_TO_INT( data );
-       printf( "addressbook_ldap_idle... queryID=%d\n", queryID );
+       g_print( "addressbook_ldap_idle... queryID=%d\n", queryID );
        */
 }
 
@@ -4330,7 +4344,7 @@ static void addressbook_perform_search(
        /* Setup a query */
        if( *searchTerm == '\0' || strlen( searchTerm ) < 1 ) return;
 
-       if( ds->type == ADDR_IF_LDAP ) {
+       if( ds && ds->type == ADDR_IF_LDAP ) {
 #if USE_LDAP
                aoType = ADDR_LDAP_QUERY;
 #endif
@@ -4459,7 +4473,7 @@ static void addressbook_browse_entry_cb(void)
                return;
        }
 
-       if( iface->type == ADDR_IF_LDAP ) {
+       if( iface && iface->type == ADDR_IF_LDAP ) {
                browseldap_entry(ds, person->externalID);
        }
 }
@@ -4816,7 +4830,7 @@ static void addrbookctl_build_ifselect( void ) {
        splitStr = g_strsplit( selectStr, ",", -1 );
        for( i = 0; i < ADDRESSBOOK_MAX_IFACE; i++ ) {
                if( splitStr[i] ) {
-                       /* printf( "%d : %s\n", i, splitStr[i] ); */
+                       /* g_print( "%d : %s\n", i, splitStr[i] ); */
                        ifType = strtol( splitStr[i], &endptr, 10 );
                        enabled = TRUE;
                        if( *endptr ) {
@@ -4824,7 +4838,7 @@ static void addrbookctl_build_ifselect( void ) {
                                        enabled = FALSE;
                                }
                        }
-                       /* printf( "\t%d : %s\n", ifType, enabled ? "yes" : "no" ); */
+                       /* g_print( "\t%d : %s\n", ifType, enabled ? "yes" : "no" ); */
                        adapter = addrbookctl_find_interface( ifType );
                        if( adapter ) {
                                newList = g_list_append( newList, adapter );
@@ -4834,7 +4848,7 @@ static void addrbookctl_build_ifselect( void ) {
                        break;
                }
        }
-       /* printf( "i=%d\n", i ); */
+       /* g_print( "i=%d\n", i ); */
        g_strfreev( splitStr );
        g_free( selectStr );
 
@@ -4907,7 +4921,7 @@ gboolean addressbook_folder_selection( gchar **folderpath )
                } else {
                        *folderpath = g_strdup_printf("%s", book->fileName);
                }
-               debug_print( "addressbook_foldersel: %s\n", *folderpath);
+               debug_print( "addressbook_foldersel: %s\n", *folderpath?*folderpath:"(null)");
                return (*folderpath != NULL);
        }
        return FALSE;
@@ -5354,12 +5368,14 @@ static gboolean addressbook_drag_motion_cb(GtkWidget      *widget,
        if (gtk_clist_get_selection_info
                (GTK_CLIST(widget), x - 24, y - 24, &row, &column)) {
 
-               if (y > height - 24 && height + vpos < total_height)
+               if (y > height - 24 && height + vpos < total_height) {
                        gtk_adjustment_set_value(pos, (vpos+5 > height ? height : vpos+5));
-
-               if (y < 24 && y > 0)
+                       gtk_adjustment_changed(pos);
+               }
+               if (y < 24 && y > 0) {
                        gtk_adjustment_set_value(pos, (vpos-5 < 0 ? 0 : vpos-5));
-
+                       gtk_adjustment_changed(pos);
+               }
                node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
 
                if (node != NULL) {