2011-11-28 [pawel] 3.7.10cvs106
[claws.git] / src / addressbook.c
index c0132b53ba408ae5b1f021f2127b19c83b706e6b..0793512322dbf6d5e4f692213dcb554f8ee1134c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
  *
  * 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
@@ -91,7 +91,9 @@
 #include "expldifdlg.h"
 #include "browseldap.h"
 #include "addrcustomattr.h"
-
+#ifdef G_OS_WIN32
+#undef interface
+#endif
 typedef enum
 {
        COL_SOURCES     = 0,
@@ -132,17 +134,17 @@ static gchar *list_titles[] = { N_("Name"),
 
 #define ADDRESSBOOK_MSGBUF_SIZE 2048
 
-static GdkPixbuf *folderxpm;
-static GdkPixbuf *folderopenxpm;
-static GdkPixbuf *groupxpm;
-static GdkPixbuf *interfacexpm;
-static GdkPixbuf *bookxpm;
-static GdkPixbuf *addressxpm;
-static GdkPixbuf *vcardxpm;
-static GdkPixbuf *jpilotxpm;
-static GdkPixbuf *categoryxpm;
-static GdkPixbuf *ldapxpm;
-static GdkPixbuf *addrsearchxpm;
+static GdkPixbuf *folderxpm = NULL;
+static GdkPixbuf *folderopenxpm = NULL;
+static GdkPixbuf *groupxpm = NULL;
+static GdkPixbuf *interfacexpm = NULL;
+static GdkPixbuf *bookxpm = NULL;
+static GdkPixbuf *addressxpm = NULL;
+static GdkPixbuf *vcardxpm = NULL;
+static GdkPixbuf *jpilotxpm = NULL;
+static GdkPixbuf *categoryxpm = NULL;
+static GdkPixbuf *ldapxpm = NULL;
+static GdkPixbuf *addrsearchxpm = NULL;
 
 /* Message buffer */
 static gchar addressbook_msgbuf[ ADDRESSBOOK_MSGBUF_SIZE ];
@@ -168,7 +170,6 @@ static void addressbook_edit_address_post_cb( ItemPerson *person );
 
 static void addressbook_create                 (void);
 static gint addressbook_close                  (void);
-static void addressbook_button_set_sensitive   (void);
 
 static gboolean address_index_has_focus = FALSE;
 static gboolean address_list_has_focus = FALSE;
@@ -665,7 +666,6 @@ void addressbook_destroy( void ) {
 void addressbook_set_target_compose(Compose *target)
 {
        addrbook.target_compose = target;
-       addressbook_button_set_sensitive();
 }
 
 Compose *addressbook_get_target_compose(void)
@@ -694,9 +694,9 @@ void addressbook_refresh( void )
 
 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                addressbook_close();
-       else if (event && event->keyval == GDK_Delete) {
+       else if (event && event->keyval == GDK_KEY_Delete) {
                /* TODO: enable deletion when focus is in ctree (needs implementation in _del_clicked() */
                if ( /* address_index_has_focus || */ address_list_has_focus )
                        addressbook_del_clicked(NULL, NULL);
@@ -710,7 +710,7 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data
 static void addressbook_size_allocate_cb(GtkWidget *widget,
                                         GtkAllocation *allocation)
 {
-       g_return_if_fail(allocation != NULL);
+       cm_return_if_fail(allocation != NULL);
 
        prefs_common.addressbookwin_width = allocation->width;
        prefs_common.addressbookwin_height = allocation->height;
@@ -1014,21 +1014,14 @@ static void addressbook_create(void)
 
        /* Address index */
        ctree = gtk_sctree_new_with_titles(N_INDEX_COLS, 0, index_titles);
-       GTK_WIDGET_UNSET_FLAGS(GTK_CMCLIST(ctree)->column[0].button,
-                              GTK_CAN_FOCUS);
+       gtkut_widget_set_can_focus(GTK_CMCLIST(ctree)->column[0].button, FALSE);
 
        gtk_container_add(GTK_CONTAINER(ctree_swin), ctree);
        gtk_cmclist_set_selection_mode(GTK_CMCLIST(ctree), GTK_SELECTION_BROWSE);
        gtk_cmclist_set_column_width(GTK_CMCLIST(ctree), 0, COL_FOLDER_WIDTH);
-       if (prefs_common.enable_dotted_lines) {
-               gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_DOTTED);
-               gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
-                                    GTK_CMCTREE_EXPANDER_SQUARE);
-       } else {
-               gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_NONE);
-               gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
-                                    GTK_CMCTREE_EXPANDER_TRIANGLE);
-       }
+       gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_NONE);
+       gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
+                            GTK_CMCTREE_EXPANDER_TRIANGLE);
        gtk_sctree_set_stripes(GTK_SCTREE(ctree), prefs_common.use_stripes_in_summaries);
        gtk_cmctree_set_indent(GTK_CMCTREE(ctree), CTREE_INDENT);
        gtk_cmclist_set_compare_func(GTK_CMCLIST(ctree),
@@ -1075,15 +1068,9 @@ static void addressbook_create(void)
        clist = gtk_sctree_new_with_titles(N_LIST_COLS, 0, list_titles);
        gtk_container_add(GTK_CONTAINER(clist_swin), clist);
        gtk_cmclist_set_selection_mode(GTK_CMCLIST(clist), GTK_SELECTION_EXTENDED);
-       if (prefs_common.enable_dotted_lines) {
-               gtk_cmctree_set_line_style(GTK_CMCTREE(clist), GTK_CMCTREE_LINES_DOTTED);
-               gtk_cmctree_set_expander_style(GTK_CMCTREE(clist),
-                                    GTK_CMCTREE_EXPANDER_SQUARE);
-       } else {
-               gtk_cmctree_set_line_style(GTK_CMCTREE(clist), GTK_CMCTREE_LINES_NONE);
-               gtk_cmctree_set_expander_style(GTK_CMCTREE(clist),
-                                    GTK_CMCTREE_EXPANDER_TRIANGLE);
-       }
+       gtk_cmctree_set_line_style(GTK_CMCTREE(clist), GTK_CMCTREE_LINES_NONE);
+       gtk_cmctree_set_expander_style(GTK_CMCTREE(clist),
+                            GTK_CMCTREE_EXPANDER_TRIANGLE);
        gtk_sctree_set_stripes(GTK_SCTREE(ctree), prefs_common.use_stripes_in_summaries);
        gtk_cmctree_set_indent(GTK_CMCTREE(clist), CTREE_INDENT);
        gtk_cmclist_set_column_width(GTK_CMCLIST(clist), COL_NAME,
@@ -1105,8 +1092,8 @@ static void addressbook_create(void)
                G_CALLBACK(addressbook_address_list_focus_evt_out), NULL);
 
        for (i = 0; i < N_LIST_COLS; i++)
-               GTK_WIDGET_UNSET_FLAGS(GTK_CMCLIST(clist)->column[i].button,
-                                      GTK_CAN_FOCUS);
+               gtkut_widget_set_can_focus(GTK_CMCLIST(clist)->column[i].button,
+                                        FALSE);
 
        g_signal_connect(G_OBJECT(clist), "tree_select_row",
                         G_CALLBACK(addressbook_list_row_selected), NULL);
@@ -1174,18 +1161,18 @@ static void addressbook_create(void)
        gtkut_stock_button_add_help(hbbox, &help_btn);
 
        edit_btn = gtk_button_new_from_stock(GTK_STOCK_EDIT);
-       GTK_WIDGET_SET_FLAGS(edit_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(edit_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), edit_btn, TRUE, TRUE, 0);
        del_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
-       GTK_WIDGET_SET_FLAGS(del_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(del_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), del_btn, TRUE, TRUE, 0);
        reg_btn = gtk_button_new_from_stock(GTK_STOCK_NEW);
-       GTK_WIDGET_SET_FLAGS(reg_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(reg_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), reg_btn, TRUE, TRUE, 0);
 
 
        lup_btn = gtk_button_new_from_stock(GTK_STOCK_FIND);
-       GTK_WIDGET_SET_FLAGS(lup_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(lup_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbox), lup_btn, TRUE, TRUE, 0);
 
        g_signal_connect(G_OBJECT(help_btn), "clicked",
@@ -1203,19 +1190,19 @@ static void addressbook_create(void)
 
        to_btn = gtk_button_new_with_label
                (prefs_common_translated_header_name("To:"));
-       GTK_WIDGET_SET_FLAGS(to_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(to_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), to_btn, TRUE, TRUE, 0);
        cc_btn = gtk_button_new_with_label
                (prefs_common_translated_header_name("Cc:"));
-       GTK_WIDGET_SET_FLAGS(cc_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(cc_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), cc_btn, TRUE, TRUE, 0);
        bcc_btn = gtk_button_new_with_label
                (prefs_common_translated_header_name("Bcc:"));
-       GTK_WIDGET_SET_FLAGS(bcc_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(bcc_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), bcc_btn, TRUE, TRUE, 0);
 
        close_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
-       GTK_WIDGET_SET_FLAGS(close_btn, GTK_CAN_DEFAULT);
+       gtkut_widget_set_can_default(close_btn, TRUE);
        gtk_box_pack_start(GTK_BOX(hbbox), close_btn, TRUE, TRUE, 0);
 
        g_signal_connect(G_OBJECT(to_btn), "clicked",
@@ -1231,8 +1218,6 @@ static void addressbook_create(void)
                         G_CALLBACK(addressbook_close_clicked), NULL);
 
        /* Build icons for interface */
-       stock_pixbuf_gdk( window, STOCK_PIXMAP_INTERFACE,
-                         &interfacexpm );
 
        /* Build control tables */
        addrbookctl_build_map(window);
@@ -1341,6 +1326,9 @@ static void addressbook_create(void)
                                      GDK_HINT_MIN_SIZE);
        gtk_widget_set_size_request(window, prefs_common.addressbookwin_width,
                                    prefs_common.addressbookwin_height);
+#ifdef G_OS_WIN32
+       gtk_window_move(GTK_WINDOW(window), 48, 48);
+#endif
 
        if (!prefs_common.addressbook_use_editaddress_dialog) {
                if (prefs_common.addressbook_vpaned_pos > 0)
@@ -1408,25 +1396,6 @@ static void addressbook_ds_show_message( AddressDataSource *ds ) {
        addressbook_status_show( addressbook_msgbuf );
 }
 
-static void addressbook_button_set_sensitive(void)
-{
-       gboolean to_sens  = FALSE;
-       gboolean cc_sens  = FALSE;
-       gboolean bcc_sens = FALSE;
-
-       if (!addrbook.window) return;
-
-       if (addrbook.target_compose) {
-               to_sens = TRUE;
-               cc_sens = TRUE;
-               bcc_sens = TRUE;
-       }
-
-       gtk_widget_set_sensitive(addrbook.to_btn, to_sens);
-       gtk_widget_set_sensitive(addrbook.cc_btn, cc_sens);
-       gtk_widget_set_sensitive(addrbook.bcc_btn, bcc_sens);
-}
-
 static void addressbook_edit_clicked(GtkButton *button, gpointer data)
 {
        addressbook_edit_address_cb(NULL, NULL);
@@ -1458,7 +1427,7 @@ static void addressbook_del_clicked(GtkButton *button, gpointer data)
        gboolean refreshList = FALSE;
        
        pobj = gtk_cmctree_node_get_row_data(ctree, addrbook.opened );
-       g_return_if_fail(pobj != NULL);
+       cm_return_if_fail(pobj != NULL);
 
        /* Test whether anything selected for deletion */
        nodeList = addrbook.listSelected;
@@ -1765,7 +1734,7 @@ static void addressbook_to_clicked(GtkButton *button, gpointer data)
        addr = (char *)gtk_entry_get_text( GTK_ENTRY( addrbook.entry) );
        if ( addr ) {
                compose_entry_append(
-                       compose, addr, (ComposeEntryType)data );
+                       compose, addr, (ComposeEntryType)data , PREF_NONE);
        }
 
        /* Select from address list */
@@ -1780,7 +1749,7 @@ static void addressbook_to_clicked(GtkButton *button, gpointer data)
                            aio->type == ADDR_ITEM_EMAIL ) {
                                addr = addressbook_format_address( aio );
                                compose_entry_append(
-                                       compose, addr, (ComposeEntryType) data );
+                                       compose, addr, (ComposeEntryType) data, PREF_NONE );
                                g_free( addr );
                        }
                        else if( aio->type == ADDR_ITEM_GROUP ) {
@@ -1792,7 +1761,7 @@ static void addressbook_to_clicked(GtkButton *button, gpointer data)
                                        addr = addressbook_format_address(
                                                        ( AddrItemObject * ) email );
                                        compose_entry_append(
-                                               compose, addr, (ComposeEntryType) data );
+                                               compose, addr, (ComposeEntryType) data, PREF_NONE );
                                        g_free( addr );
                                        nodeMail = g_list_next( nodeMail );
                                }
@@ -1812,7 +1781,7 @@ static void addressbook_to_clicked(GtkButton *button, gpointer data)
                                addr = addressbook_format_address(
                                                ( AddrItemObject * ) email );
                                compose_entry_append(
-                                       compose, addr, (ComposeEntryType) data );
+                                       compose, addr, (ComposeEntryType) data, PREF_NONE );
                                g_free( addr );
                                nodeMail = g_list_next( nodeMail );
                        }
@@ -2133,6 +2102,11 @@ static void addressbook_list_menu_setup( void ) {
        gtk_widget_set_sensitive( addrbook.edit_btn, canEdit );
        gtk_widget_set_sensitive( addrbook.del_btn, canDelete );
 
+       if (addrbook.target_compose) {
+               gtk_widget_set_sensitive(addrbook.to_btn, obj ? TRUE : FALSE);  
+               gtk_widget_set_sensitive(addrbook.cc_btn, obj ? TRUE : FALSE);
+               gtk_widget_set_sensitive(addrbook.bcc_btn, obj ? TRUE : FALSE);
+       }
 #ifdef USE_LDAP
        cm_menu_set_sensitive_full( addrbook.ui_manager, "Popups/ABListPopup/BrowseEntry",    canBrowse );
 #endif
@@ -2556,8 +2530,6 @@ static gboolean addressbook_tree_button_pressed(GtkWidget *ctree,
 
        if (obj->type == ADDR_INTERFACE) {
                AdapterInterface *adapter = ADAPTER_INTERFACE(obj);
-               if( !adapter )
-                       goto just_set_sens;
                iface = adapter->interface;
                if( !iface )
                        goto just_set_sens;
@@ -2759,7 +2731,7 @@ static void addressbook_change_node_name(GtkCMCTreeNode *node, const gchar *name
        gtk_cmctree_get_node_info(ctree, node, text, &spacing,
                                &pix_cl, &pix_op,
                                &is_leaf, &expanded);
-       gtk_sctree_set_node_info(ctree, node, name, spacing,
+       gtk_cmctree_set_node_info(ctree, node, name, spacing,
                                pix_cl, pix_op,
                                is_leaf, expanded);
 }
@@ -2903,7 +2875,7 @@ static void addressbook_treenode_delete_cb(GtkAction *action, gpointer data)
        if( GTK_CMCTREE_ROW(node)->level == 1 ) return;
 
        obj = gtk_cmctree_node_get_row_data( ctree, node );
-       g_return_if_fail(obj != NULL);
+       cm_return_if_fail(obj != NULL);
 
        if( obj->type == ADDR_DATASOURCE ) {
                ads = ADAPTER_DSOURCE(obj);
@@ -2976,7 +2948,11 @@ static void addressbook_treenode_delete_cb(GtkAction *action, gpointer data)
        if( obj->type == ADDR_DATASOURCE ) {
                /* Remove node from tree */
                gtk_cmctree_remove_node( ctree, node );
-       
+               
+               if (delType == ADDRTREE_DEL_DATA &&
+                   ds->interface && ds->interface->type == ADDR_IF_BOOK)
+                       addrbook_delete_book_file((AddressBookFile *) ds->rawDataSource);
+                       
                /* Remove data source. */
                if( addrindex_index_remove_datasource( _addressIndex_, ds ) ) {
                        addrindex_free_datasource( ds );
@@ -3215,7 +3191,8 @@ static void addressbook_new_address_cb( GtkAction *action, gpointer data ) {
 
                                pobj = gtk_cmctree_node_get_row_data(GTK_CMCTREE(addrbook.ctree), addrbook.treeSelected);
                                ds = addressbook_find_datasource( GTK_CMCTREE_NODE(addrbook.treeSelected) );
-                               abf = ds->rawDataSource;
+                               if (ds)
+                                       abf = ds->rawDataSource;
                        }
 #endif
                        person = addressbook_edit_person( abf, folder, NULL, FALSE,
@@ -3223,7 +3200,7 @@ static void addressbook_new_address_cb( GtkAction *action, gpointer data ) {
                                                                  addressbook_new_address_from_book_post_cb,
                                                                  TRUE );
 #ifdef USE_LDAP
-                       if (abf && abf->type == ADDR_IF_LDAP) {
+                       if (ds && abf && abf->type == ADDR_IF_LDAP) {
                                LdapServer *server = ds->rawDataSource;
                                ldapsvr_set_modified(server, TRUE);
                                ldapsvr_update_book(server, NULL);
@@ -3265,7 +3242,8 @@ static void addressbook_new_address_cb( GtkAction *action, gpointer data ) {
                                return;
                        pobj = gtk_cmctree_node_get_row_data(GTK_CMCTREE(addrbook.ctree), addrbook.treeSelected);
                        ds = addressbook_find_datasource( GTK_CMCTREE_NODE(addrbook.treeSelected) );
-                       abf = ds->rawDataSource;
+                       if (ds)
+                               abf = ds->rawDataSource;
                }
 #endif
                person = addressbook_edit_person( abf, folder, NULL, FALSE,
@@ -3273,7 +3251,7 @@ static void addressbook_new_address_cb( GtkAction *action, gpointer data ) {
                                                          addressbook_new_address_from_folder_post_cb,
                                                          TRUE );
 #ifdef USE_LDAP
-               if (abf && abf->type == ADDR_IF_LDAP) {
+               if (ds && abf && abf->type == ADDR_IF_LDAP) {
                        LdapServer *server = ds->rawDataSource;
                        ldapsvr_set_modified(server, TRUE);
                        ldapsvr_update_book(server, NULL);
@@ -3416,7 +3394,7 @@ static void addressbook_edit_address( gpointer data, guint action, GtkWidget *wi
 
        if( addrbook.listSelected == NULL ) return;
        obj = gtk_cmctree_node_get_row_data( clist, addrbook.listSelected );
-       g_return_if_fail(obj != NULL);
+       cm_return_if_fail(obj != NULL);
 
                ctree = GTK_CMCTREE( addrbook.ctree );
        pobj = gtk_cmctree_node_get_row_data( ctree, addrbook.treeSelected );
@@ -3843,7 +3821,7 @@ static AddressDataSource *addressbook_find_datasource( GtkCMCTreeNode *node ) {
        AddressDataSource *ds = NULL;
        AddressObject *ao;
 
-       g_return_val_if_fail(addrbook.ctree != NULL, NULL);
+       cm_return_val_if_fail(addrbook.ctree != NULL, NULL);
 
        while( node ) {
                if( GTK_CMCTREE_ROW(node)->level < 2 ) return NULL;
@@ -4227,11 +4205,11 @@ static GtkCMCTreeNode *addressbook_add_object(GtkCMCTreeNode *node,
        AddressObjectType otype;
        AddressTypeControlItem *atci = NULL;
 
-       g_return_val_if_fail(node != NULL, NULL);
-       g_return_val_if_fail(obj  != NULL, NULL);
+       cm_return_val_if_fail(node != NULL, NULL);
+       cm_return_val_if_fail(obj  != NULL, NULL);
 
        pobj = gtk_cmctree_node_get_row_data(ctree, node);
-       g_return_val_if_fail(pobj != NULL, NULL);
+       cm_return_val_if_fail(pobj != NULL, NULL);
 
        /* Determine object type to be displayed */
        if( obj->type == ADDR_DATASOURCE ) {
@@ -4324,14 +4302,18 @@ static GtkCMCTreeNode *addressbook_node_add_folder(
        ItemFolder *rootFolder;
 
        /* Only visible folders */
-       if( itemFolder->isHidden ) return NULL;
+       if( itemFolder == NULL || itemFolder->isHidden ) 
+               return NULL;
 
-       if( ds == NULL ) return NULL;
-       if( node == NULL || itemFolder == NULL ) return NULL;
+       if( ds == NULL ) 
+               return NULL;
+       if( node == NULL || itemFolder == NULL ) 
+               return NULL;
 
        /* Determine object type */
        atci = addrbookctl_lookup( otype );
-       if( atci == NULL ) return NULL;
+       if( atci == NULL ) 
+               return NULL;
 
        rootFolder = addrindex_ds_get_root_folder( ds );
        if( itemFolder == rootFolder ) {
@@ -4388,7 +4370,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 || event->keyval == GDK_KP_Enter))
+       if (event && (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter))
                addressbook_lup_clicked(NULL, NULL);
        return FALSE;
 }
@@ -4631,7 +4613,7 @@ static void addressbook_perform_search(
 
        /* Set up idler function */
        idleID = g_idle_add(
-                       ( GtkFunction ) addressbook_search_idle,
+                       (GSourceFunc) addressbook_search_idle,
                        GINT_TO_POINTER( queryID ) );
 
        /* Start search, sit back and wait for something to happen */
@@ -4717,7 +4699,7 @@ static void addressbook_browse_entry_cb( GtkAction *action, gpointer data)
                return;
 
        iface = ds->interface;
-       if(! iface->haveLibrary )
+       if(!iface || !iface->haveLibrary )
                return;
 
        person = NULL;
@@ -4766,13 +4748,46 @@ ItemObjectType addressbook_type2item( AddressObjectType abType ) {
        return ioType;
 }
 
+#define UPDATE_ICON_ATCI(id,icon,iconopen) {                   \
+       atci = addrbookctl_lookup(id);                          \
+       if (atci) {                                             \
+               atci->iconXpm = icon;                           \
+               atci->iconXpmOpen = iconopen;                   \
+       } else {                                                \
+               g_warning("can't get atci %d\n", id);           \
+       }                                                       \
+}
+
 /*
 * Build table that controls the rendering of object types.
 */
-static void addrbookctl_build_map( GtkWidget *window ) {
+static void addrbookctl_build_icons( GtkWidget *window ) {
        AddressTypeControlItem *atci;
 
        /* Build icons */
+       if (interfacexpm)
+               g_object_unref(interfacexpm);
+       if (folderxpm)
+               g_object_unref(folderxpm);
+       if (folderopenxpm)
+               g_object_unref(folderopenxpm);
+       if (groupxpm)
+               g_object_unref(groupxpm);
+       if (vcardxpm)
+               g_object_unref(vcardxpm);
+       if (bookxpm)
+               g_object_unref(bookxpm);
+       if (addressxpm)
+               g_object_unref(addressxpm);
+       if (jpilotxpm)
+               g_object_unref(jpilotxpm);
+       if (categoryxpm)
+               g_object_unref(categoryxpm);
+       if (ldapxpm)
+               g_object_unref(ldapxpm);
+       if (addrsearchxpm)
+               g_object_unref(addrsearchxpm);
+       stock_pixbuf_gdk(window, STOCK_PIXMAP_INTERFACE, &interfacexpm );
        stock_pixbuf_gdk(window, STOCK_PIXMAP_DIR_CLOSE, &folderxpm);
        stock_pixbuf_gdk(window, STOCK_PIXMAP_DIR_OPEN, &folderopenxpm);
        stock_pixbuf_gdk(window, STOCK_PIXMAP_GROUP, &groupxpm);
@@ -4783,6 +4798,26 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        stock_pixbuf_gdk(window, STOCK_PIXMAP_CATEGORY, &categoryxpm);
        stock_pixbuf_gdk(window, STOCK_PIXMAP_LDAP, &ldapxpm);
        stock_pixbuf_gdk(window, STOCK_PIXMAP_ADDRESS_SEARCH, &addrsearchxpm);
+       
+       UPDATE_ICON_ATCI(ADDR_INTERFACE,folderxpm,folderopenxpm);
+       UPDATE_ICON_ATCI(ADDR_BOOK,bookxpm,bookxpm);
+       UPDATE_ICON_ATCI(ADDR_ITEM_PERSON,NULL,NULL);
+       UPDATE_ICON_ATCI(ADDR_ITEM_EMAIL,addressxpm,addressxpm);
+       UPDATE_ICON_ATCI(ADDR_ITEM_GROUP,groupxpm,groupxpm);
+       UPDATE_ICON_ATCI(ADDR_ITEM_FOLDER,folderxpm,folderopenxpm);
+       UPDATE_ICON_ATCI(ADDR_VCARD,vcardxpm,vcardxpm);
+       UPDATE_ICON_ATCI(ADDR_JPILOT,jpilotxpm,jpilotxpm);
+       UPDATE_ICON_ATCI(ADDR_CATEGORY,categoryxpm,categoryxpm);
+       UPDATE_ICON_ATCI(ADDR_LDAP,ldapxpm,ldapxpm);
+       UPDATE_ICON_ATCI(ADDR_LDAP_QUERY,addrsearchxpm,addrsearchxpm);
+
+}
+
+/*
+* Build table that controls the rendering of object types.
+*/
+static void addrbookctl_build_map( GtkWidget *window ) {
+       AddressTypeControlItem *atci;
 
        _addressBookTypeHash_ = g_hash_table_new( g_int_hash, g_int_equal );
        _addressBookTypeList_ = NULL;
@@ -4795,8 +4830,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Interface" );
-       atci->iconXpm = folderxpm;
-       atci->iconXpmOpen = folderopenxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4809,8 +4842,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Address Book" );
-       atci->iconXpm = bookxpm;
-       atci->iconXpmOpen = bookxpm;
        atci->menuCommand = "Menu/Book/NewBook";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4823,8 +4854,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Person" );
-       atci->iconXpm = NULL;
-       atci->iconXpmOpen = NULL;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4837,8 +4866,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "Email Address" );
-       atci->iconXpm = addressxpm;
-       atci->iconXpmOpen = addressxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4851,8 +4878,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Group" );
-       atci->iconXpm = groupxpm;
-       atci->iconXpmOpen = groupxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4865,8 +4890,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Folder" );
-       atci->iconXpm = folderxpm;
-       atci->iconXpmOpen = folderopenxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4879,8 +4902,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "vCard" );
-       atci->iconXpm = vcardxpm;
-       atci->iconXpmOpen = vcardxpm;
        atci->menuCommand = "Menu/Book/NewVCard";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4893,8 +4914,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "JPilot" );
-       atci->iconXpm = jpilotxpm;
-       atci->iconXpmOpen = jpilotxpm;
        atci->menuCommand = "Menu/Book/NewJPilot";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4907,8 +4926,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "JPilot" );
-       atci->iconXpm = categoryxpm;
-       atci->iconXpmOpen = categoryxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4921,8 +4938,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "LDAP servers" );
-       atci->iconXpm = ldapxpm;
-       atci->iconXpmOpen = ldapxpm;
        atci->menuCommand = "Menu/Book/NewLDAPServer";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4935,12 +4950,17 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "LDAP Query" );
-       atci->iconXpm = addrsearchxpm;
-       atci->iconXpmOpen = addrsearchxpm;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
 
+       addrbookctl_build_icons(window);
+}
+
+void addressbook_reflect_prefs_pixmap_theme(void)
+{
+       if (addrbook.window)
+               addrbookctl_build_icons(addrbook.window);
 }
 
 /*
@@ -5134,7 +5154,7 @@ gchar *addressbook_folder_selection( const gchar *folderpath)
        ItemFolder *folder = NULL;
        gchar *path = NULL;
 
-       g_return_val_if_fail( folderpath != NULL, NULL);
+       cm_return_val_if_fail( folderpath != NULL, NULL);
 
        if ( addressbook_foldersel_selection( _addressIndex_, &book, &folder, folderpath )
                && book != NULL ) {
@@ -5590,11 +5610,11 @@ static void addressbook_drag_data_get(GtkWidget        *widget,
        if (aio && aio->type == ADDR_ITEM_PERSON) {
                if( ds && ds->interface && ds->interface->readOnly)
                        gtk_selection_data_set(selection_data,
-                                      selection_data->target, 8,
+                                      gtk_selection_data_get_target(selection_data), 8,
                                       (const guchar *)"Dummy_addr_copy", 15);
                else
                        gtk_selection_data_set(selection_data,
-                                      selection_data->target, 8,
+                                      gtk_selection_data_get_target(selection_data), 8,
                                       (const guchar *)"Dummy_addr_move", 15);
        } 
 }
@@ -5606,14 +5626,18 @@ static gboolean addressbook_drag_motion_cb(GtkWidget      *widget,
                                          guint           time,
                                          void            *data)
 {
+       GtkAllocation allocation;
+       GtkRequisition requisition;
        gint row, column;
        GtkCMCTreeNode *node = NULL;
        gboolean acceptable = FALSE;
-       gint height = addrbook.ctree->allocation.height;
-       gint total_height = addrbook.ctree->requisition.height;
+       gtk_widget_get_allocation(GTK_WIDGET(addrbook.ctree), &allocation);
+       gint height = allocation.height;
+       gtk_widget_get_requisition(GTK_WIDGET(addrbook.ctree), &requisition);
+       gint total_height = requisition.height;
        GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment(
                                GTK_SCROLLED_WINDOW(addrbook.ctree_swin));
-       gfloat vpos = pos->value;
+       gfloat vpos = gtk_adjustment_get_value(pos);
        
        if (gtk_cmclist_get_selection_info
                (GTK_CMCLIST(widget), x - 24, y - 24, &row, &column)) {
@@ -5655,7 +5679,7 @@ static gboolean addressbook_drag_motion_cb(GtkWidget      *widget,
                        (G_OBJECT(widget),
                         G_CALLBACK(addressbook_tree_selected), NULL);
                gdk_drag_status(context, 
-                                       (context->actions == GDK_ACTION_COPY ?
+                                       (gdk_drag_context_get_actions(context) == GDK_ACTION_COPY ?
                                        GDK_ACTION_COPY : GDK_ACTION_MOVE) , time);
        } else {
                gdk_drag_status(context, 0, time);
@@ -5693,7 +5717,7 @@ static void addressbook_drag_received_cb(GtkWidget        *widget,
        GtkCMCTreeNode *node;
        GtkCMCTreeNode *lastopened = addrbook.opened;
 
-       if (!strncmp(data->data, "Dummy_addr", 10)) {
+       if (!strncmp(gtk_selection_data_get_data(data), "Dummy_addr", 10)) {
                if (gtk_cmclist_get_selection_info
                        (GTK_CMCLIST(widget), x - 24, y - 24, &row, &column) == 0) {
                        return;
@@ -5704,8 +5728,8 @@ static void addressbook_drag_received_cb(GtkWidget        *widget,
                        return;
                
                gtk_cmclist_freeze(GTK_CMCLIST(addrbook.clist));
-               if (drag_context->action == GDK_ACTION_COPY || 
-                   !strcmp(data->data, "Dummy_addr_copy"))
+               if (gdk_drag_context_get_selected_action(drag_context) == GDK_ACTION_COPY || 
+                   !strcmp(gtk_selection_data_get_data(data), "Dummy_addr_copy"))
                        addressbook_clip_copy_cb(NULL, NULL);
                else
                        addressbook_clip_cut_cb(NULL, NULL);