2005-12-20 [paul] 1.9.100cvs96
[claws.git] / src / account.c
index 6a79b53e7dbf2d3f4489346be94d9eb941ddfb3a..e05f8c841d8bbfb73c21a982250bd2479d7a1aec 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
@@ -14,7 +14,7 @@
  *
  * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
 #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"
@@ -101,6 +102,8 @@ static void account_edit_close              (GtkWidget *widget, gpointer data);
 static gint account_delete_event       (GtkWidget      *widget,
                                         GdkEventAny    *event,
                                         gpointer        data);
+static void account_size_allocate_cb(GtkWidget *widget,
+                                        GtkAllocation *allocation);
 static gboolean account_key_pressed    (GtkWidget      *widget,
                                         GdkEventKey    *event,
                                         gpointer        data);
@@ -183,7 +186,7 @@ void account_read_config_all(void)
        debug_print("Reading all config for each account...\n");
 
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
-       if ((fp = fopen(rcpath, "rb")) == NULL) {
+       if ((fp = g_fopen(rcpath, "rb")) == NULL) {
                if (ENOENT != errno) FILE_OP_ERROR(rcpath, "fopen");
                g_free(rcpath);
                return;
@@ -346,6 +349,11 @@ void account_set_menu(void)
        main_window_set_account_menu(account_list);
 }
 
+void account_set_menu_only_toolbar(void)
+{
+       main_window_set_account_menu_only_toolbar(account_list);
+}
+
 void account_foreach(AccountFunc func, gpointer user_data)
 {
        GList *cur;
@@ -411,7 +419,10 @@ void account_add(void)
                        folder = folder_new(folder_get_class_from_string("news"), ac_prefs->account_name,
                                            ac_prefs->nntp_server);
                }
-
+               if (folder == NULL) {
+                       alertpanel_error(_("Can't create folder."));
+                       return;
+               }
                folder->account = ac_prefs;
                ac_prefs->folder = folder;
                folder_add(folder);
@@ -494,7 +505,8 @@ void account_set_missing_folder(void)
                                folder = folder_new(folder_get_class_from_string("news"), ap->account_name,
                                                    ap->nntp_server);
                        }
-
+                       if (folder == NULL)
+                               return;
                        folder->account = ap;
                        ap->folder = folder;
                        folder_add(folder);
@@ -543,10 +555,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) {
@@ -587,6 +605,17 @@ void account_destroy(PrefsAccount *ac_prefs)
        }
 }
 
+/*!
+ *\brief       Save Gtk object size to prefs dataset
+ */
+static void account_size_allocate_cb(GtkWidget *widget,
+                                        GtkAllocation *allocation)
+{
+       g_return_if_fail(allocation != NULL);
+
+       prefs_common.accountswin_width = allocation->width;
+       prefs_common.accountswin_height = allocation->height;
+}
 
 static void account_edit_create(void)
 {
@@ -596,8 +625,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;
@@ -612,10 +639,11 @@ static void account_edit_create(void)
        GtkWidget *hbbox;
        GtkWidget *close_btn;
 
+       static GdkGeometry geometry;
+
        debug_print("Creating account edit window...\n");
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_widget_set_usize (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);
@@ -636,7 +664,7 @@ static void account_edit_create(void)
 
        label = gtk_label_new
                (_("New messages will be checked in this order. Check the boxes\n"
-                  "on the `G' column to enable message retrieval by `Get all'."));
+                  "on the 'G' column to enable message retrieval by 'Get all'."));
        gtk_widget_show (label);
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4);
        gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
@@ -661,19 +689,23 @@ 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_from_stock(GTK_STOCK_ADD);
+       add_btn = gtk_button_new_from_stock(GTK_STOCK_NEW);
        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);
 
+#if GTK_CHECK_VERSION(2, 6, 0)
+       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_from_stock(GTK_STOCK_REMOVE);
+       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",
@@ -705,7 +737,8 @@ static void account_edit_create(void)
        gtk_widget_show (vbox2);
        gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
 
-       default_btn = gtk_button_new_with_label (_(" Set as default account "));
+       default_btn = gtk_button_new_with_mnemonic
+               (_(" _Set as default account "));
        gtk_widget_show (default_btn);
        gtk_box_pack_start (GTK_BOX (vbox2), default_btn, TRUE, FALSE, 0);
        g_signal_connect (G_OBJECT(default_btn), "clicked",
@@ -715,7 +748,7 @@ static void account_edit_create(void)
        gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END);
        gtk_box_set_spacing(GTK_BOX(hbbox), 5);
 
-       gtkut_button_set_create_stock(&hbbox, &close_btn, GTK_STOCK_CLOSE,
+       gtkut_stock_button_set_create(&hbbox, &close_btn, GTK_STOCK_CLOSE,
                                      NULL, NULL, NULL, NULL);
        gtk_widget_show(hbbox);
 
@@ -726,6 +759,20 @@ static void account_edit_create(void)
                          G_CALLBACK (account_edit_close),
                          NULL);
 
+       account_create_list_view_images(list_view);
+
+       g_signal_connect(G_OBJECT(window), "size_allocate",
+                        G_CALLBACK(account_size_allocate_cb), NULL);
+
+       if (!geometry.min_height) {
+               geometry.min_width = 500;
+               geometry.min_height = 350;
+       }
+
+       gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE);
+       gtk_widget_set_size_request(window, prefs_common.accountswin_width,
+                                   prefs_common.accountswin_height);
 
        edit_account.window    = window;
        edit_account.list_view = list_view;
@@ -781,13 +828,13 @@ static void account_clone(GtkWidget *widget, gpointer data)
                return;
 
        if (ac_prefs->protocol == A_IMAP4 || ac_prefs->protocol == A_NNTP) {
-               alertpanel_error(_("Accounts with remote folders cannot be cloned"));
+               alertpanel_error(_("Accounts with remote folders cannot be copied."));
                return;
        }
        
        ac_clon = prefs_account_new();
        /* copy fields */
-       ac_clon->account_name = g_strdup_printf(_("Cloned %s"), 
+       ac_clon->account_name = g_strdup_printf(_("Copy of %s"),
                                                ac_prefs->account_name);
        /* personal */
        ACP_FDUP(name);
@@ -917,7 +964,7 @@ static void account_clone(GtkWidget *widget, gpointer data)
 static void account_delete(GtkWidget *widget, gpointer data)
 {
        PrefsAccount *ac_prefs;
-       gint account_id;
+       gchar buf[BUFFSIZE];
        GList *list;
        Folder *folder;
  
@@ -925,9 +972,13 @@ static void account_delete(GtkWidget *widget, gpointer data)
        if (ac_prefs == NULL)
                return;
 
-       if (alertpanel(_("Delete account"),
-                      _("Do you really want to delete this account?"),
-                      _("Yes"), _("+No"), NULL) != G_ALERTDEFAULT)
+       g_snprintf(buf, sizeof(buf),
+                  _("Do you really want to delete the account '%s'?"),
+                  ac_prefs->account_name ? ac_prefs->account_name :
+                  _("(Untitled)"));
+       if (alertpanel_full(_("Delete account"), buf,
+                           GTK_STOCK_YES, GTK_STOCK_NO, NULL, FALSE,
+                           NULL, ALERT_WARNING, G_ALERTALTERNATE) != G_ALERTDEFAULT)
                return;
 
        if (ac_prefs->folder) {
@@ -1125,10 +1176,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)
@@ -1306,14 +1358,12 @@ static GtkWidget *account_list_view_create(void)
        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, TRUE);
+       gtk_tree_view_set_rules_hint(list_view, prefs_common.enable_rules_hint);
+       gtk_tree_view_set_reorderable(list_view, TRUE);
        
        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));
 
@@ -1336,21 +1386,7 @@ static GtkWidget *account_list_view_create(void)
 
 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)
@@ -1429,7 +1465,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));