2005-07-15 [colin] 1.9.12cvs60
[claws.git] / src / addressbook.c
index c60102b159970fe7c2392f23c88e25857eda7660..c61c571da8d9f23edfa1e091e35b24942822c83c 100644 (file)
@@ -24,6 +24,7 @@
 #include "defs.h"
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtkwindow.h>
 #include <gtk/gtksignal.h>
@@ -44,7 +45,6 @@
 #include <string.h>
 #include <setjmp.h>
 
-#include "intl.h"
 #include "main.h"
 #include "addressbook.h"
 #include "manage_window.h"
@@ -1115,6 +1115,8 @@ static void addressbook_del_clicked(GtkButton *button, gpointer data)
                        else if( aio->type == ADDR_ITEM_PERSON ) {
                                ItemPerson *item = ( ItemPerson * ) aio;
                                addressbook_folder_remove_one_person( clist, item );
+                               if (pobj->type == ADDR_ITEM_FOLDER)
+                                       addritem_folder_remove_person((ItemFolder *)pobj, item);
                                item = addrbook_remove_person( abf, item );
                                if( item ) {
                                        addritem_free_item_person( item );
@@ -1132,7 +1134,10 @@ static void addressbook_del_clicked(GtkButton *button, gpointer data)
                }
                g_list_free( list );
                addressbook_list_select_clear();
-               if( refreshList ) gtk_ctree_select( ctree, addrbook.opened);
+               if( refreshList ) 
+                       gtk_ctree_select( ctree, addrbook.opened);
+               addrbook_set_dirty(abf, TRUE);
+               addressbook_export_to_file();
                return;
        }
        else if( pobj->type == ADDR_ITEM_GROUP ) {
@@ -1155,6 +1160,8 @@ static void addressbook_del_clicked(GtkButton *button, gpointer data)
                g_list_free( list );
                addressbook_list_select_clear();
                gtk_ctree_select( ctree, addrbook.opened);
+               addrbook_set_dirty(abf, TRUE);
+               addressbook_export_to_file();
                return;
        }
 
@@ -1896,7 +1903,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 ); */
+               printf( "list select: %d : '%s'\n", aio->type, aio->name );
                addressbook_list_select_add( aio, ds );
        }
 
@@ -2374,15 +2381,12 @@ static void addressbook_treenode_delete_cb(
                        }
                }
                else {
-                       message = g_strdup_printf( _(
-                               "Do you want to delete the folder " \
-                               "AND all addresses in `%s' ? \n" \
-                               "If deleting the folder only, addresses " \
-                               "will be moved into parent folder." ),
-                               obj->name );
-                       aval = alertpanel( _("Delete"), message,
-                               _("Folder only"),
-                               _("Folder and Addresses"),
+                       message = g_strdup_printf
+                               ( _( "Do you want to delete the folder AND all addresses in `%s' ?\n"
+                                    "If deleting the folder only, addresses will be moved into parent folder." ),
+                                obj->name );
+                       aval = alertpanel( _("Delete folder"), message,
+                               _("_Folder only"), _("Folder and _addresses"),
                                GTK_STOCK_CANCEL );
                        g_free(message);
                        if( aval == G_ALERTDEFAULT ) {
@@ -2811,7 +2815,6 @@ static void addressbook_folder_load_one_person(
                                FALSE, person->isOpened );
                gtk_ctree_node_set_row_data(clist, nodePerson, person );
        }
-       gtk_sctree_sort_node(GTK_CTREE(clist), NULL);
        return;
 }
 
@@ -3069,7 +3072,7 @@ static void addressbook_set_clist( AddressObject *obj ) {
                        addressbook_folder_load_group( ctreelist, itemFolder );
                }
        }
-       /* gtk_clist_sort(clist); */
+       gtk_sctree_sort_node(GTK_CTREE(clist), NULL);
        gtk_clist_thaw(clist);
 }
 
@@ -3733,7 +3736,7 @@ static void addressbook_perform_search(
        gchar *name;
        gint queryID;
        guint idleID;
-       AddressObjectType aoType;
+       AddressObjectType aoType = ADDR_NONE;
 
        /* Setup a query */
        if( *searchTerm == '\0' || strlen( searchTerm ) < 1 ) return;
@@ -4508,7 +4511,7 @@ static void addressbook_start_drag(GtkWidget *widget, gint button,
        gtk_drag_set_icon_default(context);
 }
 
-static ItemPerson *dragged_person = NULL;
+static GSList *dragged_persons = NULL;
 static ItemFolder *dragged_folder = NULL;
 static AddressBookFile *dragged_ab = NULL;
 
@@ -4523,6 +4526,7 @@ static void addressbook_drag_data_get(GtkWidget        *widget,
        AddressObject *pobj = NULL;
        AdapterDSource *ads = NULL;
        AddressDataSource *ds = NULL;
+       GList *cur;
 
        pobj = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), addrbook.treeSelected );
        if( pobj == NULL ) return;
@@ -4539,16 +4543,20 @@ static void addressbook_drag_data_get(GtkWidget        *widget,
                if (!ds)
                        return;
        }
-       if (addrbook.listSelected)
-               aio = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.clist), 
-                               addrbook.listSelected );
        
-       while (aio && aio->type != ADDR_ITEM_PERSON) {
-               aio = aio->parent;
+
+       for(cur = GTK_CLIST(addrbook.clist)->selection; cur; cur = cur->next) {
+               aio = (AddrItemObject *)gtk_ctree_node_get_row_data(GTK_CTREE(addrbook.clist), 
+                       GTK_CTREE_NODE(cur->data));
+               while (aio && aio->type != ADDR_ITEM_PERSON) {
+                       aio = aio->parent;
+               }
+               if (aio) {
+                       dragged_persons = g_slist_append(dragged_persons, aio);
+               }
        }
 
        if (aio && aio->type == ADDR_ITEM_PERSON) {
-               dragged_person = (ItemPerson *)aio;
                dragged_folder = (ItemFolder *)ADAPTER_FOLDER(pobj)->itemFolder;
                dragged_ab = addressbook_get_book_file();
 
@@ -4565,13 +4573,15 @@ static void addressbook_drag_data_get(GtkWidget        *widget,
                                    drag_context->action = GDK_ACTION_COPY;
                        } else {
                                dragged_folder = NULL;
-                               dragged_person = NULL;
+                               g_slist_free(dragged_persons);
+                               dragged_persons = NULL;
                                dragged_ab = NULL;
                        }
                }
        } else {
                dragged_folder = NULL;
-               dragged_person = NULL;
+               g_slist_free(dragged_persons);
+               dragged_persons = NULL;
                dragged_ab = NULL;
        }
 }
@@ -4678,38 +4688,35 @@ static void addressbook_drag_received_cb(GtkWidget        *widget,
                AddressObject *obj = NULL;
                AdapterDSource *ads = NULL;
                AddressDataSource *ds = NULL;
-               
+               GSList *cur = dragged_persons;
+
                if (gtk_clist_get_selection_info
                        (GTK_CLIST(widget), x - 24, y - 24, &row, &column) == 0) {
-                       return;
+                       goto free_list;
                }
        
                node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
                if( node ) 
                        obj = gtk_ctree_node_get_row_data(GTK_CTREE(addrbook.ctree), node );
                if( obj == NULL ) 
-                       return;
-                       
-               
-               
-               person = ( ItemPerson * )dragged_person;
-               
+                       goto free_list;
+                               
                if (obj->type == ADDR_ITEM_FOLDER) {
                        afolder = ADAPTER_FOLDER(obj)->itemFolder;
 
                } else if (obj->type == ADDR_DATASOURCE) {
                        ads = ADAPTER_DSOURCE(obj);
                        if( ads == NULL ) 
-                               return;
+                               goto free_list;
                        ds = ads->dataSource;
                        if( ds == NULL ||
                            ds->type == ADDR_IF_JPILOT || 
                            ds->type == ADDR_IF_LDAP) 
-                               return;         
+                               goto free_list;         
                        afolder = addrindex_ds_get_root_folder( ds );
                        
                } else {
-                       return;
+                       goto free_list;
                }
 
                ofolder = dragged_folder;
@@ -4717,8 +4724,11 @@ static void addressbook_drag_received_cb(GtkWidget        *widget,
                if (afolder && ofolder) {
                        AddressBookFile *obook = dragged_ab;
                        AddressBookFile *abook = addressbook_get_book_file_for_node(node);
-                       addritem_folder_remove_person(ofolder, person);
-                       addritem_folder_add_person(afolder, person);
+                       for (cur = dragged_persons; cur; cur = cur->next) {
+                               person = (ItemPerson *)cur->data;
+                               addritem_folder_remove_person(ofolder, person);
+                               addritem_folder_add_person(afolder, person);
+                       }
                        addressbook_list_select_clear();
                        gtk_ctree_select( GTK_CTREE(addrbook.ctree), addrbook.opened);
                                                        
@@ -4734,6 +4744,9 @@ static void addressbook_drag_received_cb(GtkWidget        *widget,
 
                gtk_drag_finish(drag_context, TRUE, TRUE, time);
        }
+free_list:
+       g_slist_free(dragged_persons);
+       dragged_persons = NULL;
 }
 
 /*