#include <glib/gi18n.h>
#include <gtkhtml/gtkhtml.h>
#include <gtkhtml/gtkhtml-stream.h>
+#include <gtkhtml/gtkhtml-search.h>
+#include <gtkhtml/gtkhtml-embedded.h>
#include <tny-list.h>
#include <tny-simple-list.h>
static void modest_msg_view_init (ModestMsgView *obj);
static void modest_msg_view_finalize (GObject *obj);
static void modest_msg_view_destroy (GtkObject *obj);
+static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
/* headers signals */
static void on_recpt_activated (ModestMailHeaderView *header_view, const gchar *address, ModestMsgView *msg_view);
-static void on_attachment_activated (ModestAttachmentsView * att_view, gint index, gpointer);
+static void on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer userdata);
/* GtkHtml signals */
static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view);
ModestMsgView *msg_view);
static gboolean on_link_hover (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view);
+#ifdef MAEMO_CHANGES
+static void on_tap_and_hold (GtkWidget *widget, gpointer userdata);
+#endif /*MAEMO_CHANGES*/
+
+
/* size allocation and drawing handlers */
static void get_view_allocation (ModestMsgView *msg_view, GtkAllocation *allocation);
static void size_request (GtkWidget *widget, GtkRequisition *req);
LINK_HOVER_SIGNAL,
ATTACHMENT_CLICKED_SIGNAL,
RECPT_ACTIVATED_SIGNAL,
+ LINK_CONTEXTUAL_SIGNAL,
LAST_SIGNAL
};
+/* list properties */
+enum {
+ PROP_0,
+ PROP_HADJUSTMENT,
+ PROP_VADJUSTMENT,
+ PROP_SHADOW_TYPE
+};
+
typedef struct _ModestMsgViewPrivate ModestMsgViewPrivate;
struct _ModestMsgViewPrivate {
GtkWidget *gtkhtml;
/* embedded elements */
GtkWidget *headers_box;
GtkWidget *html_scroll;
+ GtkWidget *attachments_box;
/* internal adjustments for set_scroll_adjustments */
GtkAdjustment *hadj;
GtkAdjustment *vadj;
+ GtkShadowType shadow_type;
/* gdk windows for drawing */
GdkWindow *view_window;
GdkWindow *headers_window;
GdkWindow *html_window;
+ /* zoom */
+ gdouble current_zoom;
+
+ /* link click management */
+ gchar *last_url;
+
+ TnyHeaderFlags priority_flags;
+
gulong sig1, sig2, sig3;
};
#define MODEST_MSG_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
parent_class = g_type_class_peek_parent (klass);
gobject_class->finalize = modest_msg_view_finalize;
+ gobject_class->set_property = set_property;
+ gobject_class->get_property = get_property;
gtkobject_class->destroy = modest_msg_view_destroy;
widget_class->realize = realize;
g_type_class_add_private (gobject_class, sizeof(ModestMsgViewPrivate));
+ g_object_class_install_property (gobject_class,
+ PROP_HADJUSTMENT,
+ g_param_spec_object ("hadjustment",
+ _("Horizontal adjustment"),
+ _("GtkAdjustment with information of the horizontal visible position"),
+ GTK_TYPE_ADJUSTMENT,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class,
+ PROP_VADJUSTMENT,
+ g_param_spec_object ("vadjustment",
+ _("Vertical adjustment"),
+ _("GtkAdjustment with information of the vertical visible position"),
+ GTK_TYPE_ADJUSTMENT,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (gobject_class,
+ PROP_SHADOW_TYPE,
+ g_param_spec_enum ("shadow_type",
+ _("Shadow type"),
+ _("Kind of shadow that's shown around the view"),
+ GTK_TYPE_SHADOW_TYPE,
+ GTK_SHADOW_IN,
+ G_PARAM_READABLE | G_PARAM_WRITABLE ));
+
signals[LINK_CLICKED_SIGNAL] =
g_signal_new ("link_clicked",
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET(ModestMsgViewClass, attachment_clicked),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_INT);
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
signals[LINK_HOVER_SIGNAL] =
g_signal_new ("link_hover",
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
+ signals[LINK_CONTEXTUAL_SIGNAL] =
+ g_signal_new ("link_contextual",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET(ModestMsgViewClass, link_contextual),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
+
widget_class->set_scroll_adjustments_signal =
g_signal_new ("set_scroll_adjustments",
G_OBJECT_CLASS_TYPE (gobject_class),
}
static void
+set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ModestMsgView *msg_view = MODEST_MSG_VIEW (object);
+
+ switch (prop_id) {
+ case PROP_HADJUSTMENT:
+ modest_msg_view_set_hadjustment (msg_view, g_value_get_object (value));
+ break;
+ case PROP_VADJUSTMENT:
+ modest_msg_view_set_vadjustment (msg_view, g_value_get_object (value));
+ break;
+ case PROP_SHADOW_TYPE:
+ modest_msg_view_set_shadow_type (msg_view, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ModestMsgView *msg_view = MODEST_MSG_VIEW (object);
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
+
+ switch (prop_id) {
+ case PROP_HADJUSTMENT:
+ g_value_set_object (value, priv->hadj);
+ break;
+ case PROP_VADJUSTMENT:
+ g_value_set_object (value, priv->vadj);
+ break;
+ case PROP_SHADOW_TYPE:
+ g_value_set_enum (value, priv->shadow_type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
disconnect_hadjustment (ModestMsgView *msg_view)
{
ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
{
/* This method gets the allocation of the widget in parent widget. It's the
real position and size of the widget */
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
allocation->x = 0;
allocation->y = 0;
- allocation->width = MAX (1, GTK_WIDGET (msg_view)->allocation.width);
- allocation->height = MAX (1, GTK_WIDGET (msg_view)->allocation.height);
+ if (priv->shadow_type != GTK_SHADOW_NONE) {
+ allocation->x = GTK_WIDGET (msg_view)->style->xthickness;
+ allocation->y = GTK_WIDGET (msg_view)->style->ythickness;
+ }
+
+ allocation->width = MAX (1, (GTK_WIDGET (msg_view)->allocation.width) - allocation->x * 2);
+ allocation->height = MAX (1, (GTK_WIDGET (msg_view)->allocation.height) - allocation->y * 2);
}
GtkAdjustment *hadj,
GtkAdjustment *vadj)
{
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
modest_msg_view_set_hadjustment (msg_view, hadj);
modest_msg_view_set_vadjustment (msg_view, vadj);
+
+ gtk_container_set_focus_vadjustment (GTK_CONTAINER (priv->gtkhtml), vadj);
}
static void
priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
if (event->window == widget->window) {
gtk_paint_shadow (widget->style, widget->window,
- GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+ GTK_STATE_NORMAL, priv->shadow_type,
&event->area, widget, "msgview",
0,0,-1,-1);
} else if (event->window == priv->headers_window) {
ModestMsgView *msg_view = MODEST_MSG_VIEW (widget);
ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
gboolean hadj_value_changed, vadj_value_changed;
- GtkAllocation headers_allocation, html_allocation;
+ GtkAllocation headers_allocation, html_allocation, view_allocation;
GtkAdjustment *html_vadj;
+ if (GTK_WIDGET_MAPPED (widget) &&
+ priv->shadow_type != GTK_SHADOW_NONE &&
+ (allocation->width != widget->allocation.width ||
+ allocation->height != widget->allocation.height))
+ gdk_window_invalidate_rect (widget->window, NULL, FALSE);
+
widget->allocation = *allocation;
set_hadjustment_values (msg_view, &hadj_value_changed);
set_vadjustment_values (msg_view, &vadj_value_changed);
+ get_view_allocation (msg_view, &view_allocation);
+
headers_allocation.x = 0;
headers_allocation.y = 0;
- headers_allocation.width = allocation->width;
+ headers_allocation.width = view_allocation.width;
if (priv->headers_box)
headers_allocation.height = GTK_WIDGET (priv->headers_box)->requisition.height;
else
html_allocation.x = 0;
html_allocation.y = headers_allocation.height;
- html_allocation.width = allocation->width;
+ html_allocation.width = view_allocation.width;
html_allocation.height = MAX ((gint) html_vadj->upper, (gint)(priv->vadj->upper - headers_allocation.height));
if (GTK_WIDGET_REALIZED (widget)) {
- GtkAllocation view_allocation;
gdk_window_move_resize (widget->window,
allocation->x,
allocation->y,
allocation->width,
allocation->height);
- get_view_allocation (msg_view, &view_allocation);
-
gdk_window_move_resize (priv->view_window,
view_allocation.x,
view_allocation.y,
priv = MODEST_MSG_VIEW_GET_PRIVATE(obj);
+ priv->current_zoom = 1.0;
+ priv->priority_flags = 0;
+
priv->hadj = NULL;
priv->vadj = NULL;
+ priv->shadow_type = GTK_SHADOW_IN;
priv->view_window = NULL;
priv->headers_window = NULL;
priv->html_window = NULL;
gtk_html_set_blocking (GTK_HTML(priv->gtkhtml), FALSE);
gtk_html_set_images_blocking (GTK_HTML(priv->gtkhtml), FALSE);
- priv->mail_header_view = GTK_WIDGET(modest_mail_header_view_new ());
+ priv->mail_header_view = GTK_WIDGET(modest_mail_header_view_new (TRUE));
gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
priv->attachments_view = GTK_WIDGET(modest_attachments_view_new (NULL));
- gtk_widget_set_no_show_all (priv->attachments_view, TRUE);
priv->sig1 = g_signal_connect (G_OBJECT(priv->gtkhtml), "link_clicked",
G_CALLBACK(on_link_clicked), obj);
static void
modest_msg_view_destroy (GtkObject *obj)
{
- ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (obj);
disconnect_vadjustment (MODEST_MSG_VIEW(obj));
disconnect_hadjustment (MODEST_MSG_VIEW(obj));
gtk_adjustment_value_changed (hadj);
else
adjustment_value_changed (hadj, msg_view);
+
+ g_object_notify (G_OBJECT (msg_view), "hadjustment");
}
void
gtk_adjustment_value_changed (vadj);
else
adjustment_value_changed (vadj, msg_view);
+
+ g_object_notify (G_OBJECT (msg_view), "vadjustment");
+}
+
+/**
+ * modest_msg_view_set_shadow_type:
+ * @msg_view: a #ModestMsgView.
+ * @shadow_type: new shadow type.
+ *
+ * Sets a shadow type of the message view.
+ **/
+void
+modest_msg_view_set_shadow_type (ModestMsgView *msg_view,
+ GtkShadowType shadow_type)
+{
+ ModestMsgViewPrivate *priv;
+ g_return_if_fail (MODEST_IS_MSG_VIEW (msg_view));
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
+
+ if (priv->shadow_type != shadow_type) {
+ priv->shadow_type = shadow_type;
+
+ if (GTK_WIDGET_VISIBLE (msg_view)) {
+ gtk_widget_size_allocate (GTK_WIDGET (msg_view), &(GTK_WIDGET (msg_view)->allocation));
+ gtk_widget_queue_draw (GTK_WIDGET (msg_view));
+ }
+ g_object_notify (G_OBJECT (msg_view), "shadow-type");
+ }
+}
+
+/**
+ * modest_msg_view_get_shadow_type:
+ * @msg_view: a #ModestMsgView
+ *
+ * Gets the current shadow type of the #ModestMsgView.
+ *
+ * Return value: the shadow type
+ **/
+GtkShadowType
+modest_msg_view_get_shadow_type (ModestMsgView *msg_view)
+{
+ ModestMsgViewPrivate *priv;
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (msg_view), GTK_SHADOW_NONE);
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
+
+ return priv->shadow_type;
}
GtkWidget*
GObject *obj;
ModestMsgView* self;
ModestMsgViewPrivate *priv;
+ GtkWidget *separator;
obj = G_OBJECT(g_object_new(MODEST_TYPE_MSG_VIEW, NULL));
self = MODEST_MSG_VIEW(obj);
if (priv->mail_header_view)
gtk_box_pack_start (GTK_BOX(priv->headers_box), priv->mail_header_view, FALSE, FALSE, 0);
- if (priv->attachments_view)
- gtk_box_pack_start (GTK_BOX(priv->headers_box), priv->attachments_view, FALSE, FALSE, 0);
+ if (priv->attachments_view) {
+ priv->attachments_box = (GtkWidget *) modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view),
+ _("Attachments:"), priv->attachments_view,
+ FALSE, FALSE);
+ gtk_widget_hide_all (priv->attachments_box);
+/* gtk_widget_set_no_show_all (priv->attachments_box, TRUE); */
+ }
+
+ separator = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX(priv->headers_box), separator, FALSE, FALSE, 0);
gtk_widget_set_parent (priv->headers_box, GTK_WIDGET (self));
if (priv->gtkhtml) {
gtk_container_add (GTK_CONTAINER (priv->html_scroll), priv->gtkhtml);
gtk_widget_set_parent (priv->html_scroll, GTK_WIDGET(self));
+#ifdef MAEMO_CHANGES
+ gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->gtkhtml), NULL, NULL, 0);
+ g_signal_connect (G_OBJECT (priv->gtkhtml), "tap-and-hold", G_CALLBACK (on_tap_and_hold), obj);
+#endif
}
modest_msg_view_set_message (self, msg);
return GTK_WIDGET(self);
}
+#ifdef MAEMO_CHANGES
+static void
+on_tap_and_hold (GtkWidget *widget,
+ gpointer data)
+{
+ ModestMsgView *msg_view = (ModestMsgView *) data;
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
+
+ g_signal_emit (G_OBJECT (msg_view), signals[LINK_CONTEXTUAL_SIGNAL],
+ 0, priv->last_url);
+}
+#endif
+
static void
on_recpt_activated (ModestMailHeaderView *header_view,
const gchar *address,
}
static void
-on_attachment_activated (ModestAttachmentsView * att_view, gint index, gpointer msg_view)
+on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer msg_view)
{
-
- if (index == 0) {
- /* index is 1-based, so 0 indicates an error */
- g_printerr ("modest: invalid attachment index: %d\n", index);
- return;
- }
-
g_signal_emit (G_OBJECT(msg_view), signals[ATTACHMENT_CLICKED_SIGNAL],
- 0, index);
+ 0, mime_part);
}
static gboolean
static gboolean
on_link_hover (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view)
{
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (msg_view);
+
+ g_free (priv->last_url);
+ priv->last_url = g_strdup (uri);
+
g_signal_emit (G_OBJECT(msg_view), signals[LINK_HOVER_SIGNAL],
0, uri);
if (!msg) {
tny_header_view_clear (TNY_HEADER_VIEW (priv->mail_header_view));
+ modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
gtk_widget_hide_all (priv->mail_header_view);
- gtk_widget_hide_all (priv->attachments_view);
- gtk_widget_set_no_show_all (priv->attachments_view, TRUE);
+ gtk_widget_hide_all (priv->attachments_box);
gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
set_empty_message (self);
gtk_widget_queue_resize (GTK_WIDGET(self));
modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW(priv->attachments_view),
msg);
- body = modest_tny_msg_find_body_part (msg,TRUE);
+ body = modest_tny_msg_find_body_part (msg, TRUE);
if (body) {
if (tny_mime_part_content_type_is (body, "text/html"))
set_html_message (self, body, msg);
else
set_text_message (self, body, msg);
+
+ if(modest_attachments_view_has_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view))) {
+ gtk_widget_show_all (priv->attachments_box);
+ } else {
+ gtk_widget_hide_all (priv->attachments_box);
+ }
+
+/* g_print ("---\nfilename %s\ncontent_location %s\ncontent_id%s\ncontent_type%s\n", */
+/* tny_mime_part_get_filename (body), */
+/* tny_mime_part_get_content_location (body), */
+/* tny_mime_part_get_content_id (body), */
+/* tny_mime_part_get_content_type (body)); */
+
} else
set_empty_message (self);
gtk_widget_show (priv->gtkhtml);
+ gtk_widget_set_no_show_all (priv->attachments_box, TRUE);
gtk_widget_show_all (priv->mail_header_view);
- gtk_widget_show_all (priv->attachments_view);
+ gtk_widget_set_no_show_all (priv->attachments_box, FALSE);
+/* gtk_widget_show_all (priv->attachments_box); */
+/* gtk_widget_show_all (priv->attachments_box); */
gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
gtk_widget_queue_resize (GTK_WIDGET(self));
gtk_widget_queue_draw (GTK_WIDGET(self));
TnyMsg*
modest_msg_view_get_message (ModestMsgView *self)
{
- g_return_val_if_fail (self, NULL);
+ TnyMsg *msg;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), NULL);
+
+ msg = MODEST_MSG_VIEW_GET_PRIVATE(self)->msg;
+
+ if (msg)
+ g_object_ref (msg);
- return MODEST_MSG_VIEW_GET_PRIVATE(self)->msg;
+ return msg;
}
+gboolean
+modest_msg_view_get_message_is_empty (ModestMsgView *self)
+{
+ /* TODO: Find some gtkhtml API to check whether there is any (visible, non markup)
+ * text in the message:
+ */
+
+ return FALSE;
+}
+
+
+gboolean
+modest_msg_view_search (ModestMsgView *self, const gchar *search)
+{
+ ModestMsgViewPrivate *priv;
+ gboolean result;
+ GtkAdjustment *vadj, *tmp_vadj;
+ gdouble y_offset;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), FALSE);
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+ vadj = gtk_layout_get_vadjustment (GTK_LAYOUT (priv->gtkhtml));
+ g_object_ref (vadj);
+ tmp_vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, vadj->lower, vadj->upper, vadj->step_increment, 32.0, 32.0));
+ gtk_layout_set_vadjustment (GTK_LAYOUT (priv->gtkhtml), tmp_vadj);
+ result = gtk_html_engine_search (GTK_HTML (priv->gtkhtml),
+ search,
+ FALSE, TRUE, TRUE);
+
+// wait for the updated gtkhtml (w27) to enable this
+#if 0
+ if (result) {
+ gint x, y, w, h;
+ gdouble offset_top, offset_bottom;
+ GtkAdjustment *adj;
+ gtk_html_get_selection_area (GTK_HTML (priv->gtkhtml), &x, &y, &w, &h);
+ offset_top = (gdouble) (priv->headers_box->requisition.height + y);
+ offset_bottom = (gdouble) (priv->headers_box->requisition.height + y + h);
+ adj = GTK_ADJUSTMENT (priv->vadj);
+ if (offset_top < adj->value)
+ gtk_adjustment_set_value (adj, offset_top + adj->page_increment - adj->page_size);
+ else if (offset_bottom > adj->value + adj->page_increment)
+ gtk_adjustment_set_value (adj, offset_bottom - adj->page_increment);
+ }
+#endif
+
+ y_offset = tmp_vadj->value;
+ gtk_layout_set_vadjustment (GTK_LAYOUT (priv->gtkhtml), vadj);
+ g_object_unref (vadj);
+
+ return result;
+}
+
+gboolean
+modest_msg_view_search_next (ModestMsgView *self)
+{
+ ModestMsgViewPrivate *priv;
+ gboolean result;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), FALSE);
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+ result = gtk_html_engine_search_next (GTK_HTML (priv->gtkhtml));
+
+// fixme wait for new gtkhtml
+#if 0
+ if (result) {
+ gint x, y, w, h;
+ gdouble offset_top, offset_bottom;
+ GtkAdjustment *adj;
+ gtk_html_get_selection_area (GTK_HTML (priv->gtkhtml), &x, &y, &w, &h);
+ g_message ("SELECTION AREA x%d y%d w%d h%d", x, y, w, h);
+ offset_top = (gdouble) (priv->headers_box->requisition.height + y);
+ offset_bottom = (gdouble) (priv->headers_box->requisition.height + y + h);
+ adj = GTK_ADJUSTMENT (priv->vadj);
+ if (offset_top < adj->value)
+ gtk_adjustment_set_value (adj, offset_top + adj->page_increment - adj->page_size);
+ else if (offset_bottom > adj->value + adj->page_increment)
+ gtk_adjustment_set_value (adj, offset_bottom - adj->page_increment);
+ }
+#endif
+ return result;
+}
+
+void
+modest_msg_view_set_zoom (ModestMsgView *self, gdouble zoom)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW (self));
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+ priv->current_zoom = zoom;
+ gtk_html_set_magnification (GTK_HTML(priv->gtkhtml), zoom);
+
+ gtk_widget_queue_resize (priv->gtkhtml);
+}
+
+gdouble
+modest_msg_view_get_zoom (ModestMsgView *self)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), 1.0);
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+
+ return priv->current_zoom;
+}
+
+TnyHeaderFlags
+modest_msg_view_get_priority (ModestMsgView *self)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), 0);
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+
+ return priv->priority_flags;
+}
+
+void
+modest_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW (self));
+
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+
+ priv->priority_flags = flags & (TNY_HEADER_FLAG_HIGH_PRIORITY);
+
+ modest_mail_header_view_set_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), flags);
+}
+
+GList *
+modest_msg_view_get_selected_attachments (ModestMsgView *self)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), NULL);
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+
+ return modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
+
+}
+
+GList *
+modest_msg_view_get_attachments (ModestMsgView *self)
+{
+ ModestMsgViewPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW (self), NULL);
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
+
+ return modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
+
+}
+
+void
+modest_msg_view_grab_focus (ModestMsgView *view)
+{
+ ModestMsgViewPrivate *priv = NULL;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW (view));
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (view);
+
+ gtk_widget_grab_focus (priv->gtkhtml);
+}
+
+void
+modest_msg_view_remove_attachment (ModestMsgView *view, TnyMimePart *attachment)
+{
+ TnyMsg *msg;
+ ModestMsgViewPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW (view));
+ g_return_if_fail (TNY_IS_MIME_PART (attachment));
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (view);
+
+ msg = modest_msg_view_get_message (view);
+ modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
+ attachment);
+
+}