fix bug 4155, 'remember directory of last saving'
[claws.git] / src / messageview.c
index b07813e32d362307e93bc686b2435ab0bc1070c0..62d63ad0f77cfe44416c699b94279d3d2d26666e 100644 (file)
@@ -67,6 +67,8 @@
 #include "statusbar.h"
 #include "folder_item_prefs.h"
 #include "avatars.h"
+#include "file-utils.h"
+
 #ifndef USE_ALT_ADDRBOOK
        #include "addressbook.h"
 #else
@@ -167,7 +169,8 @@ static void reply_cb                        (GtkAction      *action,
                                         gpointer        data);
 
 static PrefsAccount *select_account_from_list
-                                       (GList          *ac_list);
+                                       (GList          *ac_list,
+                                        gboolean        has_accounts);
 static void addressbook_open_cb                (GtkAction      *action,
                                         gpointer        data);
 static void add_address_cb             (GtkAction      *action,
@@ -203,147 +206,146 @@ static void messageview_nothing_cb         (GtkAction *action, gpointer data)
 static GList *msgview_list = NULL;
 static GtkActionEntry msgview_entries[] =
 {
-       {"Menu",                        NULL, "Menu" },
+       {"Menu",                                     NULL, "Menu", NULL, NULL, NULL },
 /* menus */
-       {"File",                        NULL, N_("_File") },
-       {"Edit",                        NULL, N_("_Edit") },
-       {"View",                        NULL, N_("_View") },
-       {"Message",                     NULL, N_("_Message") },
-       {"Tools",                       NULL, N_("_Tools") },
-       {"Help",                        NULL, N_("_Help") },
-       {"PlaceHolder",                 NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
+       {"File",                                     NULL, N_("_File"), NULL, NULL, NULL },
+       {"Edit",                                     NULL, N_("_Edit"), NULL, NULL, NULL },
+       {"View",                                     NULL, N_("_View"), NULL, NULL, NULL },
+       {"Message",                                  NULL, N_("_Message"), NULL, NULL, NULL },
+       {"Tools",                                    NULL, N_("_Tools"), NULL, NULL, NULL },
+       {"Help",                                     NULL, N_("_Help"), NULL, NULL, NULL },
+       {"PlaceHolder",                              NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
 
 /* File menu */
-       {"File/SaveAs",                 NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
-       {"File/SavePartAs",             NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
-       {"File/PageSetup",              NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
-       {"File/Print",                  NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
-       {"File/---",                    NULL, "---", NULL, NULL, NULL },
-       {"File/Close",                  NULL, N_("_Close"), "<control>W", NULL, G_CALLBACK(close_cb) },
+       {"File/SaveAs",                              NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
+       {"File/SavePartAs",                          NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
+       {"File/PageSetup",                           NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
+       {"File/Print",                               NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
+       {"File/---",                                 NULL, "---", NULL, NULL, NULL },
+       {"File/Close",                               NULL, N_("_Close"), "<control>W", NULL, G_CALLBACK(close_cb) },
 
 /* Edit menu */
-       {"Edit/Copy",                   NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
-       {"Edit/SelectAll",              NULL, N_("_Select all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
-       {"Edit/---",                    NULL, "---", NULL, NULL, NULL },
-       {"Edit/Find",                   NULL, N_("_Find"), "<control>F", NULL, G_CALLBACK(search_cb) },
+       {"Edit/Copy",                                NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
+       {"Edit/SelectAll",                           NULL, N_("_Select all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
+       {"Edit/---",                                 NULL, "---", NULL, NULL, NULL },
+       {"Edit/Find",                                NULL, N_("_Find"), "<control>F", NULL, G_CALLBACK(search_cb) },
        
 /* View menu */
-       {"View/Goto",                   NULL, N_("_Go to") },
-       {"View/Goto/Prev",              NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
-       {"View/Goto/Next",              NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
-       {"View/Goto/---",               NULL, "---", NULL, NULL, NULL },
-       {"View/Goto/PrevUnread",        NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
-       {"View/Goto/NextUnread",        NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/PrevNew",           NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
-       {"View/Goto/NextNew",           NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/PrevMarked",        NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
-       {"View/Goto/NextMarked",        NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/PrevLabeled",       NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
-       {"View/Goto/NextLabeled",       NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
-       /* {"View/Goto/---",                    NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/PrevHistory",       NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
-       {"View/Goto/NextHistory",       NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/ParentMessage",     NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/NextUnreadFolder",  NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
-       {"View/Goto/Folder",            NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
-       /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
-       {"View/Goto/NextPart",          NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
-       {"View/Goto/PrevPart",          NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
-        {"View/Scroll",                 NULL, N_("Message scroll") },
-        {"View/Scroll/PrevLine",        NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
-        {"View/Scroll/NextLine",        NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
-        {"View/Scroll/PrevPage",        NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
-        {"View/Scroll/NextPage",        NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
-        /* {"View/Scroll/---",          NULL, "---", NULL, NULL, NULL }, */
-
-       {"View/Encoding",               NULL, N_("Character _encoding") }, /* set_charset_cb */
-       {"View/Encoding/---",           NULL, "---" },
+       {"View/Goto",                                NULL, N_("_Go to"), NULL, NULL, NULL },
+       {"View/Goto/Prev",                           NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
+       {"View/Goto/Next",                           NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
+       {"View/Goto/---",                            NULL, "---", NULL, NULL, NULL },
+       {"View/Goto/PrevUnread",                     NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
+       {"View/Goto/NextUnread",                     NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/PrevNew",                        NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
+       {"View/Goto/NextNew",                        NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/PrevMarked",                     NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
+       {"View/Goto/NextMarked",                     NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/PrevLabeled",                    NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
+       {"View/Goto/NextLabeled",                    NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/PrevHistory",                    NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
+       {"View/Goto/NextHistory",                    NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/ParentMessage",                  NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/NextUnreadFolder",               NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
+       {"View/Goto/Folder",                         NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
+       /* {"View/Goto/---",                         NULL, "---", NULL, NULL, NULL }, */
+       {"View/Goto/NextPart",                       NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
+       {"View/Goto/PrevPart",                       NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
+       {"View/Scroll",                              NULL, N_("Message scroll"), NULL, NULL, NULL },
+       {"View/Scroll/PrevLine",                     NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
+       {"View/Scroll/NextLine",                     NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
+       {"View/Scroll/PrevPage",                     NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
+       {"View/Scroll/NextPage",                     NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
+       /* {"View/Scroll/---",                       NULL, "---", NULL, NULL, NULL }, */
+
+       {"View/Encoding",                            NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
+       {"View/Encoding/---",                        NULL, "---", NULL, NULL, NULL },
 #define ENC_ACTION(cs_char,c_char,string) \
        { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
 
-       {"View/Encoding/Western",       NULL, N_("Western European") },
-       {"View/Encoding/Baltic",        NULL, N_("Baltic") },
-       {"View/Encoding/Hebrew",        NULL, N_("Hebrew") },
-       {"View/Encoding/Arabic",        NULL, N_("Arabic") },
-       {"View/Encoding/Cyrillic",      NULL, N_("Cyrillic") },
-       {"View/Encoding/Japanese",      NULL, N_("Japanese") },
-       {"View/Encoding/Chinese",       NULL, N_("Chinese") },
-       {"View/Encoding/Korean",        NULL, N_("Korean") },
-       {"View/Encoding/Thai",          NULL, N_("Thai") },
+       {"View/Encoding/Western",                    NULL, N_("Western European"), NULL, NULL, NULL },
+       {"View/Encoding/Baltic",                     NULL, N_("Baltic"), NULL, NULL, NULL },
+       {"View/Encoding/Hebrew",                     NULL, N_("Hebrew"), NULL, NULL, NULL },
+       {"View/Encoding/Arabic",                     NULL, N_("Arabic"), NULL, NULL, NULL },
+       {"View/Encoding/Cyrillic",                   NULL, N_("Cyrillic"), NULL, NULL, NULL },
+       {"View/Encoding/Japanese",                   NULL, N_("Japanese"), NULL, NULL, NULL },
+       {"View/Encoding/Chinese",                    NULL, N_("Chinese"), NULL, NULL, NULL },
+       {"View/Encoding/Korean",                     NULL, N_("Korean"), NULL, NULL, NULL },
+       {"View/Encoding/Thai",                       NULL, N_("Thai"), NULL, NULL, NULL },
 
-       {"View/Decode",                 NULL, N_("Decode") }, /* set_decode_cb */
-       {"View/Decode/---",             NULL, "---" },
+       {"View/Decode",                              NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
+       {"View/Decode/---",                          NULL, "---", NULL, NULL, NULL },
 
 #define DEC_ACTION(cs_type,c_type,string) \
        { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
 
-       {"View/---",                    NULL, "---", NULL, NULL, NULL },
-       {"View/MessageSource",          NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
-       {"View/Part",                   NULL, N_("Message part") },
-       {"View/Part/AsText",            NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
-       {"View/Part/Open",              NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
+       {"View/---",                                 NULL, "---", NULL, NULL, NULL },
+       {"View/MessageSource",                       NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
+       {"View/Part",                                NULL, N_("Message part"), NULL, NULL, NULL },
+       {"View/Part/AsText",                         NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
+       {"View/Part/Open",                           NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
 #ifndef G_OS_WIN32
-       {"View/Part/OpenWith",          NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
+       {"View/Part/OpenWith",                       NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
 #endif
 
-       {"View/Quotes",                 NULL, N_("Quotes") }, 
+       {"View/Quotes",                              NULL, N_("Quotes"), NULL, NULL, NULL }, 
 
 /* Message menu */
-       {"Message/Compose",             NULL, N_("Compose _new message"), "<control>M", NULL, G_CALLBACK(compose_cb) },
-       {"Message/---",                 NULL, "---", NULL, NULL, NULL },
+       {"Message/Compose",                          NULL, N_("Compose _new message"), "<control>M", NULL, G_CALLBACK(compose_cb) },
+       {"Message/---",                              NULL, "---", NULL, NULL, NULL },
 
-       {"Message/Reply",               NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY */
-       {"Message/ReplyTo",             NULL, N_("Repl_y to") }, 
-       {"Message/ReplyTo/All",         NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
-       {"Message/ReplyTo/Sender",      NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
-       {"Message/ReplyTo/List",        NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
-       /* {"Message/---",                      NULL, "---", NULL, NULL, NULL }, */
+       {"Message/Reply",                            NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY */
+       {"Message/ReplyTo",                          NULL, N_("Repl_y to"), NULL, NULL, NULL }, 
+       {"Message/ReplyTo/All",                      NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
+       {"Message/ReplyTo/Sender",                   NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
+       {"Message/ReplyTo/List",                     NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
+       /* {"Message/---",                           NULL, "---", NULL, NULL, NULL }, */
 
-       {"Message/Forward",             NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_INLINE */
-       {"Message/ForwardAtt",          NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
-       {"Message/Redirect",            NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REDIRECT */
-       {"Message/CheckSignature",              NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
+       {"Message/Forward",                          NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_INLINE */
+       {"Message/ForwardAtt",                       NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
+       {"Message/Redirect",                         NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REDIRECT */
+       {"Message/CheckSignature",                   NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
 
 /* Tools menu */       
-       {"Tools/AddressBook",           NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) }, 
-       {"Tools/AddSenderToAB",         NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) }, 
-       {"Tools/---",                   NULL, "---", NULL, NULL, NULL },
-
-       {"Tools/CreateFilterRule",                      NULL, N_("_Create filter rule") },
-       {"Tools/CreateFilterRule/Automatically",        NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
-       {"Tools/CreateFilterRule/ByFrom",               NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
-       {"Tools/CreateFilterRule/ByTo",                 NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO     */
-       {"Tools/CreateFilterRule/BySubject",            NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
+       {"Tools/AddressBook",                        NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) }, 
+       {"Tools/AddSenderToAB",                      NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) }, 
+       {"Tools/---",                                NULL, "---", NULL, NULL, NULL },
 
-       {"Tools/CreateProcessingRule",                  NULL, N_("Create processing rule") },
-       {"Tools/CreateProcessingRule/Automatically",    NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
-       {"Tools/CreateProcessingRule/ByFrom",           NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
-       {"Tools/CreateProcessingRule/ByTo",             NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
-       {"Tools/CreateProcessingRule/BySubject",                NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
+       {"Tools/CreateFilterRule",                   NULL, N_("_Create filter rule"), NULL, NULL, NULL },
+       {"Tools/CreateFilterRule/Automatically",     NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
+       {"Tools/CreateFilterRule/ByFrom",            NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
+       {"Tools/CreateFilterRule/ByTo",              NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO     */
+       {"Tools/CreateFilterRule/BySubject",         NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
 
-       /* {"Tools/---",                        NULL, "---", NULL, NULL, NULL }, */
+       {"Tools/CreateProcessingRule",               NULL, N_("Create processing rule"), NULL, NULL, NULL },
+       {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
+       {"Tools/CreateProcessingRule/ByFrom",        NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
+       {"Tools/CreateProcessingRule/ByTo",          NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
+       {"Tools/CreateProcessingRule/BySubject",     NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
+       /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
 
-       {"Tools/ListUrls",              NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) }, 
+       {"Tools/ListUrls",                           NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) }, 
 
-       /* {"Tools/---",                        NULL, "---", NULL, NULL, NULL }, */
-       {"Tools/Actions",       NULL, N_("Actio_ns") },
-       {"Tools/Actions/PlaceHolder",   NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
+       /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
+       {"Tools/Actions",                            NULL, N_("Actio_ns"), NULL, NULL, NULL },
+       {"Tools/Actions/PlaceHolder",                NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
 
 /* Help menu */
-       {"Help/About",          NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) }, 
+       {"Help/About",                               NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) }, 
 };
 
 static GtkToggleActionEntry msgview_toggle_entries[] =
 {
-       {"View/AllHeaders",             NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb) }, /* toggle */
-       {"View/Quotes/CollapseAll",     NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 1 toggle */
-       {"View/Quotes/Collapse2",               NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 2 toggle */
-       {"View/Quotes/Collapse3",               NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 3 toggle */
+       {"View/AllHeaders",         NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
+       {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 1 toggle */
+       {"View/Quotes/Collapse2",   NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 2 toggle */
+       {"View/Quotes/Collapse3",   NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 3 toggle */
 };
 
 static GtkRadioActionEntry msgview_radio_enc_entries[] =
@@ -772,32 +774,35 @@ void messageview_init(MessageView *messageview)
        noticeview_hide(messageview->noticeview);
 }
 
-static void notification_convert_header(gchar *dest, gint len, 
+static void notification_convert_header(gchar **dest,
                                        const gchar *src_,
                                        gint header_len)
 {
        char *src;
 
        cm_return_if_fail(src_ != NULL);
-       cm_return_if_fail(dest != NULL);
 
-       if (len < 1) return;
+       if (header_len < 1) {
+               *dest = g_strdup("");
+               return;
+       }
 
-       Xstrndup_a(src, src_, len, return);
+       Xstrndup_a(src, src_, strlen(src_), return);
 
        remove_return(src);
 
        if (is_ascii_str(src)) {
-               strncpy2(dest, src, len);
-               dest[len - 1] = '\0';
+               *dest = g_strdup(src);
                return;
-       } else
-               conv_encode_header(dest, len, src, header_len, FALSE);
+       } else {
+               *dest = g_malloc(BUFFSIZE);
+               conv_encode_header(*dest, BUFFSIZE, src, header_len, FALSE);
+       }
 }
 
 static gint disposition_notification_send(MsgInfo *msginfo)
 {
-       gchar buf[BUFFSIZE];
+       gchar *buf = NULL;
        gchar tmp[MAXPATHLEN + 1];
        FILE *fp;
        GList *ac_list;
@@ -812,6 +817,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        gchar *foo = NULL;
        gboolean queued_removed = FALSE;
        gchar *boundary = NULL;
+       gchar buf_date[RFC822_DATE_BUFFSIZE];
        gchar *date = NULL;
        gchar *orig_to = NULL;
        gchar *enc_sub = NULL;
@@ -828,8 +834,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        else
                to = msginfo->extradata->returnreceiptto;
 
-       ok = procheader_get_header_from_msginfo(msginfo, buf, sizeof(buf),
-                               "Return-Path:");
+       ok = procheader_get_header_from_msginfo(msginfo, &buf, "Return-Path:");
        if (ok == 0) {
                gchar *to_addr = g_strdup(to);
                extract_address(to_addr);
@@ -837,8 +842,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
                ok = strcasecmp(to_addr, buf);
                g_free(to_addr);
        } else {
-               g_strlcpy(buf, _("<No Return-Path found>"), 
-                               sizeof(buf));
+               buf = g_strdup(_("<No Return-Path found>"));
        }
        
        if (ok != 0) {
@@ -852,39 +856,28 @@ static gint disposition_notification_send(MsgInfo *msginfo)
                    "It is advised to not send the return receipt."),
                  to, buf);
                val = alertpanel_full(_("Warning"), message,
-                               _("_Don't Send"), _("_Send"), NULL, FALSE,
-                               NULL, ALERT_WARNING, G_ALERTDEFAULT);
+                               _("_Don't Send"), _("_Send"), NULL, ALERTFOCUS_FIRST, FALSE,
+                               NULL, ALERT_WARNING);
                g_free(message);                                
-               if (val != G_ALERTALTERNATE)
+               if (val != G_ALERTALTERNATE) {
+                       g_free(buf);
                        return -1;
+               }
        }
+       g_free(buf);
+       buf = NULL;
 
        ac_list = account_find_all_from_address(NULL, msginfo->to);
        ac_list = account_find_all_from_address(ac_list, msginfo->cc);
 
        if (ac_list == NULL) {
-               AlertValue val;
-               gchar *text;
-               text = g_strdup_printf(
-                 _("This message is asking for a return receipt notification\n"
-                   "but according to its '%s' and '%s' headers it was not\n"
-                   "officially addressed to you.\n"
-                   "It is advised to not send the return receipt."),
-                 prefs_common_translated_header_name("To"),
-                 prefs_common_translated_header_name("Cc"));
-               val = alertpanel_full(_("Warning"),
-                 text,
-                 _("_Don't Send"), _("_Send"), NULL, FALSE,
-                 NULL, ALERT_WARNING, G_ALERTDEFAULT);
-               if (val != G_ALERTALTERNATE)
+               ac_list = account_find_all();
+               if ((account = select_account_from_list(ac_list, FALSE)) == NULL)
                        return -1;
-       }
-
-       if (g_list_length(ac_list) > 1) {
-               if ((account = select_account_from_list(ac_list)) == NULL)
+       } else if (g_list_length(ac_list) > 1) {
+               if ((account = select_account_from_list(ac_list, TRUE)) == NULL)
                        return -1;
-       }
-       else if (ac_list != NULL)
+       } else if (ac_list != NULL)
                account = (PrefsAccount *) ac_list->data;
        g_list_free(ac_list);
 
@@ -900,8 +893,8 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg%p",
                   get_rc_dir(), G_DIR_SEPARATOR, msginfo);
 
-       if ((fp = g_fopen(tmp, "wb")) == NULL) {
-               FILE_OP_ERROR(tmp, "fopen");
+       if ((fp = claws_fopen(tmp, "wb")) == NULL) {
+               FILE_OP_ERROR(tmp, "claws_fopen");
                return -1;
        }
 
@@ -956,29 +949,37 @@ static gint disposition_notification_send(MsgInfo *msginfo)
                goto FILE_ERROR;
 
        /* Date */
-       get_rfc822_date(buf, sizeof(buf));
-       if (fprintf(fp, "Date: %s\n", buf) < 0)
+       get_rfc822_date(buf_date, sizeof(buf_date));
+       if (fprintf(fp, "Date: %s\n", buf_date) < 0)
                goto FILE_ERROR;
 
        /* From */
        if (account->name && *account->name) {
-               notification_convert_header
-                       (buf, sizeof(buf), account->name,
-                        strlen("From: "));
-               if (fprintf(fp, "From: %s <%s>\n", buf, account->address) < 0)
+               notification_convert_header(&buf, account->name, strlen("From: "));
+               if (buf == NULL)
                        goto FILE_ERROR;
-       } else
-               if (fprintf(fp, "From: %s\n", account->address) < 0)
+               if (fprintf(fp, "From: %s <%s>\n", buf, account->address) < 0) {
+                       g_free(buf);
                        goto FILE_ERROR;
+               }
+               g_free(buf);
+               buf = NULL;
+       } else
+               goto FILE_ERROR;
 
        if (fprintf(fp, "To: %s\n", to) < 0)
                goto FILE_ERROR;
 
        /* Subject */
-       notification_convert_header(buf, sizeof(buf), msginfo->subject,
-                                   strlen("Subject: "));
-       if (fprintf(fp, "Subject: Disposition notification: %s\n", buf) < 0)
+       notification_convert_header(&buf, msginfo->subject, strlen("Subject: "));
+       if (buf == NULL)
                goto FILE_ERROR;
+       if (fprintf(fp, "Subject: Disposition notification: %s\n", buf) < 0) {
+               g_free(buf);
+               goto FILE_ERROR;
+       }
+       g_free(buf);
+       buf = NULL;
 
        /* Message ID */
        if (account->gen_msgid) {
@@ -991,8 +992,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        }
 
        boundary = generate_mime_boundary("DN");
-       get_rfc822_date(buf, sizeof(buf));
-       date = g_strdup(buf);
+       date = g_strdup(buf_date);
        if (msginfo->to) {
                orig_to = g_strdup(msginfo->to);
                extract_address(orig_to);
@@ -1062,8 +1062,8 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        if (ok < 0)
                goto FILE_ERROR;        
 
-       if (fclose(fp) == EOF) {
-               FILE_OP_ERROR(tmp, "fclose");
+       if (claws_safe_fclose(fp) == EOF) {
+               FILE_OP_ERROR(tmp, "claws_fclose");
                claws_unlink(tmp);
                return -1;
        }
@@ -1100,7 +1100,7 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        return ok;
 
 FILE_ERROR:
-       fclose(fp);
+       claws_fclose(fp);
        claws_unlink(tmp);
        return -1;
 }
@@ -1178,16 +1178,14 @@ static void messageview_register_nav(MessageView *messageview)
                        if (end->prev) {
                                end->prev->next = NULL;
                                end->prev = NULL;
-                               list_free_strings(end);
-                               g_list_free(end);
+                               list_free_strings_full(end);
                        } else {
-                               list_free_strings(messageview->trail);
-                               g_list_free(messageview->trail);
+                               list_free_strings_full(messageview->trail);
                                messageview->trail = NULL;
                        }
                }
                messageview->trail = g_list_append(messageview->trail, id);
-               messageview->trail_pos = g_list_length(messageview->trail) - 1;
+               messageview->trail_pos = (gint)g_list_length(messageview->trail) - 1;
                
                /* Cut the beginning if needed */
                while (messageview->trail_pos > prefs_common.nav_history_length) {
@@ -1273,8 +1271,8 @@ static gboolean messageview_try_select_mimeinfo(MessageView *messageview, MsgInf
                        return TRUE;
                } else if (!strcasecmp(mimeinfo->subtype, "html")
                                && mimeinfo->disposition != DISPOSITIONTYPE_ATTACHMENT
-                               && (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS
-                                       || (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT
+                               && ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS)
+                                       || ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT)
                                                && prefs_common.promote_html_part))) {
                        mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
                        return TRUE;
@@ -1365,13 +1363,13 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
        messageview->updating = TRUE;
 
        if (msginfo->size > 1024*1024)
-               statuswindow_print_all(_("Fetching message (%s)..."),
+               statusbar_print_all(_("Fetching message (%s)..."),
                        to_human_readable(msginfo->size));
        
        file = procmsg_get_message_file_path(msginfo);
 
        if (msginfo->size > 1024*1024)
-               statuswindow_pop_all();
+               statusbar_pop_all();
 
        if (!file) {
                g_warning("can't get message file path.");
@@ -1458,7 +1456,7 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                g_free(subject);
        }
 
-       if (msginfo && msginfo->folder) {
+       if (msginfo->folder) {
                msginfo->folder->last_seen = msginfo->msgnum;   
        }
 
@@ -1522,8 +1520,8 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                        }
                        messageview_find_part_depth_first(&context, MIMETYPE_TEXT, "html");
                        if (context.found &&
-                           (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS ||
-                            (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT &&
+                           ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS) ||
+                            ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT) &&
                              prefs_common.promote_html_part))) { /* html found */
                                mimeinfo = context.found;
                                if (messageview_try_select_mimeinfo(messageview, msginfo, mimeinfo))
@@ -1639,8 +1637,9 @@ void messageview_destroy(MessageView *messageview)
                g_free(messageview->toolbar);
        }
 
-       list_free_strings(messageview->trail);
-       g_list_free(messageview->trail);
+       message_search_close(messageview);
+
+       list_free_strings_full(messageview->trail);
        msgview_list = g_list_remove(msgview_list, messageview); 
 
        if (messageview->window)
@@ -1814,52 +1813,6 @@ gboolean messageview_is_visible(MessageView *messageview)
        return messageview->visible;
 }
 
-static void messageview_save_as(MessageView *messageview)
-{
-       gchar *filename = NULL;
-       MsgInfo *msginfo;
-       gchar *src, *dest, *tmp;
-
-       if (!messageview->msginfo) return;
-       msginfo = messageview->msginfo;
-
-       if (msginfo->subject) {
-               Xstrdup_a(filename, msginfo->subject, return);
-               subst_for_filename(filename);
-       }
-       if (filename && !g_utf8_validate(filename, -1, NULL)) {
-               gchar *oldstr = filename;
-               filename = conv_codeset_strdup(filename,
-                                              conv_get_locale_charset_str(),
-                                              CS_UTF_8);
-               if (!filename) {
-                       g_warning("messageview_save_as(): failed to convert character set.");
-                       filename = g_strdup(oldstr);
-               }
-               dest = filesel_select_file_save(_("Save as"), filename);
-               g_free(filename);
-       } else
-               dest = filesel_select_file_save(_("Save as"), filename);
-       if (!dest) return;
-       if (is_file_exist(dest)) {
-               AlertValue aval;
-
-               aval = alertpanel(_("Overwrite"),
-                                 _("Overwrite existing file?"),
-                                 GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
-               if (G_ALERTALTERNATE != aval) return;
-       }
-
-       src = procmsg_get_message_file(msginfo);
-       if (copy_file(src, dest, TRUE) < 0) {
-               tmp =  g_path_get_basename(dest);
-               alertpanel_error(_("Couldn't save the file '%s'."), tmp);
-               g_free(tmp);
-       }
-       g_free(dest);
-       g_free(src);
-}
-
 static gint messageview_delete_cb(GtkWidget *widget, GdkEventAny *event,
                                  MessageView *messageview)
 {
@@ -2077,30 +2030,53 @@ static void select_account_cb(GtkWidget *w, gpointer data)
        *(gint*)data = combobox_get_active_data(GTK_COMBO_BOX(w));
 }
 
-static PrefsAccount *select_account_from_list(GList *ac_list)
+static PrefsAccount *select_account_from_list(GList *ac_list, gboolean has_accounts)
 {
        GtkWidget *optmenu;
        gint account_id;
+       AlertValue val;
 
        cm_return_val_if_fail(ac_list != NULL, NULL);
        cm_return_val_if_fail(ac_list->data != NULL, NULL);
-       
+
        optmenu = gtkut_account_menu_new(ac_list,
                        G_CALLBACK(select_account_cb),
                        &account_id);
        if (!optmenu)
                return NULL;
        account_id = ((PrefsAccount *) ac_list->data)->account_id;
-       if (alertpanel_with_widget(
+       if (!has_accounts) {
+               gchar *tr;
+               gchar *text;
+               tr = g_strdup(C_("'%s' stands for 'To' then 'Cc'",
+                   "This message is asking for a return receipt notification\n"
+                   "but according to its '%s' and '%s' headers it was not\n"
+                   "officially addressed to you.\n"
+                   "It is advised to not send the return receipt."));
+               text = g_strdup_printf(tr,
+                 prefs_common_translated_header_name("To"),
+                 prefs_common_translated_header_name("Cc"));
+               val = alertpanel_with_widget(
+                               _("Return Receipt Notification"),
+                               text,
+                               _("_Cancel"), _("_Send Notification"), NULL,
+                               ALERTFOCUS_FIRST, FALSE, optmenu);
+               g_free(tr);
+               g_free(text);
+       } else
+               val = alertpanel_with_widget(
                                _("Return Receipt Notification"),
                                _("More than one of your accounts uses the "
-                                 "address that this message was sent to.\n"
-                                 "Please choose which account you want to "
-                                 "use for sending the receipt notification:"),
-                               _("_Cancel"), _("_Send Notification"), NULL,
-                               FALSE, G_ALERTDEFAULT, optmenu) != G_ALERTALTERNATE)
+                                "address that this message was sent to.\n"
+                                "Please choose which account you want to "
+                                "use for sending the receipt notification:"),
+                               _("_Cancel"), _("_Send Notification"), NULL,
+                               ALERTFOCUS_FIRST, FALSE, optmenu);
+
+       if (val != G_ALERTALTERNATE)
                return NULL;
-       return account_find_from_id(account_id);
+       else
+               return account_find_from_id(account_id);
 }
 
 /* 
@@ -2177,7 +2153,7 @@ gchar *messageview_get_selection(MessageView *msgview)
 static void save_as_cb(GtkAction *action, gpointer data)
 {
        MessageView *messageview = (MessageView *)data;
-       messageview_save_as(messageview);
+       summary_save_as(messageview->mainwin->summaryview);
 }
 
 static void print_mimeview(MimeView *mimeview, gint sel_start, gint sel_end, gint partnum) 
@@ -2636,7 +2612,8 @@ static void goto_folder_cb(GtkAction *action, gpointer data)
        MessageView *messageview = (MessageView *)data;
        FolderItem *to_folder;
 
-       to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE);
+       to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
+                       _("Select folder to go to"));
 
        if (to_folder) {
                folderview_select(messageview->mainwin->folderview, to_folder);