2006-02-01 [paul] 2.0.0cvs4
[claws.git] / src / mainwindow.c
index 336ff6a57cbc6df1460304c1eb51ea9ee6afd69f..04f623b6e14210c871ffa083eded72c4bd9faf94 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2005 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws 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,6 +91,7 @@
 #include "filtering.h"
 #include "folderutils.h"
 #include "foldersort.h"
+#include "icon_legend.h"
 
 #define AC_LABEL_WIDTH 240
 
@@ -415,6 +416,9 @@ static void manual_open_cb   (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
 
+static void legend_open_cb      (GtkMenuItem   *menuitem,
+                                 gpointer       data);
+
 static void scan_tree_func      (Folder        *folder,
                                  FolderItem    *item,
                                  gpointer       data);
@@ -451,7 +455,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_File/_Add mailbox"),             NULL, NULL, 0, "<Branch>"},
        {N_("/_File/_Add mailbox/MH..."),       NULL, add_mailbox_cb, 0, NULL},
        {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
-       {N_("/_File/Change folder order"),      NULL, foldersort_cb,  0, NULL},
+       {N_("/_File/Change folder order..."),   NULL, foldersort_cb,  0, NULL},
        {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_File/_Import mbox file..."),     NULL, import_mbox_cb, 0, NULL},
        {N_("/_File/_Export to mbox file..."),  NULL, export_mbox_cb, 0, NULL},
@@ -486,14 +490,16 @@ static GtkItemFactoryEntry mainwin_entries[] =
                                                "V", toggle_message_cb, 0, "<ToggleItem>"},
        {N_("/_View/Show or hi_de/_Toolbar"),
                                                NULL, NULL, 0, "<Branch>"},
-       {N_("/_View/Show or hi_de/_Toolbar/Icon _and text"),
+       {N_("/_View/Show or hi_de/_Toolbar/Text _below icons"),
                                                NULL, toggle_toolbar_cb, TOOLBAR_BOTH, "<RadioItem>"},
-       {N_("/_View/Show or hi_de/_Toolbar/_Icon"),
-                                               NULL, toggle_toolbar_cb, TOOLBAR_ICON, "/View/Show or hide/Toolbar/Icon and text"},
-       {N_("/_View/Show or hi_de/_Toolbar/_Text"),
-                                               NULL, toggle_toolbar_cb, TOOLBAR_TEXT, "/View/Show or hide/Toolbar/Icon and text"},
-       {N_("/_View/Show or hi_de/_Toolbar/_None"),
-                                               NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Icon and text"},
+       {N_("/_View/Show or hi_de/_Toolbar/Text be_side icons"),
+                                               NULL, toggle_toolbar_cb, TOOLBAR_BOTH_HORIZ, "/View/Show or hide/Toolbar/Text below icons"},
+       {N_("/_View/Show or hi_de/_Toolbar/_Icons only"),
+                                               NULL, toggle_toolbar_cb, TOOLBAR_ICON, "/View/Show or hide/Toolbar/Text below icons"},
+       {N_("/_View/Show or hi_de/_Toolbar/_Text only"),
+                                               NULL, toggle_toolbar_cb, TOOLBAR_TEXT, "/View/Show or hide/Toolbar/Text below icons"},
+       {N_("/_View/Show or hi_de/_Toolbar/_Hide"),
+                                               NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Text below icons"},
        {N_("/_View/Show or hi_de/Status _bar"),
                                                NULL, toggle_statusbar_cb, 0, "<ToggleItem>"},
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
@@ -532,23 +538,23 @@ static GtkItemFactoryEntry mainwin_entries[] =
 
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/_Go to"),                   NULL, NULL, 0, "<Branch>"},
-       {N_("/_View/_Go to/_Prev message"),     "P", prev_cb, 0, NULL},
+       {N_("/_View/_Go to/_Previous message"), "P", prev_cb, 0, NULL},
        {N_("/_View/_Go to/_Next message"),     "N", next_cb, 0, NULL},
        {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
-       {N_("/_View/_Go to/P_rev unread message"),
+       {N_("/_View/_Go to/P_revious unread message"),
                                                "<shift>P", prev_unread_cb, 0, NULL},
        {N_("/_View/_Go to/N_ext unread message"),
                                                "<shift>N", next_unread_cb, 0, NULL},
        {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
-       {N_("/_View/_Go to/Prev ne_w message"), NULL, prev_new_cb, 0, NULL},
+       {N_("/_View/_Go to/Previous ne_w message"),     NULL, prev_new_cb, 0, NULL},
        {N_("/_View/_Go to/Ne_xt new message"), NULL, next_new_cb, 0, NULL},
        {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
-       {N_("/_View/_Go to/Prev _marked message"),
+       {N_("/_View/_Go to/Previous _marked message"),
                                                NULL, prev_marked_cb, 0, NULL},
        {N_("/_View/_Go to/Next m_arked message"),
                                                NULL, next_marked_cb, 0, NULL},
        {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
-       {N_("/_View/_Go to/Prev _labeled message"),
+       {N_("/_View/_Go to/Previous _labeled message"),
                                                NULL, prev_labeled_cb, 0, NULL},
        {N_("/_View/_Go to/Next la_beled message"),
                                                NULL, next_labeled_cb, 0, NULL},
@@ -599,6 +605,12 @@ static GtkItemFactoryEntry mainwin_entries[] =
         ENC_ACTION(C_CP1255)},
        ENC_SEPARATOR,
 
+       {N_("/_View/Character _encoding/Arabic (ISO-8859-_6)"),
+        ENC_ACTION(C_ISO_8859_6)},
+       {N_("/_View/Character _encoding/Arabic (Windows-1256)"),
+        ENC_ACTION(C_CP1256)},
+       ENC_SEPARATOR,
+
        {N_("/_View/Character _encoding/Turkish (ISO-8859-_9)"),
         ENC_ACTION(C_ISO_8859_9)},
        ENC_SEPARATOR,
@@ -791,9 +803,9 @@ static GtkItemFactoryEntry mainwin_entries[] =
 
        {N_("/_Help"),                          NULL, NULL, 0, "<Branch>"},
        {N_("/_Help/_Manual"),                  NULL, manual_open_cb, MANUAL_MANUAL_LOCAL, NULL},
-       {N_("/_Help/_FAQ"),                     NULL, manual_open_cb, MANUAL_FAQ_LOCAL, NULL},
        {N_("/_Help/_Online User-contributed FAQ"),     
                                                NULL, manual_open_cb, MANUAL_FAQ_CLAWS, NULL},
+       {N_("/_Help/Icon _Legend"),             NULL, legend_open_cb, 0, NULL},
        {N_("/_Help/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_Help/_About"),                   NULL, about_show, 0, NULL}
 };
@@ -897,7 +909,6 @@ MainWindow *main_window_create(SeparateType type)
        ifactory = gtk_item_factory_from_widget(menubar);
 
        menu_set_sensitive(ifactory, "/Help/Manual", manual_available(MANUAL_MANUAL_LOCAL));
-       menu_set_sensitive(ifactory, "/Help/FAQ", manual_available(MANUAL_FAQ_LOCAL));
 
        if (prefs_common.toolbar_detachable) {
                handlebox = gtk_handle_box_new();
@@ -963,7 +974,6 @@ MainWindow *main_window_create(SeparateType type)
        ac_button = gtk_button_new();
        gtk_tooltips_set_tip(GTK_TOOLTIPS(sel_ac_tip),
                             ac_button, _("Select account"), NULL);
-       gtk_button_set_relief(GTK_BUTTON(ac_button), GTK_RELIEF_NONE);
        GTK_WIDGET_UNSET_FLAGS(ac_button, GTK_CAN_FOCUS);
        gtk_widget_set_size_request(ac_button, -1, 0);
        gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
@@ -1066,19 +1076,24 @@ MainWindow *main_window_create(SeparateType type)
        switch (prefs_common.toolbar_style) {
        case TOOLBAR_NONE:
                menuitem = gtk_item_factory_get_item
-                       (ifactory, "/View/Show or hide/Toolbar/None");
+                       (ifactory, "/View/Show or hide/Toolbar/Hide");
                break;
        case TOOLBAR_ICON:
                menuitem = gtk_item_factory_get_item
-                       (ifactory, "/View/Show or hide/Toolbar/Icon");
+                       (ifactory, "/View/Show or hide/Toolbar/Icons only");
                break;
        case TOOLBAR_TEXT:
                menuitem = gtk_item_factory_get_item
-                       (ifactory, "/View/Show or hide/Toolbar/Text");
+                       (ifactory, "/View/Show or hide/Toolbar/Text only");
                break;
        case TOOLBAR_BOTH:
                menuitem = gtk_item_factory_get_item
-                       (ifactory, "/View/Show or hide/Toolbar/Icon and text");
+                       (ifactory, "/View/Show or hide/Toolbar/Text below icons");
+               break;
+       case TOOLBAR_BOTH_HORIZ:
+               menuitem = gtk_item_factory_get_item
+                       (ifactory,
+                        "/View/Show or hide/Toolbar/Text beside icons");
        }
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
 
@@ -1115,8 +1130,8 @@ MainWindow *main_window_create(SeparateType type)
        menu_connect_identical_items();
 
 
-       
-       /* show main window */
+       gtk_window_iconify(GTK_WINDOW(mainwin->window));
+
        gtk_widget_show(mainwin->window);
 
        /* initialize views */
@@ -1375,6 +1390,42 @@ static void main_window_set_account_receive_menu(MainWindow *mainwin,
        }
 }
 
+static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
+                                                      GList *account_list)
+{
+       GList *cur_ac, *cur_item;
+       GtkWidget *menuitem;
+       PrefsAccount *ac_prefs;
+       GtkWidget *menu = NULL;
+
+       if (mainwin->toolbar->getall_btn == NULL
+       ||  mainwin->toolbar->getall_combo == NULL) /* button doesn't exist */
+               return;
+
+       menu = mainwin->toolbar->getall_combo->menu;
+
+       /* destroy all previous menu item */
+       cur_item = GTK_MENU_SHELL(menu)->children;
+       while (cur_item != NULL) {
+               GList *next = cur_item->next;
+               gtk_widget_destroy(GTK_WIDGET(cur_item->data));
+               cur_item = next;
+       }
+
+       for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
+               ac_prefs = (PrefsAccount *)cur_ac->data;
+
+               menuitem = gtk_menu_item_new_with_label
+                       (ac_prefs->account_name
+                        ? ac_prefs->account_name : _("Untitled"));
+               gtk_widget_show(menuitem);
+               gtk_menu_append(GTK_MENU(menu), menuitem);
+               g_signal_connect(G_OBJECT(menuitem), "activate",
+                                G_CALLBACK(account_receive_menu_cb),
+                                ac_prefs);
+       }
+}
+
 void main_window_set_account_menu(GList *account_list)
 {
        GList *cur;
@@ -1384,6 +1435,18 @@ void main_window_set_account_menu(GList *account_list)
                mainwin = (MainWindow *)cur->data;
                main_window_set_account_selector_menu(mainwin, account_list);
                main_window_set_account_receive_menu(mainwin, account_list);
+               main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
+       }
+}
+
+void main_window_set_account_menu_only_toolbar(GList *account_list)
+{
+       GList *cur;
+       MainWindow *mainwin;
+
+       for (cur = mainwin_list; cur != NULL; cur = cur->next) {
+               mainwin = (MainWindow *)cur->data;
+               main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
        }
 }
 
@@ -1659,8 +1722,8 @@ void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
        if (confirm) {
                if (alertpanel(_("Empty trash"),
                               _("Delete all messages in trash folders?"),
-                              GTK_STOCK_YES, GTK_STOCK_NO, NULL)
-                   != G_ALERTDEFAULT)
+                              GTK_STOCK_CANCEL, _("+_Empty trash"), NULL)
+                   != G_ALERTALTERNATE)
                        return;
                manage_window_focus_in(mainwin->window, NULL, NULL);
        }
@@ -1791,17 +1854,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                gchar *const entry;
                SensitiveCond cond;
        } entry[] = {
-               {"/File/Add mailbox"                          , M_UNLOCKED},
-
-                {"/File/Add mailbox/MH..."                   , M_UNLOCKED},
-               {"/File/Change folder order"                  , M_UNLOCKED},
-               {"/File/Export to mbox file..."               , M_UNLOCKED},
-               {"/File/Empty all Trash folders"              , M_UNLOCKED},
-               {"/File/Work offline"                         , M_UNLOCKED},
-
-               {"/File/Save as...", M_TARGET_EXIST|M_UNLOCKED},
-               {"/File/Print..."  , M_TARGET_EXIST|M_UNLOCKED},
-               /* {"/File/Close"  , M_UNLOCKED}, */
+               {"/File/Save as...", M_TARGET_EXIST},
+               {"/File/Print..."  , M_TARGET_EXIST},
                {"/File/Exit"      , M_UNLOCKED},
 
                {"/Edit/Select thread"             , M_SINGLE_TARGET_EXIST},
@@ -1811,13 +1865,13 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/View/Expand all threads"        , M_MSG_EXIST},
                {"/View/Collapse all threads"      , M_MSG_EXIST},
                {"/View/Hide read messages"        , M_HIDE_READ_MSG},
-               {"/View/Go to/Prev message"        , M_MSG_EXIST},
+               {"/View/Go to/Previous message"        , M_MSG_EXIST},
                {"/View/Go to/Next message"        , M_MSG_EXIST},
-               {"/View/Go to/Prev unread message" , M_MSG_EXIST},
-               {"/View/Go to/Prev new message"    , M_MSG_EXIST},
-               {"/View/Go to/Prev marked message" , M_MSG_EXIST},
+               {"/View/Go to/Previous unread message" , M_MSG_EXIST},
+               {"/View/Go to/Previous new message"    , M_MSG_EXIST},
+               {"/View/Go to/Previous marked message" , M_MSG_EXIST},
                {"/View/Go to/Next marked message" , M_MSG_EXIST},
-               {"/View/Go to/Prev labeled message", M_MSG_EXIST},
+               {"/View/Go to/Previous labeled message", M_MSG_EXIST},
                {"/View/Go to/Next labeled message", M_MSG_EXIST},
                {"/View/Open in new window"        , M_SINGLE_TARGET_EXIST},
                {"/View/Show all headers"          , M_SINGLE_TARGET_EXIST},
@@ -1837,27 +1891,26 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/Message/Forward"               , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Message/Forward as attachment" , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Message/Redirect"              , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Message/Move..."               , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
-               {"/Message/Copy..."               , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
-               {"/Message/Move to trash"         , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NOT_NEWS},
-               {"/Message/Delete..."             , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
-               {"/Message/Cancel a news message" , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NEWS},
+               {"/Message/Move..."               , M_TARGET_EXIST|M_ALLOW_DELETE},
+               {"/Message/Copy..."               , M_TARGET_EXIST|M_EXEC},
+               {"/Message/Move to trash"         , M_TARGET_EXIST|M_ALLOW_DELETE|M_NOT_NEWS},
+               {"/Message/Delete..."             , M_TARGET_EXIST|M_ALLOW_DELETE},
+               {"/Message/Cancel a news message" , M_TARGET_EXIST|M_ALLOW_DELETE|M_NEWS},
                {"/Message/Mark"                  , M_TARGET_EXIST},
                {"/Message/Re-edit"               , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
 
                {"/Tools/Add sender to address book"   , M_SINGLE_TARGET_EXIST},
-               {"/Tools/Harvest addresses"            , M_UNLOCKED},
                {"/Tools/Harvest addresses/from Folder..."       
-                                                      , M_UNLOCKED|M_MSG_EXIST},
+                                                      , M_MSG_EXIST},
                {"/Tools/Harvest addresses/from Messages..."
-                                                      , M_UNLOCKED|M_MSG_EXIST|M_TARGET_EXIST},
-               {"/Tools/Harvest addresses"            , M_UNLOCKED},
-               {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC|M_UNLOCKED},
-               {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
+                                                      , M_MSG_EXIST|M_TARGET_EXIST},
+               {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC},
+               {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC},
                {"/Tools/Create filter rule"           , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
-               {"/Tools/Actions"                      , M_TARGET_EXIST|M_UNLOCKED},
+               {"/Tools/Create processing rule"       , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
+               {"/Tools/Actions"                      , M_TARGET_EXIST},
                {"/Tools/Execute"                      , M_DELAY_EXEC},
-               {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
+               {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE},
 
                {"/Configuration", M_UNLOCKED},
 
@@ -1946,7 +1999,10 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                menu_set_sensitive(ifactory, "/View/Sort/Descending", FALSE);
        }
 
-       SET_CHECK_MENU_ACTIVE("/View/Show all headers",
+       if (mainwin->messageview 
+       &&  mainwin->messageview->mimeview
+       &&  mainwin->messageview->mimeview->textview)
+               SET_CHECK_MENU_ACTIVE("/View/Show all headers",
                              mainwin->messageview->mimeview->textview->show_all_headers);
        SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
 
@@ -2059,7 +2115,7 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                
                folderwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(folderwin),
-                                    _("Sylpheed - Folder View"));
+                                    _("Sylpheed-Claws - Folder View"));
 
                gtk_window_move(GTK_WINDOW(folderwin),
                                prefs_common.folderwin_x,
@@ -2095,7 +2151,7 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                
                messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(messagewin),
-                                    _("Sylpheed - Message View"));
+                                    _("Sylpheed-Claws - Message View"));
                                     
                gtk_window_move(GTK_WINDOW(messagewin), 
                                prefs_common.main_msgwin_x,
@@ -2486,9 +2542,9 @@ static void print_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 static void app_exit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 {
        if (prefs_common.confirm_on_exit) {
-               if (alertpanel(_("Exit"), _("Exit this program?"),
-                              GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL)
-                   != G_ALERTDEFAULT)
+               if (alertpanel(_("Exit"), _("Exit Sylpheed-Claws?"),
+                              GTK_STOCK_CANCEL, GTK_STOCK_OK,  NULL)
+                   != G_ALERTALTERNATE)
                        return;
                manage_window_focus_in(mainwin->window, NULL, NULL);
        }
@@ -2640,7 +2696,7 @@ static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
                
        if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
                        _("Do you want to synchronise your folders now?"),
-                       GTK_STOCK_YES, GTK_STOCK_NO, NULL) != G_ALERTDEFAULT)
+                       GTK_STOCK_CANCEL, _("+_Synchronise"), NULL) != G_ALERTALTERNATE)
                return;
 
        folder_synchronise(NULL);
@@ -3142,7 +3198,6 @@ static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
        toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
        main_window_set_menu_sensitive(mainwindow_get_mainwindow());
        toolbar_main_set_sensitive(mainwindow_get_mainwindow());
-       gtk_button_set_relief(GTK_BUTTON(mainwindow_get_mainwindow()->ac_button), GTK_RELIEF_NONE);
        item = folderview_get_selected_item(
                        mainwindow_get_mainwindow()->folderview);
        if (item) {
@@ -3177,6 +3232,11 @@ static void manual_open_cb(MainWindow *mainwin, guint action,
        manual_open((ManualType)action);
 }
 
+static void legend_open_cb(GtkMenuItem *menuitem, gpointer data)
+{
+       legend_show();
+}
+
 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
 {
        MainWindow *mainwin = (MainWindow *)data;