2010-01-23 [pawel] 3.7.4cvs10
[claws.git] / src / addressbook.c
index d7771e8f4346b6c6fe910a6cf7b478be9b2eb91c..f9161ec6900e29e66c37943b3cc839a80a8f4881 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-2009 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
@@ -132,28 +132,17 @@ static gchar *list_titles[] = { N_("Name"),
 
 #define ADDRESSBOOK_MSGBUF_SIZE 2048
 
-static GdkPixmap *folderxpm;
-static GdkBitmap *folderxpmmask;
-static GdkPixmap *folderopenxpm;
-static GdkBitmap *folderopenxpmmask;
-static GdkPixmap *groupxpm;
-static GdkBitmap *groupxpmmask;
-static GdkPixmap *interfacexpm;
-static GdkBitmap *interfacexpmmask;
-static GdkPixmap *bookxpm;
-static GdkBitmap *bookxpmmask;
-static GdkPixmap *addressxpm;
-static GdkBitmap *addressxpmmask;
-static GdkPixmap *vcardxpm;
-static GdkBitmap *vcardxpmmask;
-static GdkPixmap *jpilotxpm;
-static GdkBitmap *jpilotxpmmask;
-static GdkPixmap *categoryxpm;
-static GdkBitmap *categoryxpmmask;
-static GdkPixmap *ldapxpm;
-static GdkBitmap *ldapxpmmask;
-static GdkPixmap *addrsearchxpm;
-static GdkPixmap *addrsearchxpmmask;
+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 ];
@@ -408,7 +397,7 @@ static GtkActionEntry addressbook_entries[] =
 {
        {"Menu",                                NULL, "Menu" },
 /* menus */
-       {"Book",                        NULL, N_("_Message") },
+       {"Book",                        NULL, N_("_Book") },
        {"Address",                     NULL, N_("_Edit") },
        {"Tools",                       NULL, N_("_Tools") },
        {"Help",                        NULL, N_("_Help") },
@@ -676,7 +665,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)
@@ -721,7 +709,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;
@@ -951,7 +939,7 @@ static void addressbook_create(void)
 #ifndef MAEMO
        MENUITEM_ADDUI_MANAGER(ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
 #else
-       MENUITEM_ADDUI_MANAGER(ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENU)
+       MENUITEM_ADDUI_MANAGER(ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_POPUP)
 #endif
 
        MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu", "Book", "Book", GTK_UI_MANAGER_MENU)
@@ -1242,8 +1230,6 @@ static void addressbook_create(void)
                         G_CALLBACK(addressbook_close_clicked), NULL);
 
        /* Build icons for interface */
-       stock_pixmap_gdk( window, STOCK_PIXMAP_INTERFACE,
-                         &interfacexpm, &interfacexpmmask );
 
        /* Build control tables */
        addrbookctl_build_map(window);
@@ -1265,8 +1251,8 @@ static void addressbook_create(void)
                        adapter->treeNode =
                                gtk_sctree_insert_node( GTK_CMCTREE(ctree),
                                        NULL, NULL, &text, FOLDER_SPACING,
-                                       interfacexpm, interfacexpmmask,
-                                       interfacexpm, interfacexpmmask,
+                                       interfacexpm,
+                                       interfacexpm,
                                        FALSE, FALSE );
                        cm_menu_set_sensitive_full(ui_manager, atci->menuCommand, adapter->haveLibrary );
                        gtk_cmctree_node_set_row_data_full(
@@ -1352,6 +1338,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)
@@ -1419,25 +1408,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);
@@ -1469,7 +1439,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;
@@ -1776,7 +1746,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 */
@@ -1791,7 +1761,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 ) {
@@ -1803,7 +1773,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 );
                                }
@@ -1823,7 +1793,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 );
                        }
@@ -2144,6 +2114,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
@@ -2567,8 +2542,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;
@@ -2764,15 +2737,14 @@ static void addressbook_change_node_name(GtkCMCTreeNode *node, const gchar *name
        GtkCMCTree *ctree = GTK_CMCTREE(addrbook.ctree);
        gchar *text[1];
        guint8 spacing;
-       GdkPixmap *pix_cl, *pix_op;
-       GdkBitmap *mask_cl, *mask_op;
+       GdkPixbuf *pix_cl, *pix_op;
        gboolean is_leaf, expanded;
 
        gtk_cmctree_get_node_info(ctree, node, text, &spacing,
-                               &pix_cl, &mask_cl, &pix_op, &mask_op,
+                               &pix_cl, &pix_op,
                                &is_leaf, &expanded);
        gtk_sctree_set_node_info(ctree, node, name, spacing,
-                               pix_cl, mask_cl, pix_op, mask_op,
+                               pix_cl, pix_op,
                                is_leaf, expanded);
 }
 
@@ -2915,7 +2887,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);
@@ -3227,7 +3199,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,
@@ -3235,7 +3208,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);
@@ -3277,7 +3250,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,
@@ -3285,7 +3259,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);
@@ -3383,8 +3357,12 @@ static void addressbook_edit_address_post_cb( ItemPerson *person )
 {
        if( person ) {
 #ifdef USE_LDAP
-               if (strcmp2(person->nickName, ADDRITEM_NAME(person)))
-                       addritem_person_set_nick_name( person, ADDRITEM_NAME(person));
+               AddressBookFile *abf = addressbook_get_book_file();
+
+               if (abf && abf->type == ADDR_IF_LDAP) {
+                       if (strcmp2(person->nickName, ADDRITEM_NAME(person)))
+                               addritem_person_set_nick_name( person, ADDRITEM_NAME(person));
+               }
 #endif
                addressbook_folder_refresh_one_person( GTK_CMCTREE(addrbook.clist), person );
                invalidate_address_completion();
@@ -3424,7 +3402,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 );
@@ -3576,8 +3554,8 @@ static void addressbook_load_group( GtkCMCTree *clist, ItemGroup *itemGroup ) {
                nodeEMail = gtk_sctree_insert_node(
                                clist, NULL, NULL,
                                text, FOLDER_SPACING,
-                               atci->iconXpm, atci->maskXpm,
-                               atci->iconXpmOpen, atci->maskXpmOpen,
+                               atci->iconXpm,
+                               atci->iconXpmOpen,
                                FALSE, FALSE );
                gtk_cmctree_node_set_row_data( clist, nodeEMail, email );
                g_free( str );
@@ -3648,8 +3626,8 @@ static void addressbook_folder_load_one_person(
                        nodePerson = gtk_sctree_insert_node(
                                        clist, NULL, NULL,
                                        text, FOLDER_SPACING,
-                                       atci->iconXpm, atci->maskXpm,
-                                       atci->iconXpmOpen, atci->maskXpmOpen,
+                                       atci->iconXpm,
+                                       atci->iconXpmOpen,
                                        FALSE, person->isOpened );
                        g_free( str );
                        str = NULL;
@@ -3661,8 +3639,8 @@ static void addressbook_folder_load_one_person(
                        nodeEMail = gtk_sctree_insert_node(
                                        clist, nodePerson, NULL,
                                        text, FOLDER_SPACING,
-                                       atciMail->iconXpm, atciMail->maskXpm,
-                                       atciMail->iconXpmOpen, atciMail->maskXpmOpen,
+                                       atciMail->iconXpm,
+                                       atciMail->iconXpmOpen,
                                        FALSE, TRUE );
                        gtk_cmctree_node_set_row_data(clist, nodeEMail, email );
                }
@@ -3677,8 +3655,8 @@ static void addressbook_folder_load_one_person(
                nodePerson = gtk_sctree_insert_node(
                                clist, NULL, NULL,
                                text, FOLDER_SPACING,
-                               atci->iconXpm, atci->maskXpm,
-                               atci->iconXpmOpen, atci->maskXpmOpen,
+                               atci->iconXpm,
+                               atci->iconXpmOpen,
                                FALSE, person->isOpened );
                gtk_cmctree_node_set_row_data(clist, nodePerson, person );
        }
@@ -3764,8 +3742,8 @@ static void addressbook_folder_load_group( GtkCMCTree *clist, ItemFolder *itemFo
                text[COL_REMARKS] = "";
                nodeGroup = gtk_sctree_insert_node(clist, NULL, NULL,
                                      text, FOLDER_SPACING,
-                                     atci->iconXpm, atci->maskXpm,
-                                     atci->iconXpmOpen, atci->maskXpmOpen,
+                                     atci->iconXpm,
+                                     atci->iconXpmOpen,
                                      FALSE, FALSE);
                gtk_cmctree_node_set_row_data(clist, nodeGroup, group );
                gtk_sctree_sort_node(clist, NULL);
@@ -3851,7 +3829,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;
@@ -4235,11 +4213,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 ) {
@@ -4258,7 +4236,7 @@ static GtkCMCTreeNode *addressbook_add_object(GtkCMCTreeNode *node,
                        gchar **name;
                        name = &obj->name;
                        added = gtk_sctree_insert_node( ctree, node, NULL, name, FOLDER_SPACING,
-                               atci->iconXpm, atci->maskXpm, atci->iconXpmOpen, atci->maskXpmOpen,
+                               atci->iconXpm, atci->iconXpmOpen,
                                atci->treeLeaf, atci->treeExpand );
                        gtk_cmctree_node_set_row_data_full( ctree, added, obj,
                                addressbook_free_treenode );
@@ -4300,7 +4278,7 @@ static GtkCMCTreeNode *addressbook_node_add_group(
        adapter->itemGroup = itemGroup;
 
        newNode = gtk_sctree_insert_node( ctree, node, NULL, name, FOLDER_SPACING,
-                       atci->iconXpm, atci->maskXpm, atci->iconXpm, atci->maskXpm,
+                       atci->iconXpm, atci->iconXpm,
                        atci->treeLeaf, atci->treeExpand );
        gtk_cmctree_node_set_row_data_full( ctree, newNode, adapter,
                addressbook_free_treenode );
@@ -4332,14 +4310,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 ) {
@@ -4353,7 +4335,7 @@ static GtkCMCTreeNode *addressbook_node_add_folder(
 
                name = ADDRITEM_NAME(itemFolder);
                newNode = gtk_sctree_insert_node( ctree, node, NULL, &name, FOLDER_SPACING,
-                               atci->iconXpm, atci->maskXpm, atci->iconXpm, atci->maskXpm,
+                               atci->iconXpm, atci->iconXpm,
                                atci->treeLeaf, atci->treeExpand );
                if( newNode ) {
                        gtk_cmctree_node_set_row_data_full( ctree, newNode, adapter,
@@ -4725,7 +4707,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;
@@ -4774,23 +4756,76 @@ 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 */
-       stock_pixmap_gdk(window, STOCK_PIXMAP_DIR_CLOSE, &folderxpm, &folderxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_DIR_OPEN, &folderopenxpm, &folderopenxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_GROUP, &groupxpm, &groupxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_VCARD, &vcardxpm, &vcardxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_BOOK, &bookxpm, &bookxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_ADDRESS, &addressxpm, &addressxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_JPILOT, &jpilotxpm, &jpilotxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_CATEGORY, &categoryxpm, &categoryxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_LDAP, &ldapxpm, &ldapxpmmask);
-       stock_pixmap_gdk(window, STOCK_PIXMAP_ADDRESS_SEARCH, &addrsearchxpm, &addrsearchxpmmask);
+       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);
+       stock_pixbuf_gdk(window, STOCK_PIXMAP_VCARD, &vcardxpm);
+       stock_pixbuf_gdk(window, STOCK_PIXMAP_BOOK, &bookxpm);
+       stock_pixbuf_gdk(window, STOCK_PIXMAP_ADDRESS, &addressxpm);
+       stock_pixbuf_gdk(window, STOCK_PIXMAP_JPILOT, &jpilotxpm);
+       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;
@@ -4803,10 +4838,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Interface" );
-       atci->iconXpm = folderxpm;
-       atci->maskXpm = folderxpmmask;
-       atci->iconXpmOpen = folderopenxpm;
-       atci->maskXpmOpen = folderopenxpmmask;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4819,10 +4850,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Address Book" );
-       atci->iconXpm = bookxpm;
-       atci->maskXpm = bookxpmmask;
-       atci->iconXpmOpen = bookxpm;
-       atci->maskXpmOpen = bookxpmmask;
        atci->menuCommand = "Menu/Book/NewBook";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4835,10 +4862,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Person" );
-       atci->iconXpm = NULL;
-       atci->maskXpm = NULL;
-       atci->iconXpmOpen = NULL;
-       atci->maskXpmOpen = NULL;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4851,10 +4874,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "Email Address" );
-       atci->iconXpm = addressxpm;
-       atci->maskXpm = addressxpmmask;
-       atci->iconXpmOpen = addressxpm;
-       atci->maskXpmOpen = addressxpmmask;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4867,10 +4886,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Group" );
-       atci->iconXpm = groupxpm;
-       atci->maskXpm = groupxpmmask;
-       atci->iconXpmOpen = groupxpm;
-       atci->maskXpmOpen = groupxpmmask;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4883,10 +4898,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "Folder" );
-       atci->iconXpm = folderxpm;
-       atci->maskXpm = folderxpmmask;
-       atci->iconXpmOpen = folderopenxpm;
-       atci->maskXpmOpen = folderopenxpmmask;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4899,10 +4910,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "vCard" );
-       atci->iconXpm = vcardxpm;
-       atci->maskXpm = vcardxpmmask;
-       atci->iconXpmOpen = vcardxpm;
-       atci->maskXpmOpen = vcardxpmmask;
        atci->menuCommand = "Menu/Book/NewVCard";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4915,10 +4922,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "JPilot" );
-       atci->iconXpm = jpilotxpm;
-       atci->maskXpm = jpilotxpmmask;
-       atci->iconXpmOpen = jpilotxpm;
-       atci->maskXpmOpen = jpilotxpmmask;
        atci->menuCommand = "Menu/Book/NewJPilot";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4931,10 +4934,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "JPilot" );
-       atci->iconXpm = categoryxpm;
-       atci->maskXpm = categoryxpmmask;
-       atci->iconXpmOpen = categoryxpm;
-       atci->maskXpmOpen = categoryxpmmask;
        atci->menuCommand = NULL;
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4947,10 +4946,6 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = TRUE;
        atci->treeLeaf = FALSE;
        atci->displayName = _( "LDAP servers" );
-       atci->iconXpm = ldapxpm;
-       atci->maskXpm = ldapxpmmask;
-       atci->iconXpmOpen = ldapxpm;
-       atci->maskXpmOpen = ldapxpmmask;
        atci->menuCommand = "Menu/Book/NewLDAPServer";
        g_hash_table_insert( _addressBookTypeHash_, &atci->objectType, atci );
        _addressBookTypeList_ = g_list_append( _addressBookTypeList_, atci );
@@ -4963,14 +4958,17 @@ static void addrbookctl_build_map( GtkWidget *window ) {
        atci->treeExpand = FALSE;
        atci->treeLeaf = TRUE;
        atci->displayName = _( "LDAP Query" );
-       atci->iconXpm = addrsearchxpm;
-       atci->maskXpm = addrsearchxpmmask;
-       atci->iconXpmOpen = addrsearchxpm;
-       atci->maskXpmOpen = addrsearchxpmmask;
        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);
 }
 
 /*
@@ -5164,7 +5162,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 ) {