added support to text/enriched
[claws.git] / src / mimeview.c
index c807a93dd60027f5ae0c4c2258006e4c39fa792f..14e043880b6b79ee8bdf629943d1b28b69aeee29 100644 (file)
@@ -51,6 +51,7 @@
 #include "gtkutils.h"
 #include "prefs_common.h"
 #include "rfc2015.h"
+#include "pgptext.h"
 
 typedef enum
 {
@@ -225,6 +226,8 @@ static gboolean mimeview_is_signed(MimeView *mimeview)
        do {
                if (rfc2015_has_signature(partinfo))
                        return TRUE;
+               if (pgptext_has_signature(partinfo))
+                       return TRUE;
         } while ((partinfo = partinfo->parent) != NULL);
 
        debug_print("mimeview_is_signed: FALSE\n" );
@@ -269,7 +272,7 @@ void mimeview_show_message(MimeView *mimeview, MimeInfo *mimeinfo,
        }
        mimeview->file = g_strdup(file);
 
-       /* skip headers */
+       /* skip MIME part headers */
        if (mimeinfo->mime_type == MIME_MULTIPART) {
                if (fseek(fp, mimeinfo->fpos, SEEK_SET) < 0)
                perror("fseek");
@@ -294,8 +297,21 @@ void mimeview_show_message(MimeView *mimeview, MimeInfo *mimeinfo,
        gtk_signal_handler_unblock_by_func(GTK_OBJECT(ctree),
                                           mimeview_selected, mimeview);
 
-       if ((node = gtk_ctree_node_nth(ctree, 0))) {
+       /* search first text part */
+       for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+            node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
+               MimeInfo *partinfo;
+
+               partinfo = gtk_ctree_node_get_row_data(ctree, node);
+               if (partinfo && partinfo->mime_type == MIME_TEXT)
+                       break;
+       }
+       if (!node)
+               node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+
+       if (node) {
                gtk_ctree_select(ctree, node);
+               gtkut_ctree_set_focus_row(ctree, node);
                gtk_widget_grab_focus(mimeview->ctree);
        }
 }
@@ -487,6 +503,7 @@ static void mimeview_selected(GtkCTree *ctree, GtkCTreeNode *node, gint column,
        switch (partinfo->mime_type) {
        case MIME_TEXT:
        case MIME_TEXT_HTML:
+       case MIME_TEXT_ENRICHED:
        case MIME_MESSAGE_RFC822:
        case MIME_MULTIPART:
                mimeview_show_message_part(mimeview, partinfo);
@@ -556,6 +573,7 @@ static void mimeview_button_pressed(GtkWidget *widget, GdkEventButton *event,
                        (GTK_CTREE(mimeview->ctree), mimeview->opened);
                if (partinfo && (partinfo->mime_type == MIME_TEXT ||
                                 partinfo->mime_type == MIME_TEXT_HTML ||
+                                partinfo->mime_type == MIME_TEXT_ENRICHED ||
                                 partinfo->mime_type == MIME_MESSAGE_RFC822 ||
                                 partinfo->mime_type == MIME_IMAGE ||
                                 partinfo->mime_type == MIME_MULTIPART))
@@ -564,6 +582,13 @@ static void mimeview_button_pressed(GtkWidget *widget, GdkEventButton *event,
                else
                        menu_set_sensitive(mimeview->popupfactory,
                                           "/Display as text", TRUE);
+               if (partinfo &&
+                   partinfo->mime_type == MIME_APPLICATION_OCTET_STREAM)
+                       menu_set_sensitive(mimeview->popupfactory,
+                                          "/Open", FALSE);
+               else
+                       menu_set_sensitive(mimeview->popupfactory,
+                                          "/Open", TRUE);
 #if USE_GPGME
                menu_set_sensitive(mimeview->popupfactory,
                                   "/Check signature",
@@ -601,7 +626,6 @@ static void mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                }
                break;
        case GDK_BackSpace:
-       case GDK_Delete:
                textview_scroll_page(mimeview->textview, TRUE);
                return;
        case GDK_Return:
@@ -750,6 +774,7 @@ static void mimeview_open_with(MimeView *mimeview)
 {
        MimeInfo *partinfo;
        gchar *filename;
+       gchar *cmd;
 
        if (!mimeview->opened) return;
        if (!mimeview->file) return;
@@ -760,21 +785,29 @@ static void mimeview_open_with(MimeView *mimeview)
 
        filename = procmime_get_tmp_file_name(partinfo);
 
-       if (procmime_get_part(filename, mimeview->file, partinfo) < 0)
+       if (procmime_get_part(filename, mimeview->file, partinfo) < 0) {
                alertpanel_error
                        (_("Can't save the part of multipart message."));
-       else {
-               gchar *cmd;
-
-               cmd = input_dialog
-                       (_("Open with"),
-                        _("Enter the command line to open file:\n"
-                          "(`%s' will be replaced with file name)"),
-                        "gedit %s");
-               if (cmd) {
-                       mimeview_view_file(filename, partinfo, cmd);
-                       g_free(cmd);
-               }
+               g_free(filename);
+               return;
+       }
+
+       if (!prefs_common.mime_open_cmd_history)
+               prefs_common.mime_open_cmd_history =
+                       add_history(NULL, prefs_common.mime_open_cmd);
+
+       cmd = input_dialog_combo
+               (_("Open with"),
+                _("Enter the command line to open file:\n"
+                  "(`%s' will be replaced with file name)"),
+                prefs_common.mime_open_cmd,
+                prefs_common.mime_open_cmd_history);
+       if (cmd) {
+               mimeview_view_file(filename, partinfo, cmd);
+               g_free(prefs_common.mime_open_cmd);
+               prefs_common.mime_open_cmd = cmd;
+               prefs_common.mime_open_cmd_history =
+                       add_history(prefs_common.mime_open_cmd_history, cmd);
        }
 
        g_free(filename);
@@ -787,7 +820,7 @@ static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
        static gchar *default_audio_cmdline = "play '%s'";
        static gchar *default_html_cmdline =
                "netscape -remote 'openURL(%s,raise)'";
-       static gchar *mime_cmdline = "metamail -d -b -c %s '%s'";
+       static gchar *mime_cmdline = "metamail -d -b -x -c %s '%s'";
        gchar buf[1024];
        gchar m_buf[1024];
        const gchar *cmd;
@@ -827,7 +860,7 @@ static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
                        return;
        }
 
-       execute_command_line(buf);
+       execute_command_line(buf, TRUE);
 }
 
 #if USE_GPGME