2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2002 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"
37 #include "summaryview.h"
39 #include "imageview.h"
42 #include "procheader.h"
44 #include "prefs_common.h"
50 #include "alertpanel.h"
54 #include "stock_pixmap.h"
56 static void messageview_change_view_type(MessageView
*messageview
,
58 static void messageview_destroy_cb (GtkWidget
*widget
,
59 MessageView
*messageview
);
60 static void messageview_size_allocate_cb(GtkWidget
*widget
,
61 GtkAllocation
*allocation
);
62 static void key_pressed (GtkWidget
*widget
,
64 MessageView
*messageview
);
65 static void focus_in (GtkWidget
*widget
,
69 static void return_receipt_show (NoticeView
*noticeview
,
71 static void return_receipt_send_clicked (NoticeView
*noticeview
,
74 static PrefsAccount
*select_account_from_list
77 static void messageview_menubar_cb (gpointer data
,
81 static void messageview_close_cb (gpointer data
,
84 static GList
*msgview_list
= NULL
;
86 MessageView
*messageview_create(MainWindow
*mainwin
)
88 MessageView
*messageview
;
90 HeaderView
*headerview
;
94 NoticeView
*noticeview
;
96 debug_print("Creating message view...\n");
97 messageview
= g_new0(MessageView
, 1);
99 messageview
->type
= MVIEW_TEXT
;
101 headerview
= headerview_create();
103 noticeview
= noticeview_create(mainwin
);
105 textview
= textview_create();
106 textview
->messageview
= messageview
;
108 imageview
= imageview_create();
109 imageview
->messageview
= messageview
;
111 mimeview
= mimeview_create();
112 mimeview
->textview
= textview_create();
113 mimeview
->textview
->messageview
= messageview
;
114 mimeview
->imageview
= imageview
;
115 mimeview
->messageview
= messageview
;
117 vbox
= gtk_vbox_new(FALSE
, 0);
118 gtk_box_pack_start(GTK_BOX(vbox
), GTK_WIDGET_PTR(headerview
),
120 gtk_box_pack_start(GTK_BOX(vbox
), GTK_WIDGET_PTR(noticeview
),
122 gtk_box_pack_start(GTK_BOX(vbox
), GTK_WIDGET_PTR(textview
),
125 /* to remove without destroyed */
126 gtk_widget_ref(GTK_WIDGET_PTR(textview
));
127 gtk_widget_ref(GTK_WIDGET_PTR(imageview
));
128 gtk_widget_ref(GTK_WIDGET_PTR(mimeview
));
129 gtk_widget_ref(GTK_WIDGET_PTR(mimeview
->textview
));
131 messageview
->vbox
= vbox
;
132 messageview
->new_window
= FALSE
;
133 messageview
->window
= NULL
;
134 messageview
->headerview
= headerview
;
135 messageview
->textview
= textview
;
136 messageview
->imageview
= imageview
;
137 messageview
->mimeview
= mimeview
;
138 messageview
->noticeview
= noticeview
;
139 messageview
->mainwin
= mainwin
;
144 static GtkItemFactoryEntry messageview_entries
[] =
146 {N_("/_File"), NULL
, NULL
, 0, "<Branch>"},
147 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
148 {N_("/_File/_Close"), "<control>W", messageview_close_cb
, 0, NULL
},
150 {N_("/_Message"), NULL
, NULL
, 0, "<Branch>"},
151 {N_("/_Message/_Reply"), "<control>R", messageview_menubar_cb
, COMPOSE_REPLY
, NULL
},
152 {N_("/_Message/Repl_y to"), NULL
, NULL
, 0, "<Branch>"},
153 {N_("/_Message/Repl_y to/_all"), "<shift><control>R", messageview_menubar_cb
, COMPOSE_REPLY_TO_ALL
, NULL
},
154 {N_("/_Message/Repl_y to/_sender"), NULL
, messageview_menubar_cb
, COMPOSE_REPLY_TO_SENDER
, NULL
},
155 {N_("/_Message/Repl_y to/mailing _list"),
156 "<control>L", messageview_menubar_cb
, COMPOSE_REPLY_TO_LIST
, NULL
},
157 {N_("/_Message/Follow-up and reply to"),NULL
, messageview_menubar_cb
, COMPOSE_FOLLOWUP_AND_REPLY_TO
, NULL
},
158 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
159 {N_("/_Message/_Delete"), "<control>D", delete_msgview_cb
, 0, NULL
},
161 {N_("/_Help"), NULL
, NULL
, 0, "<Branch>"},
162 {N_("/_Help/_About"), NULL
, about_show
, 0, NULL
}
166 GList
*messageview_get_msgview_list(void)
171 void messageview_add_toolbar(MessageView
*msgview
, GtkWidget
*window
)
173 GtkWidget
*handlebox
;
176 guint n_menu_entries
;
178 vbox
= gtk_vbox_new(FALSE
, 0);
179 gtk_widget_show(vbox
);
180 gtk_container_add(GTK_CONTAINER(window
), vbox
);
182 n_menu_entries
= sizeof(messageview_entries
) / sizeof(messageview_entries
[0]);
183 menubar
= menubar_create(window
, messageview_entries
,
184 n_menu_entries
, "<MessageView>", msgview
);
185 gtk_box_pack_start(GTK_BOX(vbox
), menubar
, FALSE
, TRUE
, 0);
187 handlebox
= gtk_handle_box_new();
188 gtk_box_pack_start(GTK_BOX(vbox
), handlebox
, FALSE
, FALSE
, 0);
189 msgview
->toolbar
= toolbar_create(TOOLBAR_MSGVIEW
, handlebox
,
191 msgview
->handlebox
= handlebox
;
192 msgview
->menubar
= menubar
;
194 gtk_container_add(GTK_CONTAINER(vbox
),
195 GTK_WIDGET_PTR(msgview
));
198 MessageView
*messageview_create_with_new_window(MainWindow
*mainwin
)
201 MessageView
*msgview
;
203 window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
204 gtk_window_set_title(GTK_WINDOW(window
), _("Sylpheed - Message View"));
205 gtk_window_set_wmclass(GTK_WINDOW(window
), "message_view", "Sylpheed");
206 gtk_window_set_policy(GTK_WINDOW(window
), TRUE
, TRUE
, FALSE
);
207 gtk_widget_set_usize(window
, prefs_common
.msgwin_width
,
208 prefs_common
.msgwin_height
);
210 msgview
= messageview_create(mainwin
);
212 gtk_signal_connect(GTK_OBJECT(window
), "size_allocate",
213 GTK_SIGNAL_FUNC(messageview_size_allocate_cb
),
215 gtk_signal_connect(GTK_OBJECT(window
), "destroy",
216 GTK_SIGNAL_FUNC(messageview_destroy_cb
), msgview
);
217 gtk_signal_connect(GTK_OBJECT(window
), "key_press_event",
218 GTK_SIGNAL_FUNC(key_pressed
), msgview
);
219 gtk_signal_connect(GTK_OBJECT(window
), "focus_in_event",
220 GTK_SIGNAL_FUNC(focus_in
), msgview
);
222 messageview_add_toolbar(msgview
, window
);
224 gtk_widget_grab_focus(msgview
->textview
->text
);
225 gtk_widget_show_all(window
);
227 msgview
->new_window
= TRUE
;
228 msgview
->window
= window
;
229 msgview
->visible
= TRUE
;
231 toolbar_set_style(msgview
->toolbar
->toolbar
, msgview
->handlebox
,
232 prefs_common
.toolbar_style
);
233 messageview_init(msgview
);
234 msgview_list
= g_list_append(msgview_list
, msgview
);
239 void messageview_init(MessageView
*messageview
)
241 headerview_init(messageview
->headerview
);
242 textview_init(messageview
->textview
);
243 imageview_init(messageview
->imageview
);
244 mimeview_init(messageview
->mimeview
);
245 /*messageview_set_font(messageview);*/
247 noticeview_hide(messageview
->noticeview
);
250 static void notification_convert_header(gchar
*dest
, gint len
,
256 g_return_if_fail(src_
!= NULL
);
257 g_return_if_fail(dest
!= NULL
);
261 Xstrndup_a(src
, src_
, len
, return);
265 if (is_ascii_str(src
)) {
266 strncpy2(dest
, src
, len
);
267 dest
[len
- 1] = '\0';
270 conv_encode_header(dest
, len
, src
, header_len
);
273 static gint
disposition_notification_queue(PrefsAccount
* account
,
274 gchar
* to
, const gchar
*file
)
282 debug_print("queueing message...\n");
283 g_return_val_if_fail(account
!= NULL
, -1);
285 tmp
= g_strdup_printf("%s%cqueue.%d", g_get_tmp_dir(),
286 G_DIR_SEPARATOR
, (gint
)file
);
287 if ((fp
= fopen(tmp
, "wb")) == NULL
) {
288 FILE_OP_ERROR(tmp
, "fopen");
292 if ((src_fp
= fopen(file
, "rb")) == NULL
) {
293 FILE_OP_ERROR(file
, "fopen");
299 if (change_file_mode_rw(fp
, tmp
) < 0) {
300 FILE_OP_ERROR(tmp
, "chmod");
301 g_warning("can't change file mode\n");
304 /* queueing variables */
305 fprintf(fp
, "AF:\n");
306 fprintf(fp
, "NF:0\n");
307 fprintf(fp
, "PS:10\n");
308 fprintf(fp
, "SRH:1\n");
309 fprintf(fp
, "SFN:\n");
310 fprintf(fp
, "DSR:\n");
311 fprintf(fp
, "MID:\n");
312 fprintf(fp
, "CFG:\n");
313 fprintf(fp
, "PT:0\n");
314 fprintf(fp
, "S:%s\n", account
->address
);
315 fprintf(fp
, "RQ:\n");
316 if (account
->smtp_server
)
317 fprintf(fp
, "SSV:%s\n", account
->smtp_server
);
319 fprintf(fp
, "SSV:\n");
320 if (account
->nntp_server
)
321 fprintf(fp
, "NSV:%s\n", account
->nntp_server
);
323 fprintf(fp
, "NSV:\n");
324 fprintf(fp
, "SSH:\n");
325 fprintf(fp
, "R:<%s>", to
);
329 while (fgets(buf
, sizeof(buf
), src_fp
) != NULL
) {
330 if (fputs(buf
, fp
) == EOF
) {
331 FILE_OP_ERROR(tmp
, "fputs");
341 if (fclose(fp
) == EOF
) {
342 FILE_OP_ERROR(tmp
, "fclose");
348 queue
= folder_get_default_queue();
349 if ((num
= folder_item_add_msg(queue
, tmp
, TRUE
)) < 0) {
350 g_warning("can't queue the message\n");
357 folder_update_item(queue
, TRUE
);
362 static gint
disposition_notification_send(MsgInfo
*msginfo
)
365 gchar tmp
[MAXPATHLEN
+ 1];
369 PrefsAccount
*account
;
373 if ((!msginfo
->returnreceiptto
) &&
374 (!msginfo
->dispositionnotificationto
))
377 /* RFC2298: Test for Return-Path */
378 if (msginfo
->dispositionnotificationto
)
379 to
= msginfo
->dispositionnotificationto
;
381 to
= msginfo
->returnreceiptto
;
383 ok
= get_header_from_msginfo(msginfo
, buf
, sizeof(buf
),
386 gchar
*to_addr
= g_strdup(to
);
387 extract_address(to_addr
);
388 extract_address(buf
);
389 ok
= strcmp(to_addr
, buf
);
392 strncpy(buf
, _("<No Return-Path found>"),
399 message
= g_strdup_printf(
400 _("The notification address to which the "
401 "return receipt is to be sent\n"
402 "does not correspond to the return path:\n"
403 "Notification address: %s\n"
405 "It is advised to not to send the return "
406 "receipt."), to
, buf
);
407 val
= alertpanel(_("Warning"), message
, _("Send"),
408 _("+Don't Send"), NULL
);
409 if (val
!= G_ALERTDEFAULT
)
413 ac_list
= account_find_all_from_address(NULL
, msginfo
->to
);
414 ac_list
= account_find_all_from_address(ac_list
, msginfo
->cc
);
416 if (ac_list
== NULL
) {
417 alertpanel_error(_("This message is asking for a return "
418 "receipt notification\n"
419 "but according to its 'To:' and 'CC:' "
420 "headers it was not\nofficially addressed "
422 "Receipt notification cancelled."));
426 if (g_list_length(ac_list
) > 1)
427 account
= select_account_from_list(ac_list
);
429 account
= (PrefsAccount
*) ac_list
->data
;
430 g_list_free(ac_list
);
435 /* write to temporary file */
436 g_snprintf(tmp
, sizeof(tmp
), "%s%ctmpmsg%d",
437 get_rc_dir(), G_DIR_SEPARATOR
, (gint
)msginfo
);
439 if ((fp
= fopen(tmp
, "wb")) == NULL
) {
440 FILE_OP_ERROR(tmp
, "fopen");
444 /* chmod for security */
445 if (change_file_mode_rw(fp
, tmp
) < 0) {
446 FILE_OP_ERROR(tmp
, "chmod");
447 g_warning("can't change file mode\n");
451 get_rfc822_date(buf
, sizeof(buf
));
452 fprintf(fp
, "Date: %s\n", buf
);
455 if (account
->name
&& *account
->name
) {
456 notification_convert_header
457 (buf
, sizeof(buf
), account
->name
,
459 fprintf(fp
, "From: %s <%s>\n", buf
, account
->address
);
461 fprintf(fp
, "From: %s\n", account
->address
);
463 fprintf(fp
, "To: %s\n", to
);
466 notification_convert_header(buf
, sizeof(buf
), msginfo
->subject
,
467 strlen("Subject: "));
468 fprintf(fp
, "Subject: Disposition notification: %s\n", buf
);
470 if (fclose(fp
) == EOF
) {
471 FILE_OP_ERROR(tmp
, "fclose");
476 to_list
= address_list_append(NULL
, to
);
477 ok
= send_message(tmp
, account
, to_list
);
480 if (prefs_common
.queue_msg
) {
485 _("Error occurred while sending the notification.\n"
486 "Put this notification into queue folder?"),
487 _("OK"), _("Cancel"), NULL
);
488 if (G_ALERTDEFAULT
== val
) {
489 ok
= disposition_notification_queue(account
, to
, tmp
);
491 alertpanel_error(_("Can't queue the notification."));
494 alertpanel_error(_("Error occurred while sending the notification."));
497 if (unlink(tmp
) < 0) FILE_OP_ERROR(tmp
, "unlink");
502 void messageview_show(MessageView
*messageview
, MsgInfo
*msginfo
,
503 gboolean all_headers
)
510 g_return_if_fail(msginfo
!= NULL
);
511 messageview
->msginfo
= msginfo
;
514 if ((fp
= procmsg_open_message_decrypted(msginfo
, &mimeinfo
)) == NULL
)
516 #else /* !USE_GPGME */
517 if ((fp
= procmsg_open_message(msginfo
)) == NULL
) return;
518 mimeinfo
= procmime_scan_mime_header(fp
);
519 #endif /* USE_GPGME */
521 if (!mimeinfo
) return;
523 file
= procmsg_get_message_file_path(msginfo
);
525 g_warning("can't get message file path.\n");
526 procmime_mimeinfo_free_all(mimeinfo
);
530 tmpmsginfo
= procheader_parse_file(file
, msginfo
->flags
, TRUE
, TRUE
);
532 headerview_show(messageview
->headerview
, tmpmsginfo
);
533 procmsg_msginfo_free(tmpmsginfo
);
535 messageview
->all_headers
= all_headers
;
536 textview_set_all_headers(messageview
->textview
, all_headers
);
537 textview_set_all_headers(messageview
->mimeview
->textview
, all_headers
);
539 if (mimeinfo
->mime_type
!= MIME_TEXT
&&
540 mimeinfo
->mime_type
!= MIME_TEXT_HTML
) {
541 messageview_change_view_type(messageview
, MVIEW_MIME
);
542 mimeview_show_message(messageview
->mimeview
, mimeinfo
, file
);
544 messageview_change_view_type(messageview
, MVIEW_TEXT
);
545 textview_show_message(messageview
->textview
, mimeinfo
, file
);
546 procmime_mimeinfo_free_all(mimeinfo
);
549 if (MSG_IS_RETRCPT_PENDING(msginfo
->flags
))
550 return_receipt_show(messageview
->noticeview
, msginfo
);
552 noticeview_hide(messageview
->noticeview
);
557 static void messageview_change_view_type(MessageView
*messageview
,
560 TextView
*textview
= messageview
->textview
;
561 MimeView
*mimeview
= messageview
->mimeview
;
563 if (messageview
->type
== type
) return;
565 if (type
== MVIEW_MIME
) {
566 gtkut_container_remove
567 (GTK_CONTAINER(GTK_WIDGET_PTR(messageview
)),
568 GTK_WIDGET_PTR(textview
));
569 gtk_box_pack_start(GTK_BOX(messageview
->vbox
),
570 GTK_WIDGET_PTR(mimeview
), TRUE
, TRUE
, 0);
571 gtk_container_add(GTK_CONTAINER(mimeview
->vbox
),
572 GTK_WIDGET_PTR(textview
));
573 } else if (type
== MVIEW_TEXT
) {
574 gtkut_container_remove
575 (GTK_CONTAINER(GTK_WIDGET_PTR(messageview
)),
576 GTK_WIDGET_PTR(mimeview
));
578 if (mimeview
->vbox
== GTK_WIDGET_PTR(textview
)->parent
)
579 gtkut_container_remove(GTK_CONTAINER(mimeview
->vbox
),
580 GTK_WIDGET_PTR(textview
));
582 gtk_box_pack_start(GTK_BOX(messageview
->vbox
),
583 GTK_WIDGET_PTR(textview
), TRUE
, TRUE
, 0);
587 messageview
->type
= type
;
590 void messageview_reflect_prefs_pixmap_theme(void)
593 MessageView
*msgview
;
595 for (cur
= msgview_list
; cur
!= NULL
; cur
= cur
->next
) {
596 msgview
= (MessageView
*)cur
->data
;
597 toolbar_update(TOOLBAR_MSGVIEW
, msgview
);
601 void messageview_clear(MessageView
*messageview
)
603 messageview_change_view_type(messageview
, MVIEW_TEXT
);
604 headerview_clear(messageview
->headerview
);
605 textview_clear(messageview
->textview
);
606 imageview_clear(messageview
->imageview
);
607 noticeview_hide(messageview
->noticeview
);
610 void messageview_destroy(MessageView
*messageview
)
612 GtkWidget
*textview
= GTK_WIDGET_PTR(messageview
->textview
);
613 GtkWidget
*imageview
= GTK_WIDGET_PTR(messageview
->imageview
);
614 GtkWidget
*mimeview
= GTK_WIDGET_PTR(messageview
->mimeview
);
616 debug_print("destroy messageview\n");
617 headerview_destroy(messageview
->headerview
);
618 textview_destroy(messageview
->textview
);
619 imageview_destroy(messageview
->imageview
);
620 mimeview_destroy(messageview
->mimeview
);
621 noticeview_destroy(messageview
->noticeview
);
623 toolbar_clear_list(TOOLBAR_MSGVIEW
);
624 if (messageview
->toolbar
) {
625 toolbar_destroy(messageview
->toolbar
);
626 g_free(messageview
->toolbar
);
629 msgview_list
= g_list_remove(msgview_list
, messageview
);
633 gtk_widget_unref(textview
);
634 gtk_widget_unref(imageview
);
635 gtk_widget_unref(mimeview
);
638 void messageview_quote_color_set(void)
642 void messageview_set_font(MessageView
*messageview
)
644 textview_set_font(messageview
->textview
, NULL
);
647 TextView
*messageview_get_current_textview(MessageView
*messageview
)
649 TextView
*text
= NULL
;
651 if (messageview
->type
== MVIEW_TEXT
)
652 text
= messageview
->textview
;
653 else if (messageview
->type
== MVIEW_MIME
) {
654 if (gtk_notebook_get_current_page
655 (GTK_NOTEBOOK(messageview
->mimeview
->notebook
)) == 0)
656 text
= messageview
->textview
;
657 else if (messageview
->mimeview
->type
== MIMEVIEW_TEXT
)
658 text
= messageview
->mimeview
->textview
;
664 void messageview_copy_clipboard(MessageView
*messageview
)
668 text
= messageview_get_current_textview(messageview
);
670 gtk_editable_copy_clipboard(GTK_EDITABLE(text
->text
));
673 void messageview_select_all(MessageView
*messageview
)
677 text
= messageview_get_current_textview(messageview
);
679 gtk_editable_select_region(GTK_EDITABLE(text
->text
), 0, -1);
682 void messageview_set_position(MessageView
*messageview
, gint pos
)
684 textview_set_position(messageview
->textview
, pos
);
687 gboolean
messageview_search_string(MessageView
*messageview
, const gchar
*str
,
690 return textview_search_string(messageview
->textview
, str
, case_sens
);
694 gboolean
messageview_search_string_backward(MessageView
*messageview
,
698 return textview_search_string_backward(messageview
->textview
,
703 gboolean
messageview_is_visible(MessageView
*messageview
)
705 return messageview
->visible
;
708 static void messageview_destroy_cb(GtkWidget
*widget
, MessageView
*messageview
)
710 messageview_destroy(messageview
);
713 static void messageview_size_allocate_cb(GtkWidget
*widget
,
714 GtkAllocation
*allocation
)
716 g_return_if_fail(allocation
!= NULL
);
718 prefs_common
.msgwin_width
= allocation
->width
;
719 prefs_common
.msgwin_height
= allocation
->height
;
722 static void key_pressed(GtkWidget
*widget
, GdkEventKey
*event
,
723 MessageView
*messageview
)
725 if (event
&& event
->keyval
== GDK_Escape
&& messageview
->window
)
726 gtk_widget_destroy(messageview
->window
);
729 static void focus_in(GtkWidget
*widget
, GdkEventFocus
*event
,
732 MessageView
*msgview
= (MessageView
*)data
;
734 summary_select_by_msgnum(msgview
->mainwin
->summaryview
,
735 msgview
->msginfo
->msgnum
);
738 void messageview_toggle_view_real(MessageView
*messageview
)
740 MainWindow
*mainwin
= messageview
->mainwin
;
741 union CompositeWin
*cwin
= &mainwin
->win
;
742 GtkWidget
*vpaned
= NULL
;
743 GtkWidget
*container
= NULL
;
744 GtkItemFactory
*ifactory
= gtk_item_factory_from_widget(mainwin
->menubar
);
746 switch (mainwin
->type
) {
748 vpaned
= cwin
->sep_none
.vpaned
;
749 container
= cwin
->sep_none
.hpaned
;
751 case SEPARATE_FOLDER
:
752 vpaned
= cwin
->sep_folder
.vpaned
;
753 container
= mainwin
->vbox_body
;
755 case SEPARATE_MESSAGE
:
760 if (vpaned
->parent
!= NULL
) {
761 gtk_widget_ref(vpaned
);
762 gtkut_container_remove(GTK_CONTAINER(container
), vpaned
);
763 gtk_widget_reparent(GTK_WIDGET_PTR(messageview
), container
);
764 menu_set_sensitive(ifactory
, "/View/Expand Summary View", FALSE
);
765 gtk_widget_grab_focus(GTK_WIDGET(messageview
->textview
->text
));
767 gtk_widget_reparent(GTK_WIDGET_PTR(messageview
), vpaned
);
768 gtk_container_add(GTK_CONTAINER(container
), vpaned
);
769 gtk_widget_unref(vpaned
);
770 menu_set_sensitive(ifactory
, "/View/Expand Summary View", TRUE
);
771 gtk_widget_grab_focus(GTK_WIDGET(mainwin
->summaryview
->ctree
));
775 static void return_receipt_show(NoticeView
*noticeview
, MsgInfo
*msginfo
)
777 noticeview_set_text(noticeview
, _("This messages asks for a return receipt."));
778 noticeview_set_button_text(noticeview
, _("Send receipt"));
779 noticeview_set_button_press_callback(noticeview
,
780 GTK_SIGNAL_FUNC(return_receipt_send_clicked
),
782 noticeview_show(noticeview
);
785 static void return_receipt_send_clicked(NoticeView
*noticeview
, MsgInfo
*msginfo
)
790 file
= procmsg_get_message_file_path(msginfo
);
792 g_warning("can't get message file path.\n");
796 tmpmsginfo
= procheader_parse_file(file
, msginfo
->flags
, TRUE
, TRUE
);
797 tmpmsginfo
->folder
= msginfo
->folder
;
798 tmpmsginfo
->msgnum
= msginfo
->msgnum
;
800 if (disposition_notification_send(tmpmsginfo
) >= 0) {
801 procmsg_msginfo_unset_flags(msginfo
, MSG_RETRCPT_PENDING
, 0);
802 noticeview_hide(noticeview
);
805 procmsg_msginfo_free(tmpmsginfo
);
809 static void select_account_cb(GtkWidget
*w
, gpointer data
)
811 *(gint
*)data
= GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(w
)));
814 static PrefsAccount
*select_account_from_list(GList
*ac_list
)
820 g_return_val_if_fail(ac_list
!= NULL
, NULL
);
821 g_return_val_if_fail(ac_list
->data
!= NULL
, NULL
);
823 optmenu
= gtk_option_menu_new();
824 menu
= gtkut_account_menu_new(ac_list
, select_account_cb
, &account_id
);
827 gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu
), menu
);
828 gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu
), 0);
829 account_id
= ((PrefsAccount
*) ac_list
->data
)->account_id
;
830 if (alertpanel_with_widget(
831 _("Return Receipt Notification"),
832 _("The message was sent to several of your "
834 "Please choose which account do you want to "
835 "use for sending the receipt notification:"),
836 _("Send Notification"), _("+Cancel"), NULL
,
837 optmenu
) != G_ALERTDEFAULT
)
839 return account_find_from_id(account_id
);
842 static void messageview_menubar_cb(gpointer data
, guint action
, GtkWidget
*widget
)
844 MessageView
*msgview
= (MessageView
*)data
;
845 MainWindow
*mainwin
= (MainWindow
*)msgview
->mainwin
;
847 g_return_if_fail(mainwin
!= NULL
);
848 reply_cb(mainwin
, action
, widget
);
851 static void messageview_close_cb(gpointer data
, guint action
, GtkWidget
*widget
)
853 MessageView
*messageview
= (MessageView
*)data
;
855 gtk_widget_destroy(messageview
->window
);