[evolution/webkit: 61/102] Add support for embedding EMailDisplays into itself
- From: Dan VrÃtil <dvratil src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/webkit: 61/102] Add support for embedding EMailDisplays into itself
- Date: Fri, 6 Jan 2012 09:30:13 +0000 (UTC)
commit ab005a4034e16505079acc14394be108a7a3736e
Author: Dan VrÃtil <dvratil redhat com>
Date: Fri Nov 25 16:15:35 2011 +0100
Add support for embedding EMailDisplays into itself
Also improves binding of EAttachmentButton with the attachment widget or
webview.
Finally WebKit port gracefuly handles simple and multi-level attachments
mail/e-mail-display.c | 94 +++++++++++++++++++++++++++++++++++-----
mail/em-format-html-display.c | 18 +++++++-
2 files changed, 97 insertions(+), 15 deletions(-)
---
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index 060da9d..eda9450 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -555,16 +555,17 @@ mail_display_load_as_source (EMailDisplay *display,
static void
mail_display_load_normal (EMailDisplay *display,
- const gchar *msg_uid)
+ const gchar *msg_uri)
{
EWebView *web_view;
EMFormatPURI *puri;
EMFormat *emf = (EMFormat *) display->priv->formatter;
- EMFormatHTMLDisplay *efhd = (EMFormatHTMLDisplay *) emf;
EAttachmentView *attachment_view;
gchar *uri;
GList *iter;
GtkContainer *grid;
+ gchar *start_part_id;
+ GtkWidget *attachment_button;
g_return_if_fail (E_IS_MAIL_DISPLAY (display));
@@ -577,16 +578,43 @@ mail_display_load_normal (EMailDisplay *display,
/* First remove all widgets left after previous message */
e_mail_display_clear (display);
-
+ attachment_view = NULL;
+ attachment_button = NULL;
grid = GTK_CONTAINER (display->priv->grid);
gtk_widget_show (display->priv->grid);
- attachment_view = NULL;
- for (iter = emf->mail_part_list; iter; iter = iter->next) {
+ /* If msg_uri contains part_id, then find it and start 'writing' from
+ * this part_id. When there's no part_id or it's invalid, start from first
+ * PURI in the list. */
+ if ((start_part_id = strstr (msg_uri, "part_id=")) != NULL) {
+ gchar *end_part_id;
+ start_part_id = start_part_id + strlen("part_id=");
+ end_part_id = strstr (start_part_id, "&");
+ if (!end_part_id)
+ start_part_id = g_strdup (start_part_id);
+ else
+ start_part_id = g_strndup (start_part_id, end_part_id - start_part_id);
+
+ iter = g_hash_table_lookup (emf->mail_part_table, start_part_id);
+ if (!iter)
+ iter = emf->mail_part_list;
+ else
+ iter = iter->next; /* Prevent endless recursion */
+ } else {
+ iter = emf->mail_part_list;
+ }
+
+ g_free (start_part_id);
+
+ for (iter = iter; iter; iter = iter->next) {
GtkWidget *widget = NULL;
puri = iter->data;
+
+ if (g_str_has_suffix (puri->uri, ".end"))
+ break;
+
uri = em_format_build_mail_uri (emf->folder, emf->message_uid,
"part_id", G_TYPE_STRING, puri->uri,
"mode", G_TYPE_INT, display->priv->mode,
@@ -595,18 +623,34 @@ mail_display_load_normal (EMailDisplay *display,
NULL);
if (puri->widget_func) {
+ gboolean expandible = FALSE;
widget = puri->widget_func (emf, puri, NULL);
+ fprintf (stderr, "%p: added %s for PURI %s\n",
+ display, G_OBJECT_TYPE_NAME (widget), puri->uri);
+
if (!GTK_IS_WIDGET (widget)) {
g_message ("Part %s didn't provide a valid widget, skipping!", puri->uri);
+ g_free (uri);
continue;
}
- if (E_IS_ATTACHMENT_BUTTON (widget) && attachment_view)
+ gtk_container_add (grid, widget);
+
+ if (attachment_button) {
+ g_object_bind_property (attachment_button, "expanded",
+ widget, "visible", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+ e_attachment_button_set_expandable (
+ E_ATTACHMENT_BUTTON (attachment_button), TRUE);
+ attachment_button = NULL;
+ expandible = TRUE;
+ }
+
+ if (E_IS_ATTACHMENT_BUTTON (widget) && attachment_view) {
e_attachment_button_set_view (E_ATTACHMENT_BUTTON (widget),
attachment_view);
-
- gtk_container_add (grid, widget);
+ attachment_button = widget;
+ }
if (E_IS_ATTACHMENT_VIEW (widget)) {
EAttachmentStore *store;
@@ -618,21 +662,47 @@ mail_display_load_normal (EMailDisplay *display,
gtk_widget_show (widget);
else
gtk_widget_hide (widget);
- } else {
- gtk_widget_show (widget);
- }
+ g_free (uri);
+ continue;
+
+ } else if (E_IS_MAIL_DISPLAY (widget)) {
+ EMFormatPURI *iter_puri;
+
+ if (!expandible)
+ gtk_widget_show (widget);
+
+ /* Find the PURI with ".end" suffix and continue writing
+ the message from following PURI */
+ do {
+ iter = iter->next;
+ if (iter)
+ iter_puri = iter->data;
+ } while (iter && (!g_str_has_suffix (iter_puri->uri, ".end")));
+
+ g_free (uri);
+ continue;
+
+ } else {
+ gtk_widget_show (widget);
+ }
}
if ((!puri->is_attachment && puri->write_func) || (puri->is_attachment && puri->write_func && puri->widget_func)) {
+
web_view = mail_display_setup_webview (display);
mail_display_insert_web_view (display, web_view);
e_web_view_load_uri (web_view, uri);
- if (widget) {
+ if (attachment_button) {
g_object_bind_property (widget, "expanded",
web_view, "visible", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+ attachment_button = NULL;
}
+ fprintf (stderr, "%p: added EWebView for PURI %s\n",
+ display, puri->uri);
+
+
}
g_free (uri);
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 1f2e9b7..13da70c 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -466,7 +466,7 @@ efhd_parse_attachment (EMFormat *emf,
emf, sizeof (EMFormatAttachmentPURI), part, part_id->str);
puri->puri.free = efhd_free_attach_puri_data;
puri->puri.widget_func = efhd_attachment_button;
- puri->shown = em_format_is_inline (emf, part_id->str, part, handler);
+ puri->shown = (handler && em_format_is_inline (emf, part_id->str, part, handler));
puri->snoop_mime_type = em_format_snoop_type (part);
puri->attachment = e_attachment_new ();
puri->attachment_view_part_id = g_strdup (part_id->str);
@@ -477,8 +477,20 @@ efhd_parse_attachment (EMFormat *emf,
if (cid)
puri->puri.cid = g_strdup_printf ("cid:%s", cid);
- if (handler)
- puri->puri.write_func = handler->write_func;
+ if (handler) {
+ CamelContentType *ct;
+ puri->puri.write_func = handler->write_func;
+
+ /* This mime_type is important for WebKit to determine content type.
+ * We have converted text/* to text/html, other (binary) formats remained
+ * untouched. */
+ ct = camel_content_type_decode (handler->mime_type);
+ if (g_strcmp0 (ct->type, "text") == 0)
+ puri->puri.mime_type = g_strdup ("text/html");
+ else
+ puri->puri.mime_type = camel_content_type_simple (ct);
+ camel_content_type_unref (ct);
+ }
em_format_add_puri (emf, (EMFormatPURI *) puri);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]