Sync with hiro's cvs 10 to 17.
[claws.git] / src / compose.c
index f4f1b822920f7786a927098f68e9513f31bca0e1..5332fa4f48f8aa272a28a3a7b0a953420513a925 100644 (file)
@@ -53,6 +53,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <time.h>
 /* #include <sys/utsname.h> */
 #  include <wctype.h>
 #endif
 
-
-#include "gtkstext.h"
-
 #include "intl.h"
 #include "main.h"
 #include "mainwindow.h"
 #include "compose.h"
+#include "gtkstext.h"
 #include "addressbook.h"
 #include "folderview.h"
 #include "procmsg.h"
 #include "menu.h"
+#include "stock_pixmap.h"
 #include "send.h"
+#include "imap.h"
 #include "news.h"
 #include "customheader.h"
 #include "prefs_common.h"
 #include "quote_fmt.h"
 #include "template.h"
 #include "undo.h"
+#include "foldersel.h"
 
 #if USE_GPGME
 #  include "rfc2015.h"
@@ -124,10 +127,6 @@ static GdkColor quote_color = {0, 0, 0, 0xbfff};
 
 static GList *compose_list = NULL;
 
-static void compose_set_undo                   (UndoMain       *undostruct, 
-                                                 gint            undo_state, 
-                                                gint            redo_state, 
-                                                GtkWidget      *changewidget);
 Compose *compose_generic_new                   (PrefsAccount   *account,
                                                 const gchar    *to,
                                                 FolderItem     *item);
@@ -231,6 +230,11 @@ static void compose_input_cb                       (gpointer           data,
 static void compose_set_ext_editor_sensitive   (Compose           *compose,
                                                 gboolean           sensitive);
 
+static void compose_undo_state_changed         (UndoMain       *undostruct,
+                                                gint            undo_state,
+                                                gint            redo_state,
+                                                gpointer        data);
+
 static gint calc_cursor_xpos   (GtkSText       *text,
                                 gint            extra,
                                 gint            char_width);
@@ -319,8 +323,8 @@ static gint compose_delete_cb               (GtkWidget      *widget,
 static void compose_destroy_cb         (GtkWidget      *widget,
                                         Compose        *compose);
 
-static void compose_undo_cb            (Compose *compose);
-static void compose_redo_cb            (Compose *compose);
+static void compose_undo_cb            (Compose        *compose);
+static void compose_redo_cb            (Compose        *compose);
 static void compose_cut_cb             (Compose        *compose);
 static void compose_copy_cb            (Compose        *compose);
 static void compose_paste_cb           (Compose        *compose);
@@ -422,6 +426,10 @@ void compose_headerentry_key_press_event_cb(GtkWidget             *entry,
                                            GdkEventKey        *event,
                                            ComposeHeaderEntry *headerentry);
 
+static void compose_show_first_last_header (Compose *compose, gboolean show_first);
+
+static void compose_ctl_enter_send_shortcut_cb(GtkWidget *w, Compose *compose);
+
 static GtkItemFactoryEntry compose_popup_entries[] =
 {
        {N_("/_Add..."),        NULL, compose_attach_cb, 0, NULL},
@@ -439,21 +447,34 @@ static GtkItemFactoryEntry compose_entries[] =
        {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_File/_Close"),                   "<alt>W", compose_close_cb, 0, NULL},
 
-       {N_("/_Edit"),             NULL, NULL, 0, "<Branch>"},
-       {N_("/_Edit/_Undo"),       "<control>Z", compose_undo_cb, 0, NULL},
-       {N_("/_Edit/_Redo"),       "<control>Y", compose_redo_cb, 0, NULL},
-       {N_("/_Edit/---"),         NULL, NULL, 0, "<Separator>"},
-       {N_("/_Edit/Cu_t"),        "<control>X", compose_cut_cb,    0, NULL},
-       {N_("/_Edit/_Copy"),       "<control>C", compose_copy_cb,   0, NULL},
-       {N_("/_Edit/_Paste"),      "<control>V", compose_paste_cb,  0, NULL},
-       {N_("/_Edit/Select _all"), "<control>A", compose_allsel_cb, 0, NULL},
-       {N_("/_Edit/---"),         NULL, NULL, 0, "<Separator>"},
-       {N_("/_Edit/_Wrap current paragraph"), "<alt>L", compose_wrap_line, 0, NULL},
+       {N_("/_Edit"),                  NULL, NULL, 0, "<Branch>"},
+       {N_("/_Edit/_Undo"),            "<control>Z", compose_undo_cb, 0, NULL},
+       {N_("/_Edit/_Redo"),            "<control>Y", compose_redo_cb, 0, NULL},
+       {N_("/_Edit/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_Edit/Cu_t"),             "<control>X", compose_cut_cb,    0, NULL},
+       {N_("/_Edit/_Copy"),            "<control>C", compose_copy_cb,   0, NULL},
+       {N_("/_Edit/_Paste"),           "<control>V", compose_paste_cb,  0, NULL},
+       {N_("/_Edit/Select _all"),      "<control>A", compose_allsel_cb, 0, NULL},
+       {N_("/_Edit/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_Edit/_Wrap current paragraph"),
+                                       "<alt>L", compose_wrap_line, 0, NULL},
        {N_("/_Edit/Wrap all long _lines"),
-                       "<shift><alt>L", compose_wrap_line_all, 0, NULL},
+                                       "<shift><alt>L", compose_wrap_line_all, 0, NULL},
        {N_("/_Edit/Edit with e_xternal editor"),
-                       "<alt>X", compose_ext_editor_cb, 0, NULL},
-
+                                       "<alt>X", compose_ext_editor_cb, 0, NULL},
+#if 0 /* NEW COMPOSE GUI */
+       {N_("/_View"),                  NULL, NULL, 0, "<Branch>"},
+       {N_("/_View/_To"),              NULL, compose_toggle_to_cb     , 0, "<ToggleItem>"},
+       {N_("/_View/_Cc"),              NULL, compose_toggle_cc_cb     , 0, "<ToggleItem>"},
+       {N_("/_View/_Bcc"),             NULL, compose_toggle_bcc_cb    , 0, "<ToggleItem>"},
+       {N_("/_View/_Reply to"),        NULL, compose_toggle_replyto_cb, 0, "<ToggleItem>"},
+       {N_("/_View/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/_Followup to"),     NULL, compose_toggle_followupto_cb, 0, "<ToggleItem>"},
+       {N_("/_View/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/R_uler"),           NULL, compose_toggle_ruler_cb, 0, "<ToggleItem>"},
+       {N_("/_View/---"),              NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/_Attachment"),      NULL, compose_toggle_attach_cb, 0, "<ToggleItem>"},
+#endif
        {N_("/_Message"),               NULL, NULL, 0, "<Branch>"},
        {N_("/_Message/_Send"),         "<control>Return",
                                        compose_send_cb, 0, NULL},
@@ -461,6 +482,8 @@ static GtkItemFactoryEntry compose_entries[] =
                                        compose_send_later_cb,  0, NULL},
        {N_("/_Message/Save to _draft folder"),
                                        "<alt>D", compose_draft_cb, 0, NULL},
+       {N_("/_Message/Save and _keep editing"),
+                                       "<control>S", compose_draft_cb, 1, NULL},
 #if 0 /* NEW COMPOSE GUI */
        {N_("/_Message/---"),           NULL, NULL, 0, "<Separator>"},
        {N_("/_Message/_To"),           NULL, compose_toggle_to_cb     , 0, "<ToggleItem>"},
@@ -483,7 +506,7 @@ static GtkItemFactoryEntry compose_entries[] =
        {N_("/_Tool/Show _ruler"),      NULL, compose_toggle_ruler_cb, 0, "<ToggleItem>"},
        {N_("/_Tool/_Address book"),    "<alt>A", compose_address_cb , 0, NULL},
        {N_("/_Tool/_Template"),        NULL, NULL, 0, "<Branch>"},
-       {N_("/_Help"),                  NULL, NULL, 0, "<LastBranch>"},
+       {N_("/_Help"),                  NULL, NULL, 0, "<Branch>"},
        {N_("/_Help/_About"),           NULL, about_show, 0, NULL}
 };
 
@@ -595,7 +618,19 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
                        compose_entry_append(compose, mailto, COMPOSE_NEWSGROUPS);
                }
        }
-       gtk_widget_grab_focus(compose->subject_entry);
+       compose_show_first_last_header(compose, TRUE);
+
+       /* Set save folder */
+       if(item && item->prefs && item->prefs->save_copy_to_folder) {
+               gchar *folderidentifier;
+
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
+               folderidentifier = folder_item_get_identifier(item);
+               gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+               g_free(folderidentifier);
+       }
+
+       gtk_widget_grab_focus(compose->header_last->entry);
 
        if (prefs_common.auto_exteditor)
                compose_exec_ext_editor(compose);
@@ -669,6 +704,9 @@ static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
        
        /* select the account for the whole folder (IMAP / NNTP) */
        if (!account)
+               /* FIXME: this is not right, because folder may be nested. we should
+                * ascend the tree until we find a parent with proper account 
+                * information */
                account = msginfo->folder->folder->account;
 
        /* select account by to: and cc: header if enabled */
@@ -705,7 +743,8 @@ static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
 
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED);
        MSG_SET_PERM_FLAGS(msginfo->flags, MSG_REPLIED);
-
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_set_perm_flags(msginfo, MSG_REPLIED);
        CHANGE_FLAGS(msginfo);
 
        compose = compose_create(account, COMPOSE_REPLY);
@@ -726,9 +765,20 @@ static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
                menu_set_toggle(ifactory, "/Message/Request Return Receipt", TRUE);
        }
 
+       /* Set save folder */
+       if(msginfo->folder && msginfo->folder->prefs && msginfo->folder->prefs->save_copy_to_folder) {
+               gchar *folderidentifier;
+
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
+               folderidentifier = folder_item_get_identifier(msginfo->folder);
+               gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+               g_free(folderidentifier);
+       }
+
        if (compose_parse_header(compose, msginfo) < 0) return;
        compose_reply_set_entry(compose, msginfo, to_all, ignore_replyto,
                                followup_and_reply_to);
+       compose_show_first_last_header(compose, TRUE);
 
        text = GTK_STEXT(compose->text);
        gtk_stext_freeze(text);
@@ -834,7 +884,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
 #if USE_GPGME
        for (;;) {
                if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-               mimeinfo = procmime_scan_mime_header(fp);
+               mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
                if (!mimeinfo) break;
 
                if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
@@ -856,7 +906,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
        }
 #else /* !USE_GPGME */
        if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-       mimeinfo = procmime_scan_mime_header(fp);
+       mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
 #endif /* USE_GPGME */
 
        fclose(fp);
@@ -901,7 +951,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
 
                prev_fpos = fpos;
 
-               partinfo = procmime_scan_mime_header(fp);
+               partinfo = procmime_scan_mime_header(fp, MIME_TEXT);
                if (!partinfo) break;
 
                if (npart != 0)
@@ -995,22 +1045,22 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
        g_return_val_if_fail(msginfo->folder != NULL, NULL);
 
        account = msginfo->folder->folder->account;
-        if (!account && msginfo->to && prefs_common.forward_account_autosel) {
+       if (!account && msginfo->to && prefs_common.forward_account_autosel) {
                gchar *to;
                Xstrdup_a(to, msginfo->to, return NULL);
                extract_address(to);
                account = account_find_from_address(to);
        }
 
-        if(!account && prefs_common.forward_account_autosel) {
-                       gchar cc[BUFFSIZE];
+       if(!account && prefs_common.forward_account_autosel) {
+               gchar cc[BUFFSIZE];
                if(!get_header_from_msginfo(msginfo,cc,sizeof(cc),"CC:")){ /* Found a CC header */
                        extract_address(cc);
                        account = account_find_from_address(cc);
                 }
        }
 
-        if (account == NULL) {
+       if (account == NULL) {
                account = cur_account;
                /*
                account = msginfo->folder->folder->account;
@@ -1021,6 +1071,8 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
 
        MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED);
        MSG_SET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_REPLIED);
        CHANGE_FLAGS(msginfo);
 
        compose = compose_create(account, COMPOSE_FORWARD);
@@ -1160,11 +1212,17 @@ void compose_reedit(MsgInfo *msginfo)
        g_return_if_fail(msginfo != NULL);
        g_return_if_fail(msginfo->folder != NULL);
 
-        account = msginfo->folder->folder->account;
+        if (msginfo->folder->stype == F_QUEUE) {
+               gchar account_address[BUFFSIZE];
+               if (!get_header_from_msginfo(msginfo, account_address, sizeof(account_address), "S:")) {
+                       account = account_find_from_address(account_address);
+               }
+       } else 
+               account = msginfo->folder->folder->account;
 
-        if(!account&& prefs_common.reedit_account_autosel) {
+       if (!account && prefs_common.reedit_account_autosel) {
                        gchar from[BUFFSIZE];
-               if(!get_header_from_msginfo(msginfo,from,sizeof(from),"FROM:")){ /* Found a FROM header */
+               if (!get_header_from_msginfo(msginfo, from, sizeof(from), "FROM:")){
                        extract_address(from);
                        account = account_find_from_address(from);
                 }
@@ -1512,15 +1570,18 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
                        Xstrdup_a(quote_str, buf, return NULL)
        }
 
-       quote_fmt_init(msginfo, quote_str);
-       quote_fmt_scan_string(fmt);
-       quote_fmt_parse();
+       if (fmt && *fmt != '\0') {
+               quote_fmt_init(msginfo, quote_str);
+               quote_fmt_scan_string(fmt);
+               quote_fmt_parse();
 
-       buf = quote_fmt_get_buffer();
-       if (buf == NULL) {
-               alertpanel_error(_("Message reply/forward format error."));
-               return NULL;
-       }
+               buf = quote_fmt_get_buffer();
+               if (buf == NULL) {
+                       alertpanel_error(_("Message reply/forward format error."));
+                       return NULL;
+               }
+       } else
+               buf = "";
 
        gtk_stext_freeze(text);
        gtk_stext_set_point(text, 0);
@@ -1555,10 +1616,10 @@ static void compose_reply_set_entry(Compose *compose, MsgInfo *msginfo,
 
        if ((compose->account->protocol != A_NNTP) || followup_and_reply_to)
                compose_entry_append(compose,
-                                   ((compose->mailinglist && !ignore_replyto)
-                                    ? compose->mailinglist
-                                    : (compose->replyto && !ignore_replyto)
+                                   ((compose->replyto && !ignore_replyto)
                                     ? compose->replyto
+                                    : (compose->mailinglist && !ignore_replyto)
+                                    ? compose->mailinglist
                                     : msginfo->from ? msginfo->from : ""),
                                     COMPOSE_TO);
        if (compose->account->protocol == A_NNTP) {
@@ -1652,13 +1713,15 @@ static void compose_reedit_set_entry(Compose *compose, MsgInfo *msginfo)
        SET_ADDRESS(COMPOSE_BCC, compose->bcc);
        SET_ADDRESS(COMPOSE_REPLYTO, compose->replyto);
 
+       compose_show_first_last_header(compose, TRUE);
+
 #if 0 /* NEW COMPOSE GUI */
        if (compose->bcc) {
                GtkItemFactory *ifactory;
                GtkWidget *menuitem;
 
                ifactory = gtk_item_factory_from_widget(compose->menubar);
-               menuitem = gtk_item_factory_get_item(ifactory, "/Message/Bcc");
+               menuitem = gtk_item_factory_get_item(ifactory, "/View/Bcc");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
        }
@@ -1668,7 +1731,7 @@ static void compose_reedit_set_entry(Compose *compose, MsgInfo *msginfo)
 
                ifactory = gtk_item_factory_from_widget(compose->menubar);
                menuitem = gtk_item_factory_get_item
-                       (ifactory, "/Message/Reply to");
+                       (ifactory, "/View/Reply to");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
        }
@@ -1773,18 +1836,15 @@ static void compose_insert_file(Compose *compose, const gchar *file)
        gtk_stext_freeze(text);
 
        while (fgets(buf, sizeof(buf), fp) != NULL) {
-               /* Strip <CR> if DOS/Windoze file, replace <CR> with <LF> if MAC file */
+               /* strip <CR> if DOS/Windows file,
+                  replace <CR> with <LF> if Macintosh file. */
+               strcrchomp(buf);
                len = strlen(buf);
-               if (len > 1 && buf[len - 2] == '\r' && buf[len - 1] == '\n') {
-                       buf[len - 2] = '\n';
-                       buf[len - 1] = '\0';
-               } else {
-                       while (--len > 0)
-                               if (buf[len] == '\r')
-                                       buf[len] = '\n';
+               if (len > 0 && buf[len - 1] != '\n') {
+                       while (--len >= 0)
+                               if (buf[len] == '\r') buf[len] = '\n';
                }
-
-               gtk_stext_insert(text, NULL, NULL, NULL, buf, -1);
+               gtk_stext_insert(text, NULL, NULL, NULL, buf, -1);
        }
 
        gtk_stext_thaw(text);
@@ -1886,7 +1946,7 @@ static void compose_attach_append(Compose *compose, const gchar *file,
 
                ifactory = gtk_item_factory_from_widget(compose->menubar);
                menuitem = gtk_item_factory_get_item(ifactory,
-                                                    "/Message/Attach");
+                                                    "/View/Attachment");
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
                                               TRUE);
        }
@@ -1915,7 +1975,7 @@ static void compose_attach_append(Compose *compose, const gchar *file,
 #define GET_CHAR(pos, buf, len)                                                     \
 {                                                                           \
        if (text->use_wchar)                                                 \
-               len = wctomb(buf, (wchar_t)GTK_STEXT_INDEX(text, (pos)));     \
+               len = wctomb(buf, (wchar_t)GTK_STEXT_INDEX(text, (pos)));    \
        else {                                                               \
                buf[0] = GTK_STEXT_INDEX(text, (pos));                       \
                len = 1;                                                     \
@@ -1934,7 +1994,6 @@ static void compose_wrap_line(Compose *compose)
        gint line_pos, cur_pos;
        gint line_len, cur_len;
 
-
        gtk_stext_freeze(text);
 
        text_len = gtk_stext_get_length(text);
@@ -2167,14 +2226,17 @@ static void compose_wrap_line_all(Compose *compose)
 
        for (; cur_pos < tlen; cur_pos++) {
                /* mark position of new line - needed for quotation wrap */
-               if (linewrap_quote && is_new_line) {
-                       qlen = gtkut_text_str_compare
-                               (text, cur_pos, tlen, qfmt);
+               if (is_new_line) {
+                       if (linewrap_quote) {
+                               qlen = gtkut_stext_str_compare
+                                       (text, cur_pos, tlen, qfmt);
+                               if (qlen)
+                                       i_len = get_indent_length
+                                               (text, cur_pos, tlen);
+                               else
+                                       i_len = 0;
+                       }
                        is_new_line = FALSE;
-                       if (qlen)
-                               i_len = get_indent_length(text, cur_pos, tlen);
-                       else
-                               i_len = 0;
                        p_pos = cur_pos;
 #ifdef WRAP_DEBUG
                        printf("new line i_len=%d qlen=%d p_pos=", i_len, qlen);
@@ -2215,7 +2277,7 @@ static void compose_wrap_line_all(Compose *compose)
                        /* if it's just quotation + newline skip it */
                        if (i_len && (cur_pos + 1 < tlen)) {
                                /* check if text at new line matches indent */
-                               ilen =  gtkut_text_str_compare_n
+                               ilen =  gtkut_stext_str_compare_n
                                        (text, cur_pos + 1, p_pos, i_len, tlen);
                                if (cur_pos + ilen < tlen) {
                                        GET_CHAR(cur_pos + ilen + 1, cb, clen);
@@ -2245,16 +2307,16 @@ static void compose_wrap_line_all(Compose *compose)
                                /* if text starts with quote fmt or with
                                   indent string, delete them */
                                if (i_len) {
-                                       ilen =  gtkut_text_str_compare_n
+                                       ilen =  gtkut_stext_str_compare_n
                                                (text, cur_pos, p_pos, i_len,
                                                 tlen);
                                        if (ilen) {
-                                               gtk_stext_forward_delete(text,
-                                                                        ilen);
+                                               gtk_stext_forward_delete
+                                                       (text, ilen);
                                                tlen -= ilen;
                                        }
                                } else if (qlen) {
-                                       if (gtkut_text_str_compare
+                                       if (gtkut_stext_str_compare
                                            (text, cur_pos, tlen, qfmt)) {
                                                gtk_stext_forward_delete
                                                        (text, qlen);
@@ -2269,7 +2331,7 @@ static void compose_wrap_line_all(Compose *compose)
                                    ((clen > 1) || isalnum(cb[0]))) {
                                        gtk_stext_insert(text, NULL, NULL,
                                                        NULL, " ", 1);
-                                       /* gtk_text_compact_buffer(text); */
+                                       /* gtk_stext_compact_buffer(text); */
                                        tlen++;
                                }
 
@@ -2317,8 +2379,8 @@ static void compose_wrap_line_all(Compose *compose)
                        dump_text(text, line_pos, tlen, 1);
 #endif
                        /* force wrapping if it is one long word but not URL */
-                       if (p_pos + i_len == line_pos)
-                               if (!gtkut_text_is_uri_string
+                       if (line_pos - p_pos <= i_len)
+                               if (!gtkut_stext_is_uri_string
                                    (text, line_pos, tlen))
                                        line_pos = cur_pos - 1;
 #ifdef WRAP_DEBUG
@@ -2330,7 +2392,7 @@ static void compose_wrap_line_all(Compose *compose)
                        /* if next character is space delete it */
                         if (clen == 1 && isspace(*cbuf)) {
                                if (p_pos + i_len != line_pos ||
-                                   !gtkut_text_is_uri_string
+                                   !gtkut_stext_is_uri_string
                                        (text, line_pos, tlen)) {
                                        gtk_stext_set_point(text, line_pos);
                                        gtk_stext_backward_delete(text, 1);
@@ -2344,7 +2406,7 @@ static void compose_wrap_line_all(Compose *compose)
 
                        /* if it is URL at beginning of line don't wrap */
                        if (p_pos + i_len == line_pos &&
-                           gtkut_text_is_uri_string(text, line_pos, tlen)) {
+                           gtkut_stext_is_uri_string(text, line_pos, tlen)) {
 #ifdef WRAP_DEBUG
                                printf("found URL at ");
                                dump_text(text, line_pos, tlen, 1);
@@ -2374,7 +2436,7 @@ static void compose_wrap_line_all(Compose *compose)
                        /* should we insert quotation ? */
                        if (linewrap_quote && qlen) {
                                /* only if line is not already quoted  */
-                               if (!gtkut_text_str_compare
+                               if (!gtkut_stext_str_compare
                                        (text, line_pos, tlen, qfmt)) {
                                        guint ins_len;
 
@@ -2753,8 +2815,26 @@ static gint compose_bounce_write_to_file(Compose *compose, const gchar *file)
                    || (g_strncasecmp(buf, "Delivered-To:",
                                      strlen("Delivered-To:")) == 0))
                        continue;
+
                if (fputs(buf, fdest) == -1)
                        goto error;
+
+               if (g_strncasecmp(buf, "From:", strlen("From:")) == 0) {
+                       fputs(" (by way of ", fdest);
+                       if (compose->account->name
+                           && *compose->account->name) {
+                               compose_convert_header
+                                       (buf, sizeof(buf),
+                                        compose->account->name,
+                                        strlen("From: "));
+                               fprintf(fdest, "%s <%s>",
+                                       buf, compose->account->address);
+                       } else
+                               fprintf(fdest, "%s",
+                                       compose->account->address);
+                       fputs(")", fdest);
+               }
+
                if (fputs("\n", fdest) == -1)
                        goto error;
        }
@@ -3152,6 +3232,14 @@ static gint compose_queue(Compose *compose, gint *msgnum, FolderItem **item)
        if(newsac) {
                fprintf(fp, "NAID:%d\n", newsac->account_id);
        }
+       /* Save copy folder */
+       if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn))) {
+               gchar *str;
+               
+               str = gtk_editable_get_chars(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+               fprintf(fp, "SCF:%s\n", str);
+               g_free(str);
+       }
        fprintf(fp, "\n");
 
        while (fgets(buf, sizeof(buf), src_fp) != NULL) {
@@ -3660,7 +3748,6 @@ static void compose_generate_msgid(Compose *compose, gchar *buf, gint len)
        g_free(addr);
 }
 
-
 static void compose_add_entry_field(GtkWidget *table, GtkWidget **hbox,
                                    GtkWidget **entry, gint *count,
                                    const gchar *label_str,
@@ -3691,7 +3778,8 @@ static void compose_add_entry_field(GtkWidget *table, GtkWidget **hbox,
        (*count)++;
 }
 
-static void compose_create_header_entry(Compose *compose) {
+static void compose_create_header_entry(Compose *compose) 
+{
        gchar *headers[] = {"To:", "Cc:", "Bcc:", "Newsgroups:", "Reply-To:", "Followup-To:", NULL};
 
        GtkWidget *combo;
@@ -3719,10 +3807,10 @@ static void compose_create_header_entry(Compose *compose) {
        } else {
                switch(compose->account->protocol) {
                        case A_NNTP:
-                               header = _("Newsgroups:");
+                               header = prefs_common.trans_hdr ? _("Newsgroups:") : "Newsgroups:";
                                break;
                        default:
-                               header = _("To:");
+                               header = prefs_common.trans_hdr ? _("To:") : "To:";
                                break;
                }                                                                   
        }
@@ -3735,6 +3823,7 @@ static void compose_create_header_entry(Compose *compose) {
 
         gtk_signal_connect(GTK_OBJECT(entry), "key-press-event", GTK_SIGNAL_FUNC(compose_headerentry_key_press_event_cb), headerentry);
        gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(compose_headerentry_changed_cb), headerentry);
+       gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(compose_ctl_enter_send_shortcut_cb), compose);
 
        address_completion_register_entry(GTK_ENTRY(entry));
 
@@ -3747,7 +3836,8 @@ static void compose_create_header_entry(Compose *compose) {
        compose->header_last = headerentry;
 }
 
-static void compose_add_header_entry(Compose *compose, gchar *header, gchar *text) {
+static void compose_add_header_entry(Compose *compose, gchar *header, gchar *text) 
+{
        ComposeHeaderEntry *last_header;
        
        last_header = compose->header_last;
@@ -3756,20 +3846,10 @@ static void compose_add_header_entry(Compose *compose, gchar *header, gchar *tex
        gtk_entry_set_text(GTK_ENTRY(last_header->entry), text);
 }
 
-static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
+static GtkWidget *compose_create_header(Compose *compose) 
 {
-       Compose   *compose;
-       GtkWidget *window;
-       GtkWidget *vbox;
-       GtkWidget *menubar;
-       GtkWidget *handlebox;
-
-       GtkWidget *notebook;
-
-       GtkWidget *vbox2;
-
-       GtkWidget *table_vbox;
        GtkWidget *label;
+       GtkWidget *hbox;
        GtkWidget *from_optmenu_hbox;
 #if 0 /* NEW COMPOSE GUI */
        GtkWidget *to_entry;
@@ -3779,7 +3859,6 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 #endif
        GtkWidget *header_scrolledwin;
        GtkWidget *header_table;
-       GtkWidget *subject_entry;
 #if 0 /* NEW COMPOSE GUI */
        GtkWidget *cc_entry;
        GtkWidget *cc_hbox;
@@ -3790,102 +3869,19 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        GtkWidget *followup_entry;
        GtkWidget *followup_hbox;
 #endif
-       GtkWidget *paned;
-
-       GtkWidget *attach_scrwin;
-       GtkWidget *attach_clist;
-
-       GtkWidget *edit_vbox;
-       GtkWidget *ruler_hbox;
-       GtkWidget *ruler;
-       GtkWidget *scrolledwin;
-       GtkWidget *text;
-
-       GtkWidget *table;
-       GtkWidget *hbox;
-
-       UndoMain *undostruct;
 
-       gchar *titles[] = {_("MIME type"), _("Size"), _("Name")};
-       guint n_menu_entries;
-       GtkStyle  *style, *new_style;
-       GdkColormap *cmap;
-       GdkColor color[1];
-       gboolean success[1];
-       GdkFont   *font;
-       GtkWidget *popupmenu;
-       GtkWidget *menuitem;
-       GtkItemFactory *popupfactory;
-       GtkItemFactory *ifactory;
-       GtkWidget *tmpl_menu;
-       gint n_entries;
        gint count = 0;
-       gint i;
-
-#if USE_PSPELL
-        GtkPspell * gtkpspell = NULL;
-#endif
-
-       g_return_val_if_fail(account != NULL, NULL);
-
-       debug_print(_("Creating compose window...\n"));
-       compose = g_new0(Compose, 1);
-
-       compose->account = account;
-       compose->orig_account = account;
-
-       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
-       gtk_widget_set_usize(window, -1, prefs_common.compose_height);
-       gtk_signal_connect(GTK_OBJECT(window), "delete_event",
-                          GTK_SIGNAL_FUNC(compose_delete_cb), compose);
-       gtk_signal_connect(GTK_OBJECT(window), "destroy",
-                          GTK_SIGNAL_FUNC(compose_destroy_cb), compose);
-       gtk_signal_connect(GTK_OBJECT(window), "focus_in_event",
-                          GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "focus_out_event",
-                          GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
-       gtk_widget_realize(window);
-
-       gtkut_widget_set_composer_icon(window);
-
-       vbox = gtk_vbox_new(FALSE, 0);
-       gtk_container_add(GTK_CONTAINER(window), vbox);
-
-       n_menu_entries = sizeof(compose_entries) / sizeof(compose_entries[0]);
-       menubar = menubar_create(window, compose_entries,
-                                n_menu_entries, "<Compose>", compose);
-       gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
-
-       handlebox = gtk_handle_box_new();
-       gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
-
-       compose_toolbar_create(compose, handlebox);
-
-       vbox2 = gtk_vbox_new(FALSE, 2);
-       gtk_box_pack_start(GTK_BOX(vbox), vbox2, TRUE, TRUE, 0);
-       gtk_container_set_border_width(GTK_CONTAINER(vbox2), BORDER_WIDTH);
-
-       table_vbox = gtk_vbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox2), table_vbox, FALSE, TRUE, 0);
-       gtk_container_set_border_width(GTK_CONTAINER(table_vbox),
-                                      BORDER_WIDTH * 2);
-
-       /* Notebook */
-       notebook = gtk_notebook_new();
-       gtk_widget_set_usize(notebook, -1, 180);
-       gtk_widget_show(notebook);
 
        /* header labels and entries */
        header_scrolledwin = gtk_scrolled_window_new(NULL, NULL);
        gtk_widget_show(header_scrolledwin);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(header_scrolledwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), header_scrolledwin, gtk_label_new(_("Header")));
 
        header_table = gtk_table_new(2, 2, FALSE);
        gtk_widget_show(header_table);
        gtk_container_set_border_width(GTK_CONTAINER(header_table), 2);
        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(header_scrolledwin), header_table);
+       gtk_viewport_set_shadow_type(GTK_VIEWPORT(GTK_BIN(header_scrolledwin)->child), GTK_SHADOW_ETCHED_IN);
        count = 0;
 
        /* option menu for selecting accounts */
@@ -3902,10 +3898,6 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 #endif
        count++;
 
-       /* Subject */
-       compose_add_entry_field(header_table, &hbox, &subject_entry, &count,
-                               "Subject:", FALSE);
-
        compose->header_table = header_table;
        compose->header_list = NULL;
        compose->header_nextrow = count;
@@ -3968,9 +3960,38 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                           GTK_SIGNAL_FUNC(compose_grab_focus_cb), compose);
 #endif
 
+       compose->table            = NULL;
+#if 0 /* NEW COMPOSE GUI */
+       compose->table            = table;
+       compose->to_hbox          = to_hbox;
+       compose->to_entry         = to_entry;
+       compose->newsgroups_hbox  = newsgroups_hbox;
+       compose->newsgroups_entry = newsgroups_entry;
+#endif
+#if 0 /* NEW COMPOSE GUI */
+       compose->cc_hbox          = cc_hbox;
+       compose->cc_entry         = cc_entry;
+       compose->bcc_hbox         = bcc_hbox;
+       compose->bcc_entry        = bcc_entry;
+       compose->reply_hbox       = reply_hbox;
+       compose->reply_entry      = reply_entry;
+       compose->followup_hbox    = followup_hbox;
+       compose->followup_entry   = followup_entry;
+#endif
+
+       return header_scrolledwin ;
+}
+
+GtkWidget *compose_create_attach(Compose *compose)
+{
+       gchar *titles[] = {_("MIME type"), _("Size"), _("Name")};
+       gint i;
+
+       GtkWidget *attach_scrwin;
+       GtkWidget *attach_clist;
+
        /* attachment list */
        attach_scrwin = gtk_scrolled_window_new(NULL, NULL);
-       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), attach_scrwin, gtk_label_new(_("Attachments")));
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(attach_scrwin),
                                       GTK_POLICY_AUTOMATIC,
                                       GTK_POLICY_ALWAYS);
@@ -4004,12 +4025,216 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                           GTK_SIGNAL_FUNC(compose_attach_drag_received_cb),
                           compose);
 
+       compose->attach_scrwin = attach_scrwin;
+       compose->attach_clist  = attach_clist;
+
+       return attach_scrwin;
+}
+
+static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose);
+static void compose_savemsg_select_cb(GtkWidget *widget, Compose *compose);
+
+static GtkWidget *compose_create_others(Compose *compose)
+{
+       GtkWidget *table;
+       GtkWidget *savemsg_checkbtn;
+       GtkWidget *savemsg_entry;
+       GtkWidget *savemsg_select;
+       
+       guint rowcount = 0;
+       gchar *folderidentifier;
+
+       /* Table for settings */
+       table = gtk_table_new(3, 1, FALSE);
+       gtk_widget_show(table);
+       gtk_table_set_row_spacings(GTK_TABLE(table), VSPACING_NARROW);
+       rowcount = 0;
+
+       /* Save Message to folder */
+       savemsg_checkbtn = gtk_check_button_new_with_label(_("Save Message to "));
+       gtk_widget_show(savemsg_checkbtn);
+       gtk_table_attach(GTK_TABLE(table), savemsg_checkbtn, 0, 1, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
+       if(folder_get_default_outbox()) {
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(savemsg_checkbtn), prefs_common.savemsg);
+       }
+       gtk_signal_connect(GTK_OBJECT(savemsg_checkbtn), "toggled",
+                           GTK_SIGNAL_FUNC(compose_savemsg_checkbtn_cb), compose);
+
+       savemsg_entry = gtk_entry_new();
+       gtk_widget_show(savemsg_entry);
+       gtk_table_attach_defaults(GTK_TABLE(table), savemsg_entry, 1, 2, rowcount, rowcount + 1);
+       gtk_editable_set_editable(GTK_EDITABLE(savemsg_entry), prefs_common.savemsg);
+       if(folder_get_default_outbox()) {
+               folderidentifier = folder_item_get_identifier(folder_get_default_outbox());
+               gtk_entry_set_text(GTK_ENTRY(savemsg_entry), folderidentifier);
+               g_free(folderidentifier);
+       }
+
+       savemsg_select = gtk_button_new_with_label (_("Select ..."));
+       gtk_widget_show (savemsg_select);
+       gtk_table_attach(GTK_TABLE(table), savemsg_select, 2, 3, rowcount, rowcount + 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
+       gtk_signal_connect (GTK_OBJECT (savemsg_select), "clicked",
+                           GTK_SIGNAL_FUNC (compose_savemsg_select_cb),
+                           compose);
+
+       rowcount++;
+
+       compose->savemsg_checkbtn = savemsg_checkbtn;
+       compose->savemsg_entry = savemsg_entry;
+
+       return table;   
+}
+
+static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose) 
+{
+       gtk_editable_set_editable(GTK_EDITABLE(compose->savemsg_entry),
+               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn)));
+}
+
+static void compose_savemsg_select_cb(GtkWidget *widget, Compose *compose)
+{
+       FolderItem *dest;
+       gchar * path;
+
+       dest = foldersel_folder_sel(NULL, NULL);
+       if (!dest) return;
+
+       path = folder_item_get_identifier(dest);
+
+       gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), path);
+       g_free(path);
+}
+
+static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
+{
+       Compose   *compose;
+       GtkWidget *window;
+       GtkWidget *vbox;
+       GtkWidget *menubar;
+       GtkWidget *handlebox;
+
+       GtkWidget *notebook;
+
+       GtkWidget *vbox2;
+
+       GtkWidget *label;
+       GtkWidget *subject_hbox;
+       GtkWidget *subject_frame;
+       GtkWidget *subject_entry;
+       GtkWidget *subject;
+       GtkWidget *paned;
 
+       GtkWidget *edit_vbox;
+       GtkWidget *ruler_hbox;
+       GtkWidget *ruler;
+       GtkWidget *scrolledwin;
+       GtkWidget *text;
+
+       GtkWidget *table;
+
+       UndoMain *undostruct;
+
+       guint n_menu_entries;
+       GtkStyle  *style, *new_style;
+       GdkColormap *cmap;
+       GdkColor color[1];
+       gboolean success[1];
+       GdkFont   *font;
+       GtkWidget *popupmenu;
+       GtkWidget *menuitem;
+       GtkItemFactory *popupfactory;
+       GtkItemFactory *ifactory;
+       GtkWidget *tmpl_menu;
+       gint n_entries;
+
+#if USE_PSPELL
+        GtkPspell * gtkpspell = NULL;
+#endif
+
+       g_return_val_if_fail(account != NULL, NULL);
+
+       debug_print(_("Creating compose window...\n"));
+       compose = g_new0(Compose, 1);
+
+       compose->account = account;
+       compose->orig_account = account;
+
+       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
+       gtk_widget_set_usize(window, -1, prefs_common.compose_height);
+       gtk_window_set_wmclass(GTK_WINDOW(window), "compose window", "Sylpheed");
+       gtk_signal_connect(GTK_OBJECT(window), "delete_event",
+                          GTK_SIGNAL_FUNC(compose_delete_cb), compose);
+       gtk_signal_connect(GTK_OBJECT(window), "destroy",
+                          GTK_SIGNAL_FUNC(compose_destroy_cb), compose);
+       gtk_signal_connect(GTK_OBJECT(window), "focus_in_event",
+                          GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
+       gtk_signal_connect(GTK_OBJECT(window), "focus_out_event",
+                          GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
+       gtk_widget_realize(window);
+
+       gtkut_widget_set_composer_icon(window);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(window), vbox);
+
+       n_menu_entries = sizeof(compose_entries) / sizeof(compose_entries[0]);
+       menubar = menubar_create(window, compose_entries,
+                                n_menu_entries, "<Compose>", compose);
+       gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
+
+       handlebox = gtk_handle_box_new();
+       gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
+
+       compose_toolbar_create(compose, handlebox);
+
+       vbox2 = gtk_vbox_new(FALSE, 2);
+       gtk_box_pack_start(GTK_BOX(vbox), vbox2, TRUE, TRUE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox2), BORDER_WIDTH);
+       
+       /* Notebook */
+       notebook = gtk_notebook_new();
+       gtk_widget_set_usize(notebook, -1, 130);
+       gtk_widget_show(notebook);
+
+       /* header labels and entries */
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), compose_create_header(compose), gtk_label_new(_("Header")));
+       /* attachment list */
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), compose_create_attach(compose), gtk_label_new(_("Attachments")));
+       /* Others Tab */
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), compose_create_others(compose), gtk_label_new(_("Others")));
+
+       /* Subject */
+       subject_hbox = gtk_hbox_new(FALSE, 0);
+       gtk_widget_show(subject_hbox);
+
+       subject_frame = gtk_frame_new(NULL);
+       gtk_frame_set_shadow_type(GTK_FRAME(subject_frame), GTK_SHADOW_OUT);
+       gtk_box_pack_start(GTK_BOX(subject_hbox), subject_frame, TRUE, TRUE, BORDER_WIDTH+1);
+       gtk_widget_show(subject_frame);
+
+       subject = gtk_hbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(subject), BORDER_WIDTH);
+       gtk_widget_show(subject);
+
+       label = gtk_label_new(_("Subject:"));
+       gtk_box_pack_start(GTK_BOX(subject), label, FALSE, FALSE, 4);
+       gtk_widget_show(label);
+
+       subject_entry = gtk_entry_new();
+       gtk_box_pack_start(GTK_BOX(subject), subject_entry, TRUE, TRUE, 2);
+       gtk_signal_connect(GTK_OBJECT(subject_entry), "activate", GTK_SIGNAL_FUNC(compose_ctl_enter_send_shortcut_cb), compose);
+       gtk_widget_show(subject_entry);
+       compose->subject_entry = subject_entry;
+       gtk_container_add(GTK_CONTAINER(subject_frame), subject);
+       
        edit_vbox = gtk_vbox_new(FALSE, 0);
 #if 0 /* NEW COMPOSE GUI */
        gtk_box_pack_start(GTK_BOX(vbox2), edit_vbox, TRUE, TRUE, 0);
 #endif
 
+       gtk_box_pack_start(GTK_BOX(edit_vbox), subject_hbox, FALSE, FALSE, 0);
+
        /* ruler */
        ruler_hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(edit_vbox), ruler_hbox, FALSE, FALSE, 0);
@@ -4035,7 +4260,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        gtk_stext_set_editable(GTK_STEXT(text), TRUE);
 
        if (prefs_common.block_cursor) {
-               GTK_STEXT(text)->cursor_type = STEXT_CURSOR_BLOCK;
+               GTK_STEXT(text)->cursor_type = GTK_STEXT_CURSOR_BLOCK;
        }
        
        if (prefs_common.smart_wrapping) {      
@@ -4049,9 +4274,11 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                           GTK_SIGNAL_FUNC(compose_changed_cb), compose);
        gtk_signal_connect(GTK_OBJECT(text), "grab_focus",
                           GTK_SIGNAL_FUNC(compose_grab_focus_cb), compose);
+       gtk_signal_connect(GTK_OBJECT(text), "activate",
+                          GTK_SIGNAL_FUNC(compose_ctl_enter_send_shortcut_cb), compose);
        gtk_signal_connect_after(GTK_OBJECT(text), "button_press_event",
                                 GTK_SIGNAL_FUNC(compose_button_press_cb),
-                                compose);
+                                edit_vbox);
 #if 0
        gtk_signal_connect_after(GTK_OBJECT(text), "key_press_event",
                                 GTK_SIGNAL_FUNC(compose_key_press_cb),
@@ -4072,7 +4299,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                gtkpspell = gtkpspell_new_with_config(gtkpspellconfig,
                                                      prefs_common.pspell_path,
                                                      prefs_common.dictionary,
-                                                     PSPELL_FASTMODE,
+                                                     prefs_common.pspell_sugmode,
                                                      conv_get_current_charset_str());
                if (gtkpspell == NULL)
                        prefs_common.enable_pspell = FALSE;
@@ -4084,6 +4311,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        /* pane between attach clist and text */
        paned = gtk_vpaned_new();
+       gtk_paned_set_gutter_size(GTK_PANED(paned), 12);
+       gtk_paned_set_handle_size(GTK_PANED(paned), 12);
        gtk_container_add(GTK_CONTAINER(vbox2), paned);
        gtk_paned_add1(GTK_PANED(paned), notebook);
        gtk_paned_add2(GTK_PANED(paned), edit_vbox);
@@ -4091,7 +4320,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        style = gtk_widget_get_style(text);
 
-       /* workaround for the slow down of GtkText when using Pixmap theme */
+       /* workaround for the slow down of GtkSText when using Pixmap theme */
        if (style->engine) {
                GtkThemeEngine *engine;
 
@@ -4144,6 +4373,17 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        tmpl_menu = gtk_item_factory_get_item(ifactory, "/Tool/Template");
 #if 0 /* NEW COMPOSE GUI */
+       gtk_widget_hide(bcc_hbox);
+       gtk_widget_hide(bcc_entry);
+       gtk_widget_hide(reply_hbox);
+       gtk_widget_hide(reply_entry);
+       gtk_widget_hide(followup_hbox);
+       gtk_widget_hide(followup_entry);
+       gtk_widget_hide(ruler_hbox);
+       gtk_table_set_row_spacing(GTK_TABLE(table), 4, 0);
+       gtk_table_set_row_spacing(GTK_TABLE(table), 5, 0);
+       gtk_table_set_row_spacing(GTK_TABLE(table), 6, 0);
+
        if (account->protocol == A_NNTP) {
                gtk_widget_hide(to_hbox);
                gtk_widget_hide(to_entry);
@@ -4155,8 +4395,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                gtk_widget_hide(newsgroups_hbox);
                gtk_widget_hide(newsgroups_entry);
                gtk_table_set_row_spacing(GTK_TABLE(table), 2, 0);
-
-               menu_set_sensitive(ifactory, "/Message/Followup to", FALSE);
+               menu_set_sensitive(ifactory, "/View/Followup to", FALSE);
        }
 #endif
 
@@ -4178,6 +4417,10 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
                break;
        }
 
+       undostruct = undo_init(text);
+       undo_set_change_state_func(undostruct, &compose_undo_state_changed,
+                                  menubar);
+
        gtk_widget_show(window);
 
        address_completion_start(window);
@@ -4189,31 +4432,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        compose->vbox2         = vbox2;
 
-       compose->table_vbox       = table_vbox;
-       compose->table            = NULL;
-#if 0 /* NEW COMPOSE GUI */
-       compose->table            = table;
-       compose->to_hbox          = to_hbox;
-       compose->to_entry         = to_entry;
-       compose->newsgroups_hbox  = newsgroups_hbox;
-       compose->newsgroups_entry = newsgroups_entry;
-#endif
-       compose->subject_entry    = subject_entry;
-#if 0 /* NEW COMPOSE GUI */
-       compose->cc_hbox          = cc_hbox;
-       compose->cc_entry         = cc_entry;
-       compose->bcc_hbox         = bcc_hbox;
-       compose->bcc_entry        = bcc_entry;
-       compose->reply_hbox       = reply_hbox;
-       compose->reply_entry      = reply_entry;
-       compose->followup_hbox    = followup_hbox;
-       compose->followup_entry   = followup_entry;
-#endif
        compose->paned = paned;
 
-       compose->attach_scrwin = attach_scrwin;
-       compose->attach_clist  = attach_clist;
-
        compose->edit_vbox     = edit_vbox;
        compose->ruler_hbox    = ruler_hbox;
        compose->ruler         = ruler;
@@ -4260,6 +4480,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        compose->exteditor_tag     = -1;
 
        compose->bounce_filename = NULL;
+       compose->undostruct = undostruct;
 
        compose_set_title(compose);
 
@@ -4273,18 +4494,13 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
         compose->gtkpspell      = gtkpspell;
 #endif
 
-       undostruct = undo_init(text);
-
-       compose->undostruct = undostruct;
-       undo_set_undo_change_funct(undostruct, &compose_set_undo, GTK_WIDGET(compose->menubar));
-
 #if 0 /* NEW COMPOSE GUI */
        if (account->protocol != A_NNTP) {
-               menuitem = gtk_item_factory_get_item(ifactory, "/Message/To");
+               menuitem = gtk_item_factory_get_item(ifactory, "/View/To");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                gtk_widget_set_sensitive(menuitem, FALSE);
-               menuitem = gtk_item_factory_get_item(ifactory, "/Message/Cc");
+               menuitem = gtk_item_factory_get_item(ifactory, "/View/Cc");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                gtk_widget_set_sensitive(menuitem, FALSE);
@@ -4295,7 +4511,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 #if 0 /* NEW COMPOSE GUI */
                compose->use_cc = TRUE;
                gtk_entry_set_text(GTK_ENTRY(cc_entry), account->auto_cc);
-               menuitem = gtk_item_factory_get_item(ifactory, "/Message/Cc");
+               menuitem = gtk_item_factory_get_item(ifactory, "/View/Cc");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
 #endif
@@ -4303,8 +4519,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        if (account->set_autobcc) {
                compose_entry_append(compose, account->auto_bcc, COMPOSE_BCC);
 #if 0 /* NEW COMPOSE GUI */
-               compose->use_bcc = TRUE;
-               menuitem = gtk_item_factory_get_item(ifactory, "/Message/Bcc");
+               menuitem = gtk_item_factory_get_item(ifactory, "/View/Bcc");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                if (account->auto_bcc && mode != COMPOSE_REEDIT)
@@ -4317,22 +4532,25 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 #if 0 /* NEW COMPOSE GUI */
                compose->use_replyto = TRUE;
                menuitem = gtk_item_factory_get_item(ifactory,
-                                                    "/Message/Reply to");
+                                                    "/View/Reply to");
                gtk_check_menu_item_set_active
                        (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                gtk_entry_set_text(GTK_ENTRY(reply_entry),
                                   account->auto_replyto);
 #endif
        }
+
        if (account->protocol != A_NNTP) {
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(compose->header_last->combo)->entry), _("To:"));
+               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(compose->header_last->combo)->entry), prefs_common.trans_hdr ? _("To:") : "To:");
        } else {
-               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(compose->header_last->combo)->entry), _("Newsgroups:"));
+               gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(compose->header_last->combo)->entry), prefs_common.trans_hdr ? _("Newsgroups:") : "Newsgroups:");
        }
 
-       menuitem = gtk_item_factory_get_item(ifactory, "/Tool/Show ruler");
+#if 0 /* NEW COMPOSE GUI */
+       menuitem = gtk_item_factory_get_item(ifactory, "/View/Ruler");
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
                                       prefs_common.show_ruler);
+#endif                                
 
 #if USE_GPGME
        menuitem = gtk_item_factory_get_item(ifactory, "/Message/Sign");
@@ -4379,28 +4597,9 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        return compose;
 }
 
-#include "pixmaps/stock_mail_send.xpm"
-#include "pixmaps/stock_mail_send_queue.xpm"
-#include "pixmaps/stock_mail.xpm"
-#include "pixmaps/stock_paste.xpm"
-#include "pixmaps/stock_mail_attach.xpm"
-#include "pixmaps/stock_mail_compose.xpm"
-#include "pixmaps/linewrap.xpm"
-#include "pixmaps/tb_address_book.xpm"
-
-#define CREATE_TOOLBAR_ICON(xpm_d) \
-{ \
-       icon = gdk_pixmap_create_from_xpm_d(container->window, &mask, \
-                                           &container->style->white, \
-                                           xpm_d); \
-       icon_wid = gtk_pixmap_new(icon, mask); \
-}
-
 static void compose_toolbar_create(Compose *compose, GtkWidget *container)
 {
        GtkWidget *toolbar;
-       GdkPixmap *icon;
-       GdkBitmap *mask;
        GtkWidget *icon_wid;
        GtkWidget *send_btn;
        GtkWidget *sendl_btn;
@@ -4420,15 +4619,14 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
        gtk_toolbar_set_space_style(GTK_TOOLBAR(toolbar),
                                    GTK_TOOLBAR_SPACE_LINE);
 
-       CREATE_TOOLBAR_ICON(stock_mail_send_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL_SEND);
        send_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                           _("Send"),
                                           _("Send message"),
                                           "Send",
                                           icon_wid, toolbar_send_cb, compose);
 
-       CREATE_TOOLBAR_ICON(stock_mail_send_queue_xpm);
-       /* CREATE_TOOLBAR_ICON(tb_mail_queue_send_xpm); */
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL_SEND_QUEUE);
        sendl_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                           _("Send later"),
                                           _("Put into queue folder and send later"),
@@ -4436,7 +4634,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
                                           icon_wid, toolbar_send_later_cb,
                                           compose);
 
-       CREATE_TOOLBAR_ICON(stock_mail_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL);
        draft_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                            _("Draft"),
                                            _("Save to draft folder"),
@@ -4446,7 +4644,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
 
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
-       CREATE_TOOLBAR_ICON(stock_paste_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_PASTE);
        insert_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                             _("Insert"),
                                             _("Insert file"),
@@ -4454,7 +4652,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
                                             icon_wid, toolbar_insert_cb,
                                             compose);
 
-       CREATE_TOOLBAR_ICON(stock_mail_attach_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL_ATTACH);
        attach_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                             _("Attach"),
                                             _("Attach file"),
@@ -4464,7 +4662,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
 
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
-       CREATE_TOOLBAR_ICON(stock_mail_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL);
        sig_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                          _("Signature"),
                                          _("Insert signature"),
@@ -4473,7 +4671,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
 
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
-       CREATE_TOOLBAR_ICON(stock_mail_compose_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_MAIL_COMPOSE);
        exteditor_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                                _("Editor"),
                                                _("Edit with external editor"),
@@ -4482,10 +4680,10 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
                                                toolbar_ext_editor_cb,
                                                compose);
 
-       CREATE_TOOLBAR_ICON(linewrap_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_LINEWRAP);
        linewrap_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                               _("Linewrap"),
-                                              _("Wrap current paragraph"),
+                                              _("Wrap all long lines"),
                                               "Linewrap",
                                               icon_wid,
                                               toolbar_linewrap_cb,
@@ -4493,7 +4691,7 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
 
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
-       CREATE_TOOLBAR_ICON(tb_address_book_xpm);
+       icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_ADDRESS_BOOK);
        addrbook_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                               _("Address"),
                                               _("Address book"),
@@ -4515,8 +4713,6 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container)
        gtk_widget_show_all(toolbar);
 }
 
-#undef CREATE_TOOLBAR_ICON
-
 static GtkWidget *compose_account_option_menu_create(Compose *compose)
 {
        GList *accounts;
@@ -4600,10 +4796,12 @@ static void compose_template_apply(Compose *compose, Template *tmpl)
        if (!tmpl || !tmpl->value) return;
 
        gtk_stext_freeze(GTK_STEXT(compose->text));
-        
-       if (tmpl->subject)
+
+       if (tmpl->subject && *tmpl->subject != '\0')
                gtk_entry_set_text(GTK_ENTRY(compose->subject_entry),
                                   tmpl->subject);
+       if (tmpl->to && *tmpl->to != '\0')
+               compose_entry_append(compose, tmpl->to, COMPOSE_TO);
 
        if (compose->replyinfo == NULL) {
                MsgInfo dummyinfo;
@@ -4755,7 +4953,7 @@ static void compose_attach_property(Compose *compose)
                GtkWidget *menuitem;
 
                cancelled = FALSE;
-                gtk_main();
+               gtk_main();
 
                if (cancelled == TRUE) {
                        gtk_widget_hide(attach_prop.window);
@@ -5219,6 +5417,73 @@ static void compose_set_ext_editor_sensitive(Compose *compose,
        gtk_widget_set_sensitive(compose->linewrap_btn,  sensitive);
 }
 
+/**
+ * compose_undo_state_changed:
+ *
+ * Change the sensivity of the menuentries undo and redo
+ **/
+static void compose_undo_state_changed(UndoMain *undostruct, gint undo_state,
+                                      gint redo_state, gpointer data)
+{
+       GtkWidget *widget = GTK_WIDGET(data);
+       GtkItemFactory *ifactory;
+
+       g_return_if_fail(widget != NULL);
+
+       debug_print("Set_undo.  UNDO:%i  REDO:%i\n", undo_state, redo_state);
+
+       ifactory = gtk_item_factory_from_widget(widget);
+
+       switch (undo_state) {
+       case UNDO_STATE_TRUE:
+               if (!undostruct->undo_state) {
+                       debug_print ("Set_undo - Testpoint\n");
+                       undostruct->undo_state = TRUE;
+                       menu_set_sensitive(ifactory, "/Edit/Undo", TRUE);
+               }
+               break;
+       case UNDO_STATE_FALSE:
+               if (undostruct->undo_state) {
+                       undostruct->undo_state = FALSE;
+                       menu_set_sensitive(ifactory, "/Edit/Undo", FALSE);
+               }
+               break;
+       case UNDO_STATE_UNCHANGED:
+               break;
+       case UNDO_STATE_REFRESH:
+               menu_set_sensitive(ifactory, "/Edit/Undo",
+                                  undostruct->undo_state);
+               break;
+       default:
+               g_warning("Undo state not recognized");
+               break;
+       }
+
+       switch (redo_state) {
+       case UNDO_STATE_TRUE:
+               if (!undostruct->redo_state) {
+                       undostruct->redo_state = TRUE;
+                       menu_set_sensitive(ifactory, "/Edit/Redo", TRUE);
+               }
+               break;
+       case UNDO_STATE_FALSE:
+               if (undostruct->redo_state) {
+                       undostruct->redo_state = FALSE;
+                       menu_set_sensitive(ifactory, "/Edit/Redo", FALSE);
+               }
+               break;
+       case UNDO_STATE_UNCHANGED:
+               break;
+       case UNDO_STATE_REFRESH:
+               menu_set_sensitive(ifactory, "/Edit/Redo",
+                                  undostruct->redo_state);
+               break;
+       default:
+               g_warning("Redo state not recognized");
+               break;
+       }
+}
+
 static gint calc_cursor_xpos(GtkSText *text, gint extra, gint char_width)
 {
        gint cursor_pos;
@@ -5456,6 +5721,7 @@ static void compose_send_cb(gpointer data, guint action, GtkWidget *widget)
        gint val;
 
        val = compose_send(compose);
+
        if (val == 0) gtk_widget_destroy(compose->window);
 }
 
@@ -5474,24 +5740,34 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        Compose *compose = (Compose *)data;
        FolderItem *draft;
        gchar *tmp;
+       gint msgnum;
+       static gboolean lock = FALSE;
+
+       if (lock) return;
 
        draft = folder_get_default_draft();
+       g_return_if_fail(draft != NULL);
 
-        tmp = g_strdup_printf("%s%cdraft.%d", g_get_tmp_dir(),
+       lock = TRUE;
+
+       tmp = g_strdup_printf("%s%cdraft.%d", g_get_tmp_dir(),
                              G_DIR_SEPARATOR, (gint)compose);
 
        if (compose_write_to_file(compose, tmp, TRUE) < 0) {
                g_free(tmp);
+               lock = FALSE;
                return;
        }
 
        folder_item_scan(draft);
-       if (folder_item_add_msg(draft, tmp, TRUE) < 0) {
+       if ((msgnum = folder_item_add_msg(draft, tmp, TRUE)) <= 0) {
                unlink(tmp);
                g_free(tmp);
+               lock = FALSE;
                return;
        }
        g_free(tmp);
+       draft->mtime = 0;       /* force updating */
 
        if (compose->mode == COMPOSE_REEDIT) {
                compose_remove_reedit_target(compose);
@@ -5504,7 +5780,33 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        folder_item_scan(draft);
        folderview_update_item(draft, TRUE);
 
-       gtk_widget_destroy(compose->window);
+       lock = FALSE;
+
+       /* 0: quit editing  1: keep editing */
+       if (action == 0)
+               gtk_widget_destroy(compose->window);
+       else {
+               struct stat s;
+               gchar *path;
+
+               path = folder_item_fetch_msg(draft, msgnum);
+               g_return_if_fail(path != NULL);
+               if (stat(path, &s) < 0) {
+                       FILE_OP_ERROR(path, "stat");
+                       g_free(path);
+                       lock = FALSE;
+                       return;
+               }
+               g_free(path);
+
+               procmsg_msginfo_free(compose->targetinfo);
+               compose->targetinfo = g_new0(MsgInfo, 1);
+               compose->targetinfo->msgnum = msgnum;
+               compose->targetinfo->size = s.st_size;
+               compose->targetinfo->mtime = s.st_mtime;
+               compose->targetinfo->folder = draft;
+               compose->mode = COMPOSE_REEDIT;
+       }
 }
 
 static void compose_attach_cb(gpointer data, guint action, GtkWidget *widget)
@@ -5621,12 +5923,12 @@ static void compose_destroy_cb(GtkWidget *widget, Compose *compose)
        compose_destroy(compose);
 }
 
-static void compose_undo_cb(Compose *compose) 
+static void compose_undo_cb(Compose *compose)
 {
        undo_undo(compose->undostruct);
 }
 
-static void compose_redo_cb(Compose *compose) 
+static void compose_redo_cb(Compose *compose)
 {
        undo_redo(compose->undostruct);
 }
@@ -5806,8 +6108,8 @@ static void compose_toggle_attach_cb(gpointer data, guint action,
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
                gtk_widget_ref(compose->edit_vbox);
 
-               gtk_container_remove(GTK_CONTAINER(compose->vbox2),
-                                    compose->edit_vbox);
+               gtkut_container_remove(GTK_CONTAINER(compose->vbox2),
+                                      compose->edit_vbox);
                gtk_paned_add2(GTK_PANED(compose->paned), compose->edit_vbox);
                gtk_box_pack_start(GTK_BOX(compose->vbox2), compose->paned,
                                   TRUE, TRUE, 0);
@@ -5821,10 +6123,10 @@ static void compose_toggle_attach_cb(gpointer data, guint action,
                gtk_widget_ref(compose->paned);
                gtk_widget_ref(compose->edit_vbox);
 
-               gtk_container_remove(GTK_CONTAINER(compose->vbox2),
-                                    compose->paned);
-               gtk_container_remove(GTK_CONTAINER(compose->paned),
-                                    compose->edit_vbox);
+               gtkut_container_remove(GTK_CONTAINER(compose->vbox2),
+                                      compose->paned);
+               gtkut_container_remove(GTK_CONTAINER(compose->paned),
+                                      compose->edit_vbox);
                gtk_box_pack_start(GTK_BOX(compose->vbox2),
                                   compose->edit_vbox, TRUE, TRUE, 0);
 
@@ -6007,7 +6309,16 @@ void compose_headerentry_key_press_event_cb(GtkWidget *entry,
                        g_slist_remove(headerentry->compose->header_list,
                                       headerentry);
                g_free(headerentry);
+       } else  if (event->keyval == GDK_Tab) {
+               if (headerentry->compose->header_last == headerentry) {
+                       /* Override default next focus, and give it to subject_entry
+                        * instead of notebook tabs
+                        */
+                       gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key-press-event"); 
+                       gtk_widget_grab_focus(headerentry->compose->subject_entry);
+               }
        }
+
 }
 
 void compose_headerentry_changed_cb(GtkWidget *entry,
@@ -6022,72 +6333,41 @@ void compose_headerentry_changed_cb(GtkWidget *entry,
                        (GTK_OBJECT(entry),
                         GTK_SIGNAL_FUNC(compose_headerentry_changed_cb),
                         headerentry);
+               /* Automatically scroll down */
+               compose_show_first_last_header(headerentry->compose, FALSE);
+               
        }
 }
 
-/**
- * undo_set_undo:
- *
- * Change the sensivity of the menuentries undo and redo
- **/
-static void compose_set_undo(UndoMain *undostruct, gint undo_state, 
-                            gint redo_state, GtkWidget *changewidget) 
+static void compose_show_first_last_header(Compose *compose, gboolean show_first)
 {
-       GtkItemFactory *ifactory;
-        debug_print ("Set_undo.  UNDO:%i  REDO:%i\n",
-                 undo_state,
-                 redo_state);
+       GtkAdjustment *vadj;
 
-       g_return_if_fail (changewidget != NULL);
+       g_return_if_fail(compose);
+       g_return_if_fail(GTK_IS_WIDGET(compose->header_table));
+       g_return_if_fail(GTK_IS_VIEWPORT(compose->header_table->parent));
 
-       ifactory = gtk_item_factory_from_widget(changewidget);
+       vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(compose->header_table->parent));
+       gtk_adjustment_set_value(vadj, (show_first ? vadj->lower : vadj->upper));
+}
 
-       /* Set undo */
-        switch (undo_state) {
-        case UNDO_STATE_TRUE:
-                if (!undostruct->undo_state) {
-                       debug_print ("Set_undo - Testpoint\n");
-                        undostruct->undo_state = TRUE;
-                       menu_set_sensitive(ifactory, "/Edit/Undo", TRUE);
-                }
-                break;
-        case UNDO_STATE_FALSE:
-                if (undostruct->undo_state) {
-                        undostruct->undo_state = FALSE;
-                       menu_set_sensitive(ifactory, "/Edit/Undo", FALSE);
-                }
-                break;
-        case UNDO_STATE_UNCHANGED:
-                break;
-        case UNDO_STATE_REFRESH:
-               menu_set_sensitive(ifactory, "/Edit/Undo", undostruct->undo_state);
-                break;
-        default:
-                g_warning ("Undo state not recognized");
-               break;
-        }
+static void compose_ctl_enter_send_shortcut_cb(GtkWidget *w, Compose *compose)
+{
+       GtkItemFactory *ifactory;
+       GtkAccelEntry  *accel;
+       GtkWidget      *send_button;
+       GSList *list;
+       GdkEvent *e= gtk_get_current_event();
+       
+       if (e->type != GDK_KEY_PRESS || 
+           !( ((GdkEventKey *)e)->state & GDK_CONTROL_MASK) )
+               return;
 
-        /* Set redo*/
-        switch (redo_state) {
-        case UNDO_STATE_TRUE:
-                if (!undostruct->redo_state) {
-                        undostruct->redo_state = TRUE;
-                       menu_set_sensitive(ifactory, "/Edit/Redo", TRUE);
-                }
-                break;
-        case UNDO_STATE_FALSE:
-                if (undostruct->redo_state) {
-                        undostruct->redo_state = FALSE;
-                       menu_set_sensitive(ifactory, "/Edit/Redo", FALSE);
-                }
-                break;
-        case UNDO_STATE_UNCHANGED:
-                break;
-        case UNDO_STATE_REFRESH:
-               menu_set_sensitive(ifactory, "/Edit/Redo", undostruct->redo_state);
-                break;
-        default:
-                g_warning ("Redo state not recognized");
-               break;
-        }
-}
+       ifactory = gtk_item_factory_from_widget(compose->menubar);
+       send_button = gtk_item_factory_get_widget(ifactory, "/Message/Send");
+       list = gtk_accel_group_entries_from_object(GTK_OBJECT(send_button));
+       accel = (GtkAccelEntry *) list->data;
+       if (accel->accelerator_key == GDK_Return && 
+           accel->accelerator_mods == GDK_CONTROL_MASK)
+               compose_send_cb(compose, 0, NULL);
+}