/*
* 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
#include "account.h"
#include "alertpanel.h"
#include "send.h"
+#include "pgptext.h"
static void messageview_change_view_type(MessageView *messageview,
MessageType type);
static void key_pressed (GtkWidget *widget,
GdkEventKey *event,
MessageView *messageview);
+static void messageview_toggle_view(MessageView *messageview);
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;
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;
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);
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);
MsgInfo newmsginfo;
newmsginfo.msgnum = num;
- newmsginfo.flags = 0;
+ newmsginfo.flags.perm_flags = newmsginfo.flags.tmp_flags = 0;
procmsg_write_flags(&newmsginfo, fp);
fclose(fp);
}
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;
}
return ok;
}
-void messageview_show(MessageView *messageview, MsgInfo *msginfo)
+void messageview_show(MessageView *messageview, MsgInfo *msginfo,
+ gboolean all_headers)
{
FILE *fp;
gchar *file;
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_FLAGS(msginfo->flags, MSG_ENCRYPTED);
- }
- 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);
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 ?"),
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 {
MessageType type)
{
TextView *textview = messageview->textview;
- ImageView *imageview = messageview->imageview;
MimeView *mimeview = messageview->mimeview;
if (messageview->type == type) return;
if (type == MVIEW_MIME) {
- 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) {
- 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);
messageview_change_view_type(messageview, MVIEW_TEXT);
headerview_clear(messageview->headerview);
textview_clear(messageview->textview);
+ imageview_clear(messageview->imageview);
}
void messageview_destroy(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)
+{
+ textview_set_position(messageview->textview, pos);
+}
+
+gboolean messageview_search_string(MessageView *messageview, const gchar *str,
+ gboolean case_sens)
+{
+ return textview_search_string(messageview->textview, str, case_sens);
+ return FALSE;
+}
+
+gboolean messageview_search_string_backward(MessageView *messageview,
+ const gchar *str,
+ gboolean case_sens)
+{
+ return textview_search_string_backward(messageview->textview,
+ str, case_sens);
+ return FALSE;
}
GtkWidget *messageview_get_text_widget(MessageView *messageview)
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));
+ }
+}