From 6642d01f14a95b02f2f5bd96d59bc7d1dc9bf835 Mon Sep 17 00:00:00 2001 From: Jon Trowbridge Date: Tue, 11 Dec 2001 18:03:44 +0000 Subject: Add ETable magic for our new "Needs Reply" column. (The next few entries 2001-12-11 Jon Trowbridge * message-list.etspec: Add ETable magic for our new "Needs Reply" column. (The next few entries are for bug #90) * message-list.h: Add COL_NEED_REPLY. * message-list.c: Move mail_need_reply_xpm to the end of states_pixmaps. (ml_duplicate_value): Handle COL_NEED_REPLY. (ml_free_value): Handle COL_NEED_REPLY. (ml_initialize_value): Handle COL_NEED_REPLY. (ml_value_is_empty): Handle COL_NEED_REPLY. Added needs_reply_map[] array. (ml_value_to_string): Handle COL_NEED_REPLY. (ml_tree_value_at): Fix magic numbers, undoing my changes from the otehr day. Add handler for COL_NEED_REPLY. (message_list_create_extras): Attach icons for COL_NEED_REPLY. (on_click): Undo my previous changes to display need-reply status in COL_MESSAGE_STATUS. Add handing for COL_NEED_REPLY. * mail.h: Change mail_format_mime_message, mail_format_raw_message and the MailMimeHandlerFn typedef to take GtkHTML and GtkHTMLStream args, as per our changes in mail-format.c. * mail-format.c: Giant refactoring. Remove the assumption throughout that we will always want to render into the GtkHTML object contained in the MailDisplay. Instead, always pass in the GtkHTML and GtkHTMLStream that we want to write to. Also, ignore theme work-arounds if the printing flag is set. (This and what follows fixes bug #82) * mail-display.h: Remove GtkHTMLStream *stream from MailDisplay. We don't need it anymore. * mail-display.c (mail_display_render): Added. Breaks the code that renders the message into the GtkHTML object out of mail_display_redisplay. (mail_display_redisplay): Call mail_display_render. (mail_display_init): Remove reference to ->stream. (mail_display_new): Remove reference to ->stream. * mail-callbacks.c (do_mail_print): Create a new GtkHTML to render our printed version into (via the new function mail_display_render. Set the MailDisplay's printing flag to TRUE before we render, and set it back to FALSE afterwards. (do_mail_fetch_and_print): If the preview pane isn't open when we try to print, fetch the message before printing. (print_msg): Call do_mail_fetch_and_print. (print_preview_msg): Call do_mail_fetch_and_print. * folder-browser-ui.c: Remove "PrintMessage" and "PrintPreviewMessage" from message_pane_enables... these now work when the preview pane is closed. Disable printing if multiple messages are selected. svn path=/trunk/; revision=14981 --- mail/ChangeLog | 56 +++++++++ mail/folder-browser-ui.c | 3 +- mail/mail-callbacks.c | 87 ++++++++++++- mail/mail-display.c | 48 ++++--- mail/mail-display.h | 7 +- mail/mail-format.c | 318 +++++++++++++++++++++++++---------------------- mail/mail.h | 6 +- mail/message-list.c | 96 +++++++------- mail/message-list.etspec | 4 +- mail/message-list.h | 4 +- 10 files changed, 399 insertions(+), 230 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index cbf4776f71..821b560f47 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,59 @@ +2001-12-11 Jon Trowbridge + + * message-list.etspec: Add ETable magic for our new "Needs Reply" + column. (The next few entries are for bug #90) + + * message-list.h: Add COL_NEED_REPLY. + + * message-list.c: Move mail_need_reply_xpm to the end of + states_pixmaps. + (ml_duplicate_value): Handle COL_NEED_REPLY. + (ml_free_value): Handle COL_NEED_REPLY. + (ml_initialize_value): Handle COL_NEED_REPLY. + (ml_value_is_empty): Handle COL_NEED_REPLY. Added + needs_reply_map[] array. + (ml_value_to_string): Handle COL_NEED_REPLY. + (ml_tree_value_at): Fix magic numbers, undoing my changes from the + otehr day. Add handler for COL_NEED_REPLY. + (message_list_create_extras): Attach icons for COL_NEED_REPLY. + (on_click): Undo my previous changes to display need-reply status + in COL_MESSAGE_STATUS. Add handing for COL_NEED_REPLY. + + * mail.h: Change mail_format_mime_message, mail_format_raw_message + and the MailMimeHandlerFn typedef to take GtkHTML and + GtkHTMLStream args, as per our changes in mail-format.c. + + * mail-format.c: Giant refactoring. Remove the assumption + throughout that we will always want to render into the GtkHTML + object contained in the MailDisplay. Instead, always pass in the + GtkHTML and GtkHTMLStream that we want to write to. Also, ignore + theme work-arounds if the printing flag is set. (This and what + follows fixes bug #82) + + * mail-display.h: Remove GtkHTMLStream *stream from MailDisplay. + We don't need it anymore. + + * mail-display.c (mail_display_render): Added. Breaks the code + that renders the message into the GtkHTML object out of + mail_display_redisplay. + (mail_display_redisplay): Call mail_display_render. + (mail_display_init): Remove reference to ->stream. + (mail_display_new): Remove reference to ->stream. + + * mail-callbacks.c (do_mail_print): Create a new GtkHTML to render + our printed version into (via the new function + mail_display_render. Set the MailDisplay's printing flag to TRUE + before we render, and set it back to FALSE afterwards. + (do_mail_fetch_and_print): If the preview pane isn't open when we + try to print, fetch the message before printing. + (print_msg): Call do_mail_fetch_and_print. + (print_preview_msg): Call do_mail_fetch_and_print. + + * folder-browser-ui.c: Remove "PrintMessage" and + "PrintPreviewMessage" from message_pane_enables... these now work + when the preview pane is closed. Disable printing if multiple + messages are selected. + 2001-12-10 Jeffrey Stedfast * mail-ops.c (filter_folder_filter): Don't expunge when we sync diff --git a/mail/folder-browser-ui.c b/mail/folder-browser-ui.c index e2b718c191..0960bd1bc4 100644 --- a/mail/folder-browser-ui.c +++ b/mail/folder-browser-ui.c @@ -520,7 +520,6 @@ static const char *message_pane_enables[] = { /* these only work if there's a message in the message pane * (preview pane). This state is independent of how many are * selected. */ - "PrintMessage", "PrintPreviewMessage", "ViewFullHeaders", "ViewLoadImages", "ViewNormal", "ViewSource", "MessageSearch", "AddSenderToAddressbook", NULL @@ -564,6 +563,8 @@ folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelection "MessageReplyAll", "MessageReplyList", "MessageReplySender", "MessageResend", "MessageForwardInline", "MessageForwardQuoted", "MessageSearch", + "PrintMessage", "PrintPreviewMessage", + "ToolsFilterMailingList", "ToolsFilterRecipient", "ToolsFilterSender", "ToolsFilterSubject", "ToolsVFolderMailingList", "ToolsVFolderRecipient", "ToolsVFolderSender", "ToolsVFolderSubject", diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 494bd2a1fa..8a5429b3e6 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -2334,13 +2334,14 @@ providers_config (BonoboUIComponent *uih, void *user_data, const char *path) static void do_mail_print (FolderBrowser *fb, gboolean preview) { + GtkHTML *html; GnomePrintContext *print_context; GnomePrintMaster *print_master; GnomePrintDialog *dialog; GnomePrinter *printer = NULL; int copies = 1; int collate = FALSE; - + if (!preview) { dialog = GNOME_PRINT_DIALOG (gnome_print_dialog_new (_("Print Message"), GNOME_PRINT_DIALOG_COPIES)); @@ -2372,8 +2373,21 @@ do_mail_print (FolderBrowser *fb, gboolean preview) gnome_print_master_set_paper (print_master, gnome_paper_with_name (_("US-Letter"))); gnome_print_master_set_copies (print_master, copies, collate); print_context = gnome_print_master_get_context (print_master); - gtk_html_print_set_master (fb->mail_display->html, print_master); - gtk_html_print (fb->mail_display->html, print_context); + + html = GTK_HTML (gtk_html_new ()); + + /* Set our 'printing' flag to true and render. This causes us + to ignoring any adjustments we made to accomodate the + user's theme. */ + fb->mail_display->printing = TRUE; + + mail_display_render (fb->mail_display, html); + gtk_html_print_set_master (html, print_master); + gtk_html_print (html, print_context); + + fb->mail_display->printing = FALSE; + + gtk_object_unref (GTK_OBJECT (html)); gnome_print_master_close (print_master); if (preview){ @@ -2394,6 +2408,69 @@ do_mail_print (FolderBrowser *fb, gboolean preview) gtk_object_unref (GTK_OBJECT (print_master)); } +/* This is pretty evil. FolderBrowser's API should be extended to allow these sorts of + things to be done in a more natural way. */ + +/* */ + +struct blarg_this_sucks { + FolderBrowser *fb; + gboolean preview; +}; + +static void +done_message_selected (CamelFolder *folder, char *uid, CamelMimeMessage *msg, void *data) +{ + struct blarg_this_sucks *blarg = data; + FolderBrowser *fb = blarg->fb; + gboolean preview = blarg->preview; + + g_free (blarg); + + mail_display_set_message (fb->mail_display, (CamelMedium *)msg); + + g_free (fb->loaded_uid); + fb->loaded_uid = fb->loading_uid; + fb->loading_uid = NULL; + + do_mail_print (fb, preview); +} + +/* Ack! Most of this is copied from folder-browser.c */ +static void +do_mail_fetch_and_print (FolderBrowser *fb, gboolean preview) +{ + if (! fb->preview_shown) { + /* If the preview pane is closed, we have to do some + extra magic to load the message. */ + struct blarg_this_sucks *blarg = g_new (struct blarg_this_sucks, 1); + + blarg->fb = fb; + blarg->preview = preview; + + fb->loading_id = 0; + + /* if we are loading, then set a pending, but leave the loading, coudl cancel here (?) */ + if (fb->loading_uid) { + g_free (fb->pending_uid); + fb->pending_uid = g_strdup (fb->new_uid); + } else { + if (fb->new_uid) { + fb->loading_uid = g_strdup (fb->new_uid); + mail_get_message (fb->folder, fb->loading_uid, done_message_selected, blarg, mail_thread_new); + } else { + mail_display_set_message (fb->mail_display, NULL); + g_free (blarg); + } + } + + } else { + do_mail_print (fb, preview); + } +} + +/* */ + void print_msg (GtkWidget *button, gpointer user_data) { @@ -2402,7 +2479,7 @@ print_msg (GtkWidget *button, gpointer user_data) if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - do_mail_print (fb, FALSE); + do_mail_fetch_and_print (fb, FALSE); } void @@ -2413,7 +2490,7 @@ print_preview_msg (GtkWidget *button, gpointer user_data) if (FOLDER_BROWSER_IS_DESTROYED (fb)) return; - do_mail_print (fb, TRUE); + do_mail_fetch_and_print (fb, TRUE); } /******************** Begin Subscription Dialog ***************************/ diff --git a/mail/mail-display.c b/mail/mail-display.c index 4746c348aa..437f4bb11e 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -1346,6 +1346,33 @@ clear_data (CamelObject *object, gpointer event_data, gpointer user_data) g_datalist_clear (&data); } +void +mail_display_render (MailDisplay *md, GtkHTML *html) +{ + GtkHTMLStream *stream; + + g_return_if_fail (IS_MAIL_DISPLAY (md)); + g_return_if_fail (GTK_IS_HTML (html)); + + stream = gtk_html_begin (html); + + mail_html_write (html, stream, + "\n" + "\n" + "\n\n\n"); + mail_html_write (html, stream, "\n"); + + if (md->current_message) { + if (md->display_style == MAIL_CONFIG_DISPLAY_SOURCE) + mail_format_raw_message (md->current_message, md, html, stream); + else + mail_format_mime_message (md->current_message, md, html, stream); + } + + mail_html_write (html, stream, "\n"); + gtk_html_end (html, stream, GTK_HTML_STREAM_OK); +} + /** * mail_display_redisplay: * @mail_display: the mail display object @@ -1363,25 +1390,12 @@ mail_display_redisplay (MailDisplay *md, gboolean unscroll) md->redisplay_counter++; /* printf ("md %p redisplay %d\n", md, md->redisplay_counter); */ - md->stream = gtk_html_begin (GTK_HTML (md->html)); if (!unscroll) { /* This is a hack until there's a clean way to do this. */ GTK_HTML (md->html)->engine->newPage = FALSE; } - - mail_html_write (md->html, md->stream, "\n\n\n\n\n"); - mail_html_write (md->html, md->stream, "\n"); - - if (md->current_message) { - if (md->display_style == MAIL_CONFIG_DISPLAY_SOURCE) - mail_format_raw_message (md->current_message, md); - else - mail_format_mime_message (md->current_message, md); - } - - mail_html_write (md->html, md->stream, "\n"); - gtk_html_end (md->html, md->stream, GTK_HTML_STREAM_OK); - md->stream = NULL; + + mail_display_render (md, md->html); } @@ -1459,7 +1473,6 @@ mail_display_init (GtkObject *object) mail_display->scroll = NULL; mail_display->html = NULL; mail_display->redisplay_counter = 0; - mail_display->stream = NULL; mail_display->last_active = NULL; mail_display->idle_id = 0; mail_display->selection = NULL; @@ -1469,6 +1482,8 @@ mail_display_init (GtkObject *object) mail_display->invisible = gtk_invisible_new (); mail_display->display_style = mail_config_get_message_display_style (); + + mail_display->printing = FALSE; } static void @@ -2100,7 +2115,6 @@ mail_display_new (void) mail_display->scroll = E_SCROLL_FRAME (scroll); mail_display->html = GTK_HTML (html); - mail_display->stream = NULL; mail_display->last_active = NULL; mail_display->data = g_new0 (GData *, 1); g_datalist_init (mail_display->data); diff --git a/mail/mail-display.h b/mail/mail-display.h index 3602fe230b..1555405519 100644 --- a/mail/mail-display.h +++ b/mail/mail-display.h @@ -27,11 +27,11 @@ struct _MailDisplay { EScrollFrame *scroll; GtkHTML *html; - GtkHTMLStream *stream; + /* GtkHTMLStream *stream; */ gint redisplay_counter; gpointer last_active; guint idle_id; - + char *charset; char *selection; @@ -44,6 +44,8 @@ struct _MailDisplay { GtkWidget *invisible; MailConfigDisplayStyle display_style; + + guint printing : 1; }; typedef struct { @@ -54,6 +56,7 @@ GtkType mail_display_get_type (void); GtkWidget * mail_display_new (void); void mail_display_queue_redisplay (MailDisplay *mail_display); +void mail_display_render (MailDisplay *mail_display, GtkHTML *html); void mail_display_redisplay (MailDisplay *mail_display, gboolean unscroll); void mail_display_redisplay_when_loaded (MailDisplay *md, gconstpointer key, diff --git a/mail/mail-format.c b/mail/mail-format.c index 051eda7b3f..0578b76ab8 100644 --- a/mail/mail-format.c +++ b/mail/mail-format.c @@ -51,62 +51,64 @@ #include "mail-crypto.h" static char *try_inline_pgp (char *start, CamelMimePart *part, - guint offset, MailDisplay *md); + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static char *try_inline_pgp_sig (char *start, CamelMimePart *part, - guint offset, MailDisplay *md); + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static char *try_uudecoding (char *start, CamelMimePart *part, - guint offset, MailDisplay *md); + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static char *try_inline_binhex (char *start, CamelMimePart *part, - guint offset, MailDisplay *md); + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_text_plain (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_text_plain_flowed (char *text, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_text_enriched (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_text_html (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_image (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_mixed (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_related (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_alternative (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_appledouble (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_multipart_signed (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_message_rfc822 (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_message_external_body (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); static gboolean handle_via_bonobo (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); /* writes the header info for a mime message into an html stream */ -static void write_headers (CamelMimeMessage *message, MailDisplay *md); +static void write_headers (CamelMimeMessage *message, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream); /* dispatch html printing via mimetype */ -static gboolean format_mime_part (CamelMimePart *part, MailDisplay *md); +static gboolean format_mime_part (CamelMimePart *part, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream); static void free_url (gpointer key, gpointer value, gpointer data) @@ -154,7 +156,8 @@ add_url (const char *kind, char *url, gpointer data, MailDisplay *md) * Writes a CamelMimeMessage out into a MailDisplay **/ void -mail_format_mime_message (CamelMimeMessage *mime_message, MailDisplay *md) +mail_format_mime_message (CamelMimeMessage *mime_message, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream) { GHashTable *hash; @@ -186,8 +189,8 @@ mail_format_mime_message (CamelMimeMessage *mime_message, MailDisplay *md) (GDestroyNotify) g_hash_table_destroy); } - write_headers (mime_message, md); - format_mime_part (CAMEL_MIME_PART (mime_message), md); + write_headers (mime_message, md, html, stream); + format_mime_part (CAMEL_MIME_PART (mime_message), md, html, stream); } @@ -199,10 +202,11 @@ mail_format_mime_message (CamelMimeMessage *mime_message, MailDisplay *md) * Writes a CamelMimeMessage source out into a MailDisplay **/ void -mail_format_raw_message (CamelMimeMessage *mime_message, MailDisplay *md) +mail_format_raw_message (CamelMimeMessage *mime_message, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream) { GByteArray *bytes; - char *html; + char *html_str; g_return_if_fail (CAMEL_IS_MIME_MESSAGE (mime_message)); @@ -210,21 +214,21 @@ mail_format_raw_message (CamelMimeMessage *mime_message, MailDisplay *md) TRUE, NULL, NULL)) return; - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "
\n"); bytes = mail_format_get_data_wrapper_text (CAMEL_DATA_WRAPPER (mime_message), md); if (bytes) { g_byte_array_append (bytes, "", 1); - html = e_text_to_html (bytes->data, E_TEXT_TO_HTML_CONVERT_NL | - E_TEXT_TO_HTML_CONVERT_SPACES | E_TEXT_TO_HTML_ESCAPE_8BIT); + html_str = e_text_to_html (bytes->data, E_TEXT_TO_HTML_CONVERT_NL | + E_TEXT_TO_HTML_CONVERT_SPACES | E_TEXT_TO_HTML_ESCAPE_8BIT); g_byte_array_free (bytes, TRUE); - mail_html_write (md->html, md->stream, html); - g_free (html); + mail_html_write (html, stream, html_str); + g_free (html_str); } - mail_html_write (md->html, md->stream, "
"); + mail_html_write (html, stream, ""); } static const char * @@ -613,13 +617,14 @@ mail_part_set_default_displayed_inline (CamelMimePart *part, MailDisplay *md, } static void -attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) +attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream) { - char *htmlinfo, *html, *fmt; + char *htmlinfo, *html_str, *fmt; const char *info; /* Start the table, create the pop-up object. */ - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "" "" "" @@ -629,11 +634,11 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) /* Write the MIME type */ info = gnome_vfs_mime_get_value (mime_type, "description"); - html = e_text_to_html (info ? info : mime_type, 0); - htmlinfo = e_utf8_from_locale_string (html); - g_free (html); + html_str = e_text_to_html (info ? info : mime_type, 0); + htmlinfo = e_utf8_from_locale_string (html_str); + g_free (html_str); fmt = e_utf8_from_locale_string (_("%s attachment")); - gtk_html_stream_printf (md->stream, fmt, htmlinfo); + gtk_html_stream_printf (stream, fmt, htmlinfo); g_free (htmlinfo); g_free (fmt); @@ -641,7 +646,7 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) info = camel_mime_part_get_filename (part); if (info) { htmlinfo = e_text_to_html (info, 0); - gtk_html_stream_printf (md->stream, " (%s)", htmlinfo); + gtk_html_stream_printf (stream, " (%s)", htmlinfo); g_free (htmlinfo); } @@ -649,17 +654,18 @@ attachment_header (CamelMimePart *part, const char *mime_type, MailDisplay *md) info = camel_mime_part_get_description (part); if (info) { htmlinfo = e_text_to_html (info, E_TEXT_TO_HTML_CONVERT_URLS); - gtk_html_stream_printf (md->stream, ", \"%s\"", htmlinfo); + gtk_html_stream_printf (stream, ", \"%s\"", htmlinfo); g_free (htmlinfo); } - mail_html_write (md->html, md->stream, "" + mail_html_write (html, stream, "" "
" "
\n"); } static gboolean -format_mime_part (CamelMimePart *part, MailDisplay *md) +format_mime_part (CamelMimePart *part, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper; char *mime_type; @@ -678,10 +684,10 @@ format_mime_part (CamelMimePart *part, MailDisplay *md) char *mesg; mesg = e_utf8_from_locale_string (_("Could not parse MIME message. Displaying as source.")); - mail_error_printf (md->html, md->stream, "\n%s\n", mesg); + mail_error_printf (html, stream, "\n%s\n", mesg); g_free (mesg); if (mail_content_loaded (wrapper, md, TRUE, NULL, NULL)) - handle_text_plain (part, "text/plain", md); + handle_text_plain (part, "text/plain", md, html, stream); return TRUE; } @@ -713,11 +719,11 @@ format_mime_part (CamelMimePart *part, MailDisplay *md) /* No header for anonymous inline parts. */ if (!((inline_flags & I_ACTUALLY) && is_anonymous (part, mime_type))) - attachment_header (part, mime_type, md); + attachment_header (part, mime_type, md, html, stream); if (handler && handler->builtin && inline_flags & I_DISPLAYED && mail_content_loaded (wrapper, md, TRUE, NULL, NULL)) - output = (*handler->builtin) (part, mime_type, md); + output = (*handler->builtin) (part, mime_type, md, html, stream); else output = TRUE; @@ -789,7 +795,8 @@ write_text_header (const char *name, const char *value, int flags, GtkHTML *html } static void -write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *field_name, int flags) +write_address (MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream, + const CamelInternetAddress *addr, const char *field_name, int flags) { const char *name, *email; gint i; @@ -797,7 +804,7 @@ write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *fi if (addr == NULL || !camel_internet_address_get (addr, 0, NULL, NULL)) return; - write_field_row_begin (field_name, flags, md->html, md->stream); + write_field_row_begin (field_name, flags, html, stream); i = 0; while (camel_internet_address_get (addr, i, &name, &email)) { @@ -823,7 +830,7 @@ write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *fi } if (i) - mail_html_write (md->html, md->stream, ", "); + mail_html_write (html, stream, ", "); if (have_email || have_name) { if (!have_email) { @@ -831,11 +838,11 @@ write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *fi } if (have_name) { - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "%s <%s>", name_disp, addr_url, email_disp); } else { - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "%s", addr_url, email_disp); } @@ -844,7 +851,7 @@ write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *fi char *str; str = e_utf8_from_locale_string (_("Bad Address")); - gtk_html_stream_printf (md->stream, "%s", str); + gtk_html_stream_printf (stream, "%s", str); g_free (str); } @@ -856,7 +863,7 @@ write_address (MailDisplay *md, const CamelInternetAddress *addr, const char *fi i++; } - mail_html_write (md->html, md->stream, ""); + mail_html_write (html, stream, ""); } /* order of these must match write_header code */ @@ -879,33 +886,40 @@ default_header_index(const char *name) /* index is index of header in default_headers array */ static void -write_default_header(CamelMimeMessage *message, MailDisplay *md, int index, int flags) +write_default_header(CamelMimeMessage *message, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream, + int index, int flags) { switch(index) { case 0: - write_address (md, camel_mime_message_get_from (message), _("From"), flags | WRITE_BOLD); + write_address (md, html, stream, + camel_mime_message_get_from (message), _("From"), flags | WRITE_BOLD); break; case 1: - write_address (md, camel_mime_message_get_reply_to (message), _("Reply-To"), flags | WRITE_BOLD); + write_address (md, html, stream, + camel_mime_message_get_reply_to (message), _("Reply-To"), flags | WRITE_BOLD); break; case 2: - write_address(md, camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_TO), + write_address(md, html, stream, + camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_TO), _("To"), flags | WRITE_BOLD); break; case 3: - write_address (md, camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC), + write_address (md, html, stream, + camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC), _("Cc"), flags | WRITE_BOLD); break; case 4: - write_address (md, camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC), + write_address (md, html, stream, + camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC), _("Bcc"), flags | WRITE_BOLD); break; case 5: write_text_header (_("Subject"), camel_mime_message_get_subject (message), - flags | WRITE_BOLD, md->html, md->stream); + flags | WRITE_BOLD, html, stream); break; case 6: - write_date (message, flags | WRITE_BOLD, md->html, md->stream); + write_date (message, flags | WRITE_BOLD, html, stream); break; default: g_assert_not_reached(); @@ -915,17 +929,20 @@ write_default_header(CamelMimeMessage *message, MailDisplay *md, int index, int #define COLOR_IS_LIGHT(r, g, b) ((r + g + b) > (128 * 3)) static void -write_headers (CamelMimeMessage *message, MailDisplay *md) +write_headers (CamelMimeMessage *message, MailDisplay *md, + GtkHTML *html, GtkHTMLStream *stream) { gboolean full = (md->display_style == MAIL_CONFIG_DISPLAY_FULL_HEADERS); char bgcolor[7], fontcolor[7]; GtkStyle *style = NULL; int i; - /* My favorite thing to do...much around with colors so we respect people's stupid themes */ - style = gtk_widget_get_style (GTK_WIDGET (md->html)); - if (style) { - int state = GTK_WIDGET_STATE (GTK_WIDGET (md->html)); + /* My favorite thing to do... muck around with colors so we respect people's stupid themes. + However, we only do this if we are rendering to the screen -- we ignore the theme + when we are printing. */ + style = gtk_widget_get_style (GTK_WIDGET (html)); + if (style && !md->printing) { + int state = GTK_WIDGET_STATE (GTK_WIDGET (html)); gushort r, g, b; r = style->base[state].red / 256; @@ -944,7 +961,7 @@ write_headers (CamelMimeMessage *message, MailDisplay *md) sprintf (bgcolor, "%.2X%.2X%.2X", r, g, b); - r = style->text[state].red; + r = style->text[state].red / 256; g = style->text[state].green / 256; b = style->text[state].blue / 256; @@ -954,7 +971,7 @@ write_headers (CamelMimeMessage *message, MailDisplay *md) strcpy (fontcolor, "000000"); } - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "" "" @@ -980,18 +997,18 @@ write_headers (CamelMimeMessage *message, MailDisplay *md) i = default_header_index(header->name); if (i == -1) { value = header_decode_string(header->value, charset); - write_text_header(header->name, value, WRITE_NOCOLUMNS, md->html, md->stream); + write_text_header(header->name, value, WRITE_NOCOLUMNS, html, stream); g_free(value); } else - write_default_header(message, md, i, WRITE_NOCOLUMNS); + write_default_header(message, md, html, stream, i, WRITE_NOCOLUMNS); header = header->next; } } else { for (i=0;ihtml, md->stream, + mail_html_write (html, stream, "
" "
" "
" "
\n"); @@ -1099,9 +1116,9 @@ mail_format_get_data_wrapper_text (CamelDataWrapper *wrapper, MailDisplay *mail_ } static void -write_hr (MailDisplay *md) +write_hr (GtkHTML *html, GtkHTMLStream *stream) { - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "
" "
\n"); } @@ -1113,7 +1130,7 @@ write_hr (MailDisplay *md) struct { char *start; char * (*handler) (char *start, CamelMimePart *part, - guint offset, MailDisplay *md); + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); } text_specials[] = { { "-----BEGIN PGP MESSAGE-----\n", try_inline_pgp }, { "-----BEGIN PGP SIGNED MESSAGE-----\n", try_inline_pgp_sig }, @@ -1123,23 +1140,23 @@ struct { #define NSPECIALS (sizeof (text_specials) / sizeof (*text_specials)) static void -write_one_text_plain_chunk (const char *text, int len, MailDisplay *md) +write_one_text_plain_chunk (const char *text, int len, GtkHTML *html, GtkHTMLStream *stream) { char *buf; - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "
\n"); buf = g_strndup (text, len); - mail_text_write (md->html, md->stream, buf); + mail_text_write (html, stream, buf); g_free (buf); - mail_html_write (md->html, md->stream, "
\n"); + mail_html_write (html, stream, "\n"); } static gboolean handle_text_plain (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); @@ -1162,7 +1179,7 @@ handle_text_plain (CamelMimePart *part, const char *mime_type, type = camel_mime_part_get_content_type (part); format = header_content_type_param (type, "format"); if (format && !g_strcasecmp (format, "flowed")) - return handle_text_plain_flowed (text, md); + return handle_text_plain_flowed (text, md, html, stream); /* Only look for binhex and stuff if this is real text/plain. * (and not, say, application/mac-binhex40 that mail-identify @@ -1184,9 +1201,9 @@ handle_text_plain (CamelMimePart *part, const char *mime_type, /* Deal with special case */ if (start != p) - write_one_text_plain_chunk (p, start - p, md); + write_one_text_plain_chunk (p, start - p, html, stream); - p = text_specials[i].handler (start, part, start - text, md); + p = text_specials[i].handler (start, part, start - text, md, html, stream); if (p == start) { /* Oops. That failed. Output this line normally and * skip over it. @@ -1198,13 +1215,13 @@ handle_text_plain (CamelMimePart *part, const char *mime_type, break; } p++; - write_one_text_plain_chunk (start, p - start, md); + write_one_text_plain_chunk (start, p - start, html, stream); } else if (p) - write_hr (md); + write_hr (html, stream); } /* Finish up (or do the whole thing if there were no specials). */ if (p) - write_one_text_plain_chunk (p, strlen (p), md); + write_one_text_plain_chunk (p, strlen (p), html, stream); g_free (text); @@ -1212,13 +1229,13 @@ handle_text_plain (CamelMimePart *part, const char *mime_type, } static gboolean -handle_text_plain_flowed (char *buf, MailDisplay *md) +handle_text_plain_flowed (char *buf, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { char *text, *line, *eol, *p; int prevquoting = 0, quoting, len, br_pending = 0; guint32 citation_color = mail_config_get_citation_color (); - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "\n\n" "
\n\n"); @@ -1233,20 +1250,20 @@ handle_text_plain_flowed (char *buf, MailDisplay *md) quoting++; if (quoting != prevquoting) { if (prevquoting == 0) { - gtk_html_stream_printf (md->stream, "", citation_color); + gtk_html_stream_printf (stream, "", citation_color); if (br_pending) br_pending--; } while (quoting > prevquoting) { - mail_html_write (md->html, md->stream, "
"); + mail_html_write (html, stream, "
"); prevquoting++; } while (quoting < prevquoting) { - mail_html_write (md->html, md->stream, "
"); + mail_html_write (html, stream, "
"); prevquoting--; } if (quoting == 0) { - mail_html_write (md->html, md->stream, "
\n"); + mail_html_write (html, stream, "
\n"); if (br_pending) br_pending--; } @@ -1261,7 +1278,7 @@ handle_text_plain_flowed (char *buf, MailDisplay *md) } while (br_pending) { - mail_html_write (md->html, md->stream, "
\n"); + mail_html_write (html, stream, "
\n"); br_pending--; } @@ -1269,7 +1286,7 @@ handle_text_plain_flowed (char *buf, MailDisplay *md) text = e_text_to_html (p, E_TEXT_TO_HTML_CONVERT_SPACES | E_TEXT_TO_HTML_CONVERT_URLS); if (text && *text) - mail_html_write (md->html, md->stream, text); + mail_html_write (html, stream, text); g_free (text); if (p[len - 1] != ' ' || !strcmp (p, "-- ")) @@ -1280,7 +1297,7 @@ handle_text_plain_flowed (char *buf, MailDisplay *md) } g_free (buf); - mail_html_write (md->html, md->stream, "
\n
\n"); + mail_html_write (html, stream, "\n\n"); return TRUE; } @@ -1320,7 +1337,7 @@ destroy_part (CamelObject *root, gpointer event_data, gpointer user_data) static char * try_inline_pgp (char *start, CamelMimePart *mime_part, - guint offset, MailDisplay *md) + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelMimePart *part; CamelMultipart *multipart; @@ -1358,15 +1375,15 @@ try_inline_pgp (char *start, CamelMimePart *mime_part, camel_object_hook_event (CAMEL_OBJECT (md->current_message), "finalize", destroy_part, part); - write_hr (md); - format_mime_part (part, md); + write_hr (html, stream); + format_mime_part (part, md, html, stream); return end; } static char * try_inline_pgp_sig (char *start, CamelMimePart *mime_part, - guint offset, MailDisplay *md) + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelMimePart *part; CamelMultipart *multipart; @@ -1419,15 +1436,15 @@ try_inline_pgp_sig (char *start, CamelMimePart *mime_part, camel_object_hook_event (CAMEL_OBJECT (md->current_message), "finalize", destroy_part, part); - write_hr (md); - format_mime_part (part, md); + write_hr (html, stream); + format_mime_part (part, md, html, stream); return sig_end; } static char * try_uudecoding (char *start, CamelMimePart *mime_part, - guint offset, MailDisplay *md) + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { int mode, len, state = 0; char *filename, *estart, *p, *out, uulen = 0; @@ -1466,15 +1483,15 @@ try_uudecoding (char *start, CamelMimePart *mime_part, camel_object_hook_event (CAMEL_OBJECT (md->current_message), "finalize", destroy_part, part); - write_hr (md); - format_mime_part (part, md); + write_hr (html, stream); + format_mime_part (part, md, html, stream); return p + 4; } static char * try_inline_binhex (char *start, CamelMimePart *mime_part, - guint offset, MailDisplay *md) + guint offset, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { char *p; CamelMimePart *part; @@ -1496,8 +1513,8 @@ try_inline_binhex (char *start, CamelMimePart *mime_part, camel_object_hook_event (CAMEL_OBJECT (md->current_message), "finalize", destroy_part, part); - write_hr (md); - format_mime_part (part, md); + write_hr (html, stream); + format_mime_part (part, md, html, stream); return p; } @@ -1517,7 +1534,7 @@ g_string_append_len (GString *string, const char *str, int len) /* text/enriched (RFC 1896) or text/richtext (included in RFC 1341) */ static gboolean handle_text_enriched (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { static GHashTable *translations = NULL; CamelDataWrapper *wrapper = @@ -1567,11 +1584,11 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, if (!g_strcasecmp (mime_type, "text/richtext")) { enriched = FALSE; - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "\n\n"); } else { enriched = TRUE; - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "\n\n"); } @@ -1665,7 +1682,7 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, g_string_free (string, TRUE); xed = g_strdup_printf ("x-evolution-data:%p", part); - gtk_html_stream_printf (md->stream, "", xed); + gtk_html_stream_printf (stream, "", xed); add_url ("data_urls", xed, ba, md); return TRUE; @@ -1673,31 +1690,31 @@ handle_text_enriched (CamelMimePart *part, const char *mime_type, static gboolean handle_text_html (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { const char *location; - mail_html_write (md->html, md->stream, "\n\n"); + mail_html_write (html, stream, "\n\n"); /* FIXME: deal with relative URLs */ location = get_location (part, md); if (!location) location = get_cid (part, md); - gtk_html_stream_printf (md->stream, "", location); + gtk_html_stream_printf (stream, "", location); return TRUE; } static gboolean -handle_image (CamelMimePart *part, const char *mime_type, MailDisplay *md) +handle_image (CamelMimePart *part, const char *mime_type, MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { - gtk_html_stream_printf (md->stream, "", + gtk_html_stream_printf (stream, "", get_cid (part, md)); return TRUE; } static gboolean handle_multipart_mixed (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); @@ -1711,11 +1728,11 @@ handle_multipart_mixed (CamelMimePart *part, const char *mime_type, nparts = camel_multipart_get_number (mp); for (i = 0; i < nparts; i++) { if (i != 0 && output) - write_hr (md); + write_hr (html, stream); part = camel_multipart_get_part (mp, i); - output = format_mime_part (part, md); + output = format_mime_part (part, md, html, stream); } return TRUE; @@ -1723,7 +1740,7 @@ handle_multipart_mixed (CamelMimePart *part, const char *mime_type, static gboolean handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper; CamelMimePart *mime_part; @@ -1735,7 +1752,7 @@ handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, /* Currently we only handle RFC2015-style PGP encryption. */ if (!camel_pgp_mime_is_rfc2015_encrypted (part)) - return handle_multipart_mixed (part, mime_type, md); + return handle_multipart_mixed (part, mime_type, md, html, stream); camel_exception_init (&ex); mime_part = mail_crypto_pgp_mime_part_decrypt (part, &ex); @@ -1745,7 +1762,7 @@ handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, error = e_utf8_from_locale_string (camel_exception_get_description (&ex)); - mail_error_printf (md->html, md->stream, "\n%s\n", error); + mail_error_printf (html, stream, "\n%s\n", error); g_free (error); camel_exception_clear (&ex); @@ -1757,13 +1774,13 @@ handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, camel_object_unref (CAMEL_OBJECT (mime_part)); /* and continue on our merry way... */ - return format_mime_part (part, md); + return format_mime_part (part, md, html, stream); } } static gboolean handle_multipart_signed (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelMimePart *subpart; CamelDataWrapper *wrapper; @@ -1783,11 +1800,11 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, nparts = camel_multipart_get_number (mp); for (i = 0; i < nparts - 1; i++) { if (i != 0 && output) - write_hr (md); + write_hr (html, stream); subpart = camel_multipart_get_part (mp, i); - output = format_mime_part (subpart, md); + output = format_mime_part (subpart, md, html, stream); } subpart = camel_multipart_get_part (mp, i); @@ -1799,7 +1816,7 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, /* Write out the click-for-info object */ url = g_strdup_printf ("signature:%p/%lu", subpart, (unsigned long)time (NULL)); - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "
" "" @@ -1809,11 +1826,11 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, "
" "
", url); add_url ("part_urls", url, subpart, md); - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, U_("This message is digitally signed. " "Click the lock icon for more information.")); - mail_html_write (md->html, md->stream, + mail_html_write (html, stream, "
" "
\n"); } else { @@ -1836,7 +1853,7 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, message = U_("Evolution does not recognize this type of signed message."); if (good) { - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "" "" "
%s

", @@ -1844,7 +1861,7 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, U_("This message is digitally signed and " "has been found to be authentic.")); } else { - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "" "" "
%s

", @@ -1854,13 +1871,12 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, } if (message) { - gtk_html_stream_printf (md->stream, "", - good ? "" : "color=red"); - mail_text_write (md->html, md->stream, message); - mail_html_write (md->html, md->stream, ""); + gtk_html_stream_printf (stream, "", good ? "" : "color=red"); + mail_text_write (html, stream, message); + mail_html_write (html, stream, ""); } - mail_html_write (md->html, md->stream, "
"); + mail_html_write (html, stream, "
"); camel_exception_clear (&ex); camel_cipher_validity_free (valid); } @@ -1871,7 +1887,7 @@ handle_multipart_signed (CamelMimePart *part, const char *mime_type, /* As seen in RFC 2387! */ static gboolean handle_multipart_related (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); @@ -1915,7 +1931,7 @@ handle_multipart_related (CamelMimePart *part, const char *mime_type, if (!display_part) { /* Oops. Hrmph. */ - return handle_multipart_mixed (part, mime_type, md); + return handle_multipart_mixed (part, mime_type, md, html, stream); } /* Record the Content-ID/Content-Location of any non-displayed parts. */ @@ -1929,7 +1945,7 @@ handle_multipart_related (CamelMimePart *part, const char *mime_type, } /* Now, display the displayed part. */ - return format_mime_part (display_part, md); + return format_mime_part (display_part, md, html, stream); } /* RFC 2046 says "display the last part that you are able to display". */ @@ -1960,7 +1976,7 @@ find_preferred_alternative (CamelMultipart *multipart, gboolean want_plain) static gboolean handle_multipart_alternative (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); @@ -1973,15 +1989,15 @@ handle_multipart_alternative (CamelMimePart *part, const char *mime_type, mime_part = find_preferred_alternative (multipart, FALSE); if (mime_part) - return format_mime_part (mime_part, md); + return format_mime_part (mime_part, md, html, stream); else - return handle_multipart_mixed (part, mime_type, md); + return handle_multipart_mixed (part, mime_type, md, html, stream); } /* RFC 1740 */ static gboolean handle_multipart_appledouble (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); @@ -1996,28 +2012,28 @@ handle_multipart_appledouble (CamelMimePart *part, const char *mime_type, * likely it's application/octet-stream though. */ part = camel_multipart_get_part (multipart, 1); - return format_mime_part (part, md); + return format_mime_part (part, md, html, stream); } static gboolean handle_message_rfc822 (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelDataWrapper *wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (wrapper), FALSE); - mail_html_write (md->html, md->stream, "
"); - mail_format_mime_message (CAMEL_MIME_MESSAGE (wrapper), md); - mail_html_write (md->html, md->stream, "
"); + mail_html_write (html, stream, "
"); + mail_format_mime_message (CAMEL_MIME_MESSAGE (wrapper), md, html, stream); + mail_html_write (html, stream, "
"); return TRUE; } static gboolean handle_message_external_body (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { CamelContentType *type; const char *access_type; @@ -2141,9 +2157,9 @@ handle_message_external_body (CamelMimePart *part, const char *mime_type, static gboolean handle_via_bonobo (CamelMimePart *part, const char *mime_type, - MailDisplay *md) + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream) { - gtk_html_stream_printf (md->stream, + gtk_html_stream_printf (stream, "", get_cid (part, md), mime_type); return TRUE; diff --git a/mail/mail.h b/mail/mail.h index 97713013c0..f1a3162a66 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -40,9 +40,9 @@ GByteArray *mail_format_get_data_wrapper_text (CamelDataWrapper *data, MailDisplay *mail_display); void mail_format_mime_message (CamelMimeMessage *mime_message, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); void mail_format_raw_message (CamelMimeMessage *mime_message, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); gboolean mail_content_loaded (CamelDataWrapper *wrapper, MailDisplay *display, gboolean redisplay, @@ -51,7 +51,7 @@ gboolean mail_content_loaded (CamelDataWrapper *wrapper, typedef gboolean (*MailMimeHandlerFn) (CamelMimePart *part, const char *mime_type, - MailDisplay *md); + MailDisplay *md, GtkHTML *html, GtkHTMLStream *stream); typedef struct { gboolean generic; OAF_ServerInfo *component; diff --git a/mail/message-list.c b/mail/message-list.c index 02e6d234c9..24fac02cbe 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -138,7 +138,6 @@ static struct { { mail_new_xpm, NULL }, { mail_read_xpm, NULL }, { mail_replied_xpm, NULL }, - { mail_need_reply_xpm, NULL }, /* FIXME: Replace these with pixmaps for multiple_read and multiple_unread */ { mail_new_xpm, NULL }, { mail_read_xpm, NULL }, @@ -152,6 +151,7 @@ static struct { { score_high_xpm, NULL }, { score_higher_xpm, NULL }, { score_highest_xpm, NULL }, + { mail_need_reply_xpm, NULL }, { NULL, NULL } }; @@ -540,6 +540,7 @@ ml_duplicate_value (ETreeModel *etm, int col, const void *value, void *data) { switch (col){ case COL_MESSAGE_STATUS: + case COL_NEED_REPLY: case COL_FLAGGED: case COL_SCORE: case COL_ATTACHMENT: @@ -566,6 +567,7 @@ ml_free_value (ETreeModel *etm, int col, void *value, void *data) { switch (col){ case COL_MESSAGE_STATUS: + case COL_NEED_REPLY: case COL_FLAGGED: case COL_SCORE: case COL_ATTACHMENT: @@ -591,6 +593,7 @@ ml_initialize_value (ETreeModel *etm, int col, void *data) { switch (col){ case COL_MESSAGE_STATUS: + case COL_NEED_REPLY: case COL_FLAGGED: case COL_SCORE: case COL_ATTACHMENT: @@ -617,6 +620,7 @@ ml_value_is_empty (ETreeModel *etm, int col, const void *value, void *data) { switch (col){ case COL_MESSAGE_STATUS: + case COL_NEED_REPLY: case COL_FLAGGED: case COL_SCORE: case COL_ATTACHMENT: @@ -645,6 +649,11 @@ static const char *status_map[] = { N_("Multiple Messages"), }; +static const char *needs_reply_map[] = { + "", + N_("Needs Reply"), +}; + static const char *score_map[] = { N_("Lowest"), N_("Lower"), @@ -667,6 +676,10 @@ ml_value_to_string (ETreeModel *etm, int col, const void *value, void *data) return g_strdup(""); return g_strdup(_(status_map[i])); + case COL_NEED_REPLY: + i = (unsigned int)value; + return g_strdup (_(needs_reply_map[i])); + case COL_SCORE: i = (unsigned int)value + 3; if (i > 6) @@ -794,14 +807,12 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) child = e_tree_model_node_get_first_child(etm, path); if (child && !e_tree_node_is_expanded(message_list->tree, path)) { if (subtree_unread(message_list, child)) - return (void *)4; + return (void *)3; else - return (void *)5; + return (void *)4; } - if (msg_info->flags & CAMEL_MESSAGE_NEEDS_REPLY) - return GINT_TO_POINTER (3); - else if (msg_info->flags & CAMEL_MESSAGE_ANSWERED) + if (msg_info->flags & CAMEL_MESSAGE_ANSWERED) return GINT_TO_POINTER (2); else if (msg_info->flags & CAMEL_MESSAGE_SEEN) return GINT_TO_POINTER (1); @@ -809,6 +820,8 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) return GINT_TO_POINTER (0); break; } + case COL_NEED_REPLY: + return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_NEEDS_REPLY) != 0); case COL_FLAGGED: return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_FLAGGED) != 0); case COL_SCORE: { @@ -966,31 +979,36 @@ message_list_create_extras (void) extras = e_table_extras_new(); e_table_extras_add_pixbuf(extras, "status", states_pixmaps [0].pixbuf); - e_table_extras_add_pixbuf(extras, "score", states_pixmaps [14].pixbuf); - e_table_extras_add_pixbuf(extras, "attachment", states_pixmaps [7].pixbuf); - e_table_extras_add_pixbuf(extras, "flagged", states_pixmaps [8].pixbuf); + e_table_extras_add_pixbuf(extras, "score", states_pixmaps [13].pixbuf); + e_table_extras_add_pixbuf(extras, "attachment", states_pixmaps [6].pixbuf); + e_table_extras_add_pixbuf(extras, "flagged", states_pixmaps [7].pixbuf); + e_table_extras_add_pixbuf(extras, "needsreply", states_pixmaps [15].pixbuf); e_table_extras_add_compare(extras, "address_compare", address_compare); e_table_extras_add_compare(extras, "subject_compare", subject_compare); - for (i = 0; i < 6; i++) + for (i = 0; i < 5; i++) images [i] = states_pixmaps [i].pixbuf; - e_table_extras_add_cell(extras, "render_message_status", e_cell_toggle_new (0, 6, images)); + e_table_extras_add_cell(extras, "render_message_status", e_cell_toggle_new (0, 5, images)); for (i = 0; i < 2; i++) - images [i] = states_pixmaps [i + 6].pixbuf; + images [i] = states_pixmaps [i + 5].pixbuf; e_table_extras_add_cell(extras, "render_attachment", e_cell_toggle_new (0, 2, images)); - images [1] = states_pixmaps [8].pixbuf; + images [1] = states_pixmaps [7].pixbuf; e_table_extras_add_cell(extras, "render_flagged", e_cell_toggle_new (0, 2, images)); + images [1] = states_pixmaps [15].pixbuf; + e_table_extras_add_cell(extras, "render_needs_reply", e_cell_toggle_new (0, 2, images)); + for (i = 0; i < 7; i++) - images[i] = states_pixmaps [i + 8].pixbuf; + images[i] = states_pixmaps [i + 7].pixbuf; e_table_extras_add_cell(extras, "render_score", e_cell_toggle_new (0, 7, images)); - + + /* date cell */ cell = e_cell_date_new (NULL, GTK_JUSTIFY_LEFT); gtk_object_set (GTK_OBJECT (cell), @@ -2028,51 +2046,31 @@ on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, Mess int flag; CamelMessageInfo *info; - if (col == COL_MESSAGE_STATUS) { - guint32 msg_flags; - - info = get_message_info (list, path); - if (info == NULL) { - return FALSE; - } - - msg_flags = camel_folder_get_message_flags (list->folder, camel_message_info_uid (info)); - - if (msg_flags & CAMEL_MESSAGE_NEEDS_REPLY) { - flag = 0; - } else if (msg_flags & CAMEL_MESSAGE_SEEN) { - flag = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_NEEDS_REPLY; - } else { - flag = CAMEL_MESSAGE_SEEN; - } - - camel_folder_set_message_flags (list->folder, camel_message_info_uid (info), - CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_NEEDS_REPLY, flag); - - if (flag & CAMEL_MESSAGE_SEEN && list->seen_id) { - gtk_timeout_remove (list->seen_id); - list->seen_id = 0; - } - - return TRUE; - } - - if (col == COL_FLAGGED) + if (col == COL_MESSAGE_STATUS) + flag = CAMEL_MESSAGE_SEEN; + else if (col == COL_FLAGGED) flag = CAMEL_MESSAGE_FLAGGED; + else if (col == COL_NEED_REPLY) + flag = CAMEL_MESSAGE_NEEDS_REPLY; else return FALSE; - + info = get_message_info (list, path); if (info == NULL) { return FALSE; } - + /* If a message was marked as deleted and the user flags it as important, undelete it */ - if (col == COL_FLAGGED && (info->flags & CAMEL_MESSAGE_DELETED)) + if ((col == COL_FLAGGED || col == COL_NEED_REPLY) && (info->flags & CAMEL_MESSAGE_DELETED)) flag |= CAMEL_MESSAGE_DELETED; camel_folder_set_message_flags (list->folder, camel_message_info_uid (info), flag, ~info->flags); - + + if (flag == CAMEL_MESSAGE_SEEN && list->seen_id) { + gtk_timeout_remove (list->seen_id); + list->seen_id = 0; + } + return TRUE; } diff --git a/mail/message-list.etspec b/mail/message-list.etspec index a8bf34056a..9733eae9d6 100644 --- a/mail/message-list.etspec +++ b/mail/message-list.etspec @@ -1,5 +1,6 @@ + @@ -9,8 +10,9 @@ + - + diff --git a/mail/message-list.h b/mail/message-list.h index 2846c04ec4..cfed0c7e67 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -26,6 +26,7 @@ enum { COL_RECEIVED, COL_TO, COL_SIZE, + COL_NEED_REPLY, COL_LAST, @@ -36,7 +37,8 @@ enum { }; #define MESSAGE_LIST_COLUMN_IS_ACTIVE(col) (col == COL_MESSAGE_STATUS || \ - col == COL_FLAGGED) + col == COL_FLAGGED || \ + col == COL_NEED_REPLY) #define ML_HIDE_NONE_START (0) #define ML_HIDE_NONE_END (2147483647) -- cgit v1.2.3