X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-msg-view.c;h=bb9ff81f5b57e0db11f732774424c815c33b989b;hb=b4391573da7fb5893b5cc987a38057dc3ea6e9ac;hp=9bb4944852693d2e6e5314b6022e2ddc23bcdf36;hpb=2f9b57f4cab8d61c10113d1e22974719bbf33745;p=modest diff --git a/src/modest-tny-msg-view.c b/src/modest-tny-msg-view.c index 9bb4944..bb9ff81 100644 --- a/src/modest-tny-msg-view.c +++ b/src/modest-tny-msg-view.c @@ -4,6 +4,8 @@ #include "modest-tny-msg-view.h" #include "modest-tny-stream-gtkhtml.h" +#include "modest-tny-msg-actions.h" + #include #include #include @@ -17,7 +19,7 @@ static void modest_tny_msg_view_finalize (GObject *obj); static GSList* get_url_matches (GString *txt); -static gboolean fill_gtkhtml_with_txt (GtkHTML* gtkhtml, const gchar* txt); +static gboolean fill_gtkhtml_with_txt (GtkHTML* gtkhtml, const gchar* txt, TnyMsgIface *msg); static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestTnyMsgView *msg_view); @@ -118,6 +120,7 @@ modest_tny_msg_view_init (ModestTnyMsgView *obj) priv->msg = NULL; priv->gtkhtml = gtk_html_new(); + gtk_html_set_editable (GTK_HTML(priv->gtkhtml), FALSE); gtk_html_allow_selection (GTK_HTML(priv->gtkhtml), TRUE); gtk_html_set_caret_mode (GTK_HTML(priv->gtkhtml), FALSE); @@ -135,11 +138,7 @@ modest_tny_msg_view_init (ModestTnyMsgView *obj) static void modest_tny_msg_view_finalize (GObject *obj) { - ModestTnyMsgViewPrivate *priv; - priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(obj); - - if (priv->gtkhtml) - g_object_unref (G_OBJECT(priv->gtkhtml)); + } GtkWidget* @@ -191,6 +190,7 @@ find_cid_image (TnyMsgIface *msg, const gchar *cid) const gchar *part_cid; part = TNY_MSG_MIME_PART_IFACE(parts->data); part_cid = tny_msg_mime_part_iface_get_content_id (part); + printf("CMP:%s:%s\n", cid, part_cid); if (part_cid && strcmp (cid, part_cid) == 0) return part; /* we found it! */ @@ -240,6 +240,39 @@ typedef struct { } url_match_t; +static gchar * +attachments_as_html(TnyMsgIface *msg) +{ + gboolean attachments_found = FALSE; + GString *appendix; + const GList *attl; + const gchar *content_type, *filename; + if (!msg) + return g_malloc0(1); + appendix = g_string_new("\n
Attachments:
\n"); + attl = tny_msg_iface_get_parts(msg); + while (attl) { + filename = ""; + content_type = tny_msg_mime_part_iface_get_content_type( + TNY_MSG_MIME_PART_IFACE(attl->data)); + g_return_if_fail(content_type); + if (strcmp (content_type, "image/jpeg") == 0 || strcmp (content_type, "image/gif") == 0) { + filename = tny_msg_mime_part_iface_get_filename( + TNY_MSG_MIME_PART_IFACE(attl->data)); + if (!filename) + filename = "unknown"; + else + attachments_found = TRUE; + g_string_append_printf(appendix, "%s: %s
\n", filename, filename, content_type); + } + attl = attl->next; + } + g_string_append(appendix, ""); + if (!attachments_found) + g_string_assign(appendix, ""); + return g_string_free(appendix, FALSE); +} + static void hyperlinkify_plain_text (GString *txt) { @@ -264,8 +297,10 @@ hyperlinkify_plain_text (GString *txt) g_free (url); g_free (repl); - + + g_free (cursor->data); } + g_slist_free (match_list); } @@ -325,7 +360,7 @@ convert_to_html (const gchar *data) } } } - + g_string_append (html, ""); hyperlinkify_plain_text (html); @@ -413,45 +448,31 @@ get_url_matches (GString *txt) } static gboolean -fill_gtkhtml_with_txt (GtkHTML* gtkhtml, const gchar* txt) +fill_gtkhtml_with_txt (GtkHTML* gtkhtml, const gchar* txt, TnyMsgIface *msg) { - gchar *html; + GString *html; + gchar *html_attachments; g_return_val_if_fail (gtkhtml, FALSE); g_return_val_if_fail (txt, FALSE); - html = convert_to_html (txt); - gtk_html_load_from_string (gtkhtml, html, strlen(html)); - g_free (html); + html = g_string_new(convert_to_html (txt)); + html_attachments = attachments_as_html(msg); + g_string_append(html, html_attachments); + + gtk_html_load_from_string (gtkhtml, html->str, html->len); + g_string_free (html, TRUE); + g_free(html_attachments); return TRUE; } -static TnyMsgMimePartIface * -find_body_part (TnyMsgIface *msg, const gchar *mime_type) -{ - TnyMsgMimePartIface *part = NULL; - GList *parts; - - g_return_val_if_fail (msg, NULL); - g_return_val_if_fail (mime_type, NULL); - - parts = (GList*) tny_msg_iface_get_parts (msg); - while (parts && !part) { - part = TNY_MSG_MIME_PART_IFACE(parts->data); - if (!tny_msg_mime_part_iface_content_type_is (part, mime_type)) - part = NULL; - parts = parts->next; - } - - return part; -} - static gboolean -set_html_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) +set_html_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body, TnyMsgIface *msg) { + gchar *html_attachments; TnyStreamIface *gtkhtml_stream; ModestTnyMsgViewPrivate *priv; @@ -466,9 +487,13 @@ set_html_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) tny_stream_iface_reset (gtkhtml_stream); tny_msg_mime_part_iface_decode_to_stream (tny_body, gtkhtml_stream); + html_attachments = attachments_as_html(msg); + /* is this clean? */ + gtkhtml_write(gtkhtml_stream, html_attachments, strlen(html_attachments)); tny_stream_iface_reset (gtkhtml_stream); g_object_unref (G_OBJECT(gtkhtml_stream)); + g_free (html_attachments); return TRUE; } @@ -477,7 +502,7 @@ set_html_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) /* this is a hack --> we use the tny_text_buffer_stream to * get the message text, then write to gtkhtml 'by hand' */ static gboolean -set_text_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) +set_text_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body, TnyMsgIface *msg) { GtkTextBuffer *buf; GtkTextIter begin, end; @@ -500,8 +525,8 @@ set_text_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) gtk_text_buffer_get_bounds (buf, &begin, &end); txt = gtk_text_buffer_get_text (buf, &begin, &end, FALSE); - fill_gtkhtml_with_txt (GTK_HTML(priv->gtkhtml), txt); - + fill_gtkhtml_with_txt (GTK_HTML(priv->gtkhtml), txt, msg); + g_object_unref (G_OBJECT(txt_stream)); g_object_unref (G_OBJECT(buf)); @@ -509,7 +534,31 @@ set_text_message (ModestTnyMsgView *self, TnyMsgMimePartIface *tny_body) return TRUE; } +gchar * +modest_tny_msg_view_get_selected_text (ModestTnyMsgView *self) +{ + ModestTnyMsgViewPrivate *priv; + gchar *sel; + GtkWidget *html; + int len; + GtkClipboard *clip; + gchar *text; + GtkTextBuffer *buf; + g_return_if_fail (self); + priv = MODEST_TNY_MSG_VIEW_GET_PRIVATE(self); + html = priv->gtkhtml; + + /* I'm sure there is a better way to check for selected text */ + sel = gtk_html_get_selection_html(GTK_HTML(html), &len); + if (!sel) + return NULL; + + g_free(sel); + + clip = gtk_widget_get_clipboard(html, GDK_SELECTION_PRIMARY); + return gtk_clipboard_wait_for_text(clip); +} void modest_tny_msg_view_set_message (ModestTnyMsgView *self, TnyMsgIface *msg) @@ -523,27 +572,24 @@ modest_tny_msg_view_set_message (ModestTnyMsgView *self, TnyMsgIface *msg) priv->msg = msg; - fill_gtkhtml_with_txt (GTK_HTML(priv->gtkhtml), ""); + fill_gtkhtml_with_txt (GTK_HTML(priv->gtkhtml), "", msg); if (!msg) return; - body = find_body_part (msg, "text/html"); + body = modest_tny_msg_actions_find_body_part (msg, "text/html"); if (body) { - set_html_message (self, body); + set_html_message (self, body, msg); return; } - body = find_body_part (msg, "text/plain"); + body = modest_tny_msg_actions_find_body_part (msg, "text/plain"); if (body) { - set_text_message (self, body); + set_text_message (self, body, msg); return; } /* hmmmmm */ fill_gtkhtml_with_txt (GTK_HTML(priv->gtkhtml), - _("Unsupported message type")); + _("Unsupported message type"), msg); } - - -