X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-msg-view.c;h=728ec5d7b7258bf75eebb6d92a714a0b291d03d5;hp=e726529fc24d1761cf44d1c90edd128ecdffddab;hb=c04e24ad16b9a570a1152ec2c05c953fe39a3c3c;hpb=cf7593ba08e1ade84656add10c0584d3182bc74c diff --git a/src/widgets/modest-msg-view.c b/src/widgets/modest-msg-view.c index e726529..728ec5d 100644 --- a/src/widgets/modest-msg-view.c +++ b/src/widgets/modest-msg-view.c @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include #include @@ -57,7 +59,7 @@ static void get_property (GObject *object, guint prop_id, GValue *value, GPa /* 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); @@ -65,6 +67,11 @@ static gboolean on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLSt 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); @@ -91,6 +98,7 @@ enum { LINK_HOVER_SIGNAL, ATTACHMENT_CLICKED_SIGNAL, RECPT_ACTIVATED_SIGNAL, + LINK_CONTEXTUAL_SIGNAL, LAST_SIGNAL }; @@ -113,6 +121,7 @@ struct _ModestMsgViewPrivate { /* embedded elements */ GtkWidget *headers_box; GtkWidget *html_scroll; + GtkWidget *attachments_box; /* internal adjustments for set_scroll_adjustments */ GtkAdjustment *hadj; @@ -124,6 +133,14 @@ struct _ModestMsgViewPrivate { 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), \ @@ -230,8 +247,8 @@ modest_msg_view_class_init (ModestMsgViewClass *klass) 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", @@ -251,6 +268,15 @@ modest_msg_view_class_init (ModestMsgViewClass *klass) 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), @@ -437,8 +463,11 @@ set_scroll_adjustments (ModestMsgView *msg_view, 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 @@ -830,6 +859,9 @@ modest_msg_view_init (ModestMsgView *obj) 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; @@ -853,11 +885,10 @@ modest_msg_view_init (ModestMsgView *obj) 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); @@ -1045,6 +1076,7 @@ modest_msg_view_new (TnyMsg *msg) GObject *obj; ModestMsgView* self; ModestMsgViewPrivate *priv; + GtkWidget *separator; obj = G_OBJECT(g_object_new(MODEST_TYPE_MSG_VIEW, NULL)); self = MODEST_MSG_VIEW(obj); @@ -1058,14 +1090,26 @@ modest_msg_view_new (TnyMsg *msg) 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); @@ -1073,6 +1117,19 @@ modest_msg_view_new (TnyMsg *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, @@ -1082,18 +1139,11 @@ on_recpt_activated (ModestMailHeaderView *header_view, } 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 @@ -1111,6 +1161,11 @@ on_link_clicked (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view) 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); @@ -1297,8 +1352,7 @@ modest_msg_view_set_message (ModestMsgView *self, TnyMsg *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)); @@ -1313,18 +1367,34 @@ modest_msg_view_set_message (ModestMsgView *self, TnyMsg *msg) 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)); @@ -1340,8 +1410,175 @@ modest_msg_view_set_message (ModestMsgView *self, TnyMsg *msg) 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_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); +#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)); +#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)); + +} + +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); + +}