* src/procmsg.[ch]
[claws.git] / src / messageview.c
index de2ce30af2c3c0b02b2b1054f9d359281786dc74..b7bc73981e3f37336c217e1a063edb5d1adb868f 100644 (file)
 #include "procheader.h"
 #include "procmime.h"
 #include "account.h"
+#include "action.h"
 #include "prefs_common.h"
 #include "prefs_account.h"
 #include "gtkutils.h"
 #include "utils.h"
 #include "rfc2015.h"
 #include "send_message.h"
-#include "pgptext.h"
 #include "stock_pixmap.h"
 
+static GList *messageview_list = NULL;
 
 static void messageview_change_view_type(MessageView   *messageview,
                                         MessageType     type);
@@ -272,6 +273,8 @@ static GtkItemFactoryEntry msgview_entries[] =
                                        NULL, create_filter_cb, FILTER_BY_TO, NULL},
        {N_("/_Tools/_Create filter rule/by _Subject"),
                                        NULL, create_filter_cb, FILTER_BY_SUBJECT, NULL},
+       {N_("/_Tools/---"),             NULL, NULL, 0, "<Separator>"},
+       {N_("/_Tools/Actio_ns"),        NULL, NULL, 0, "<Branch>"},
 
        {N_("/_Help"),                  NULL, NULL, 0, "<Branch>"},
        {N_("/_Help/_About"),           NULL, about_cb, 0, NULL}
@@ -298,7 +301,7 @@ MessageView *messageview_create(MainWindow *mainwin)
        textview = textview_create();
        textview->messageview = messageview;
 
-       mimeview = mimeview_create();
+       mimeview = mimeview_create(mainwin);
        mimeview->textview = textview_create();
        mimeview->textview->messageview = messageview;
        mimeview->messageview = messageview;
@@ -339,6 +342,7 @@ void messageview_add_toolbar(MessageView *msgview, GtkWidget *window)
        GtkWidget *handlebox;
        GtkWidget *vbox;
        GtkWidget *menubar;
+       GtkItemFactory *ifactory;
        guint n_menu_entries;
 
        vbox = gtk_vbox_new(FALSE, 0);
@@ -360,6 +364,9 @@ void messageview_add_toolbar(MessageView *msgview, GtkWidget *window)
        gtk_container_add(GTK_CONTAINER(vbox),
                          GTK_WIDGET_PTR(msgview));
 
+       ifactory = gtk_item_factory_from_widget(menubar);
+       action_update_msgview_menu(ifactory, msgview);
+
        msgview_list = g_list_append(msgview_list, msgview);
 }
 
@@ -431,7 +438,7 @@ static void notification_convert_header(gchar *dest, gint len,
                dest[len - 1] = '\0';
                return;
        } else
-               conv_encode_header(dest, len, src, header_len);
+               conv_encode_header(dest, len, src, header_len, FALSE);
 }
 
 static gint disposition_notification_queue(PrefsAccount * account,
@@ -510,7 +517,7 @@ static gint disposition_notification_queue(PrefsAccount * account,
        }
 
        queue = folder_get_default_queue();
-       if ((num = folder_item_add_msg(queue, tmp, TRUE)) < 0) {
+       if ((num = folder_item_add_msg(queue, tmp, NULL, TRUE)) < 0) {
                g_warning("can't queue the message\n");
                unlink(tmp);
                g_free(tmp);
@@ -661,24 +668,21 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        return ok;
 }
 
+GList *messageview_get_window_list(void)
+{
+       return messageview_list;
+}
+
 void messageview_show(MessageView *messageview, MsgInfo *msginfo,
                      gboolean all_headers)
 {
-       FILE *fp;
        gchar *file;
        MimeInfo *mimeinfo;
 
        g_return_if_fail(msginfo != NULL);
 
-#if USE_GPGME
-       if ((fp = procmsg_open_message_decrypted(msginfo, &mimeinfo)) == NULL)
-               return;
-#else /* !USE_GPGME */
-       if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-       mimeinfo = procmime_scan_mime_header(fp);
-#endif /* USE_GPGME */
-       fclose(fp);
-       if (!mimeinfo) return;
+       mimeinfo = procmime_scan_message(msginfo);
+       g_return_if_fail(mimeinfo != NULL);
 
        file = procmsg_get_message_file_path(msginfo);
        if (!file) {
@@ -697,8 +701,7 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo,
        textview_set_all_headers(messageview->textview, all_headers);
        textview_set_all_headers(messageview->mimeview->textview, all_headers);
 
-       if (mimeinfo->mime_type != MIME_TEXT &&
-           mimeinfo->mime_type != MIME_TEXT_HTML) {
+       if (mimeinfo->mime_type != MIME_TEXT) {
                messageview_change_view_type(messageview, MVIEW_MIME);
                mimeview_show_message(messageview->mimeview, mimeinfo, file);
        } else {
@@ -707,8 +710,10 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo,
                procmime_mimeinfo_free_all(mimeinfo);
        }
 
-       if (MSG_IS_RETRCPT_PENDING(msginfo->flags))
-               return_receipt_show(messageview->noticeview, msginfo);
+       if ((messageview->msginfo->dispositionnotificationto || 
+            messageview->msginfo->returnreceiptto) &&
+           !MSG_IS_RETRCPT_SENT(messageview->msginfo->flags))
+               return_receipt_show(messageview->noticeview, messageview->msginfo);
        else 
                noticeview_hide(messageview->noticeview);
 
@@ -756,6 +761,7 @@ void messageview_reflect_prefs_pixmap_theme(void)
        for (cur = msgview_list; cur != NULL; cur = cur->next) {
                msgview = (MessageView*)cur->data;
                toolbar_update(TOOLBAR_MSGVIEW, msgview);
+               mimeview_update(msgview->mimeview);
        }
 }
 
@@ -764,6 +770,7 @@ void messageview_clear(MessageView *messageview)
        procmsg_msginfo_free(messageview->msginfo);
        messageview->msginfo = NULL;
        messageview_change_view_type(messageview, MVIEW_TEXT);
+       messageview->filtered = FALSE;
        headerview_clear(messageview->headerview);
        textview_clear(messageview->textview);
        noticeview_hide(messageview->noticeview);
@@ -775,6 +782,8 @@ void messageview_destroy(MessageView *messageview)
        GtkWidget *mimeview  = GTK_WIDGET_PTR(messageview->mimeview);
 
        debug_print("destroy messageview\n");
+       messageview_list = g_list_remove(messageview_list, messageview);
+
        headerview_destroy(messageview->headerview);
        textview_destroy(messageview->textview);
        mimeview_destroy(messageview->mimeview);
@@ -798,7 +807,6 @@ void messageview_destroy(MessageView *messageview)
 void messageview_delete(MessageView *msgview)
 {
        MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
-       SummaryView *summaryview = (SummaryView*)msgview->mainwin->summaryview;
        FolderItem *trash = folder_get_default_trash();
        GSList *msg_list;
 
@@ -902,6 +910,14 @@ TextView *messageview_get_current_textview(MessageView *messageview)
        return text;
 }
 
+MimeInfo *messageview_get_selected_mime_part(MessageView *messageview)
+{
+       if (messageview->type == MVIEW_MIME)
+               return mimeview_get_selected_part(messageview->mimeview);
+
+       return NULL;
+}
+
 void messageview_copy_clipboard(MessageView *messageview)
 {
        TextView *text;
@@ -1038,7 +1054,7 @@ void messageview_toggle_view_real(MessageView *messageview)
 
 static void return_receipt_show(NoticeView *noticeview, MsgInfo *msginfo)
 {
-       noticeview_set_text(noticeview, _("This messages asks for a return receipt."));
+       noticeview_set_text(noticeview, _("This message asks for a return receipt"));
        noticeview_set_button_text(noticeview, _("Send receipt"));
        noticeview_set_button_press_callback(noticeview,
                                             GTK_SIGNAL_FUNC(return_receipt_send_clicked),
@@ -1062,7 +1078,7 @@ static void return_receipt_send_clicked(NoticeView *noticeview, MsgInfo *msginfo
        tmpmsginfo->msgnum = msginfo->msgnum;
 
        if (disposition_notification_send(tmpmsginfo) >= 0) {
-               procmsg_msginfo_unset_flags(msginfo, MSG_RETRCPT_PENDING, 0);
+               procmsg_msginfo_set_flags(msginfo, MSG_RETRCPT_SENT, 0);
                noticeview_hide(noticeview);
        }               
 
@@ -1103,10 +1119,9 @@ static PrefsAccount *select_account_from_list(GList *ac_list)
        return account_find_from_id(account_id);
 }
 
-
 /* 
- * \brief return selected messageview text used by composing 
- *       to reply to selected text only
+ * \brief return selected messageview text, when nothing is 
+ *       selected and message was filtered, return complete text
  *
  * \param  pointer to Messageview 
  *
@@ -1114,21 +1129,31 @@ static PrefsAccount *select_account_from_list(GList *ac_list)
  */
 gchar *messageview_get_selection(MessageView *msgview)
 {
+       TextView *textview;
        gchar *text = NULL;
+       GtkEditable *edit = NULL;
+       gint body_pos = 0;
        
        g_return_val_if_fail(msgview != NULL, NULL);
 
-       text = gtkut_editable_get_selection
-               (GTK_EDITABLE(msgview->textview->text));
-       
-       if (!text && msgview->type == MVIEW_MIME
-           && msgview->mimeview->type == MIMEVIEW_TEXT
-           && msgview->mimeview->textview
-           && !msgview->mimeview->textview->default_text) {
-               text = gtkut_editable_get_selection 
-                       (GTK_EDITABLE(msgview->mimeview->textview->text));   
+       textview = messageview_get_current_textview(msgview);
+       if (textview) {
+               edit = GTK_EDITABLE(textview->text);
+               body_pos = textview->body_pos;
+       } else {
+               edit = GTK_EDITABLE(msgview->mimeview->textview->text);
+               body_pos = msgview->mimeview->textview->body_pos;
        }
 
+       g_return_val_if_fail(edit != NULL, NULL);
+
+       if (edit->has_selection)
+               text = gtkut_editable_get_selection(edit);
+       else if (msgview->filtered) 
+               text = gtk_editable_get_chars (edit, body_pos, -1);
+       else
+               text = NULL;
+       
        return text;
 }