2005-10-16 [colin] 1.9.15cvs50
[claws.git] / src / mimeview.c
index 06a01a1cab0e19c875f2fa6b757cefd8c935885a..c188e0d20593743ce4ec392bd2f2d99304020245 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -271,6 +271,7 @@ MimeView *mimeview_create(MainWindow *mainwin)
        gtk_widget_show(vbox);
        siginfoview = noticeview_create(mainwin);
        noticeview_hide(siginfoview);
+       noticeview_set_icon_clickable(siginfoview, TRUE);
        gtk_box_pack_start(GTK_BOX(vbox), mime_notebook, TRUE, TRUE, 0);
        gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET_PTR(siginfoview), FALSE, FALSE, 0);
 
@@ -459,7 +460,7 @@ static void mimeview_show_message_part(MimeView *mimeview, MimeInfo *partinfo)
        fname = mimeview->file;
        if (!fname) return;
 
-       if ((fp = fopen(fname, "rb")) == NULL) {
+       if ((fp = g_fopen(fname, "rb")) == NULL) {
                FILE_OP_ERROR(fname, "fopen");
                return;
        }
@@ -625,6 +626,7 @@ void mimeview_clear(MimeView *mimeview)
 }
 
 static void check_signature_cb(GtkWidget *widget, gpointer user_data);
+void mimeview_check_signature(MimeView *mimeview);
 static void display_full_info_cb(GtkWidget *widget, gpointer user_data);
 
 static void update_signature_noticeview(MimeView *mimeview, MimeInfo *mimeinfo)
@@ -638,22 +640,22 @@ static void update_signature_noticeview(MimeView *mimeview, MimeInfo *mimeinfo)
        
        switch (privacy_mimeinfo_get_sig_status(mimeinfo)) {
        case SIGNATURE_UNCHECKED:
-               button_text = _("Check");
+               button_text = _("Check signature");
                func = check_signature_cb;
                icon = STOCK_PIXMAP_PRIVACY_SIGNED;
                break;
        case SIGNATURE_OK:
-               button_text = _("Full info");
+               button_text = _("View full information");
                func = display_full_info_cb;
                icon = STOCK_PIXMAP_PRIVACY_PASSED;
                break;
        case SIGNATURE_WARN:
-               button_text = _("Full info");
+               button_text = _("View full information");
                func = display_full_info_cb;
                icon = STOCK_PIXMAP_PRIVACY_WARN;
                break;
        case SIGNATURE_INVALID:
-               button_text = _("Full info");
+               button_text = _("View full information");
                func = display_full_info_cb;
                icon = STOCK_PIXMAP_PRIVACY_FAILED;
                break;
@@ -664,15 +666,22 @@ static void update_signature_noticeview(MimeView *mimeview, MimeInfo *mimeinfo)
        default:
                break;
        }
-       text = privacy_mimeinfo_sig_info_short(mimeinfo);
+       if (privacy_mimeinfo_get_sig_status(mimeinfo) == SIGNATURE_UNCHECKED) {
+               gchar *tmp = privacy_mimeinfo_sig_info_short(mimeinfo);
+               text = g_strdup_printf("%s %s",
+                       tmp, _("Click the icon to check it."));
+               g_free(tmp);
+       } else
+               text = privacy_mimeinfo_sig_info_short(mimeinfo);
        noticeview_set_text(mimeview->siginfoview, text);
        g_free(text);
-       noticeview_set_button_text(mimeview->siginfoview, button_text);
+       noticeview_set_button_text(mimeview->siginfoview, NULL);
        noticeview_set_button_press_callback(
                mimeview->siginfoview,
                G_CALLBACK(func),
                (gpointer) mimeview);
        noticeview_set_icon(mimeview->siginfoview, icon);
+       noticeview_set_tooltip(mimeview->siginfoview, button_text);
 }
 
 static void check_signature_cb(GtkWidget *widget, gpointer user_data)
@@ -680,12 +689,28 @@ static void check_signature_cb(GtkWidget *widget, gpointer user_data)
        MimeView *mimeview = (MimeView *) user_data;
        MimeInfo *mimeinfo = mimeview->siginfo;
        
+       if (mimeinfo == NULL)
+               return;
+
        privacy_mimeinfo_check_signature(mimeinfo);
        update_signature_noticeview(mimeview, mimeview->siginfo);
        icon_list_clear(mimeview);
        icon_list_create(mimeview, mimeview->mimeinfo);
 }
 
+void mimeview_check_signature(MimeView *mimeview)
+{
+       check_signature_cb(NULL, mimeview);     
+}
+
+static void redisplay_email(GtkWidget *widget, gpointer user_data)
+{
+       MimeView *mimeview = (MimeView *) user_data;
+       GtkCTreeNode *node = mimeview->opened;
+       mimeview->opened = NULL;
+       mimeview_selected(GTK_CTREE(mimeview->ctree), node, 0, mimeview);
+}
+
 static void display_full_info_cb(GtkWidget *widget, gpointer user_data)
 {
        MimeView *mimeview = (MimeView *) user_data;
@@ -695,15 +720,34 @@ static void display_full_info_cb(GtkWidget *widget, gpointer user_data)
        textview_set_text(mimeview->textview, siginfo);
        g_free(siginfo);
        noticeview_set_button_text(mimeview->siginfoview, NULL);
+       noticeview_set_button_press_callback(
+               mimeview->siginfoview,
+               G_CALLBACK(redisplay_email),
+               (gpointer) mimeview);
+       noticeview_set_tooltip(mimeview->siginfoview, _("Go back to email"));
 }
 
 static void update_signature_info(MimeView *mimeview, MimeInfo *selected)
 {
        MimeInfo *siginfo;
-
+       MimeInfo *first_text;
+       
        g_return_if_fail(mimeview != NULL);
        g_return_if_fail(selected != NULL);
        
+       if (selected->type == MIMETYPE_MESSAGE 
+       &&  !g_ascii_strcasecmp(selected->subtype, "rfc822")) {
+               /* if the first text part is signed, check that */
+               first_text = selected;
+               while (first_text && first_text->type != MIMETYPE_TEXT) {
+                       first_text = procmime_mimeinfo_next(first_text);
+               }
+               if (first_text) {
+                       update_signature_info(mimeview, first_text);
+                       return;
+               }       
+       }
+
        siginfo = selected;
        while (siginfo != NULL) {
                if (privacy_mimeinfo_is_signed(siginfo))
@@ -928,6 +972,11 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                KEY_PRESS_EVENT_STOP();
                mimeview_open_with(mimeview);
                return TRUE;
+       case GDK_c:
+               BREAK_ON_MODIFIER_KEY();
+               KEY_PRESS_EVENT_STOP();
+               mimeview_check_signature(mimeview);
+               return TRUE;
        default:
                break;
        }
@@ -1065,14 +1114,14 @@ static void mimeview_save_all(MimeView *mimeview)
                startdir = g_strconcat(prefs_common.attach_save_dir,
                                       G_DIR_SEPARATOR_S, NULL);
 
-       dirname = filesel_select_file_open_folder(_("Select destination folder"), startdir);
+       dirname = filesel_select_file_save_folder(_("Select destination folder"), startdir);
        if (!dirname) {
                if (startdir) g_free(startdir);
                return;
        }
 
        if (!is_dir_exist (dirname)) {
-               alertpanel_error(_("`%s' is not a directory."),
+               alertpanel_error(_("'%s' is not a directory."),
                                 dirname);
                if (startdir) g_free(startdir);
                return;
@@ -1229,6 +1278,8 @@ static void mimeview_open_with(MimeView *mimeview)
        MimeInfo *partinfo;
        gchar *filename;
        gchar *cmd;
+       gchar *mime_command = NULL;
+       gchar *content_type = NULL;
 
        if (!mimeview->opened) return;
        if (!mimeview->file) return;
@@ -1256,13 +1307,18 @@ static void mimeview_open_with(MimeView *mimeview)
                prefs_common.mime_open_cmd_history =
                        add_history(NULL, prefs_common.mime_open_cmd);
 
+       content_type = procmime_get_content_type_str(partinfo->type,
+                       partinfo->subtype);
+       mime_command = mailcap_get_command_for_type(content_type);
+       g_free(content_type);
        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,
+                  "('%s' will be replaced with file name)"),
+                mime_command ? mime_command : prefs_common.mime_open_cmd,
                 prefs_common.mime_open_cmd_history,
                 TRUE);
+       g_free(mime_command);
        if (cmd) {
                mimeview_view_file(filename, partinfo, cmd);
                g_free(prefs_common.mime_open_cmd);
@@ -1277,10 +1333,10 @@ static void mimeview_open_with(MimeView *mimeview)
 static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
                               const gchar *cmdline)
 {
-       static gchar *default_image_cmdline = "display '%s'";
-       static gchar *default_audio_cmdline = "play '%s'";
+       static gchar *default_image_cmdline = DEFAULT_IMAGE_VIEWER_CMD;
+       static gchar *default_audio_cmdline = DEFAULT_AUDIO_PLAYER_CMD;
        static gchar *default_html_cmdline = DEFAULT_BROWSER_CMD;
-       static gchar *mime_cmdline = "metamail -d -b -x -c %s '%s'";
+       static gchar *mime_cmdline = DEFAULT_MIME_CMD;
        gchar buf[1024];
        gchar m_buf[1024];
        const gchar *cmd;
@@ -1318,7 +1374,7 @@ static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
                g_snprintf(buf, sizeof(buf), cmd, filename);
        else {
                if (cmd)
-                       g_warning("MIME viewer command line is invalid: `%s'", cmd);
+                       g_warning("MIME viewer command line is invalid: '%s'", cmd);
                if (def_cmd)
                        g_snprintf(buf, sizeof(buf), def_cmd, filename);
                else
@@ -1481,6 +1537,11 @@ static gint icon_key_pressed(GtkWidget *button, GdkEventKey *event,
                KEY_PRESS_EVENT_STOP();
                mimeview_open_with(mimeview);
                return TRUE;
+       case GDK_c:
+               BREAK_ON_MODIFIER_KEY();
+               KEY_PRESS_EVENT_STOP();
+               mimeview_check_signature(mimeview);
+               return TRUE;
        default:
                break;
        }