From 923549e2bb1c037694980b066252d952d7ead811 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 11 Jan 2011 00:46:46 +0200 Subject: [PATCH] * : updates for new MIME-part handling --- src/mu-cmd.c | 60 ++++++++++---- toys/mug2/mug-msg-view.c | 156 ++--------------------------------- widgets/Makefile.am | 2 + widgets/mu-msg-attach-view.c | 12 ++- widgets/mu-msg-body-view.c | 97 ++++++++++++++++++++-- widgets/mu-msg-body-view.h | 5 +- widgets/mu-msg-view.c | 136 ++++++++++++++++-------------- 7 files changed, 228 insertions(+), 240 deletions(-) diff --git a/src/mu-cmd.c b/src/mu-cmd.c index be364f89..5b5e428b 100644 --- a/src/mu-cmd.c +++ b/src/mu-cmd.c @@ -30,12 +30,39 @@ #include "mu-str.h" #include "mu-maildir.h" +static gboolean +save_part (MuMsg *msg, const char *targetdir, guint partidx, gboolean overwrite, + gboolean play) +{ + gchar *filepath; + + filepath = mu_msg_part_filepath (msg, targetdir, partidx); + if (!filepath) { + g_warning ("%s: failed to get filepath", __FUNCTION__); + return FALSE; + } + + if (!mu_msg_part_save (msg, filepath, partidx, overwrite, FALSE)) { + g_warning ("%s: failed to save MIME-part %d at %s", + __FUNCTION__, partidx, filepath); + g_free (filepath); + return FALSE; + } + + if (play) + mu_util_play (filepath); + + return TRUE; +} + + + static gboolean save_numbered_parts (MuMsg *msg, MuConfig *opts) { gboolean rv; char **parts, **cur; - + parts = g_strsplit (opts->parts, ",", 0); for (rv = TRUE, cur = parts; cur && *cur; ++cur) { @@ -43,7 +70,7 @@ save_numbered_parts (MuMsg *msg, MuConfig *opts) unsigned idx; int i; char *endptr; - + idx = (unsigned)(i = strtol (*cur, &endptr, 10)); if (i < 0 || *cur == endptr) { g_warning ("invalid MIME-part index '%s'", *cur); @@ -51,21 +78,19 @@ save_numbered_parts (MuMsg *msg, MuConfig *opts) break; } - if (!mu_msg_mime_part_save - (msg, idx, opts->targetdir, opts->overwrite, opts->play)) { - g_warning ("failed to save MIME-part %d", idx); - rv = FALSE; + rv = save_part (msg, opts->targetdir, idx, opts->overwrite, + opts->play); + if (!rv) { + g_warning ("failed to save MIME-part %d", idx); break; - } + } } g_strfreev (parts); - return rv; } struct _SaveData { - MuMsg *msg; gboolean attachments_only; gboolean result; guint saved_num; @@ -77,7 +102,7 @@ typedef struct _SaveData SaveData; static void -save_part_if (MuMsgPart *part, SaveData *sd) +save_part_if (MuMsg *msg, MuMsgPart *part, SaveData *sd) { /* something went wrong somewhere; stop */ if (!sd->result) @@ -97,8 +122,8 @@ save_part_if (MuMsgPart *part, SaveData *sd) g_ascii_strcasecmp (part->type, "multipart") == 0) return; - sd->result = mu_msg_mime_part_save (sd->msg, part->index, - sd->targetdir, sd->overwrite, sd->play); + sd->result = mu_msg_part_save (msg, sd->targetdir, part->index, + sd->overwrite, sd->play); if (!sd->result) g_warning ("failed to save MIME-part %u", part->index); else @@ -112,7 +137,6 @@ save_certain_parts (MuMsg *msg, gboolean attachments_only, { SaveData sd; - sd.msg = msg; sd.result = TRUE; sd.saved_num = 0; sd.attachments_only = attachments_only; @@ -120,9 +144,9 @@ save_certain_parts (MuMsg *msg, gboolean attachments_only, sd.targetdir = targetdir; sd.play = play; - mu_msg_msg_part_foreach (msg, - (MuMsgPartForeachFunc)save_part_if, - &sd); + mu_msg_part_foreach (msg, + (MuMsgPartForeachFunc)save_part_if, + &sd); if (sd.saved_num == 0) { g_warning ("no %s extracted from this message", @@ -173,7 +197,7 @@ save_parts (const char *path, MuConfig *opts) static void -each_part_show (MuMsgPart *part, gpointer user_data) +each_part_show (MuMsg *msg, MuMsgPart *part, gpointer user_data) { g_print (" %u %s %s/%s [%s]\n", part->index, @@ -199,7 +223,7 @@ show_parts (const char* path, MuConfig *opts) } g_print ("MIME-parts in this message:\n"); - mu_msg_msg_part_foreach (msg, each_part_show, NULL); + mu_msg_part_foreach (msg, each_part_show, NULL); mu_msg_unref (msg); return TRUE; diff --git a/toys/mug2/mug-msg-view.c b/toys/mug2/mug-msg-view.c index ce5288ba..d52198cb 100644 --- a/toys/mug2/mug-msg-view.c +++ b/toys/mug2/mug-msg-view.c @@ -38,47 +38,9 @@ enum { LAST_SIGNAL }; -enum _HeaderRow { - HEADER_ROW_FROM, - HEADER_ROW_TO, - HEADER_ROW_SUBJECT, - HEADER_ROW_CC, - HEADER_ROW_DATE, - HEADER_ROW_PATH, - HEADER_ROW_MSGID, - HEADER_ROW_SIZE, - HEADER_ROW_NUM -}; -typedef enum _HeaderRow HeaderRow; - -struct _HeaderInfo { - HeaderRow row; - const char *title; -}; -typedef struct _HeaderInfo HeaderInfo; - -static const HeaderInfo HEADER_INFO[] = { - {HEADER_ROW_CC, "Cc"}, - {HEADER_ROW_SUBJECT, "Subject"}, - {HEADER_ROW_DATE, "Date"} -}; - -static const HeaderInfo HEADER_INFO_EXPANDER[] = { - {HEADER_ROW_FROM, "From"}, - {HEADER_ROW_TO, "To"}, - {HEADER_ROW_PATH, "Path"}, - {HEADER_ROW_MSGID, "Message-Id"}, - {HEADER_ROW_SIZE, "Size"} -}; typedef struct _MugMsgViewPrivate MugMsgViewPrivate; struct _MugMsgViewPrivate { - - GtkWidget *_headers_area; - GtkWidget *_tablemain, *_tableexpander; - GtkWidget *_headervals[HEADER_ROW_NUM]; - - GtkWidget *_expander_header, *_expander; GtkWidget *_view; }; #define MUG_MSG_VIEW_GET_PRIVATE(o)(G_TYPE_INSTANCE_GET_PRIVATE((o),MUG_TYPE_MSG_VIEW, MugMsgViewPrivate)) @@ -109,76 +71,6 @@ mug_msg_view_class_init (MugMsgViewClass * klass) /* etc. */ } -static GtkWidget * -create_table (MugMsgViewPrivate * priv, const HeaderInfo * hinfo, guint num) -{ - guint i; - GtkWidget *table; - - table = gtk_table_new (num, 2, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); - - for (i = 0; i < num; ++i) { - - char *str; - GtkWidget *l, *al; - - l = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); - - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - str = g_strdup_printf ("%s:", hinfo[i].title); - gtk_label_set_markup (GTK_LABEL (l), str); - g_free (str); - - al = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); - gtk_container_add (GTK_CONTAINER (al), l); - gtk_table_attach (GTK_TABLE (table), al, 0, 1, i, i + 1, - GTK_FILL, 0, 0, 0); - - l = priv->_headervals[hinfo[i].row] = gtk_label_new (NULL); - al = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); - gtk_label_set_selectable (GTK_LABEL (l), TRUE); - - gtk_container_add (GTK_CONTAINER (al), l); - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - gtk_label_set_line_wrap_mode (GTK_LABEL (l), - PANGO_WRAP_WORD_CHAR); - gtk_label_set_line_wrap (GTK_LABEL (l), FALSE); - gtk_table_attach (GTK_TABLE (table), al, - 1, 2, i, i + 1, GTK_FILL, 0, 0, 0); - } - - return table; -} - -static GtkWidget * -headers_area (MugMsgViewPrivate * priv) -{ - GtkWidget *scrolled, *vbox; - - priv->_tablemain = create_table (priv, HEADER_INFO, - G_N_ELEMENTS (HEADER_INFO)); - priv->_tableexpander = create_table - (priv, HEADER_INFO_EXPANDER, G_N_ELEMENTS (HEADER_INFO_EXPANDER)); - priv->_expander = gtk_expander_new ("Details"); - gtk_container_add (GTK_CONTAINER (priv->_expander), - priv->_tableexpander); - - vbox = gtk_vbox_new (FALSE, FALSE); - gtk_box_pack_start (GTK_BOX (vbox), priv->_tablemain, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), priv->_expander, FALSE, FALSE, 0); - - scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled), - vbox); - - return priv->_headers_area = scrolled; -} - static void mug_msg_view_init (MugMsgView * obj) { @@ -188,10 +80,6 @@ mug_msg_view_init (MugMsgView * obj) priv = MUG_MSG_VIEW_GET_PRIVATE (obj); priv->_view = mu_msg_view_new (); - /* priv->_view = gtk_text_view_new (); */ - /* gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->_view), FALSE); */ - /* gtk_text_view_set_left_margin (GTK_TEXT_VIEW (priv->_view), 10); */ - /* gtk_text_view_set_right_margin (GTK_TEXT_VIEW (priv->_view), 10); */ scrolled = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), @@ -200,8 +88,6 @@ mug_msg_view_init (MugMsgView * obj) gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled), priv->_view); - gtk_box_pack_start (GTK_BOX (obj), headers_area (priv), FALSE, FALSE, - 0); gtk_box_pack_start (GTK_BOX (obj), scrolled, TRUE, TRUE, 0); } @@ -219,39 +105,6 @@ mug_msg_view_new (void) } -static void -fill_header (MugMsgViewPrivate * priv, MuMsg * msg) -{ - int i; - - for (i = 0; i != HEADER_ROW_NUM; ++i) { - const gchar *val; - switch (i) { - case HEADER_ROW_FROM: val = mu_msg_get_from (msg); break; - case HEADER_ROW_TO: val = mu_msg_get_to (msg); break; - case HEADER_ROW_SUBJECT: val = mu_msg_get_subject (msg); break; - case HEADER_ROW_MSGID: val = mu_msg_get_msgid (msg);break; - case HEADER_ROW_CC: val = mu_msg_get_cc (msg); break; - case HEADER_ROW_PATH: val = mu_msg_get_path (msg); break; - case HEADER_ROW_DATE: - val = mu_str_date_s ("%c", mu_msg_get_date (msg)); - break; - case HEADER_ROW_SIZE: - val = mu_str_size_s (mu_msg_get_size (msg)); - break; - default: - val = NULL; - } - - { - gchar *str; - str = g_markup_escape_text (val ? val : "", -1); - gtk_label_set_markup - (GTK_LABEL (priv->_headervals[i]), str); - g_free (str); - } - } -} gboolean mug_msg_view_set_msg (MugMsgView * self, const char *msgpath) @@ -264,10 +117,13 @@ mug_msg_view_set_msg (MugMsgView * self, const char *msgpath) if (!msgpath) mu_msg_view_set_message (MU_MSG_VIEW(priv->_view), NULL); else { - MuMsg *msg = mu_msg_new (msgpath, NULL, NULL); + MuMsg *msg; + + msg = mu_msg_new (msgpath, NULL, NULL); mu_msg_view_set_message (MU_MSG_VIEW(priv->_view), msg); - fill_header (priv, msg); - mu_msg_unref (msg); + + if (msg) + mu_msg_unref (msg); } return TRUE; diff --git a/widgets/Makefile.am b/widgets/Makefile.am index 3f202981..b65449aa 100644 --- a/widgets/Makefile.am +++ b/widgets/Makefile.am @@ -37,6 +37,8 @@ libmuwidgets_la_SOURCES= \ mu-msg-attach-view.h \ mu-msg-body-view.c \ mu-msg-body-view.h \ + mu-msg-header-view.c \ + mu-msg-header-view.h \ mu-msg-view.h \ mu-msg-view.c diff --git a/widgets/mu-msg-attach-view.c b/widgets/mu-msg-attach-view.c index b48b833f..d96ce312 100644 --- a/widgets/mu-msg-attach-view.c +++ b/widgets/mu-msg-attach-view.c @@ -129,7 +129,11 @@ mu_msg_attach_view_init (MuMsgAttachView *obj) static void mu_msg_attach_view_finalize (GObject *obj) { - mu_msg_unref (MU_MSG_ATTACH_VIEW(obj)->_priv->_msg); + MuMsg *msg; + + msg = MU_MSG_ATTACH_VIEW(obj)->_priv->_msg; + if (msg) + mu_msg_unref (msg); G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -149,7 +153,7 @@ typedef struct _CBData CBData; static void -each_part (MuMsgPart *part, CBData *cbdata) +each_part (MuMsg *msg, MuMsgPart *part, CBData *cbdata) { GtkTreeIter treeiter; GdkPixbuf *pixbuf; @@ -180,7 +184,7 @@ each_part (MuMsgPart *part, CBData *cbdata) -1); if (pixbuf) g_object_unref (pixbuf); - + ++cbdata->count; } @@ -206,7 +210,7 @@ mu_msg_attach_view_set_message (MuMsgAttachView *self, MuMsg *msg) cbdata.store = store; cbdata.count = 0; - mu_msg_msg_part_foreach (msg, (MuMsgPartForeachFunc)each_part, &cbdata); + mu_msg_part_foreach (msg, (MuMsgPartForeachFunc)each_part, &cbdata); return cbdata.count; } diff --git a/widgets/mu-msg-body-view.c b/widgets/mu-msg-body-view.c index 180bd5ff..691d5892 100644 --- a/widgets/mu-msg-body-view.c +++ b/widgets/mu-msg-body-view.c @@ -18,8 +18,8 @@ */ #include #include "mu-msg-body-view.h" +#include -/* include other impl specific header files */ /* 'private'/'protected' functions */ static void mu_msg_body_view_class_init (MuMsgBodyViewClass *klass); @@ -35,6 +35,7 @@ enum { struct _MuMsgBodyViewPrivate { WebKitWebSettings *_settings; + MuMsg *_message; }; #define MU_MSG_BODY_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MU_TYPE_MSG_BODY_VIEW, \ @@ -66,11 +67,72 @@ mu_msg_body_view_class_init (MuMsgBodyViewClass *klass) /* etc. */ } + + +static char* +save_file_for_cid (MuMsg *msg, const char* cid) +{ + gint idx; + gchar *filepath; + gboolean rv; + + g_return_val_if_fail (msg, NULL); + g_return_val_if_fail (cid, NULL); + + idx = mu_msg_part_find_cid (msg, cid); + if (idx < 0) { + g_warning ("%s: cannot find %s", __FUNCTION__, cid); + return NULL; + } + + filepath = mu_msg_part_filepath_cache (msg, idx); + if (!filepath) { + g_warning ("%s: cannot create filepath", filepath); + return NULL; + } + + rv = mu_msg_part_save (msg, filepath, idx, FALSE, TRUE); + if (!rv) { + g_warning ("%s: failed to save %s", __FUNCTION__, filepath); + g_free (filepath); + filepath = NULL; + } + + return filepath; +} + +static void +on_resource_request_starting (MuMsgBodyView *self, WebKitWebFrame *frame, + WebKitWebResource *resource, WebKitNetworkRequest *request, + WebKitNetworkResponse *response, gpointer data) +{ + const char* uri; + MuMsg *msg; + + msg = self->_priv->_message; + uri = webkit_network_request_get_uri (request); + + if (g_ascii_strncasecmp (uri, "cid:", 4) == 0) { + gchar *filepath; + filepath = save_file_for_cid (msg, uri + 4); + if (filepath) { + gchar *fileuri; + fileuri = g_strdup_printf ("file://%s", filepath); + webkit_network_request_set_uri (request, fileuri); + g_free (fileuri); + g_free (filepath); + } + } +} + + static void mu_msg_body_view_init (MuMsgBodyView *obj) { obj->_priv = MU_MSG_BODY_VIEW_GET_PRIVATE(obj); + obj->_priv->_message = NULL; + obj->_priv->_settings = webkit_web_settings_new (); g_object_set (G_OBJECT(obj->_priv->_settings), "enable-scripts", FALSE, @@ -81,7 +143,9 @@ mu_msg_body_view_init (MuMsgBodyView *obj) webkit_web_view_set_settings (WEBKIT_WEB_VIEW(obj), obj->_priv->_settings); webkit_web_view_set_editable (WEBKIT_WEB_VIEW(obj), FALSE); - /* other settings */ + + g_signal_connect (obj, "resource-request-starting", + G_CALLBACK (on_resource_request_starting), NULL); } static void @@ -92,6 +156,9 @@ mu_msg_body_view_finalize (GObject *obj) priv = MU_MSG_BODY_VIEW_GET_PRIVATE(obj); if (priv && priv->_settings) g_object_unref (priv->_settings); + + if (priv->_message) + mu_msg_unref (priv->_message); G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -104,7 +171,7 @@ mu_msg_body_view_new (void) void -mu_msg_body_view_set_html (MuMsgBodyView *self, const char* html) +set_html (MuMsgBodyView *self, const char* html) { g_return_if_fail (MU_IS_MSG_BODY_VIEW(self)); @@ -115,8 +182,8 @@ mu_msg_body_view_set_html (MuMsgBodyView *self, const char* html) ""); } -void -mu_msg_body_view_set_text (MuMsgBodyView *self, const char* txt) +static void +set_text (MuMsgBodyView *self, const char* txt) { g_return_if_fail (MU_IS_MSG_BODY_VIEW(self)); @@ -126,3 +193,23 @@ mu_msg_body_view_set_text (MuMsgBodyView *self, const char* txt) "utf-8", ""); } + + +void +mu_msg_body_view_set_message (MuMsgBodyView *self, MuMsg *msg) +{ + const char* data; + + g_return_if_fail (self); + + if (self->_priv->_message) + mu_msg_unref (self->_priv->_message); + + self->_priv->_message = msg ? mu_msg_ref (msg) : NULL; + + data = msg ? mu_msg_get_body_html (msg) : ""; + if (data) + set_html (self, data); + else + set_text (self, mu_msg_get_body_text (msg)); +} diff --git a/widgets/mu-msg-body-view.h b/widgets/mu-msg-body-view.h index 0d717f3c..45dadd7a 100644 --- a/widgets/mu-msg-body-view.h +++ b/widgets/mu-msg-body-view.h @@ -21,6 +21,7 @@ #define __MU_MSG_BODY_VIEW_H__ #include +#include G_BEGIN_DECLS @@ -57,8 +58,8 @@ GType mu_msg_body_view_get_type (void) G_GNUC_CONST; /* if this is a kind of GtkWidget, it should probably return at GtkWidget* */ GtkWidget* mu_msg_body_view_new (void); -void mu_msg_body_view_set_html (MuMsgBodyView *self, const char* html); -void mu_msg_body_view_set_text (MuMsgBodyView *self, const char* html); +void mu_msg_body_view_set_message (MuMsgBodyView *self, MuMsg *msg); + G_END_DECLS diff --git a/widgets/mu-msg-view.c b/widgets/mu-msg-view.c index 9834c14f..8d6bde47 100644 --- a/widgets/mu-msg-view.c +++ b/widgets/mu-msg-view.c @@ -20,7 +20,10 @@ #include "mu-msg-view.h" #include "mu-msg-body-view.h" #include "mu-msg-attach-view.h" -#include "mu-msg.h" +#include "mu-msg-header-view.h" + +#include +#include /* 'private'/'protected' functions */ static void mu_msg_view_class_init (MuMsgViewClass *klass); @@ -35,6 +38,7 @@ enum { }; struct _MuMsgViewPrivate { + GtkWidget *_headers; GtkWidget *_body; GtkWidget *_attach, *_attacharea; }; @@ -71,41 +75,75 @@ mu_msg_view_class_init (MuMsgViewClass *klass) static void on_attach_activated (MuMsgView *self, guint partnum, MuMsg *msg) { - char *tmpdir; - - tmpdir = mu_util_create_tmpdir (); - if (!tmpdir) - return; - - mu_msg_mime_part_save (msg, partnum, tmpdir, FALSE, TRUE); - g_free (tmpdir); + gchar* filepath; + + filepath = mu_msg_part_filepath_cache (msg, partnum); + if (filepath) { + mu_msg_part_save (msg, filepath, partnum, FALSE, TRUE); + mu_util_play (filepath); + g_free (filepath); + } } -static void -mu_msg_view_init (MuMsgView *obj) +static GtkWidget* +get_header_widget (MuMsgView *self) +{ + return self->_priv->_headers = mu_msg_header_view_new (); +} + + +static GtkWidget* +get_body_widget (MuMsgView *self) { GtkWidget *scrolledwin; - obj->_priv = MU_MSG_VIEW_GET_PRIVATE(obj); - - obj->_priv->_body = mu_msg_body_view_new (); + self->_priv->_body = mu_msg_body_view_new (); scrolledwin = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER(scrolledwin), - obj->_priv->_body); - gtk_box_pack_start (GTK_BOX(obj), scrolledwin, - TRUE, TRUE, 2); + self->_priv->_body); - obj->_priv->_attacharea = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(obj->_priv->_attacharea), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - obj->_priv->_attach = mu_msg_attach_view_new (); - gtk_container_add (GTK_CONTAINER(obj->_priv->_attacharea), obj->_priv->_attach); + return scrolledwin; +} - g_signal_connect (obj->_priv->_attach, "attach-activated", +static GtkWidget* +get_attach_widget (MuMsgView *self) +{ + /* GtkWidget *scrolledwin; */ + + self->_priv->_attacharea = gtk_frame_new (""); + /* scrolledwin = gtk_scrolled_window_new (NULL, NULL); */ + /* gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolledwin), */ + /* GTK_POLICY_NEVER, */ + /* GTK_POLICY_AUTOMATIC); */ + + self->_priv->_attach = mu_msg_attach_view_new (); + gtk_container_add (GTK_CONTAINER(self->_priv->_attacharea), + self->_priv->_attach); + + g_signal_connect (self->_priv->_attach, "attach-activated", G_CALLBACK(on_attach_activated), - obj); + self); + + return self->_priv->_attacharea; +} + +static void +mu_msg_view_init (MuMsgView *self) +{ + self->_priv = MU_MSG_VIEW_GET_PRIVATE(self); + + gtk_box_pack_start (GTK_BOX(self), get_header_widget (self), + FALSE, FALSE, 2); + + gtk_box_pack_start (GTK_BOX(self), get_attach_widget (self), + FALSE, FALSE, 2); + + gtk_box_pack_start (GTK_BOX(self), get_body_widget (self), + TRUE, TRUE, 2); + + + } static void @@ -123,55 +161,31 @@ mu_msg_view_new (void) static void -add_attachment_area_maybe (MuMsgView *self, MuMsg *msg) +update_attachment_area (MuMsgView *self, MuMsg *msg) { gint attach_num; - GList *children, *cur; - gboolean has_area; - - has_area = FALSE; - cur = children = gtk_container_get_children (GTK_CONTAINER(self)); - while (cur) { - if (cur->data == self->_priv->_attacharea) { - has_area = TRUE; - break; - } - cur = g_list_next (cur); - } - g_list_free (children); - + attach_num = 0; if (msg) attach_num = mu_msg_attach_view_set_message (MU_MSG_ATTACH_VIEW(self->_priv->_attach), msg); - - if (attach_num < 1 && has_area) { - g_object_ref (self->_priv->_attacharea); - gtk_container_remove (GTK_CONTAINER(self), - self->_priv->_attacharea); - } else if (attach_num >= 1 && !has_area) { - gtk_box_pack_start (GTK_BOX(self), self->_priv->_attacharea, - FALSE, FALSE, 0); + if (attach_num > 0) gtk_widget_show_all (self->_priv->_attacharea); - } + else + gtk_widget_hide_all (self->_priv->_attacharea); } void mu_msg_view_set_message (MuMsgView *self, MuMsg *msg) -{ - const char *data; - +{ g_return_if_fail (MU_IS_MSG_VIEW(self)); + + mu_msg_header_view_set_message (MU_MSG_HEADER_VIEW(self->_priv->_headers), + msg); + mu_msg_body_view_set_message (MU_MSG_BODY_VIEW(self->_priv->_body), + msg); - data = msg ? mu_msg_get_body_html (msg) : ""; - if (data) - mu_msg_body_view_set_html (MU_MSG_BODY_VIEW(self->_priv->_body), - data); - else - mu_msg_body_view_set_text (MU_MSG_BODY_VIEW(self->_priv->_body), - mu_msg_get_body_text (msg)); - - add_attachment_area_maybe (self, msg); + update_attachment_area (self, msg); }