sync with 0.7.6cvs4
[claws.git] / src / messageview.c
index 827a207f1cd0ea5235bc666463011b200befbaf1..72ab34eec79d1e8e0f90bfe5083c21dd4c8eeef3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2002 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,6 +58,7 @@ static void messageview_size_allocate_cb(GtkWidget    *widget,
 static void key_pressed                        (GtkWidget      *widget,
                                         GdkEventKey    *event,
                                         MessageView    *messageview);
+static void messageview_toggle_view(MessageView *messageview);
 
 MessageView *messageview_create(void)
 {
@@ -82,7 +83,8 @@ MessageView *messageview_create(void)
        imageview->messageview = messageview;
 
        mimeview = mimeview_create();
-       mimeview->textview = textview;
+       mimeview->textview = textview_create();
+       mimeview->textview->messageview = messageview;
        mimeview->imageview = imageview;
        mimeview->messageview = messageview;
 
@@ -96,6 +98,7 @@ MessageView *messageview_create(void)
        gtk_widget_ref(GTK_WIDGET_PTR(textview));
        gtk_widget_ref(GTK_WIDGET_PTR(imageview));
        gtk_widget_ref(GTK_WIDGET_PTR(mimeview));
+       gtk_widget_ref(GTK_WIDGET_PTR(mimeview->textview));
 
        messageview->vbox       = vbox;
        messageview->new_window = FALSE;
@@ -114,7 +117,8 @@ MessageView *messageview_create_with_new_window(void)
        MessageView *msgview;
 
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_title(GTK_WINDOW(window), "Message");
+       gtk_window_set_title(GTK_WINDOW(window), _("Sylpheed - Message View"));
+       gtk_window_set_wmclass(GTK_WINDOW(window), "message_view", "Sylpheed");
        gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
        gtk_widget_set_usize(window, prefs_common.msgwin_width,
                             prefs_common.msgwin_height);
@@ -183,12 +187,12 @@ static gint disposition_notification_queue(PrefsAccount * account,
 
        tmp = g_strdup_printf("%s%cqueue.%d", g_get_tmp_dir(),
                              G_DIR_SEPARATOR, (gint)file);
-       if ((fp = fopen(tmp, "w")) == NULL) {
+       if ((fp = fopen(tmp, "wb")) == NULL) {
                FILE_OP_ERROR(tmp, "fopen");
                g_free(tmp);
                return -1;
        }
-       if ((src_fp = fopen(file, "r")) == NULL) {
+       if ((src_fp = fopen(file, "rb")) == NULL) {
                FILE_OP_ERROR(file, "fopen");
                fclose(fp);
                unlink(tmp);
@@ -293,7 +297,7 @@ static gint disposition_notification_send(MsgInfo * msginfo)
        g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg%d",
                   get_rc_dir(), G_DIR_SEPARATOR, (gint)msginfo);
 
-       if ((fp = fopen(tmp, "w")) == NULL) {
+       if ((fp = fopen(tmp, "wb")) == NULL) {
                FILE_OP_ERROR(tmp, "fopen");
                return -1;
        }
@@ -361,7 +365,8 @@ static gint disposition_notification_send(MsgInfo * msginfo)
        return ok;
 }
 
-void messageview_show(MessageView *messageview, MsgInfo *msginfo)
+void messageview_show(MessageView *messageview, MsgInfo *msginfo,
+                     gboolean all_headers)
 {
        FILE *fp;
        gchar *file;
@@ -371,51 +376,8 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo)
        g_return_if_fail(msginfo != NULL);
 
 #if USE_GPGME
-       for (;;) {
-               if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-               mimeinfo = procmime_scan_mime_header(fp);
-               if (!mimeinfo) break;
-
-               if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
-                   rfc2015_is_encrypted(mimeinfo)) {
-                       MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
-               }
-               if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
-                   pgptext_is_encrypted(mimeinfo, msginfo)) {
-                       MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
-                       /* To avoid trouble with the rfc2015 stuff we go for encryption 
-                        * right here. */
-                       if (MSG_IS_ENCRYPTED(msginfo->flags) &&
-                           !msginfo->plaintext_file  &&
-                           !msginfo->decryption_failed) {
-                               /* This is an encrypted message but it has not yet
-                                * been decrypted and there was no unsuccessful
-                                * decryption attempt */
-                               pgptext_decrypt_message(msginfo, mimeinfo, fp);
-                               if (msginfo->plaintext_file &&
-                                   !msginfo->decryption_failed) {
-                                       fclose(fp);
-                                       continue;
-                               }
-                       }
-               }
-               
-               if (MSG_IS_ENCRYPTED(msginfo->flags) &&
-                   !msginfo->plaintext_file  &&
-                   !msginfo->decryption_failed) {
-                       /* This is an encrypted message but it has not yet
-                        * been decrypted and there was no unsuccessful
-                        * decryption attempt */
-                       rfc2015_decrypt_message(msginfo, mimeinfo, fp);
-                       if (msginfo->plaintext_file &&
-                           !msginfo->decryption_failed) {
-                               fclose(fp);
-                               continue;
-                       }
-               }
-
-               break;
-       }
+       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);
@@ -424,19 +386,26 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo)
        if (!mimeinfo) return;
 
        file = procmsg_get_message_file_path(msginfo);
-       g_return_if_fail(file != NULL);
+       if (!file) {
+               g_warning("can't get message file path.\n");
+               procmime_mimeinfo_free(mimeinfo);
+               return;
+       }
 
        /* FIXME - doesn't tmpmsginfo->flags have the value
         * of msginfo->flags after procheader_parse()???
         * in any case, checking tmpmsginfo->flags for MSG_UNREAD
         * fixes the return-receipt-request bug */
 
-       tmpmsginfo = procheader_parse(file, msginfo->flags, TRUE);
+       tmpmsginfo = procheader_parse(file, msginfo->flags, TRUE, TRUE);
+       if (MSG_IS_MIME(tmpmsginfo->flags))
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MIME);
 
        if (prefs_common.return_receipt
            && (tmpmsginfo->dispositionnotificationto
                || tmpmsginfo->returnreceiptto)
-           && (MSG_IS_UNREAD(msginfo->flags))) {
+           && (MSG_IS_UNREAD(tmpmsginfo->flags))
+           && (MSG_IS_RETRCPT_PENDING(tmpmsginfo->flags))) {
                gint ok;
                
                if (alertpanel(_("Return Receipt"), _("Send return receipt ?"),
@@ -445,12 +414,17 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo)
                        if (ok < 0)
                                alertpanel_error(_("Error occurred while sending notification."));
                }
+               MSG_UNSET_PERM_FLAGS(tmpmsginfo->flags, MSG_RETRCPT_PENDING);   
        }
 
        headerview_show(messageview->headerview, tmpmsginfo);
        procmsg_msginfo_free(tmpmsginfo);
 
-       if (mimeinfo->mime_type != MIME_TEXT) {
+       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) {
                messageview_change_view_type(messageview, MVIEW_MIME);
                mimeview_show_message(messageview->mimeview, mimeinfo, file);
        } else {
@@ -466,36 +440,26 @@ static void messageview_change_view_type(MessageView *messageview,
                                         MessageType type)
 {
        TextView *textview = messageview->textview;
-       ImageView *imageview = messageview->imageview;
        MimeView *mimeview = messageview->mimeview;
 
        if (messageview->type == type) return;
 
        if (type == MVIEW_MIME) {
-               if (textview->text) 
-                       gtk_editable_claim_selection(GTK_EDITABLE(textview->text), FALSE, GDK_CURRENT_TIME);
-               gtk_container_remove
+               gtkut_container_remove
                        (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)),
                         GTK_WIDGET_PTR(textview));
                gtk_box_pack_start(GTK_BOX(messageview->vbox),
                                   GTK_WIDGET_PTR(mimeview), TRUE, TRUE, 0);
                gtk_container_add(GTK_CONTAINER(mimeview->vbox),
                                  GTK_WIDGET_PTR(textview));
-               mimeview->type = MIMEVIEW_TEXT;
        } else if (type == MVIEW_TEXT) {
-               if (mimeview->textview->text) 
-                       gtk_editable_claim_selection(GTK_EDITABLE(mimeview->textview->text), FALSE, GDK_CURRENT_TIME);
-               gtk_container_remove
+               gtkut_container_remove
                        (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)),
                         GTK_WIDGET_PTR(mimeview));
 
-               if (mimeview->vbox == GTK_WIDGET_PTR(textview)->parent) {
-                       gtk_container_remove(GTK_CONTAINER(mimeview->vbox),
-                                            GTK_WIDGET_PTR(textview));
-               } else {
-                       gtk_container_remove(GTK_CONTAINER(mimeview->vbox),
-                                            GTK_WIDGET_PTR(imageview));
-               }
+               if (mimeview->vbox == GTK_WIDGET_PTR(textview)->parent)
+                       gtkut_container_remove(GTK_CONTAINER(mimeview->vbox),
+                                              GTK_WIDGET_PTR(textview));
 
                gtk_box_pack_start(GTK_BOX(messageview->vbox),
                                   GTK_WIDGET_PTR(textview), TRUE, TRUE, 0);
@@ -510,6 +474,7 @@ void messageview_clear(MessageView *messageview)
        messageview_change_view_type(messageview, MVIEW_TEXT);
        headerview_clear(messageview->headerview);
        textview_clear(messageview->textview);
+       imageview_clear(messageview->imageview);
 }
 
 void messageview_destroy(MessageView *messageview)
@@ -541,30 +506,52 @@ void messageview_set_font(MessageView *messageview)
 
 void messageview_copy_clipboard(MessageView *messageview)
 {
-       if (messageview->type == MVIEW_TEXT)
-               gtk_editable_copy_clipboard
-                       (GTK_EDITABLE(messageview->textview->text));
+       gint displaytype = /* force MVIEV_TEXT on first page */
+               ((messageview->type == MVIEW_MIME)
+               && (gtk_notebook_get_current_page(GTK_NOTEBOOK(
+                               messageview->mimeview->notebook)) > 0))
+               ? MVIEW_MIME
+               : MVIEW_TEXT;
+
+       switch (displaytype) {
+       case MVIEW_TEXT:
+               gtk_editable_copy_clipboard(GTK_EDITABLE(messageview->textview->text));
+               break;
+       case MVIEW_MIME:
+               if (messageview->mimeview->type == MIMEVIEW_TEXT)
+                       gtk_editable_copy_clipboard(GTK_EDITABLE(messageview->mimeview->textview->text));
+       default:
+               break;
+       }
 }
 
 void messageview_select_all(MessageView *messageview)
 {
+       GtkWidget *text = NULL;
+
        if (messageview->type == MVIEW_TEXT)
-               gtk_editable_select_region
-                       (GTK_EDITABLE(messageview->textview->text), 0, -1);
+               text = messageview->textview->text;
+       else if (messageview->type == MVIEW_MIME) {
+               if (gtk_notebook_get_current_page
+                       (GTK_NOTEBOOK(messageview->mimeview->notebook)) == 0)
+                       text = messageview->textview->text;
+               else if (messageview->mimeview->type == MIMEVIEW_TEXT)
+                       text = messageview->mimeview->textview->text;
+       }
+
+       if (text)
+               gtk_editable_select_region(GTK_EDITABLE(text), 0, -1);
 }
 
 void messageview_set_position(MessageView *messageview, gint pos)
 {
-       if (messageview->type == MVIEW_TEXT)
-               textview_set_position(messageview->textview, pos);
+       textview_set_position(messageview->textview, pos);
 }
 
 gboolean messageview_search_string(MessageView *messageview, const gchar *str,
                                   gboolean case_sens)
 {
-       if (messageview->type == MVIEW_TEXT)
-               return textview_search_string(messageview->textview,
-                                             str, case_sens);
+       return textview_search_string(messageview->textview, str, case_sens);
        return FALSE;
 }
 
@@ -572,9 +559,8 @@ gboolean messageview_search_string_backward(MessageView *messageview,
                                            const gchar *str,
                                            gboolean case_sens)
 {
-       if (messageview->type == MVIEW_TEXT)
-               return textview_search_string_backward(messageview->textview,
-                                                      str, case_sens);
+       return textview_search_string_backward(messageview->textview,
+                                              str, case_sens);
        return FALSE;
 }
 
@@ -603,3 +589,51 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (event && event->keyval == GDK_Escape && messageview->window)
                gtk_widget_destroy(messageview->window);
 }
+
+static void messageview_toggle_view(MessageView *messageview)
+{
+       MainWindow *mainwin = messageview->mainwin;
+       GtkItemFactory *ifactory;
+       
+       if (!mainwin) return;
+       
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+       menu_toggle_toggle(ifactory, "/View/Expand Summary View");
+}
+
+void messageview_toggle_view_real(MessageView *messageview)
+{
+       MainWindow *mainwin = messageview->mainwin;
+       union CompositeWin *cwin = &mainwin->win;
+       GtkWidget *vpaned = NULL;
+       GtkWidget *container = NULL;
+       GtkItemFactory *ifactory =gtk_item_factory_from_widget(mainwin->menubar);
+       
+       switch (mainwin->type) {
+       case SEPARATE_NONE:
+               vpaned = cwin->sep_none.vpaned;
+               container = cwin->sep_none.hpaned;
+               break;
+       case SEPARATE_FOLDER:
+               vpaned = cwin->sep_folder.vpaned;
+               container = mainwin->vbox_body;
+               break;
+       case SEPARATE_MESSAGE:
+       case SEPARATE_BOTH:
+               return;
+       }
+
+       if (vpaned->parent != NULL) {
+               gtk_widget_ref(vpaned);
+               gtkut_container_remove(GTK_CONTAINER(container), vpaned);
+               gtk_widget_reparent(GTK_WIDGET_PTR(messageview), container);
+               menu_set_sensitive(ifactory, "/View/Expand Summary View", FALSE);
+               gtk_widget_grab_focus(GTK_WIDGET(messageview->textview->text));
+       } else {
+               gtk_widget_reparent(GTK_WIDGET_PTR(messageview), vpaned);
+               gtk_container_add(GTK_CONTAINER(container), vpaned);
+               gtk_widget_unref(vpaned);
+               menu_set_sensitive(ifactory, "/View/Expand Summary View", TRUE);
+               gtk_widget_grab_focus(GTK_WIDGET(mainwin->summaryview->ctree));
+       }
+}