2005-06-14 [paul] 1.9.11cvs66
[claws.git] / src / account.c
index de12078ffd975553b478fa471293f949bd57fccf..fd6e7336737d4453829431156ce277394f30e96e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2004 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2005 Hiroyuki Yamamoto
  *
  * 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
 #include "defs.h"
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <stdio.h>
 #include <errno.h>
 
-#include "intl.h"
 #include "main.h"
 #include "mainwindow.h"
 #include "folderview.h"
@@ -37,6 +37,7 @@
 #include "account.h"
 #include "prefs_gtk.h"
 #include "prefs_account.h"
+#include "prefs_common.h"
 #include "folder_item_prefs.h"
 #include "compose.h"
 #include "manage_window.h"
@@ -157,6 +158,20 @@ static void account_double_clicked         (GtkTreeView            *list_view,
                                                 GtkTreePath            *path,
                                                 GtkTreeViewColumn      *column,
                                                 gpointer                data);
+                                                
+static void drag_begin                         (GtkTreeView *list_view,
+                                                GdkDragContext *context,
+                                                gpointer data);
+
+static void drag_end                           (GtkTreeView *list_view,
+                                                GdkDragContext *context,
+                                                gpointer data);
+                     
+static void account_row_changed_while_drag_drop        (GtkTreeModel *model, 
+                                                GtkTreePath  *path,
+                                                GtkTreeIter  *iter,
+                                                gpointer      arg3,
+                                                GtkTreeView  *list_view);
 
 void account_read_config_all(void)
 {
@@ -529,10 +544,16 @@ FolderItem *account_get_special_folder(PrefsAccount *ac_prefs,
                }
                break;
        case F_QUEUE:
-               if (ac_prefs->folder)
-                       item = FOLDER(ac_prefs->folder)->queue;
-               if (!item)
-                       item = folder_get_default_queue();
+               if (ac_prefs->set_queue_folder && ac_prefs->queue_folder) {
+                       item = folder_find_item_from_identifier
+                               (ac_prefs->queue_folder);
+               }
+               if (!item) {
+                       if (ac_prefs->folder)
+                               item = FOLDER(ac_prefs->folder)->queue;
+                       if (!item)
+                               item = folder_get_default_queue();
+               }
                break;
        case F_TRASH:
                if (ac_prefs->set_trash_folder && ac_prefs->trash_folder) {
@@ -582,8 +603,6 @@ static void account_edit_create(void)
        GtkWidget *hbox;
        GtkWidget *scrolledwin;
        GtkWidget *list_view;
-       gchar *titles[N_EDIT_ACCOUNT_COLS];
-       gint i;
 
        GtkWidget *vbox2;
        GtkWidget *add_btn;
@@ -601,7 +620,7 @@ static void account_edit_create(void)
        debug_print("Creating account edit window...\n");
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_widget_set_usize (window, 500, 350);
+       gtk_widget_set_size_request (window, 500, 350);
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
        gtk_window_set_title (GTK_WINDOW (window), _("Edit accounts"));
        gtk_window_set_modal (GTK_WINDOW (window), TRUE);
@@ -647,37 +666,41 @@ static void account_edit_create(void)
        gtk_widget_show (vbox2);
        gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
 
-       add_btn = gtk_button_new_with_label (_("Add"));
+       add_btn = gtk_button_new_from_stock(GTK_STOCK_ADD);
        gtk_widget_show (add_btn);
        gtk_box_pack_start (GTK_BOX (vbox2), add_btn, FALSE, FALSE, 4);
        g_signal_connect (G_OBJECT(add_btn), "clicked",
                          G_CALLBACK (account_add), NULL);
 
-       edit_btn = gtk_button_new_with_label (_("Edit"));
+#ifdef GTK_STOCK_EDIT
+       edit_btn = gtk_button_new_from_stock (GTK_STOCK_EDIT);
+#else
+       edit_btn = gtk_button_new_from_stock(GTK_STOCK_PROPERTIES);
+#endif
        gtk_widget_show (edit_btn);
        gtk_box_pack_start (GTK_BOX (vbox2), edit_btn, FALSE, FALSE, 4);
        g_signal_connect (G_OBJECT(edit_btn), "clicked",
                          G_CALLBACK (account_edit_prefs), NULL);
 
-       del_btn = gtk_button_new_with_label (_(" Delete "));
+       del_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
        gtk_widget_show (del_btn);
        gtk_box_pack_start (GTK_BOX (vbox2), del_btn, FALSE, FALSE, 4);
        g_signal_connect (G_OBJECT(del_btn), "clicked",
                          G_CALLBACK (account_delete), NULL);
 
-       clone_btn = gtk_button_new_with_label (_(" Clone "));
+       clone_btn = gtk_button_new_from_stock(GTK_STOCK_COPY);
        gtk_widget_show (clone_btn);
        gtk_box_pack_start (GTK_BOX (vbox2), clone_btn, FALSE, FALSE, 4);
        g_signal_connect(G_OBJECT(clone_btn), "clicked",
                         G_CALLBACK(account_clone), NULL);
        
-       down_btn = gtk_button_new_with_label (_("Down"));
+       down_btn = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
        gtk_widget_show (down_btn);
        gtk_box_pack_end (GTK_BOX (vbox2), down_btn, FALSE, FALSE, 4);
        g_signal_connect (G_OBJECT(down_btn), "clicked",
                          G_CALLBACK (account_down), NULL);
 
-       up_btn = gtk_button_new_with_label (_("Up"));
+       up_btn = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
        gtk_widget_show (up_btn);
        gtk_box_pack_end (GTK_BOX (vbox2), up_btn, FALSE, FALSE, 4);
        g_signal_connect (G_OBJECT(up_btn), "clicked",
@@ -697,9 +720,14 @@ static void account_edit_create(void)
        g_signal_connect (G_OBJECT(default_btn), "clicked",
                          G_CALLBACK (account_set_default), NULL);
 
-       gtkut_button_set_create(&hbbox, &close_btn, _("Close"),
-                               NULL, NULL, NULL, NULL);
+       hbbox = gtk_hbutton_box_new();
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END);
+       gtk_box_set_spacing(GTK_BOX(hbbox), 5);
+
+       gtkut_stock_button_set_create(&hbbox, &close_btn, GTK_STOCK_CLOSE,
+                                     NULL, NULL, NULL, NULL);
        gtk_widget_show(hbbox);
+
        gtk_box_pack_end (GTK_BOX (hbox), hbbox, FALSE, FALSE, 0);
        gtk_widget_grab_default (close_btn);
 
@@ -707,6 +735,7 @@ static void account_edit_create(void)
                          G_CALLBACK (account_edit_close),
                          NULL);
 
+       account_create_list_view_images(list_view);
 
        edit_account.window    = window;
        edit_account.list_view = list_view;
@@ -898,7 +927,6 @@ static void account_clone(GtkWidget *widget, gpointer data)
 static void account_delete(GtkWidget *widget, gpointer data)
 {
        PrefsAccount *ac_prefs;
-       gint account_id;
        GList *list;
        Folder *folder;
  
@@ -1106,10 +1134,11 @@ static void account_list_view_add(PrefsAccount *ac_prefs)
                         ac_prefs->protocol == A_LOCAL);
        getall = has_getallbox && ac_prefs->recv_at_getall;
 
-       return account_list_view_insert_account_item(list_store,
-                                                    name, protocol, server,
-                                                    ac_prefs->is_default,
-                                                    getall, ac_prefs);
+       account_list_view_insert_account_item(list_store,
+                                            name, protocol, server,
+                                            ac_prefs->is_default,
+                                            getall, ac_prefs);
+       return;
 }
 
 static void account_list_view_set(void)
@@ -1282,18 +1311,16 @@ static GtkWidget *account_list_view_create(void)
 {
        GtkTreeView *list_view;
        GtkTreeSelection *selector;
+       GtkListStore *store = account_create_data_store();
 
-       list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL
-               (account_create_data_store())));
-       
-       gtk_tree_view_set_rules_hint(list_view, TRUE);
+       list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
+       g_object_unref(G_OBJECT(store));
+
+       gtk_tree_view_set_rules_hint(list_view, prefs_common.enable_rules_hint);
        
        selector = gtk_tree_view_get_selection(list_view);
        gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
 
-       /* create the pixbufs */
-       account_create_list_view_images(GTK_WIDGET(list_view));
-
        /* create the columns */
        account_create_list_view_columns(GTK_WIDGET(list_view));
 
@@ -1302,26 +1329,21 @@ static GtkWidget *account_list_view_create(void)
                         G_CALLBACK(account_double_clicked),
                         list_view);
 
+       g_signal_connect(G_OBJECT(list_view), "drag_begin",                      
+                        G_CALLBACK(drag_begin),
+                        list_view);
+                        
+       g_signal_connect(G_OBJECT(list_view), "drag_end",                        
+                        G_CALLBACK(drag_end),
+                        list_view);
+                        
+       gtk_tree_view_set_reorderable(list_view, TRUE);
        return GTK_WIDGET(list_view);
 }
 
 static void account_create_list_view_images(GtkWidget *list_view)
 {
-       GdkPixmap *markxpm;
-       GdkBitmap *markxpmmask;
-       const guchar *pixdata;
-       GdkPixbuf *pbuf;
-       
-       stock_pixmap_gdk(list_view, STOCK_PIXMAP_MARK, &markxpm, &markxpmmask);
-
-       pbuf = gdk_pixbuf_get_from_drawable(NULL, markxpm, NULL,
-                                           0, 0, 0, 0, -1, -1);
-       pixdata = gdk_pixbuf_get_pixels(pbuf);
-       mark_pixbuf = gdk_pixbuf_add_alpha(pbuf, TRUE, 
-                                          pixdata[0],
-                                          pixdata[1],
-                                          pixdata[2]);
-       g_object_unref(pbuf);
+       stock_pixbuf_gdk(list_view, STOCK_PIXMAP_MARK, &mark_pixbuf);
 }
 
 static void account_create_list_view_columns(GtkWidget *list_view)
@@ -1400,7 +1422,6 @@ GtkTreePath *account_list_view_get_selected_account_path(GtkWidget *list_view)
        GtkTreeSelection *selector;
        GtkTreeModel *model;
        GtkTreeIter iter;
-       GtkTreePath *res;
 
        selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
        
@@ -1562,3 +1583,37 @@ static void account_double_clicked(GtkTreeView           *list_view,
 {
        account_edit_prefs(NULL, NULL); 
 }
+
+static void drag_begin(GtkTreeView *list_view,
+                     GdkDragContext *context,
+                     gpointer data)
+{
+       /* XXX unfortunately a completed drag & drop does not emit 
+        * a "rows_reordered" signal, but a "row_changed" signal.
+        * So during drag and drop, listen to "row_changed", and
+        * update the account list accordingly */
+
+       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
+       g_signal_connect(G_OBJECT(model), "row_changed",
+                        G_CALLBACK(account_row_changed_while_drag_drop),
+                        list_view);
+}
+
+static void drag_end(GtkTreeView *list_view,
+                   GdkDragContext *context,
+                   gpointer data)
+{
+       GtkTreeModel *model = gtk_tree_view_get_model(list_view);
+       g_signal_handlers_disconnect_by_func(G_OBJECT(model),
+                                            G_CALLBACK(account_row_changed_while_drag_drop),
+                                            list_view);
+}
+
+static void account_row_changed_while_drag_drop(GtkTreeModel *model, 
+                                  GtkTreePath  *path,
+                                  GtkTreeIter  *iter,
+                                  gpointer      arg3,
+                                  GtkTreeView  *list_view)
+{      
+       account_list_set();     
+}