2006-05-12 [colin] 2.2.0cvs3
authorColin Leroy <colin@colino.net>
Fri, 12 May 2006 17:42:48 +0000 (17:42 +0000)
committerColin Leroy <colin@colino.net>
Fri, 12 May 2006 17:42:48 +0000 (17:42 +0000)
* src/folder.c
* src/mainwindow.c
* src/mainwindow.h
* src/messageview.c
* src/prefs_spelling.c
* src/procheader.c
* src/procmsg.c
* src/procmsg.h
* src/summaryview.c
* src/toolbar.c
* src/toolbar.h
Add contextual menu on Compose toolbar
                button. Fixes bug #944 (Automatic
                addresses not applied when changing account
                from compose window)
                add Mailing List support
                based on the old 0.6.5claws25 patch by
                Melvin Hadasht, with finishing touches
                by Colin
                Fix "ignore thread" when mails are threaded by
                subject (and weren't ignored although appearing
                in the thread).
                GUI rework.
                Both patches by Pawel.

14 files changed:
ChangeLog
PATCHSETS
configure.ac
src/folder.c
src/mainwindow.c
src/mainwindow.h
src/messageview.c
src/prefs_spelling.c
src/procheader.c
src/procmsg.c
src/procmsg.h
src/summaryview.c
src/toolbar.c
src/toolbar.h

index ee0891c85d3b821e924d1a39c05a3872c2e1ffc0..8d038080a360839459c5cf53d74290572825b780 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2006-05-12 [colin]     2.2.0cvs3
+
+       * src/folder.c
+       * src/mainwindow.c
+       * src/mainwindow.h
+       * src/messageview.c
+       * src/prefs_spelling.c
+       * src/procheader.c
+       * src/procmsg.c
+       * src/procmsg.h
+       * src/summaryview.c
+       * src/toolbar.c
+       * src/toolbar.h
+               Add contextual menu on Compose toolbar
+                button. Fixes bug #944 (Automatic
+                addresses not applied when changing account
+                from compose window)
+                add Mailing List support
+                based on the old 0.6.5claws25 patch by
+                Melvin Hadasht, with finishing touches
+                by Colin
+                Fix "ignore thread" when mails are threaded by
+                subject (and weren't ignored although appearing
+                in the thread).
+                GUI rework.
+                Both patches by Pawel.
+
+
 2006-05-12 [colin]     2.1.1cvs50
 
        * po/cs.po
index f315a8d8066f333fe9db40b3718659d51bd4e5f0..260b1600c09eebe6fded1ce1122e77d890f189bf 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.115.2.82 -r 1.115.2.83 src/main.c;  ) > 2.1.1cvs48.patchset
 ( cvs diff -u -r 1.1.2.3 -r 1.1.2.4 manual/Makefile.am;  diff -u /dev/null manual/pl/Makefile.am;  diff -u /dev/null manual/pl/account.xml;  diff -u /dev/null manual/pl/ack.xml;  diff -u /dev/null manual/pl/addrbook.xml;  diff -u /dev/null manual/pl/advanced.xml;  diff -u /dev/null manual/pl/faq.xml;  diff -u /dev/null manual/pl/glossary.xml;  diff -u /dev/null manual/pl/gpl.xml;  diff -u /dev/null manual/pl/handling.xml;  diff -u /dev/null manual/pl/intro.xml;  diff -u /dev/null manual/pl/keyboard.xml;  diff -u /dev/null manual/pl/plugins.xml;  diff -u /dev/null manual/pl/starting.xml;  diff -u /dev/null manual/pl/sylpheed-claws-manual.xml;  diff -u /dev/null manual/pl/dist/.cvsignore;  diff -u /dev/null manual/pl/dist/Makefile.am;  diff -u /dev/null manual/pl/dist/html/.cvsignore;  diff -u /dev/null manual/pl/dist/html/Makefile.am;  diff -u /dev/null manual/pl/dist/pdf/.cvsignore;  diff -u /dev/null manual/pl/dist/pdf/Makefile.am;  diff -u /dev/null manual/pl/dist/ps/.cvsignore;  diff -u /dev/null manual/pl/dist/ps/Makefile.am;  diff -u /dev/null manual/pl/dist/txt/.cvsignore;  diff -u /dev/null manual/pl/dist/txt/Makefile.am;  ) > 2.1.1cvs49.patchset
 ( cvs diff -u -r 1.9.2.5 -r 1.9.2.6 po/cs.po;  cvs diff -u -r 1.58.2.21 -r 1.58.2.22 po/de.po;  cvs diff -u -r 1.12.2.10 -r 1.12.2.11 po/en_GB.po;  cvs diff -u -r 1.60.2.28 -r 1.60.2.29 po/es.po;  cvs diff -u -r 1.1.2.9 -r 1.1.2.10 po/fi.po;  cvs diff -u -r 1.42.2.23 -r 1.42.2.24 po/fr.po;  cvs diff -u -r 1.50.2.17 -r 1.50.2.18 po/pt_BR.po;  cvs diff -u -r 1.17.2.20 -r 1.17.2.21 po/sr.po;  cvs diff -u -r 1.5.2.14 -r 1.5.2.15 po/zh_CN.po;  ) > 2.1.1cvs50.patchset
+( cvs diff -u -r 1.213.2.91 -r 1.213.2.92 src/folder.c;  cvs diff -u -r 1.274.2.108 -r 1.274.2.109 src/mainwindow.c;  cvs diff -u -r 1.39.2.16 -r 1.39.2.17 src/mainwindow.h;  cvs diff -u -r 1.94.2.82 -r 1.94.2.83 src/messageview.c;  cvs diff -u -r 1.5.2.23 -r 1.5.2.24 src/prefs_spelling.c;  cvs diff -u -r 1.47.2.28 -r 1.47.2.29 src/procheader.c;  cvs diff -u -r 1.150.2.61 -r 1.150.2.62 src/procmsg.c;  cvs diff -u -r 1.60.2.27 -r 1.60.2.28 src/procmsg.h;  cvs diff -u -r 1.395.2.194 -r 1.395.2.195 src/summaryview.c;  cvs diff -u -r 1.43.2.43 -r 1.43.2.44 src/toolbar.c;  cvs diff -u -r 1.19.2.10 -r 1.19.2.11 src/toolbar.h;  ) > 2.2.0cvs3.patchset
index 4608c3b689a92194e2768885e0ceb8b3e3c61534..0756d049506053055583a7eb3b05b78ad8a6c095 100644 (file)
@@ -7,11 +7,11 @@ PACKAGE=sylpheed-claws
 
 dnl version number
 MAJOR_VERSION=2
-MINOR_VERSION=1
-MICRO_VERSION=1
+MINOR_VERSION=2
+MICRO_VERSION=0
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=50
+EXTRA_VERSION=3
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index 0a320e43fadb2060af3d310180f7e8bf518b3376..7e7ce021385782266169d53bd1f68d6c3c885817 100644 (file)
@@ -1672,7 +1672,8 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        guint markedcnt = 0, unreadmarkedcnt = 0;
        guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
        gboolean update_flags = 0, old_uids_valid = FALSE;
-    
+       GHashTable *subject_table = NULL;
+       
        g_return_val_if_fail(item != NULL, -1);
        if (item->path == NULL) return -1;
 
@@ -1682,13 +1683,17 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        g_return_val_if_fail(folder->klass->get_num_list != NULL, -1);
 
        debug_print("Scanning folder %s for cache changes.\n", item->path ? item->path : "(null)");
-
+       
        /* Get list of messages for folder and cache */
        if (folder->klass->get_num_list(item->folder, item, &folder_list, &old_uids_valid) < 0) {
                debug_print("Error fetching list of message numbers\n");
                return(-1);
        }
 
+       if(prefs_common.thread_by_subject) {
+               subject_table = g_hash_table_new(g_str_hash, g_str_equal);
+       }
+       
        if (old_uids_valid) {
                if (!item->cache)
                        folder_item_read_cache(item);
@@ -1808,9 +1813,16 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                                procmsg_msginfo_free(msginfo);
 
                                debug_print("Remembering message %d to update...\n", folder_cur_num);
-                       } else
+                       } else {
                                exists_list = g_slist_prepend(exists_list, msginfo);
 
+                               if(prefs_common.thread_by_subject &&
+                                       MSG_IS_IGNORE_THREAD(msginfo->flags) &&
+                                       !subject_table_lookup(subject_table, msginfo->subject)) {
+                                       subject_table_insert(subject_table, msginfo->subject, msginfo);
+                               }
+                       }
+                       
                        /* Move to next folder and cache number */
                        cache_list_cur = cache_list_cur->next;
                        folder_list_cur = folder_list_cur->next;
@@ -1869,8 +1881,15 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                            (item->folder->account->filter_on_recv) &&
                            procmsg_msginfo_filter(msginfo))
                                to_filter = g_slist_prepend(to_filter, msginfo);
-                       else
+                       else {
                                exists_list = g_slist_prepend(exists_list, msginfo);
+                               
+                               if(prefs_common.thread_by_subject &&
+                                       MSG_IS_IGNORE_THREAD(msginfo->flags) &&
+                                       !subject_table_lookup(subject_table, msginfo->subject)) {
+                                       subject_table_insert(subject_table, msginfo->subject, msginfo);
+                               }
+                       }
                }
                filtering_move_and_copy_msgs(to_filter);
                for (elem = to_filter; elem; elem = g_slist_next(elem)) {
@@ -1888,7 +1907,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 
        folder_item_set_batch(item, TRUE);
        for (elem = exists_list; elem != NULL; elem = g_slist_next(elem)) {
-               MsgInfo *msginfo;
+               MsgInfo *msginfo, *parent_msginfo;
 
                msginfo = elem->data;
                if (MSG_IS_IGNORE_THREAD(msginfo->flags) && (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)))
@@ -1896,6 +1915,15 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                if (!MSG_IS_IGNORE_THREAD(msginfo->flags) && procmsg_msg_has_flagged_parent(msginfo, MSG_IGNORE_THREAD)) {
                        procmsg_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0, MSG_NEW | MSG_UNREAD, 0);
                }
+               if(prefs_common.thread_by_subject && !msginfo->inreplyto &&
+                       !msginfo->references && !MSG_IS_IGNORE_THREAD(msginfo->flags) &&
+                       (parent_msginfo = subject_table_lookup(subject_table, msginfo->subject)))
+               {
+                       if(MSG_IS_IGNORE_THREAD(parent_msginfo->flags)) {
+                               procmsg_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0,
+                                               MSG_NEW | MSG_UNREAD, 0);
+                       }
+               }
                if ((folder_has_parent_of_type(item, F_OUTBOX) ||
                     folder_has_parent_of_type(item, F_QUEUE)  ||
                     folder_has_parent_of_type(item, F_DRAFT)  ||
@@ -1917,7 +1945,11 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        }
        folder_item_set_batch(item, FALSE);
        g_slist_free(exists_list);
-
+       
+       if(prefs_common.thread_by_subject) {
+               g_hash_table_destroy(subject_table);
+       }
+       
        item->new_msgs = newcnt;
        item->unread_msgs = unreadcnt;
        item->total_msgs = totalcnt;
@@ -1928,7 +1960,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 
        folder_item_update(item, update_flags);
        folder_item_update_thaw();
-
+       
        return 0;
 }
 
index aefb0657de4c3fae80a88dee8eb0517099dcf176..2984f4448a4d0e9f02bd296dfb3765deab5f1d2a 100644 (file)
@@ -402,6 +402,8 @@ static void account_selector_menu_cb         (GtkMenuItem   *menuitem,
                                          gpointer       data);
 static void account_receive_menu_cb     (GtkMenuItem   *menuitem,
                                          gpointer       data);
+static void account_compose_menu_cb     (GtkMenuItem   *menuitem,
+                                         gpointer       data);
 
 static void prefs_open_cb      (GtkMenuItem    *menuitem,
                                 gpointer        data);
@@ -443,6 +445,17 @@ void main_window_reply_cb                  (MainWindow     *mainwin,
                                                 GtkWidget      *widget);
 gboolean mainwindow_progressindicator_hook     (gpointer        source,
                                                 gpointer        userdata);
+
+static gint mailing_list_create_submenu(GtkItemFactory *ifactory,
+                                      MsgInfo *msginfo);
+
+static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
+       
+static void get_url_part(const gchar **buf, gchar *url_decoded, gint maxlen);
+
+static void mailing_list_compose(GtkWidget *w, gpointer *data);
+static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
 #define  SEPARATE_ACTION 500 
 static void mainwindow_quicksearch             (MainWindow     *mainwin, 
                                                 guint           action, 
@@ -708,6 +721,15 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Message/_Forward"),              "<control><alt>F", main_window_reply_cb, COMPOSE_FORWARD_INLINE, NULL},
        {N_("/_Message/For_ward as attachment"),        NULL, main_window_reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
        {N_("/_Message/Redirect"),              NULL, main_window_reply_cb, COMPOSE_REDIRECT, NULL},
+
+       {N_("/_Message/Mailing-_List"),                 NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/Post"),            NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/Help"),            NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/Subscribe"),       NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/Unsubscribe"),     NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/View archive"),    NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Mailing-_List/Contact owner"),   NULL, NULL, 0, "<Branch>"},
+       
        {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
        {N_("/_Message/M_ove..."),              "<control>O", move_to_cb, 0, NULL},
        {N_("/_Message/_Copy..."),              "<shift><control>O", copy_to_cb, 0, NULL},
@@ -1052,6 +1074,9 @@ MainWindow *main_window_create(SeparateType type)
        gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
        ifactory = gtk_item_factory_from_widget(menubar);
 
+/*     gtk_widget_show(gtk_item_factory_get_item(ifactory,"/Message/Mailing-List"));
+       main_create_mailing_list_menu (mainwin, NULL); */
+
        menu_set_sensitive(ifactory, "/Help/Manual", manual_available(MANUAL_MANUAL_LOCAL));
 
        if (prefs_common.toolbar_detachable) {
@@ -1260,6 +1285,8 @@ MainWindow *main_window_create(SeparateType type)
        /* create actions menu */
        main_window_update_actions_menu(mainwin);
 
+       main_create_mailing_list_menu (mainwin, NULL);
+
        /* attach accel groups to main window */
 #define        ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)                        \
        gtk_window_add_accel_group                                      \
@@ -1596,6 +1623,42 @@ static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
        }
 }
 
+static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
+                                                      GList *account_list)
+{
+       GList *cur_ac, *cur_item;
+       GtkWidget *menuitem;
+       PrefsAccount *ac_prefs;
+       GtkWidget *menu = NULL;
+
+       if (mainwin->toolbar->compose_mail_btn == NULL
+       ||  mainwin->toolbar->compose_combo == NULL) /* button doesn't exist */
+               return;
+
+       menu = mainwin->toolbar->compose_combo->menu;
+
+       /* destroy all previous menu item */
+       cur_item = GTK_MENU_SHELL(menu)->children;
+       while (cur_item != NULL) {
+               GList *next = cur_item->next;
+               gtk_widget_destroy(GTK_WIDGET(cur_item->data));
+               cur_item = next;
+       }
+
+       for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
+               ac_prefs = (PrefsAccount *)cur_ac->data;
+
+               menuitem = gtk_menu_item_new_with_label
+                       (ac_prefs->account_name
+                        ? ac_prefs->account_name : _("Untitled"));
+               gtk_widget_show(menuitem);
+               gtk_menu_append(GTK_MENU(menu), menuitem);
+               g_signal_connect(G_OBJECT(menuitem), "activate",
+                                G_CALLBACK(account_compose_menu_cb),
+                                ac_prefs);
+       }
+}
+
 void main_window_set_account_menu(GList *account_list)
 {
        GList *cur;
@@ -1606,6 +1669,7 @@ void main_window_set_account_menu(GList *account_list)
                main_window_set_account_selector_menu(mainwin, account_list);
                main_window_set_account_receive_menu(mainwin, account_list);
                main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
+               main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
        }
 }
 
@@ -1617,6 +1681,7 @@ void main_window_set_account_menu_only_toolbar(GList *account_list)
        for (cur = mainwin_list; cur != NULL; cur = cur->next) {
                mainwin = (MainWindow *)cur->data;
                main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
+               main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
        }
 }
 
@@ -2187,6 +2252,178 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        main_window_menu_callback_unblock(mainwin);
 }
 
+void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
+{
+       GtkItemFactory *ifactory;
+       gint is_menu = 0;
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+       
+       if (msginfo) 
+               is_menu = mailing_list_create_submenu (ifactory, msginfo);
+       if (is_menu)
+               gtk_widget_set_sensitive (gtk_item_factory_get_item
+                               (ifactory,"/Message/Mailing-List"), TRUE);
+       else
+               gtk_widget_set_sensitive (gtk_item_factory_get_item
+                               (ifactory,"/Message/Mailing-List"), FALSE);
+}
+
+static gint mailing_list_create_submenu (GtkItemFactory *ifactory, MsgInfo *msginfo)
+{
+       gint menu_nb = 0;
+       GtkWidget *menuitem;
+
+       /* Mailing list post */
+       if (msginfo && !strcmp2 (msginfo->list_post, "NO")) {
+               msginfo->list_post = g_strdup (_("No posting allowed"));
+       }
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/Post");
+               
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_post);
+       /* Mailing list help */
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/Help");
+       
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_help);
+
+       /* Mailing list subscribe */
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/Subscribe");
+       
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_subscribe);
+               
+       /* Mailing list unsubscribe */
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/Unsubscribe");
+       
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_unsubscribe);
+       
+       /* Mailing list view archive */
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/View archive");
+       
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_archive);
+       
+       /* Mailing list contact owner */
+       menuitem = gtk_item_factory_get_item (ifactory, "/Message/Mailing-List/Contact owner");
+       
+       menu_nb += mailing_list_populate_submenu (menuitem, msginfo->list_owner);
+       
+       return menu_nb;
+}
+
+static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
+{
+       GtkWidget *item, *menu;
+       const gchar *url_pt ;
+       gchar url_decoded[BUFFSIZE];
+       GList *amenu, *alist;
+       gint menu_nb = 0;
+       
+       menu = GTK_WIDGET(GTK_MENU_ITEM(menuitem)->submenu);
+       
+       /* First delete old submenu */
+       /* FIXME: we can optimize this, and only change/add/delete necessary items */
+       for (amenu = (GTK_MENU_SHELL(menu)->children) ; amenu; ) {
+               alist = amenu->next;
+               item = GTK_WIDGET (amenu->data);
+               gtk_widget_destroy (item);
+               amenu = alist;
+       }
+       if (list_header) {
+               for (url_pt = list_header; url_pt && *url_pt;) {
+                       get_url_part (&url_pt, url_decoded, BUFFSIZE);
+                       item = NULL;
+                       if (!g_strncasecmp(url_decoded, "mailto:", 7)) {
+                               item = gtk_menu_item_new_with_label ((url_decoded));
+                               gtk_signal_connect (GTK_OBJECT(item), "activate",
+                                               GTK_SIGNAL_FUNC(mailing_list_compose), NULL);
+                       }
+                       else if (!g_strncasecmp (url_decoded, "http:", 5) ||
+                                !g_strncasecmp (url_decoded, "https:",6)) {
+
+                               item = gtk_menu_item_new_with_label ((url_decoded));
+                               gtk_signal_connect (GTK_OBJECT(item), "activate",
+                                               GTK_SIGNAL_FUNC(mailing_list_open_uri), NULL);
+                       } 
+                       if (item) {
+                               gtk_menu_append (GTK_MENU(menu), item);
+                               gtk_widget_show (item);
+                               menu_nb++;
+                       }
+               }
+       }
+       if (menu_nb)
+               gtk_widget_set_sensitive (menuitem, TRUE);
+       else
+               gtk_widget_set_sensitive (menuitem, FALSE);
+               
+
+       return menu_nb;
+}
+
+static void get_url_part (const gchar **buffer, gchar *url_decoded, gint maxlen)
+{
+       gchar tmp[BUFFSIZE];
+       const gchar *buf;
+       gint i = 0;
+       buf = *buffer;
+       
+       if (buf == 0x00) {
+               url_decoded = 0x00;
+               return;
+       }
+       /* Ignore spaces, comments  and tabs () */
+       for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
+               if (*buf == '(')
+                       for (;*buf != ')' && *buf != 0x00; buf++);
+       
+       /* First non space and non comment must be a < */
+       if (*buf =='<' ) {
+               buf++;
+               for (i = 0; *buf != '>' && *buf != 0x00 && i<maxlen; tmp[i++] = *(buf++));
+               buf++;
+       }
+       else 
+               /* else, we finish parsing and ignore everything */
+               for (;buf != 0x00; buf++);
+       
+       tmp[i]       = 0x00;
+       *url_decoded = 0x00;
+       
+       if (i == maxlen) {
+               for (;*buf != 0x00; buf++);
+               return;
+       }
+       decode_uri (url_decoded, (const gchar *)tmp);
+
+       /* Prepare the work for the next url in the list */
+       /* after the closing bracket >, ignore space, comments and tabs */
+       for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
+               if (*buf == '(')
+                       for (;*buf != ')' && *buf != 0x00; buf++);
+       /* now first non space, non comment must be a comma */
+       if (*buf != ',')
+               for (;*buf != 0x00; buf++);
+       else
+               buf++;
+       *buffer = buf;
+}
+       
+static void mailing_list_compose (GtkWidget *w, gpointer *data)
+{
+       gchar *mailto;
+
+       gtk_label_get (GTK_LABEL (GTK_BIN (w)->child), (gchar **) &mailto);
+       compose_new(NULL, mailto+7, NULL);
+}
+ static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
+{
+       gchar *mailto;
+       gtk_label_get (GTK_LABEL (GTK_BIN (w)->child), (gchar **) &mailto);
+       open_uri (mailto, prefs_common.uri_cmd);
+} 
+       
 void main_window_popup(MainWindow *mainwin)
 {
        gtkut_window_popup(mainwin->window);
@@ -3377,6 +3614,15 @@ static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
        inc_account_mail(mainwin, account);
 }
 
+static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
+{
+       MainWindow *mainwin = (MainWindow *)mainwin_list->data;
+       PrefsAccount *account = (PrefsAccount *)data;
+       FolderItem *item = mainwin->summaryview->folder_item;   
+
+       compose_new_with_folderitem(account, item);
+}
+
 static void prefs_open_cb(GtkMenuItem *menuitem, gpointer data)
 {
        prefs_gtk_open();
index 552afa5504682b4a1aba6ed1d7950e4bc224a7f8..50a2de58590458235a7061604069e4188c1a1c15 100644 (file)
@@ -162,6 +162,10 @@ void main_window_set_account_menu_only_toolbar     (GList          *account_list);
 GtkWidget *main_window_get_folder_window       (MainWindow     *mainwin);
 GtkWidget *main_window_get_message_window      (MainWindow     *mainwin);
 
+/* Mailing list support */
+void main_create_mailing_list_menu     (MainWindow *mainwin, MsgInfo *msginfo);
+gint mailing_list_get_list_post_mailto         (gchar **url, gchar *mailto, gint maxlen);
+
 void main_window_separation_change     (MainWindow     *mainwin,
                                         SeparateType    type);
 
index 6207eebb40bdb7dcf665fb028567a7418da742ae..2172d5b316127e44e6dbb3d2ebee3a53173a7109 100644 (file)
@@ -46,6 +46,7 @@
 #include "addressbook.h"
 #include "alertpanel.h"
 #include "inputdialog.h"
+#include "mainwindow.h"
 #include "manage_window.h"
 #include "procmsg.h"
 #include "procheader.h"
@@ -839,6 +840,8 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
 
        messageview_set_position(messageview, 0);
 
+       main_create_mailing_list_menu(messageview->mainwin, messageview->msginfo);
+
        if (messageview->msginfo->partial_recv)
                partial_recv_show(messageview->noticeview, 
                                  messageview->msginfo);
index b4f8a2ae22aea8520120116e14d90136f715a22c..4052b5105d0e0866d3157a9af94ab7d404d19bda 100644 (file)
@@ -47,14 +47,15 @@ typedef struct _SpellingPage
 
        GtkWidget *window;              /* do not modify */
 
+       GtkWidget *automatic_frame;
+       GtkWidget *dictionary_frame;
+       GtkWidget *path_frame;
+       
        GtkWidget *enable_aspell_checkbtn;
        GtkWidget *recheck_when_changing_dict_checkbtn;
        GtkWidget *check_while_typing_checkbtn;
        GtkWidget *use_alternate_checkbtn;
 
-       GtkWidget *table;
-
-       GtkWidget *aspell_path_label;
        GtkWidget *aspell_path_entry;
        GtkWidget *aspell_path_select;
 
@@ -75,10 +76,12 @@ typedef struct _SpellingPage
 
 static void prefs_spelling_enable(SpellingPage *spelling, gboolean enable)
 {
-       gtk_widget_set_sensitive(spelling->check_while_typing_checkbtn, enable);
-       gtk_widget_set_sensitive(spelling->recheck_when_changing_dict_checkbtn, enable);
-       gtk_widget_set_sensitive(spelling->use_alternate_checkbtn,      enable);
-       gtk_widget_set_sensitive(spelling->table,                       enable);
+       gtk_widget_set_sensitive(spelling->automatic_frame, enable);
+       gtk_widget_set_sensitive(spelling->dictionary_frame, enable);
+       gtk_widget_set_sensitive(spelling->path_frame, enable);
+       gtk_widget_set_sensitive(spelling->misspelled_label, enable);
+       gtk_widget_set_sensitive(spelling->misspelled_colorbtn, enable);
+       gtk_widget_set_sensitive(spelling->use_alternate_checkbtn, enable);
 }
 
 static void prefs_spelling_checkbtn_enable_aspell_toggle_cb
@@ -141,16 +144,19 @@ void prefs_spelling_create_widget(PrefsPage *_page, GtkWindow *window, gpointer
 {
        SpellingPage *prefs_spelling = (SpellingPage *) _page;
 
-       GtkWidget *vbox1, *vbox2;
+       GtkWidget *vbox1, *vbox2, *hbox;
 
        GtkWidget *enable_aspell_checkbtn;
        GtkWidget *check_while_typing_checkbtn;
        GtkWidget *recheck_when_changing_dict_checkbtn;
        GtkWidget *use_alternate_checkbtn;
 
-       GtkWidget *table;
+       GtkWidget *label;
+
+       GtkWidget *automatic_frame;
+       GtkWidget *dictionary_frame;
+       GtkWidget *path_frame;
 
-       GtkWidget *aspell_path_label;
        GtkWidget *aspell_path_hbox;
        GtkWidget *aspell_path_entry;
        GtkWidget *aspell_path_select;
@@ -181,16 +187,6 @@ void prefs_spelling_create_widget(PrefsPage *_page, GtkWindow *window, gpointer
        gtk_widget_show(enable_aspell_checkbtn);
        gtk_box_pack_start(GTK_BOX(vbox2), enable_aspell_checkbtn, TRUE, TRUE, 0);
 
-       check_while_typing_checkbtn = gtk_check_button_new_with_label(
-                       _("Check while typing"));
-       gtk_widget_show(check_while_typing_checkbtn);
-       gtk_box_pack_start(GTK_BOX(vbox2), check_while_typing_checkbtn, TRUE, TRUE, 0);
-
-       recheck_when_changing_dict_checkbtn = gtk_check_button_new_with_label(
-                       _("Re-check message when changing dictionary"));
-       gtk_widget_show(recheck_when_changing_dict_checkbtn);
-       gtk_box_pack_start(GTK_BOX(vbox2), recheck_when_changing_dict_checkbtn, TRUE, TRUE, 0);
-
        use_alternate_checkbtn = gtk_check_button_new_with_label(
                        _("Enable alternate dictionary"));
        gtk_widget_show(use_alternate_checkbtn);
@@ -200,27 +196,11 @@ void prefs_spelling_create_widget(PrefsPage *_page, GtkWindow *window, gpointer
        gtk_tooltips_set_tip(tooltips, use_alternate_checkbtn, 
                        _("Faster switching with last used dictionary"), NULL);
 
-       
-       table = gtk_table_new(4, 2, FALSE);
-       gtk_widget_show(table);
-       gtk_table_set_row_spacings(GTK_TABLE(table), 4);
-       gtk_table_set_col_spacings(GTK_TABLE(table), 8);
-       gtk_box_pack_start(GTK_BOX(vbox2), table, TRUE, TRUE, 0);
-
-       
-       aspell_path_label = gtk_label_new(_("Dictionaries path:"));
-       gtk_widget_show(aspell_path_label);
-       gtk_table_attach(GTK_TABLE(table), aspell_path_label, 0, 1, 0, 1,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
-       gtk_label_set_justify(GTK_LABEL(aspell_path_label), GTK_JUSTIFY_RIGHT);
-       gtk_misc_set_alignment(GTK_MISC(aspell_path_label), 1, 0.5);
-
+       PACK_FRAME(vbox1, path_frame, _("Dictionary path"));
        aspell_path_hbox = gtk_hbox_new(FALSE, 8);
        gtk_widget_show(aspell_path_hbox);
-       gtk_table_attach(GTK_TABLE(table), aspell_path_hbox, 1, 2, 0, 1,
-                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                        (GtkAttachOptions) (GTK_FILL), 0, 0);
+       gtk_container_add(GTK_CONTAINER(path_frame), aspell_path_hbox);
+       gtk_container_set_border_width(GTK_CONTAINER(aspell_path_hbox), 8);     
 
        aspell_path_entry = gtk_entry_new();
        gtk_widget_show(aspell_path_entry);
@@ -231,60 +211,89 @@ void prefs_spelling_create_widget(PrefsPage *_page, GtkWindow *window, gpointer
        gtk_widget_show(aspell_path_select);
        gtk_box_pack_start(GTK_BOX(aspell_path_hbox), aspell_path_select, FALSE, FALSE, 0);
 
+       PACK_FRAME(vbox1, automatic_frame, _("Automatic spelling"));
+       vbox2 = gtk_vbox_new(FALSE, VSPACING_NARROW);
+       gtk_widget_show(vbox2);
+       gtk_container_add(GTK_CONTAINER(automatic_frame), vbox2);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox2), 8);
        
-       default_dict_label = gtk_label_new(_("Default dictionary:"));
+       check_while_typing_checkbtn = gtk_check_button_new_with_label(
+                       _("Check while typing"));
+       gtk_widget_show(check_while_typing_checkbtn);
+       gtk_box_pack_start(GTK_BOX(vbox2), check_while_typing_checkbtn, TRUE, TRUE, 0);
+
+       recheck_when_changing_dict_checkbtn = gtk_check_button_new_with_label(
+                       _("Re-check message when changing dictionary"));
+       gtk_widget_show(recheck_when_changing_dict_checkbtn);
+       gtk_box_pack_start(GTK_BOX(vbox2), recheck_when_changing_dict_checkbtn, TRUE, TRUE, 0);
+       
+       PACK_FRAME(vbox1, dictionary_frame, _("Dictionary"));
+       vbox2 = gtk_vbox_new(FALSE, VSPACING_NARROW);
+       gtk_widget_show(vbox2);
+       gtk_container_add(GTK_CONTAINER(dictionary_frame), vbox2);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox2), 8);
+       
+       hbox = gtk_hbox_new(FALSE, 10);
+       gtk_widget_show(hbox);
+       gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 0);
+       
+       default_dict_label = gtk_label_new(_("Default dictionary"));
        gtk_widget_show(default_dict_label);
-       gtk_table_attach(GTK_TABLE(table), default_dict_label, 0, 1, 1, 2,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
-       gtk_label_set_justify(GTK_LABEL(default_dict_label), GTK_JUSTIFY_RIGHT);
+       gtk_label_set_justify(GTK_LABEL(default_dict_label), GTK_JUSTIFY_LEFT);
        gtk_misc_set_alignment(GTK_MISC(default_dict_label), 1, 0.5);
-
+       gtk_box_pack_start(GTK_BOX(hbox), default_dict_label, FALSE, FALSE, 0);
+       
+       label = gtk_label_new("");
+       gtk_widget_show(label);
+       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+       
        default_dict_optmenu = gtk_option_menu_new();
        gtk_widget_show(default_dict_optmenu);
-       gtk_table_attach(GTK_TABLE(table), default_dict_optmenu, 1, 2, 1, 2,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
+       gtk_widget_set_size_request(default_dict_optmenu, 180, -1);
+
        default_dict_optmenu_menu = gtk_menu_new();
        gtk_option_menu_set_menu(GTK_OPTION_MENU(default_dict_optmenu),
                        default_dict_optmenu_menu);
+       gtk_box_pack_start(GTK_BOX(hbox), default_dict_optmenu, FALSE, FALSE, 0);
 
+       hbox = gtk_hbox_new(FALSE, 10);
+       gtk_widget_show(hbox);
+       gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 0);
        
-       sugmode_label = gtk_label_new(_("Default suggestion mode:"));
+       sugmode_label = gtk_label_new(_("Default suggestion mode"));
        gtk_widget_show(sugmode_label);
-       gtk_table_attach(GTK_TABLE(table), sugmode_label, 0, 1, 2, 3,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
-       gtk_label_set_justify(GTK_LABEL(sugmode_label), GTK_JUSTIFY_RIGHT);
+       gtk_label_set_justify(GTK_LABEL(sugmode_label), GTK_JUSTIFY_LEFT);
        gtk_misc_set_alignment(GTK_MISC(sugmode_label), 1, 0.5);
+       gtk_box_pack_start(GTK_BOX(hbox), sugmode_label, FALSE, FALSE, 0);
+
+       label = gtk_label_new("");
+       gtk_widget_show(label);
+       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
 
        sugmode_optmenu = gtk_option_menu_new();
        gtk_widget_show(sugmode_optmenu);
-       gtk_table_attach(GTK_TABLE(table), sugmode_optmenu, 1, 2, 2, 3,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
+       gtk_widget_set_size_request(sugmode_optmenu, 180, -1); 
+       
        sugmode_optmenu_menu = gtk_menu_new();
        gtk_option_menu_set_menu(GTK_OPTION_MENU(sugmode_optmenu),
                        sugmode_optmenu_menu);
-
+       gtk_box_pack_start(GTK_BOX(hbox), sugmode_optmenu, FALSE, FALSE, 0);
        
+       misspelled_hbox = gtk_hbox_new(FALSE, 10);
+       gtk_widget_show(misspelled_hbox);
+       gtk_box_pack_start(GTK_BOX(vbox1), misspelled_hbox, FALSE, FALSE, 0);
+               
        misspelled_label = gtk_label_new(_("Misspelled word color:"));
        gtk_widget_show(misspelled_label);
-       gtk_table_attach(GTK_TABLE(table), misspelled_label, 0, 1, 3, 4,
-                        (GtkAttachOptions) (GTK_FILL),
-                        (GtkAttachOptions) (0), 0, 0);
+       gtk_box_pack_start(GTK_BOX(misspelled_hbox), misspelled_label,
+               FALSE, FALSE, 0);
        gtk_label_set_justify(GTK_LABEL(misspelled_label), GTK_JUSTIFY_RIGHT);
        gtk_misc_set_alignment(GTK_MISC(misspelled_label), 1, 0.5);
 
-       misspelled_hbox = gtk_hbox_new(FALSE, 0);
-       gtk_widget_show(misspelled_hbox);
-       gtk_table_attach(GTK_TABLE(table), misspelled_hbox, 1, 2, 3, 4,
-                        (GtkAttachOptions) (GTK_FILL),
-                        (GtkAttachOptions) (GTK_FILL), 0, 0);
-
        misspelled_colorbtn = gtk_button_new_with_label("");
        gtk_widget_show(misspelled_colorbtn);
-       gtk_box_pack_start(GTK_BOX(misspelled_hbox), misspelled_colorbtn, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(misspelled_hbox), misspelled_colorbtn,
+               FALSE, FALSE, 0);
        gtk_widget_set_size_request(misspelled_colorbtn, 30, 20);
        tooltips = gtk_tooltips_new();
        gtk_tooltips_set_tip(tooltips, misspelled_colorbtn,
@@ -321,14 +330,15 @@ void prefs_spelling_create_widget(PrefsPage *_page, GtkWindow *window, gpointer
        gtkut_set_widget_bgcolor_rgb(misspelled_colorbtn, prefs_spelling->misspell_col);
 
        prefs_spelling->window                  = GTK_WIDGET(window);
+       prefs_spelling->automatic_frame =       automatic_frame;
+       prefs_spelling->dictionary_frame =      dictionary_frame;
+       prefs_spelling->path_frame =    path_frame;
        prefs_spelling->enable_aspell_checkbtn  = enable_aspell_checkbtn;
        prefs_spelling->check_while_typing_checkbtn
                = check_while_typing_checkbtn;
        prefs_spelling->recheck_when_changing_dict_checkbtn
                = recheck_when_changing_dict_checkbtn;
        prefs_spelling->use_alternate_checkbtn  = use_alternate_checkbtn;
-       prefs_spelling->table                   = table;
-       prefs_spelling->aspell_path_label       = aspell_path_label;
        prefs_spelling->aspell_path_entry       = aspell_path_entry;
        prefs_spelling->aspell_path_select      = aspell_path_select;
        prefs_spelling->default_dict_label      = default_dict_label;
index bca7e19ef8cfc72f79dbcfe6ca7eaaec65a950ee..73cde0731dda33c5108f63f914b28523b0130b21 100644 (file)
@@ -358,6 +358,12 @@ enum
        H_SC_PARTIALLY_RETRIEVED = 20,
        H_SC_ACCOUNT_SERVER = 21,
        H_SC_ACCOUNT_LOGIN = 22,
+       H_LIST_POST        = 23,
+       H_LIST_SUBSCRIBE   = 24,
+       H_LIST_UNSUBSCRIBE = 25,
+       H_LIST_HELP        = 26,
+       H_LIST_ARCHIVE     = 27,
+       H_LIST_OWNER       = 28,
 };
 
 static HeaderEntry hentry_full[] = {{"Date:",          NULL, FALSE},
@@ -383,6 +389,12 @@ static HeaderEntry hentry_full[] = {{"Date:",              NULL, FALSE},
                                   {"SC-Partially-Retrieved:", NULL, FALSE},
                                   {"SC-Account-Server:", NULL, FALSE},
                                   {"SC-Account-Login:",NULL, FALSE},
+                                  {"List-Post:",       NULL, TRUE},
+                                  {"List-Subscribe:",  NULL, TRUE},
+                                  {"List-Unsubscribe:",NULL, TRUE},
+                                  {"List-Help:",       NULL, TRUE},
+                                  {"List-Archive:",    NULL, TRUE},
+                                  {"List-Owner:",      NULL, TRUE},
                                   {NULL,               NULL, FALSE}};
 
 static HeaderEntry hentry_short[] = {{"Date:",         NULL, FALSE},
@@ -609,6 +621,23 @@ static MsgInfo *parse_stream(void *data, gboolean isstring, MsgFlags flags,
                        if (msginfo->fromspace) break;
                        msginfo->fromspace = g_strdup(hp);
                        break;
+               case H_LIST_POST:
+                       msginfo->list_post = g_strdup(hp);
+                       break;
+               case H_LIST_SUBSCRIBE:
+                       msginfo->list_subscribe = g_strdup(hp);
+                       break;
+               case H_LIST_UNSUBSCRIBE:
+                       msginfo->list_unsubscribe = g_strdup(hp);
+                       break;
+               case H_LIST_HELP:
+                       msginfo->list_help = g_strdup(hp);
+                       break;
+               case H_LIST_ARCHIVE:
+                       msginfo->list_archive = g_strdup(hp);
+                       break;
+               case H_LIST_OWNER:
+                       msginfo->list_owner = g_strdup(hp);
                default:
                        break;
                }
index 702ac5dc4bfcf366b92f6381c9a93e8872aef03d..d45c9ade0d427cdfe9d393910aa982f0b0c74266 100644 (file)
@@ -1209,6 +1209,18 @@ MsgInfo *procmsg_msginfo_get_full_info(MsgInfo *msginfo)
 
        /* CLAWS: make sure we add the missing members; see: 
         * procheader.c::procheader_get_headernames() */
+       if (!msginfo->list_post)
+               msginfo->list_post = g_strdup(full_msginfo->list_post);
+       if (!msginfo->list_subscribe)
+               msginfo->list_subscribe = g_strdup(full_msginfo->list_subscribe);
+       if (!msginfo->list_unsubscribe)
+               msginfo->list_unsubscribe = g_strdup(full_msginfo->list_unsubscribe);
+       if (!msginfo->list_help)
+               msginfo->list_help = g_strdup(full_msginfo->list_help);
+       if (!msginfo->list_archive)
+               msginfo->list_archive= g_strdup(full_msginfo->list_archive);
+       if (!msginfo->list_owner)
+               msginfo->list_owner = g_strdup(full_msginfo->list_owner);
        if (!msginfo->xface)
                msginfo->xface = g_strdup(full_msginfo->xface);
        if (!msginfo->face)
@@ -1266,6 +1278,13 @@ void procmsg_msginfo_free(MsgInfo *msginfo)
        g_free(msginfo->inreplyto);
        g_free(msginfo->xref);
 
+       g_free(msginfo->list_post);
+       g_free(msginfo->list_subscribe);
+       g_free(msginfo->list_unsubscribe);
+       g_free(msginfo->list_help);
+       g_free(msginfo->list_archive);
+       g_free(msginfo->list_owner);
+
        g_free(msginfo->partial_recv);
        g_free(msginfo->account_server);
        g_free(msginfo->account_login);
@@ -1517,7 +1536,9 @@ static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_ses
                                mailval = send_message_smtp(&tmp_ac, to_list, fp);
                        }
                }
-       }
+       } else if (!to_list && !newsgroup_list) 
+               mailval = -1;
+
 
        fseek(fp, filepos, SEEK_SET);
        if (newsgroup_list && (mailval == 0)) {
index 5efb49942219517401c6a015c456e98b22655642..c8da4fc84d2483e50f14f3990abe7f7ad21ee2b0 100644 (file)
@@ -218,6 +218,14 @@ struct _MsgInfo
        gchar *account_server;
        gchar *account_login;
        gint planned_download;
+
+       /* Mailing list support */
+       gchar *list_post;
+       gchar *list_subscribe;
+       gchar *list_unsubscribe;
+       gchar *list_help;
+       gchar *list_archive;
+       gchar *list_owner;
 };
 
 struct _MsgFileInfo
index 75531cae9599f44fcdccc9d5474da7f5bda65dd7..0981c48ce96b92f474f94ed06a0772b1de21dd44 100644 (file)
@@ -751,6 +751,7 @@ void summary_init(SummaryView *summaryview)
        summary_clear_list(summaryview);
        summary_set_column_titles(summaryview);
        summary_colorlabel_menu_create(summaryview, FALSE);
+       main_create_mailing_list_menu (summaryview->mainwin, NULL);     
        summary_set_menu_sensitive(summaryview);
 
 }
index 27fc83fec2699d70ceb47f2294369dba8b0b2a9f..8a241d47cc238e9e052b1431a2170c186b0026cb 100644 (file)
@@ -1432,6 +1432,7 @@ Toolbar *toolbar_create(ToolbarType        type,
        ComboButton *replylist_combo;
        ComboButton *replysender_combo;
        ComboButton *fwd_combo;
+       ComboButton *compose_combo;
 
        GtkTooltips *toolbar_tips;
        ToolbarSylpheedActions *action_item;
@@ -1523,6 +1524,14 @@ Toolbar *toolbar_create(ToolbarType       type,
                        gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), 
                                             toolbar_data->compose_news_btn,
                                           _("Compose News"), NULL);
+                       compose_combo = gtkut_combo_button_create(toolbar_data->compose_mail_btn, NULL, 0,
+                                       "<Compose>", (gpointer)toolbar_item);
+                       gtk_button_set_relief(GTK_BUTTON(compose_combo->arrow),
+                                             GTK_RELIEF_NONE);
+                       gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),
+                                                 GTK_WIDGET_PTR(compose_combo),
+                                                 _("Compose with selected Account"), "Compose");
+                       toolbar_data->compose_combo = compose_combo;
                        break;
                case A_LEARN_SPAM:
                        icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
@@ -1857,6 +1866,9 @@ void toolbar_main_set_sensitive(gpointer data)
        if (toolbar->getall_btn)
                SET_WIDGET_COND(GTK_WIDGET_PTR(toolbar->getall_combo),
                        M_HAVE_ACCOUNT|M_UNLOCKED);
+       if (toolbar->compose_mail_btn)
+               SET_WIDGET_COND(GTK_WIDGET_PTR(toolbar->compose_combo),
+                       M_HAVE_ACCOUNT);
        SET_WIDGET_COND(toolbar->compose_news_btn, M_HAVE_ACCOUNT);
        SET_WIDGET_COND(toolbar->reply_btn,
                        M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
@@ -1987,6 +1999,7 @@ void toolbar_init(Toolbar * toolbar) {
        toolbar->send_btn               = NULL;
        toolbar->compose_mail_btn       = NULL;
        toolbar->compose_news_btn       = NULL;
+       toolbar->compose_combo          = NULL;
        toolbar->reply_btn              = NULL;
        toolbar->replysender_btn        = NULL;
        toolbar->replyall_btn           = NULL;
index e1188a171c86f175704c9a7aba2b52391c7cddbe..ff177acb6a297ae6e4f9ddcf5e8152ddda5a91fd 100644 (file)
@@ -56,6 +56,7 @@ struct _Toolbar {
 
        GtkWidget *compose_mail_btn;
        GtkWidget *compose_news_btn;
+       ComboButton *compose_combo;
 
        GtkWidget *reply_btn;
        ComboButton *reply_combo;