diff options
Diffstat (limited to 'mail/mail-display.c')
-rw-r--r-- | mail/mail-display.c | 461 |
1 files changed, 149 insertions, 312 deletions
diff --git a/mail/mail-display.c b/mail/mail-display.c index 81510d0800..e979ae8878 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -46,8 +46,6 @@ #include "e-searching-tokenizer.h" #include "folder-browser-factory.h" #include "mail-stream-gtkhtml.h" -#include "folder-browser-window.h" -#include "folder-browser.h" #include "mail-display.h" #include "mail-config.h" #include "mail-ops.h" @@ -73,18 +71,7 @@ struct _PixbufLoader { }; static GHashTable *thumbnail_cache = NULL; -/* Drag & Drop types */ -#define TEXT_URI_LIST_TYPE "text/uri-list" - -enum DndTargetType { - DND_TARGET_TYPE_TEXT_URI_LIST, -}; - -static GtkTargetEntry drag_types[] = { - { TEXT_URI_LIST_TYPE, 0, DND_TARGET_TYPE_TEXT_URI_LIST }, -}; - -static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); +static gchar *save_pathname = NULL; /* preserves last directory in save dialog */ /*----------------------------------------------------------------------* * Callbacks @@ -139,7 +126,7 @@ make_safe_filename (const char *prefix,CamelMimePart *part) { const char *name = NULL; char *safe, *p; - + if (part) { name = camel_mime_part_get_filename (part); } @@ -148,7 +135,7 @@ make_safe_filename (const char *prefix,CamelMimePart *part) /* This is a filename. Translators take note. */ name = _("attachment"); } - + p = strrchr (name, '/'); if (p) safe = g_strdup_printf ("%s%s", prefix, p); @@ -167,18 +154,24 @@ save_data_cb (GtkWidget *widget, gpointer user_data) { GtkFileSelection *file_select = (GtkFileSelection *) gtk_widget_get_ancestor (widget, GTK_TYPE_FILE_SELECTION); - char *dir; - + gchar *p; + /* uh, this doesn't really feel right, but i dont know what to do better */ gtk_widget_hide (GTK_WIDGET (file_select)); - write_data_to_file (user_data, gtk_file_selection_get_filename (file_select), + write_data_to_file (user_data, + gtk_file_selection_get_filename (file_select), FALSE); - + /* preserve the pathname */ - dir = g_dirname (gtk_file_selection_get_filename (file_select)); - mail_config_set_last_filesel_dir (dir); - g_free (dir); - + g_free(save_pathname); + save_pathname = g_strdup(gtk_file_selection_get_filename(file_select)); + if((p = strrchr(save_pathname, '/')) != NULL) + p[0] = 0; + else { + g_free(save_pathname); + save_pathname = NULL; + } + gtk_widget_destroy (GTK_WIDGET (file_select)); } @@ -219,46 +212,17 @@ mail_display_jump_to_anchor (MailDisplay *md, const char *url) } static void -mail_display_digest_clicked (MailDisplay *md, const char *url) -{ - FolderBrowser *fb, *parent_fb; - CamelFolder *digest; - CamelStore *store; - GtkWidget *window; - - parent_fb = (FolderBrowser *) gtk_widget_get_ancestor (GTK_WIDGET (md), FOLDER_BROWSER_TYPE); - - store = camel_digest_store_new (url); - - digest = camel_digest_folder_new (store, md->current_message); - camel_object_unref (CAMEL_OBJECT (store)); - if (!digest) - return; - - fb = (FolderBrowser *) folder_browser_new (parent_fb->shell, NULL); - folder_browser_set_message_preview (fb, TRUE); - folder_browser_set_folder (fb, digest, url); - camel_object_unref (CAMEL_OBJECT (digest)); - gtk_widget_show (GTK_WIDGET (fb)); - - window = folder_browser_window_new (fb); - gtk_widget_show (window); -} - -static void on_link_clicked (GtkHTML *html, const char *url, MailDisplay *md) { - if (!g_strncasecmp (url, "news:", 5) || !g_strncasecmp (url, "nntp:", 5)) { + if (!g_strncasecmp (url, "news:", 5) || + !g_strncasecmp (url, "nntp:", 5)) g_warning ("Can't handle news URLs yet."); - } else if (!g_strncasecmp (url, "mailto:", 7)) { + else if (!g_strncasecmp (url, "mailto:", 7)) send_to_url (url); - } else if (!g_strncasecmp (url, "digest:", 7)) { - mail_display_digest_clicked (md, url); - } else if (*url == '#') { + else if (*url == '#') mail_display_jump_to_anchor (md, url); - } else { + else gnome_url_show (url); - } } static void @@ -270,7 +234,10 @@ save_part (CamelMimePart *part) g_return_if_fail (part != NULL); camel_object_ref (CAMEL_OBJECT (part)); - filename = make_safe_filename (mail_config_get_last_filesel_dir (), part); + if (save_pathname == NULL) + save_pathname = g_strdup (g_get_home_dir ()); + + filename = make_safe_filename (save_pathname, part); file_select = GTK_FILE_SELECTION ( gtk_file_selection_new (_("Save Attachment"))); @@ -296,7 +263,7 @@ static void save_cb (GtkWidget *widget, gpointer user_data) { CamelMimePart *part = gtk_object_get_data (GTK_OBJECT (user_data), "CamelMimePart"); - + save_part (part); } @@ -328,7 +295,8 @@ launch_cb (GtkWidget *widget, gpointer user_data) tmpdir = e_mkdtemp ("evolution.XXXXXX"); if (!tmpdir) { - char *msg = g_strdup_printf (_("Could not create temporary directory: %s"), + char *msg = g_strdup_printf (_("Could not create temporary " + "directory: %s"), g_strerror (errno)); gnome_error_dialog (msg); g_free (msg); @@ -338,21 +306,16 @@ launch_cb (GtkWidget *widget, gpointer user_data) filename = make_safe_filename (tmpdir, part); if (!write_data_to_file (part, filename, TRUE)) { - char *msg = g_strdup_printf (_("Could not create temporary file '%s': %s"), - filename, g_strerror (errno)); - gnome_error_dialog (msg); g_free (filename); - g_free (msg); return; } command = g_strdup_printf ("%s %s%s &", app->command, app->expects_uris == GNOME_VFS_MIME_APPLICATION_ARGUMENT_TYPE_URIS ? "file://" : "", filename); - g_free (filename); - system (command); g_free (command); + g_free (filename); } static void @@ -385,16 +348,16 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, EScrollFrame *user_data) { EPopupMenu *menu; EPopupMenu save_item = { N_("Save to Disk..."), NULL, - GTK_SIGNAL_FUNC (save_cb), NULL, NULL, 0 }; + GTK_SIGNAL_FUNC (save_cb), NULL, 0 }; EPopupMenu view_item = { N_("View Inline"), NULL, - GTK_SIGNAL_FUNC (inline_cb), NULL, NULL, 2 }; + GTK_SIGNAL_FUNC (inline_cb), NULL, 2 }; EPopupMenu open_item = { N_("Open in %s..."), NULL, - GTK_SIGNAL_FUNC (launch_cb), NULL, NULL, 1 }; + GTK_SIGNAL_FUNC (launch_cb), NULL, 1 }; MailDisplay *md; CamelMimePart *part; MailMimeHandler *handler; int mask = 0, i, nitems; - + #ifdef USE_OLD_DISPLAY_STYLE if (event->button != 3) { gtk_propagate_event (GTK_WIDGET (user_data), @@ -402,27 +365,27 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, EScrollFrame *user_data) return TRUE; } #endif - + if (event->button != 1 && event->button != 3) { gtk_propagate_event (GTK_WIDGET (user_data), (GdkEvent *)event); return TRUE; } - + /* Stop the signal, since we don't want the button's class method to mess up our popup. */ gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "button_press_event"); - + part = gtk_object_get_data (GTK_OBJECT (widget), "CamelMimePart"); handler = mail_lookup_handler (gtk_object_get_data (GTK_OBJECT (widget), "mime_type")); - + if (handler && handler->applications) nitems = g_list_length (handler->applications) + 2; else nitems = 3; menu = g_new0 (EPopupMenu, nitems + 1); - + /* Save item */ memcpy (&menu[0], &save_item, sizeof (menu[0])); menu[0].name = _(menu[0].name); @@ -621,7 +584,7 @@ pixbuf_gen_idle (struct _PixbufLoader *pbl) pixbuf = gdk_pixbuf_new_from_file (EVOLUTION_ICONSDIR "/pgp-signature-nokey.png"); } else pixbuf = gdk_pixbuf_loader_get_pixbuf (pbl->loader); - + width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); @@ -798,7 +761,7 @@ save_url (MailDisplay *md, const char *url) g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL); data = camel_medium_get_content_object ((CamelMedium *)part); - if (!mail_content_loaded (data, md, TRUE, NULL, NULL, NULL)) { + if (!mail_content_loaded (data, md, TRUE, NULL, NULL)) { return NULL; } @@ -811,75 +774,6 @@ save_url (MailDisplay *md, const char *url) return NULL; } -static void -drag_data_get_cb (GtkWidget *widget, - GdkDragContext *drag_context, - GtkSelectionData *selection_data, - guint info, - guint time, - gpointer user_data) -{ - CamelMimePart *part = user_data; - const char *filename, *tmpdir; - char *uri_list; - - switch (info) { - case DND_TARGET_TYPE_TEXT_URI_LIST: - /* Kludge around Nautilus requesting the same data many times */ - uri_list = gtk_object_get_data (GTK_OBJECT (widget), "uri-list"); - if (uri_list) { - gtk_selection_data_set (selection_data, selection_data->target, 8, - uri_list, strlen (uri_list)); - return; - } - - tmpdir = e_mkdtemp ("drag-n-drop-XXXXXX"); - if (!tmpdir) { - char *msg; - - msg = g_strdup_printf (_("Could not create temporary directory: %s"), - g_strerror (errno)); - gnome_error_dialog (msg); - g_free (msg); - } - - filename = camel_mime_part_get_filename (part); - if (!filename) - filename = _("Unknown"); - - uri_list = g_strdup_printf ("file://%s/%s", tmpdir, filename); - - if (!write_data_to_file (part, uri_list + 7, TRUE)) { - g_free (uri_list); - return; - } - - gtk_selection_data_set (selection_data, selection_data->target, 8, - uri_list, strlen (uri_list)); - - gtk_object_set_data_full (GTK_OBJECT (widget), "uri-list", uri_list, g_free); - - break; - default: - g_assert_not_reached (); - } -} - -static void -drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *drag_context, - gpointer user_data) -{ - char *uri_list; - - uri_list = gtk_object_get_data (GTK_OBJECT (widget), "uri-list"); - if (uri_list) { - gtk_object_set_data (GTK_OBJECT (widget), "uri-list", NULL); - unlink (uri_list + 7); - g_free (uri_list); - } -} - static gboolean do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb, CamelMimePart *part, MailDisplay *md) @@ -887,11 +781,11 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb, GtkWidget *button, *mainbox, *hbox, *arrow, *popup; MailMimeHandler *handler; struct _PixbufLoader *pbl; - + pbl = g_new0 (struct _PixbufLoader, 1); if (g_strncasecmp (eb->type, "image/", 6) == 0) { CamelDataWrapper *content; - + content = camel_medium_get_content_object (CAMEL_MEDIUM (part)); if (!camel_data_wrapper_is_offline (content)) { pbl->mstream = camel_stream_mem_new (); @@ -906,63 +800,54 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb, pbl->eb = eb; pbl->destroy_id = gtk_signal_connect (GTK_OBJECT (eb), "destroy", embeddable_destroy_cb, pbl); - + g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc)pixbuf_gen_idle, pbl, NULL); - + mainbox = gtk_hbox_new (FALSE, 0); - + button = gtk_button_new (); gtk_object_set_data (GTK_OBJECT (button), "MailDisplay", md); - + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (button_press), part); - - handler = mail_lookup_handler (eb->type); - if (handler && handler->builtin) - gtk_widget_set_sensitive (button, TRUE); - else - gtk_widget_set_sensitive (button, FALSE); - - /* Drag & Drop */ - gtk_drag_source_set (button, GDK_BUTTON1_MASK, - drag_types, num_drag_types, - GDK_ACTION_MOVE); - gtk_signal_connect (GTK_OBJECT (button), "drag-data-get", - drag_data_get_cb, part); - gtk_signal_connect (GTK_OBJECT (button), "drag-data-delete", - drag_data_delete_cb, part); - + hbox = gtk_hbox_new (FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (hbox), 2); - - if (handler && mail_part_is_displayed_inline (part, md)) + + if (mail_part_is_displayed_inline (part, md)) arrow = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_DOWN); else arrow = gnome_stock_new_with_icon (GNOME_STOCK_PIXMAP_FORWARD); gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), pbl->pixmap, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (button), hbox); - + popup = gtk_button_new (); gtk_container_add (GTK_CONTAINER (popup), gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_ETCHED_IN)); - + gtk_object_set_data (GTK_OBJECT (popup), "MailDisplay", md); gtk_object_set_data (GTK_OBJECT (popup), "CamelMimePart", part); gtk_object_set_data_full (GTK_OBJECT (popup), "mime_type", g_strdup (eb->type), (GDestroyNotify)g_free); - + gtk_signal_connect (GTK_OBJECT (popup), "button_press_event", GTK_SIGNAL_FUNC (pixmap_press), md->scroll); - + gtk_box_pack_start (GTK_BOX (mainbox), button, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (mainbox), popup, TRUE, TRUE, 0); gtk_widget_show_all (mainbox); - + + handler = mail_lookup_handler (eb->type); + if (handler && handler->builtin) + gtk_widget_set_sensitive (button, TRUE); + else + gtk_widget_set_sensitive (button, FALSE); + gtk_container_add (GTK_CONTAINER (eb), mainbox); - + return TRUE; } @@ -1073,7 +958,7 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) urls = g_datalist_get_data (md->data, "part_urls"); if (!urls) return FALSE; - + if (!strncmp (eb->classid, "popup:", 6) && eb->type) { part = g_hash_table_lookup (urls, eb->classid + 6); if (!CAMEL_IS_MIME_PART (part)) @@ -1101,11 +986,9 @@ load_http (MailDisplay *md, gpointer data) GHashTable *urls; GnomeVFSHandle *handle; GnomeVFSFileSize read; - GnomeVFSResult result; GByteArray *ba; char buf[8192]; - size_t total = 0; - + urls = g_datalist_get_data (md->data, "data_urls"); ba = g_hash_table_lookup (urls, url); g_return_if_fail (ba != NULL); @@ -1118,15 +1001,10 @@ load_http (MailDisplay *md, gpointer data) return; } - while ((result = gnome_vfs_read (handle, buf, sizeof (buf), &read)) == GNOME_VFS_OK) { - printf ("%s: read %d bytes\n", url, read); + while (gnome_vfs_read (handle, buf, sizeof (buf), &read) == GNOME_VFS_OK) g_byte_array_append (ba, buf, read); - total += read; - } gnome_vfs_close (handle); - - printf ("gnome_vfs_read result is %d; read %d total bytes\n", result, total); - + #if 0 if (!ba->len) printf ("no data in %s\n", url); @@ -1173,11 +1051,8 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, g_return_if_fail (CAMEL_IS_MEDIUM (medium)); - if (md->related) - g_hash_table_remove(md->related, medium); - data = camel_medium_get_content_object (medium); - if (!mail_content_loaded (data, md, FALSE, url, html, handle)) + if (!mail_content_loaded (data, md, FALSE, url, handle)) return; content_type = camel_data_wrapper_get_mime_type_field (data); @@ -1200,7 +1075,7 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, gtk_html_end (html, handle, GTK_HTML_STREAM_OK); return; } - + urls = g_datalist_get_data (md->data, "data_urls"); g_return_if_fail (urls != NULL); @@ -1216,23 +1091,23 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, gtk_html_end (html, handle, GTK_HTML_STREAM_OK); return; } - + /* See if it's something we can load. */ if (strncmp (url, "http:", 5) == 0) { if (mail_config_get_http_mode () == MAIL_CONFIG_HTTP_ALWAYS || g_datalist_get_data (md->data, "load_images")) { ba = g_byte_array_new (); g_hash_table_insert (urls, g_strdup (url), ba); - mail_display_stream_write_when_loaded (md, ba, url, load_http, html, handle, + mail_display_stream_write_when_loaded (md, ba, url, load_http, handle, g_strdup (url)); } else if (mail_config_get_http_mode () == MAIL_CONFIG_HTTP_SOMETIMES && !g_datalist_get_data (md->data, "checking_from")) { const CamelInternetAddress *from = camel_mime_message_get_from (md->current_message); const char *name, *addr; - + g_datalist_set_data (md->data, "checking_from", GINT_TO_POINTER (1)); - + /* Make sure we aren't deal w/ some sort of a pathological message w/o a From: header */ if (from != NULL && camel_internet_address_get (from, 0, &name, &addr)) e_book_query_address_locally (addr, ebook_callback, md); @@ -1246,11 +1121,10 @@ struct _load_content_msg { struct _mail_msg msg; MailDisplay *display; - GtkHTML *html; GtkHTMLStream *handle; - int redisplay_counter; - char *url; + gint redisplay_counter; + gchar *url; CamelMimeMessage *message; void (*callback)(MailDisplay *, gpointer); gpointer data; @@ -1288,16 +1162,16 @@ try_part_urls (struct _load_content_msg *m) g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), FALSE); data = camel_medium_get_content_object (medium); - if (!mail_content_loaded (data, m->display, FALSE, m->url, m->html, m->handle)) { + if (!mail_content_loaded (data, m->display, FALSE, m->url, m->handle)) { g_warning ("This code should not be reached\n"); return TRUE; } - html_stream = mail_stream_gtkhtml_new (m->html, m->handle); + html_stream = mail_stream_gtkhtml_new (m->display->html, m->handle); camel_data_wrapper_write_to_stream (data, html_stream); camel_object_unref (CAMEL_OBJECT (html_stream)); - gtk_html_end (m->html, m->handle, GTK_HTML_STREAM_OK); + gtk_html_end (m->display->html, m->handle, GTK_HTML_STREAM_OK); return TRUE; } @@ -1317,9 +1191,9 @@ try_data_urls (struct _load_content_msg *m) if (ba) { if (ba->len) { printf ("writing ...\n"); - gtk_html_write (m->html, m->handle, ba->data, ba->len); + gtk_html_write (m->display->html, m->handle, ba->data, ba->len); } - gtk_html_end (m->html, m->handle, GTK_HTML_STREAM_OK); + gtk_html_end (m->display->html, m->handle, GTK_HTML_STREAM_OK); return TRUE; } @@ -1341,7 +1215,7 @@ load_content_loaded (struct _mail_msg *mm) m->display->redisplay_counter); if (m->redisplay_counter == m->display->redisplay_counter) { if (!try_part_urls (m) && !try_data_urls (m)) - gtk_html_end (m->html, m->handle, GTK_HTML_STREAM_ERROR); + gtk_html_end (m->display->html, m->handle, GTK_HTML_STREAM_ERROR); } } else mail_display_redisplay (m->display, FALSE); @@ -1367,7 +1241,6 @@ static struct _mail_msg_op load_content_op = { static void stream_write_or_redisplay_when_loaded (MailDisplay *md, - GtkHTML *html, gconstpointer key, const gchar *url, void (*callback)(MailDisplay *, gpointer), @@ -1394,7 +1267,6 @@ stream_write_or_redisplay_when_loaded (MailDisplay *md, m = mail_msg_new (&load_content_op, NULL, sizeof (*m)); m->display = md; gtk_object_ref (GTK_OBJECT (m->display)); - m->html = html; m->handle = handle; m->url = g_strdup (url); m->redisplay_counter = md->redisplay_counter; @@ -1410,40 +1282,34 @@ stream_write_or_redisplay_when_loaded (MailDisplay *md, void mail_display_stream_write_when_loaded (MailDisplay *md, gconstpointer key, - const char *url, + const gchar *url, void (*callback)(MailDisplay *, gpointer), - GtkHTML *html, GtkHTMLStream *handle, gpointer data) { - stream_write_or_redisplay_when_loaded (md, html, key, url, callback, handle, data); + stream_write_or_redisplay_when_loaded (md, key, url, callback, handle, data); } void mail_display_redisplay_when_loaded (MailDisplay *md, gconstpointer key, void (*callback)(MailDisplay *, gpointer), - GtkHTML *html, gpointer data) { - stream_write_or_redisplay_when_loaded (md, html, key, NULL, callback, NULL, data); + stream_write_or_redisplay_when_loaded (md, key, NULL, callback, NULL, data); } void -mail_text_write (GtkHTML *html, GtkHTMLStream *stream, gboolean printing, const char *text) +mail_text_write (GtkHTML *html, GtkHTMLStream *stream, const char *text) { - guint flags; char *htmltext; - flags = E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_SPACES; - - if (!printing) - flags |= E_TEXT_TO_HTML_CONVERT_URLS | E_TEXT_TO_HTML_CONVERT_ADDRESSES; - - if (mail_config_get_citation_highlight () && ! printing) - flags |= E_TEXT_TO_HTML_MARK_CITATION; - - htmltext = e_text_to_html_full (text, flags, mail_config_get_citation_color ()); + htmltext = e_text_to_html_full (text, E_TEXT_TO_HTML_CONVERT_URLS | + E_TEXT_TO_HTML_CONVERT_ADDRESSES | + E_TEXT_TO_HTML_CONVERT_NL | + E_TEXT_TO_HTML_CONVERT_SPACES | + (mail_config_get_citation_highlight () ? E_TEXT_TO_HTML_MARK_CITATION : 0), + mail_config_get_citation_color ()); gtk_html_write (html, stream, "<tt>", 4); gtk_html_write (html, stream, htmltext, strlen (htmltext)); @@ -1476,50 +1342,19 @@ static void clear_data (CamelObject *object, gpointer event_data, gpointer user_data) { GData *data = user_data; - - g_datalist_clear (&data); -} - -void -mail_display_render (MailDisplay *md, GtkHTML *html, gboolean reset_scroll) -{ - GtkHTMLStream *stream; - - g_return_if_fail (IS_MAIL_DISPLAY (md)); - g_return_if_fail (GTK_IS_HTML (html)); - stream = gtk_html_begin (html); - if (!reset_scroll) { - /* This is a hack until there's a clean way to do this. */ - GTK_HTML (md->html)->engine->newPage = FALSE; - } - - mail_html_write (html, stream, - "<!doctype html public \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n" - "<html>\n" - "<head>\n<meta name=\"generator\" content=\"Evolution Mail Component\">\n</head>\n"); - mail_html_write (html, stream, "<body marginwidth=0 marginheight=0>\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, "</body></html>\n"); - gtk_html_end (html, stream, GTK_HTML_STREAM_OK); + g_datalist_clear (&data); } /** * mail_display_redisplay: * @mail_display: the mail display object - * @reset_scroll: specifies whether or not to reset current scroll + * @unscroll: specifies whether or not to lose current scroll * * Force a redraw of the message display. **/ void -mail_display_redisplay (MailDisplay *md, gboolean reset_scroll) +mail_display_redisplay (MailDisplay *md, gboolean unscroll) { if (GTK_OBJECT_DESTROYED (md)) return; @@ -1528,7 +1363,25 @@ mail_display_redisplay (MailDisplay *md, gboolean reset_scroll) md->redisplay_counter++; /* printf ("md %p redisplay %d\n", md, md->redisplay_counter); */ - mail_display_render (md, md->html, reset_scroll); + 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, "<!doctype html public \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n<html>\n<head>\n<meta name=\"generator\" content=\"Evolution Mail Component\">\n</head>\n"); + mail_html_write (md->html, md->stream, "<body marginwidth=0 marginheight=0>\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, "</body></html>\n"); + gtk_html_end (md->html, md->stream, GTK_HTML_STREAM_OK); + md->stream = NULL; } @@ -1606,18 +1459,16 @@ 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; - mail_display->charset = NULL; mail_display->current_message = NULL; mail_display->data = NULL; - + mail_display->invisible = gtk_invisible_new (); mail_display->display_style = mail_config_get_message_display_style (); - - mail_display->printing = FALSE; } static void @@ -1752,15 +1603,15 @@ enum { static EPopupMenu link_menu [] = { { N_("Open Link in Browser"), NULL, - GTK_SIGNAL_FUNC (link_open_in_browser), NULL, NULL, MASK_URL }, + GTK_SIGNAL_FUNC (link_open_in_browser), NULL, MASK_URL }, { N_("Copy Link Location"), NULL, - GTK_SIGNAL_FUNC (link_copy_location), NULL, NULL, MASK_URL }, + GTK_SIGNAL_FUNC (link_copy_location), NULL, MASK_URL }, #if 0 { N_("Save Link as (FIXME)"), NULL, - GTK_SIGNAL_FUNC (link_save_as), NULL, NULL, MASK_URL }, + GTK_SIGNAL_FUNC (link_save_as), NULL, MASK_URL }, #endif { N_("Save Image as..."), NULL, - GTK_SIGNAL_FUNC (image_save_as), NULL, NULL, MASK_SRC }, + GTK_SIGNAL_FUNC (image_save_as), NULL, MASK_SRC }, TERMINATOR }; @@ -1978,11 +1829,7 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * if (url && !g_strncasecmp (url, "mailto:", 7)) { PopupInfo *pop; - gchar *url_decoded; - - url_decoded = gtk_html_get_url_object_relative (GTK_HTML (widget), - point->object, - url); + gchar *url_decoded = g_strdup (url); camel_url_decode (url_decoded); popup_thing = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressPopup", @@ -2009,10 +1856,7 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * hide_mask |= MASK_SRC; g_free (gtk_object_get_data (GTK_OBJECT (mail_display), "current_src_uri")); - gtk_object_set_data (GTK_OBJECT (mail_display), "current_src_uri", - gtk_html_get_url_object_relative (GTK_HTML (widget), - point->object, - src)); + gtk_object_set_data (GTK_OBJECT (mail_display), "current_src_uri", g_strdup (src)); e_popup_menu_run (link_menu, (GdkEvent *) event, 0, hide_mask, mail_display); @@ -2197,10 +2041,10 @@ mail_display_new (void) GtkWidget *scroll, *html; GdkAtom clipboard_atom; HTMLTokenizer *tok; - + gtk_box_set_homogeneous (GTK_BOX (mail_display), FALSE); gtk_widget_show (GTK_WIDGET (mail_display)); - + scroll = e_scroll_frame_new (NULL, NULL); e_scroll_frame_set_policy (E_SCROLL_FRAME (scroll), GTK_POLICY_AUTOMATIC, @@ -2208,47 +2052,16 @@ mail_display_new (void) e_scroll_frame_set_shadow_type (E_SCROLL_FRAME (scroll), GTK_SHADOW_IN); gtk_box_pack_start_defaults (GTK_BOX (mail_display), GTK_WIDGET (scroll)); gtk_widget_show (GTK_WIDGET (scroll)); - + html = gtk_html_new (); tok = e_searching_tokenizer_new (); html_engine_set_tokenizer (GTK_HTML (html)->engine, tok); gtk_object_unref (GTK_OBJECT (tok)); - - mail_display_initialize_gtkhtml (mail_display, GTK_HTML (html)); - - gtk_container_add (GTK_CONTAINER (scroll), html); - gtk_widget_show (GTK_WIDGET (html)); - - gtk_signal_connect (GTK_OBJECT (mail_display->invisible), "selection_get", - GTK_SIGNAL_FUNC (invisible_selection_get_callback), mail_display); - gtk_signal_connect (GTK_OBJECT (mail_display->invisible), "selection_clear_event", - GTK_SIGNAL_FUNC (invisible_selection_clear_event_callback), mail_display); - - gtk_selection_add_target (mail_display->invisible, - GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, 1); - - clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); - if (clipboard_atom != GDK_NONE) - gtk_selection_add_target (mail_display->invisible, - clipboard_atom, GDK_SELECTION_TYPE_STRING, 1); - - mail_display->scroll = E_SCROLL_FRAME (scroll); - mail_display->html = GTK_HTML (html); - mail_display->last_active = NULL; - mail_display->data = g_new0 (GData *, 1); - g_datalist_init (mail_display->data); - - return GTK_WIDGET (mail_display); -} -void -mail_display_initialize_gtkhtml (MailDisplay *mail_display, GtkHTML *html) -{ gtk_html_set_default_content_type (GTK_HTML (html), "text/html; charset=utf-8"); - + gtk_html_set_editable (GTK_HTML (html), FALSE); - gtk_signal_connect (GTK_OBJECT (html), "url_requested", GTK_SIGNAL_FUNC (on_url_requested), mail_display); @@ -2268,7 +2081,31 @@ mail_display_initialize_gtkhtml (MailDisplay *mail_display, GtkHTML *html) GTK_SIGNAL_FUNC (html_iframe_created), mail_display); gtk_signal_connect (GTK_OBJECT (html), "on_url", GTK_SIGNAL_FUNC (html_on_url), mail_display); -} + gtk_container_add (GTK_CONTAINER (scroll), html); + gtk_widget_show (GTK_WIDGET (html)); + + gtk_signal_connect (GTK_OBJECT (mail_display->invisible), "selection_get", + GTK_SIGNAL_FUNC (invisible_selection_get_callback), mail_display); + gtk_signal_connect (GTK_OBJECT (mail_display->invisible), "selection_clear_event", + GTK_SIGNAL_FUNC (invisible_selection_clear_event_callback), mail_display); + + gtk_selection_add_target (mail_display->invisible, + GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, 1); + + clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); + if (clipboard_atom != GDK_NONE) + gtk_selection_add_target (mail_display->invisible, + clipboard_atom, GDK_SELECTION_TYPE_STRING, 1); + + 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); + + return GTK_WIDGET (mail_display); +} E_MAKE_TYPE (mail_display, "MailDisplay", MailDisplay, mail_display_class_init, mail_display_init, PARENT_TYPE); |