2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999,2000 Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include <gdk/gdkkeysyms.h>
24 #include <gtk/gtkvbox.h>
25 #include <gtk/gtkcontainer.h>
26 #include <gtk/gtkeditable.h>
27 #include <gtk/gtkwindow.h>
28 #include <gtk/gtktext.h>
35 #include "messageview.h"
36 #include "headerview.h"
38 #include "imageview.h"
41 #include "procheader.h"
43 #include "prefs_common.h"
48 static void messageview_change_view_type(MessageView *messageview,
50 static void messageview_destroy_cb (GtkWidget *widget,
51 MessageView *messageview);
52 static void messageview_size_allocate_cb(GtkWidget *widget,
53 GtkAllocation *allocation);
54 static void key_pressed (GtkWidget *widget,
56 MessageView *messageview);
58 MessageView *messageview_create(void)
60 MessageView *messageview;
62 HeaderView *headerview;
67 debug_print(_("Creating message view...\n"));
68 messageview = g_new0(MessageView, 1);
70 messageview->type = MVIEW_TEXT;
72 headerview = headerview_create();
74 textview = textview_create();
75 textview->messageview = messageview;
77 imageview = imageview_create();
78 imageview->messageview = messageview;
80 mimeview = mimeview_create();
81 mimeview->textview = textview;
82 mimeview->imageview = imageview;
83 mimeview->messageview = messageview;
85 vbox = gtk_vbox_new(FALSE, 0);
86 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(headerview),
88 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(textview),
91 /* to remove without destroyed */
92 gtk_widget_ref(GTK_WIDGET_PTR(textview));
93 gtk_widget_ref(GTK_WIDGET_PTR(imageview));
94 gtk_widget_ref(GTK_WIDGET_PTR(mimeview));
96 messageview->vbox = vbox;
97 messageview->new_window = FALSE;
98 messageview->window = NULL;
99 messageview->headerview = headerview;
100 messageview->textview = textview;
101 messageview->imageview = imageview;
102 messageview->mimeview = mimeview;
107 MessageView *messageview_create_with_new_window(void)
110 MessageView *msgview;
112 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
113 gtk_window_set_title(GTK_WINDOW(window), "Message");
114 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
115 gtk_widget_set_usize(window, prefs_common.msgwin_width,
116 prefs_common.msgwin_height);
118 msgview = messageview_create();
120 gtk_signal_connect(GTK_OBJECT(window), "size_allocate",
121 GTK_SIGNAL_FUNC(messageview_size_allocate_cb),
123 gtk_signal_connect(GTK_OBJECT(window), "destroy",
124 GTK_SIGNAL_FUNC(messageview_destroy_cb), msgview);
125 gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
126 GTK_SIGNAL_FUNC(key_pressed), msgview);
128 gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET_PTR(msgview));
129 gtk_widget_grab_focus(msgview->textview->text);
130 gtk_widget_show_all(window);
132 msgview->new_window = TRUE;
133 msgview->window = window;
135 messageview_init(msgview);
140 void messageview_init(MessageView *messageview)
142 headerview_init(messageview->headerview);
143 textview_init(messageview->textview);
144 imageview_init(messageview->imageview);
145 mimeview_init(messageview->mimeview);
146 //messageview_set_font(messageview);
149 void messageview_show(MessageView *messageview, MsgInfo *msginfo)
156 g_return_if_fail(msginfo != NULL);
160 if ((fp = procmsg_open_message(msginfo)) == NULL) return;
161 mimeinfo = procmime_scan_mime_header(fp);
162 if (!mimeinfo) break;
164 if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
165 rfc2015_is_encrypted(mimeinfo)) {
166 MSG_SET_FLAGS(msginfo->flags, MSG_ENCRYPTED);
168 if (MSG_IS_ENCRYPTED(msginfo->flags) &&
169 !msginfo->plaintext_file &&
170 !msginfo->decryption_failed) {
171 /* This is an encrypted message but it has not yet
172 * been decrypted and there was no unsuccessful
173 * decryption attempt */
174 rfc2015_decrypt_message(msginfo, mimeinfo, fp);
175 if (msginfo->plaintext_file &&
176 !msginfo->decryption_failed) {
184 #else /* !USE_GPGME */
185 if ((fp = procmsg_open_message(msginfo)) == NULL) return;
186 mimeinfo = procmime_scan_mime_header(fp);
187 #endif /* USE_GPGME */
189 if (!mimeinfo) return;
191 file = procmsg_get_message_file_path(msginfo);
192 g_return_if_fail(file != NULL);
194 tmpmsginfo = procheader_parse(file, msginfo->flags, TRUE);
195 headerview_show(messageview->headerview, tmpmsginfo);
196 procmsg_msginfo_free(tmpmsginfo);
198 if (mimeinfo->mime_type != MIME_TEXT) {
199 messageview_change_view_type(messageview, MVIEW_MIME);
200 mimeview_show_message(messageview->mimeview, mimeinfo, file);
202 messageview_change_view_type(messageview, MVIEW_TEXT);
203 textview_show_message(messageview->textview, mimeinfo, file);
204 procmime_mimeinfo_free(mimeinfo);
210 static void messageview_change_view_type(MessageView *messageview,
213 TextView *textview = messageview->textview;
214 ImageView *imageview = messageview->imageview;
215 MimeView *mimeview = messageview->mimeview;
217 if (messageview->type == type) return;
219 if (type == MVIEW_MIME) {
221 (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)),
222 GTK_WIDGET_PTR(textview));
223 gtk_box_pack_start(GTK_BOX(messageview->vbox),
224 GTK_WIDGET_PTR(mimeview), TRUE, TRUE, 0);
225 gtk_container_add(GTK_CONTAINER(mimeview->vbox),
226 GTK_WIDGET_PTR(textview));
227 mimeview->type = MIMEVIEW_TEXT;
228 } else if (type == MVIEW_TEXT) {
230 (GTK_CONTAINER(GTK_WIDGET_PTR(messageview)),
231 GTK_WIDGET_PTR(mimeview));
233 if (mimeview->vbox == GTK_WIDGET_PTR(textview)->parent) {
234 gtk_container_remove(GTK_CONTAINER(mimeview->vbox),
235 GTK_WIDGET_PTR(textview));
237 gtk_container_remove(GTK_CONTAINER(mimeview->vbox),
238 GTK_WIDGET_PTR(imageview));
241 gtk_box_pack_start(GTK_BOX(messageview->vbox),
242 GTK_WIDGET_PTR(textview), TRUE, TRUE, 0);
246 messageview->type = type;
249 void messageview_clear(MessageView *messageview)
251 messageview_change_view_type(messageview, MVIEW_TEXT);
252 headerview_clear(messageview->headerview);
253 textview_clear(messageview->textview);
256 void messageview_destroy(MessageView *messageview)
258 GtkWidget *textview = GTK_WIDGET_PTR(messageview->textview);
259 GtkWidget *imageview = GTK_WIDGET_PTR(messageview->imageview);
260 GtkWidget *mimeview = GTK_WIDGET_PTR(messageview->mimeview);
262 headerview_destroy(messageview->headerview);
263 textview_destroy(messageview->textview);
264 imageview_destroy(messageview->imageview);
265 mimeview_destroy(messageview->mimeview);
269 gtk_widget_unref(textview);
270 gtk_widget_unref(imageview);
271 gtk_widget_unref(mimeview);
274 void messageview_quote_color_set(void)
278 void messageview_set_font(MessageView *messageview)
280 textview_set_font(messageview->textview, NULL);
283 void messageview_copy_clipboard(MessageView *messageview)
285 if (messageview->type == MVIEW_TEXT)
286 gtk_editable_copy_clipboard
287 (GTK_EDITABLE(messageview->textview->text));
290 void messageview_select_all(MessageView *messageview)
292 if (messageview->type == MVIEW_TEXT)
293 gtk_editable_select_region
294 (GTK_EDITABLE(messageview->textview->text), 0, -1);
297 GtkWidget *messageview_get_text_widget(MessageView *messageview)
299 return messageview->textview->text;
302 static void messageview_destroy_cb(GtkWidget *widget, MessageView *messageview)
304 messageview_destroy(messageview);
307 static void messageview_size_allocate_cb(GtkWidget *widget,
308 GtkAllocation *allocation)
310 g_return_if_fail(allocation != NULL);
312 prefs_common.msgwin_width = allocation->width;
313 prefs_common.msgwin_height = allocation->height;
316 static void key_pressed(GtkWidget *widget, GdkEventKey *event,
317 MessageView *messageview)
319 if (event && event->keyval == GDK_Escape && messageview->window)
320 gtk_widget_destroy(messageview->window);