Remove not used size_limit item in settings dialog
[modest] / src / widgets / modest-webkit-msg-view.c
1 /* Copyright (c) 2006, 2007, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <config.h>
31 #include <tny-gtk-text-buffer-stream.h>
32 #include <string.h>
33 #include <regex.h>
34 #include <ctype.h>
35 #include <stdlib.h>
36 #include <glib/gi18n.h>
37 #include <tny-list.h>
38 #include <tny-simple-list.h>
39 #include <tny-vfs-stream.h>
40
41 #include <modest-tny-msg.h>
42 #include <modest-text-utils.h>
43 #include <widgets/modest-msg-view.h>
44 #include <widgets/modest-compact-mail-header-view.h>
45 #ifdef MODEST_TOOLKIT_HILDON2
46 #include <hildon/hildon-gtk.h>
47 #endif
48 #include <widgets/modest-attachments-view.h>
49 #include <modest-marshal.h>
50 #include <widgets/modest-webkit-mime-part-view.h>
51 #include <widgets/modest-webkit-msg-view.h>
52 #include <widgets/modest-isearch-view.h>
53 #include <widgets/modest-ui-constants.h>
54 #include <modest-icon-names.h>
55 #include <gtk/gtk.h>
56
57 /* 'private'/'protected' functions */
58 static void     modest_webkit_msg_view_class_init   (ModestWebkitMsgViewClass *klass);
59 static void     tny_header_view_init (gpointer g, gpointer iface_data);
60 static void     tny_msg_view_init (gpointer g, gpointer iface_data);
61 static void     tny_mime_part_view_init (gpointer g, gpointer iface_data);
62 static void     modest_mime_part_view_init (gpointer g, gpointer iface_data);
63 static void     modest_zoomable_init (gpointer g, gpointer iface_data);
64 static void     modest_isearch_view_init (gpointer g, gpointer iface_data);
65 static void     modest_msg_view_init (gpointer g, gpointer iface_data);
66 static void     modest_webkit_msg_view_init         (ModestWebkitMsgView *obj);
67 static void     modest_webkit_msg_view_finalize     (GObject *obj);
68 static void     modest_webkit_msg_view_destroy     (GtkObject *obj);
69
70 /* headers signals */
71 static void on_recpt_activated (ModestMailHeaderView *header_view, const gchar *address, ModestWebkitMsgView *msg_view);
72 static void on_show_details (ModestMailHeaderView *header_view, ModestWebkitMsgView *msg_view);
73 static void on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer userdata);
74
75 /* body view signals */
76 static gboolean on_activate_link (GtkWidget *widget, const gchar *uri, ModestWebkitMsgView *msg_view);
77 static gboolean on_fetch_url (GtkWidget *widget, const gchar *uri, TnyStream *stream,
78                               ModestWebkitMsgView *msg_view);
79 static gboolean on_link_hover (GtkWidget *widget, const gchar *uri, ModestWebkitMsgView *msg_view);
80 static void on_limit_error (GtkWidget *widget, ModestWebkitMsgView *msg_view);
81
82 /* TnyMimePartView implementation */
83 static void modest_msg_view_mp_clear (TnyMimePartView *self);
84 static void modest_msg_view_mp_set_part (TnyMimePartView *self, TnyMimePart *part);
85 static void modest_msg_view_mp_set_part_default (TnyMimePartView *self, TnyMimePart *part);
86 static TnyMimePart* modest_msg_view_mp_get_part (TnyMimePartView *self);
87 static TnyMimePart* modest_msg_view_mp_get_part_default (TnyMimePartView *self);
88 /* ModestMimePartView implementation */
89 static gboolean modest_msg_view_mp_is_empty (ModestMimePartView *self);
90 static gboolean modest_msg_view_mp_is_empty_default (ModestMimePartView *self);
91 /* TnyHeaderView implementation */
92 static void modest_msg_view_set_header (TnyHeaderView *self, TnyHeader *header);
93 static void modest_msg_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
94 static void modest_msg_view_clear_header (TnyHeaderView *self);
95 static void modest_msg_view_clear_header_default (TnyHeaderView *self);
96 /* TnyMsgView implementation */
97 static TnyMsg *modest_msg_view_get_msg (TnyMsgView *self);
98 static TnyMsg *modest_msg_view_get_msg_default (TnyMsgView *self);
99 static void modest_msg_view_set_msg (TnyMsgView *self, TnyMsg *msg);
100 static void modest_msg_view_set_msg_default (TnyMsgView *self, TnyMsg *msg);
101 static void modest_msg_view_clear (TnyMsgView *self);
102 static void modest_msg_view_clear_default (TnyMsgView *self);
103 static void modest_msg_view_set_unavailable (TnyMsgView *self);
104 static void modest_msg_view_set_unavailable_default (TnyMsgView *self);
105 static TnyMimePartView *modest_msg_view_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part);
106 static TnyMimePartView *modest_msg_view_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part);
107 static TnyMsgView *modest_msg_view_create_new_inline_viewer (TnyMsgView *self);
108 static TnyMsgView *modest_msg_view_create_new_inline_viewer_default (TnyMsgView *self);
109 /* ModestZoomable implementation */
110 static gdouble modest_msg_view_get_zoom (ModestZoomable *self);
111 static void modest_msg_view_set_zoom (ModestZoomable *self, gdouble value);
112 static gboolean modest_msg_view_zoom_minus (ModestZoomable *self);
113 static gboolean modest_msg_view_zoom_plus (ModestZoomable *self);
114 static gdouble modest_msg_view_get_zoom_default (ModestZoomable *self);
115 static void modest_msg_view_set_zoom_default (ModestZoomable *self, gdouble value);
116 static gboolean modest_msg_view_zoom_minus_default (ModestZoomable *self);
117 static gboolean modest_msg_view_zoom_plus_default (ModestZoomable *self);
118 /* ModestISearchView implementation */
119 static gboolean modest_msg_view_search (ModestISearchView *self, const gchar *string);
120 static gboolean modest_msg_view_search_default (ModestISearchView *self, const gchar *string);
121 static gboolean modest_msg_view_search_next (ModestISearchView *self);
122 static gboolean modest_msg_view_search_next_default (ModestISearchView *self);
123 /* ModestMsgView implementation */
124 static void modest_webkit_msg_view_set_msg_with_other_body (ModestMsgView *self, TnyMsg *msg, TnyMimePart *other_body);
125 static GtkAdjustment *modest_webkit_msg_view_get_vadjustment (ModestMsgView *self);
126 static GtkAdjustment *modest_webkit_msg_view_get_hadjustment (ModestMsgView *self);
127 static void modest_webkit_msg_view_set_vadjustment (ModestMsgView *self, GtkAdjustment *vadj);
128 static void modest_webkit_msg_view_set_hadjustment (ModestMsgView *self, GtkAdjustment *hadj);
129 static void modest_webkit_msg_view_set_shadow_type (ModestMsgView *self, GtkShadowType type);
130 static GtkShadowType modest_webkit_msg_view_get_shadow_type (ModestMsgView *self);
131 static TnyHeaderFlags modest_webkit_msg_view_get_priority (ModestMsgView *self);
132 static void modest_webkit_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags);
133 static TnyList *modest_webkit_msg_view_get_selected_attachments (ModestMsgView *self);
134 static TnyList *modest_webkit_msg_view_get_attachments (ModestMsgView *self);
135 static void modest_webkit_msg_view_grab_focus (ModestMsgView *self);
136 static void modest_webkit_msg_view_remove_attachment (ModestMsgView *view, TnyMimePart *attachment);
137 static void modest_webkit_msg_view_request_fetch_images (ModestMsgView *view);
138 static void modest_webkit_msg_view_set_branding (ModestMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
139 static gboolean modest_webkit_msg_view_has_blocked_external_images (ModestMsgView *view);
140 static void modest_webkit_msg_view_set_msg_with_other_body_default (ModestMsgView *view, TnyMsg *msg, TnyMimePart *part);
141 static GtkAdjustment *modest_webkit_msg_view_get_vadjustment_default (ModestMsgView *self);
142 static GtkAdjustment *modest_webkit_msg_view_get_hadjustment_default (ModestMsgView *self);
143 static void modest_webkit_msg_view_set_vadjustment_default (ModestMsgView *self, GtkAdjustment *vadj);
144 static void modest_webkit_msg_view_set_hadjustment_default (ModestMsgView *self, GtkAdjustment *hadj);
145 static void modest_webkit_msg_view_set_shadow_type_default (ModestMsgView *self, GtkShadowType type);
146 static GtkShadowType modest_webkit_msg_view_get_shadow_type_default (ModestMsgView *self);
147 static TnyHeaderFlags modest_webkit_msg_view_get_priority_default (ModestMsgView *self);
148 static void modest_webkit_msg_view_set_priority_default (ModestMsgView *self, TnyHeaderFlags flags);
149 static TnyList *modest_webkit_msg_view_get_selected_attachments_default (ModestMsgView *self);
150 static TnyList *modest_webkit_msg_view_get_attachments_default (ModestMsgView *self);
151 static void modest_webkit_msg_view_grab_focus_default (ModestMsgView *self);
152 static void modest_webkit_msg_view_remove_attachment_default (ModestMsgView *view, TnyMimePart *attachment);
153 static gboolean modest_webkit_msg_view_has_blocked_external_images_default (ModestMsgView *view);
154 static void modest_webkit_msg_view_request_fetch_images_default (ModestMsgView *view);
155 static void modest_webkit_msg_view_set_branding_default (ModestMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
156
157 /* internal api */
158 static void     set_header     (ModestWebkitMsgView *self, TnyHeader *header);
159 static TnyMsg   *get_message   (ModestWebkitMsgView *self);
160 static void     set_message    (ModestWebkitMsgView *self, TnyMsg *tny_msg, TnyMimePart *other_body);
161 static gboolean is_empty       (ModestWebkitMsgView *self); 
162 static void     set_zoom       (ModestWebkitMsgView *self, gdouble zoom);
163 static gdouble  get_zoom       (ModestWebkitMsgView *self);
164 static gboolean search         (ModestWebkitMsgView *self, const gchar *search);
165 static gboolean search_next    (ModestWebkitMsgView *self);
166 static GtkAdjustment *get_vadjustment (ModestWebkitMsgView *self);
167 static GtkAdjustment *get_hadjustment (ModestWebkitMsgView *self);
168 static void set_vadjustment (ModestWebkitMsgView *self, GtkAdjustment *vadj);
169 static void set_hadjustment (ModestWebkitMsgView *self, GtkAdjustment *hadj);
170 static void set_shadow_type (ModestWebkitMsgView *self, GtkShadowType type);
171 static GtkShadowType get_shadow_type (ModestWebkitMsgView *self);
172 static TnyHeaderFlags get_priority (ModestWebkitMsgView *self);
173 static void set_priority (ModestWebkitMsgView *self, TnyHeaderFlags flags);
174 static TnyList *get_selected_attachments (ModestWebkitMsgView *self);
175 static TnyList *get_attachments (ModestWebkitMsgView *self);
176 static void grab_focus (ModestWebkitMsgView *self);
177 static void remove_attachment (ModestWebkitMsgView *view, TnyMimePart *attachment);
178 static void request_fetch_images (ModestWebkitMsgView *view);
179 static void set_branding (ModestWebkitMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
180 static gboolean has_blocked_external_images (ModestWebkitMsgView *view);
181
182 typedef struct _ModestWebkitMsgViewPrivate ModestWebkitMsgViewPrivate;
183 struct _ModestWebkitMsgViewPrivate {
184         GtkWidget   *body_view;
185         GtkWidget   *mail_header_view;
186         GtkWidget   *attachments_view;
187
188         TnyMsg      *msg;
189
190         /* embedded elements */
191         GtkWidget   *headers_box;
192         GtkWidget   *attachments_box;
193
194         GtkWidget   *priority_box;
195         GtkWidget   *priority_icon;
196
197         /* zoom */
198         gdouble current_zoom;
199
200         /* link click management */
201         gchar *last_url;
202 };
203
204 #define MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
205                                                                                  MODEST_TYPE_WEBKIT_MSG_VIEW, \
206                                                                                  ModestWebkitMsgViewPrivate))
207
208 /* globals */
209 static GtkContainerClass *parent_class = NULL;
210
211 GType
212 modest_webkit_msg_view_get_type (void)
213 {
214         static GType my_type = 0;
215         if (!my_type) {
216                 static const GTypeInfo my_info = {
217                         sizeof(ModestWebkitMsgViewClass),
218                         NULL,           /* base init */
219                         NULL,           /* base finalize */
220                         (GClassInitFunc) modest_webkit_msg_view_class_init,
221                         NULL,           /* class finalize */
222                         NULL,           /* class data */
223                         sizeof(ModestWebkitMsgView),
224                         1,              /* n_preallocs */
225                         (GInstanceInitFunc) modest_webkit_msg_view_init,
226                         NULL
227                 };
228                 static const GInterfaceInfo tny_msg_view_info = 
229                 {
230                   (GInterfaceInitFunc) tny_msg_view_init, /* interface_init */
231                   NULL,         /* interface_finalize */
232                   NULL          /* interface_data */
233                 };
234
235                 static const GInterfaceInfo tny_mime_part_view_info = 
236                 {
237                   (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
238                   NULL,         /* interface_finalize */
239                   NULL          /* interface_data */
240                 };
241
242                 static const GInterfaceInfo tny_header_view_info = 
243                 {
244                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
245                   NULL,         /* interface_finalize */
246                   NULL          /* interface_data */
247                 };
248
249                 static const GInterfaceInfo modest_mime_part_view_info = 
250                 {
251                   (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
252                   NULL,         /* interface_finalize */
253                   NULL          /* interface_data */
254                 };
255
256                 static const GInterfaceInfo modest_zoomable_info = 
257                 {
258                   (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
259                   NULL,         /* interface_finalize */
260                   NULL          /* interface_data */
261                 };
262
263                 static const GInterfaceInfo modest_isearch_view_info = 
264                 {
265                   (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
266                   NULL,         /* interface_finalize */
267                   NULL          /* interface_data */
268                 };
269
270                 static const GInterfaceInfo modest_msg_view_info = 
271                 {
272                   (GInterfaceInitFunc) modest_msg_view_init, /* interface_init */
273                   NULL,         /* interface_finalize */
274                   NULL          /* interface_data */
275                 };
276
277                 my_type = g_type_register_static (GTK_TYPE_VIEWPORT,
278                                                   "ModestWebkitMsgView",
279                                                   &my_info, 0);
280
281                 g_type_add_interface_static (my_type, TNY_TYPE_HEADER_VIEW, 
282                         &tny_header_view_info);
283
284                 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW, 
285                         &tny_mime_part_view_info);
286
287                 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW, 
288                         &modest_mime_part_view_info);
289
290                 g_type_add_interface_static (my_type, TNY_TYPE_MSG_VIEW, 
291                         &tny_msg_view_info);
292
293                 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE, 
294                         &modest_zoomable_info);
295
296                 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW, 
297                         &modest_isearch_view_info);
298
299                 g_type_add_interface_static (my_type, MODEST_TYPE_MSG_VIEW, 
300                         &modest_msg_view_info);
301         }
302         return my_type;
303 }
304
305 static void
306 modest_webkit_msg_view_class_init (ModestWebkitMsgViewClass *klass)
307 {
308         GObjectClass *gobject_class;
309         GtkWidgetClass *widget_class;
310         GtkObjectClass *gtkobject_class;
311         GtkContainerClass *container_class;
312         gobject_class = (GObjectClass*) klass;
313         widget_class = (GtkWidgetClass *) klass;
314         gtkobject_class = (GtkObjectClass *) klass;
315         container_class = (GtkContainerClass *) klass;
316
317         parent_class            = g_type_class_peek_parent (klass);
318         gobject_class->finalize = modest_webkit_msg_view_finalize;
319         gtkobject_class->destroy = modest_webkit_msg_view_destroy;
320
321         klass->set_header_func = modest_msg_view_set_header_default;
322         klass->clear_header_func = modest_msg_view_clear_header_default;
323         klass->get_part_func = modest_msg_view_mp_get_part_default;
324         klass->set_part_func = modest_msg_view_mp_set_part_default;
325         klass->is_empty_func = modest_msg_view_mp_is_empty_default;
326         klass->get_msg_func = modest_msg_view_get_msg_default;
327         klass->set_msg_func = modest_msg_view_set_msg_default;
328         klass->set_unavailable_func = modest_msg_view_set_unavailable_default;
329         klass->clear_func = modest_msg_view_clear_default;
330         klass->create_mime_part_view_for_func = modest_msg_view_create_mime_part_view_for_default;
331         klass->create_new_inline_viewer_func = modest_msg_view_create_new_inline_viewer_default;
332         klass->get_zoom_func = modest_msg_view_get_zoom_default;
333         klass->set_zoom_func = modest_msg_view_set_zoom_default;
334         klass->zoom_minus_func = modest_msg_view_zoom_minus_default;
335         klass->zoom_plus_func = modest_msg_view_zoom_plus_default;
336         klass->search_func = modest_msg_view_search_default;
337         klass->search_next_func = modest_msg_view_search_next_default;
338         klass->set_msg_with_other_body_func = modest_webkit_msg_view_set_msg_with_other_body_default;
339         klass->get_vadjustment_func = modest_webkit_msg_view_get_vadjustment_default;
340         klass->get_hadjustment_func = modest_webkit_msg_view_get_hadjustment_default;
341         klass->set_vadjustment_func = modest_webkit_msg_view_set_vadjustment_default;
342         klass->set_hadjustment_func = modest_webkit_msg_view_set_hadjustment_default;
343         klass->get_shadow_type_func = modest_webkit_msg_view_get_shadow_type_default;
344         klass->set_shadow_type_func = modest_webkit_msg_view_set_shadow_type_default;
345         klass->get_priority_func = modest_webkit_msg_view_get_priority_default;
346         klass->set_priority_func = modest_webkit_msg_view_set_priority_default;
347         klass->get_selected_attachments_func = modest_webkit_msg_view_get_selected_attachments_default;
348         klass->get_attachments_func = modest_webkit_msg_view_get_attachments_default;
349         klass->grab_focus_func = modest_webkit_msg_view_grab_focus_default;
350         klass->remove_attachment_func = modest_webkit_msg_view_remove_attachment_default;
351         klass->request_fetch_images_func = modest_webkit_msg_view_request_fetch_images_default;
352         klass->set_branding_func = modest_webkit_msg_view_set_branding_default;
353         klass->has_blocked_external_images_func = modest_webkit_msg_view_has_blocked_external_images_default;
354
355         g_type_class_add_private (gobject_class, sizeof(ModestWebkitMsgViewPrivate));
356
357 }
358
359 static void
360 modest_webkit_msg_view_init (ModestWebkitMsgView *obj)
361 {
362         ModestWebkitMsgViewPrivate *priv;
363         GtkWidget *vbox;
364
365         GTK_WIDGET_UNSET_FLAGS (obj, GTK_NO_WINDOW);
366         gtk_widget_set_redraw_on_allocate (GTK_WIDGET (obj), TRUE);
367         gtk_container_set_reallocate_redraws (GTK_CONTAINER (obj), TRUE);
368         gtk_container_set_resize_mode (GTK_CONTAINER (obj), GTK_RESIZE_QUEUE);
369         
370         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE(obj);
371
372         vbox = gtk_vbox_new (FALSE, 0);
373
374         priv->current_zoom = 1.0;
375
376         priv->msg                     = NULL;
377
378         priv->body_view                 = GTK_WIDGET (g_object_new (MODEST_TYPE_WEBKIT_MIME_PART_VIEW, NULL));
379         priv->mail_header_view        = GTK_WIDGET (modest_compact_mail_header_view_new ());
380         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
381         priv->attachments_view        = GTK_WIDGET(modest_attachments_view_new (NULL));
382
383 #ifdef MODEST_TOOLKIT_HILDON2
384         modest_attachments_view_set_style (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
385                                            MODEST_ATTACHMENTS_VIEW_STYLE_LINKS);
386 #else
387         modest_attachments_view_set_style (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
388                                            MODEST_ATTACHMENTS_VIEW_STYLE_SELECTABLE);
389 #endif
390
391         g_signal_connect (G_OBJECT(priv->body_view), "activate_link",
392                                        G_CALLBACK(on_activate_link), obj);
393         g_signal_connect (G_OBJECT(priv->body_view), "fetch_url",
394                                        G_CALLBACK(on_fetch_url), obj);
395         g_signal_connect (G_OBJECT(priv->body_view), "link_hover",
396                                        G_CALLBACK(on_link_hover), obj);
397         g_signal_connect (G_OBJECT(priv->body_view), "limit_error",
398                           G_CALLBACK(on_limit_error), obj);
399
400         g_signal_connect (G_OBJECT (priv->mail_header_view), "recpt-activated", 
401                           G_CALLBACK (on_recpt_activated), obj);
402         g_signal_connect (G_OBJECT (priv->mail_header_view), "show-details", 
403                           G_CALLBACK (on_show_details), obj);
404
405         g_signal_connect (G_OBJECT (priv->attachments_view), "activate",
406                           G_CALLBACK (on_attachment_activated), obj);
407
408         priv->headers_box = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT);
409         gtk_box_pack_start (GTK_BOX (vbox), priv->headers_box, FALSE, FALSE, 0);
410
411         if (priv->mail_header_view)
412                 gtk_box_pack_start (GTK_BOX(priv->headers_box), priv->mail_header_view, FALSE, FALSE, 0);
413
414         priv->priority_icon = gtk_image_new ();
415         gtk_misc_set_alignment (GTK_MISC (priv->priority_icon), 0.0, 0.5);
416         if (priv->priority_icon) {
417                 priv->priority_box = (GtkWidget *)
418                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view),
419                                                                    _("mcen_me_editor_message_priority"),
420                                                                    priv->priority_icon,
421                                                                    FALSE, FALSE);
422                                                                    
423                 gtk_widget_hide_all (priv->priority_box);
424         }
425         if (priv->attachments_view) {
426                 gchar *att_label = g_strconcat (_("mail_va_attachment"), ":", NULL);
427
428                 priv->attachments_box = (GtkWidget *)
429                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view),
430                                                                    att_label,
431                                                                    priv->attachments_view,
432                                                                    FALSE, FALSE);
433                 gtk_widget_hide_all (priv->attachments_box);
434                 g_free (att_label);
435         }
436
437
438         if (priv->body_view) {
439                 gtk_box_pack_start (GTK_BOX (vbox), priv->body_view, TRUE, TRUE, 0);
440         }
441
442         gtk_container_add (GTK_CONTAINER (obj), vbox);
443         gtk_container_set_focus_vadjustment (GTK_CONTAINER (vbox), gtk_viewport_get_vadjustment (GTK_VIEWPORT (obj)));
444         gtk_container_set_focus_vadjustment (GTK_CONTAINER (priv->body_view), gtk_viewport_get_vadjustment (GTK_VIEWPORT (obj)));
445         
446 }
447         
448
449 static void
450 modest_webkit_msg_view_finalize (GObject *obj)
451 {       
452         ModestWebkitMsgViewPrivate *priv;
453         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (obj);
454
455         if (priv->msg) {
456                 g_object_unref (G_OBJECT(priv->msg));
457                 priv->msg = NULL;
458         }
459
460         priv->body_view = NULL;
461         priv->attachments_view = NULL;
462
463         G_OBJECT_CLASS(parent_class)->finalize (obj);           
464 }
465
466 static void
467 modest_webkit_msg_view_destroy (GtkObject *obj)
468 {       
469
470         GTK_OBJECT_CLASS(parent_class)->destroy (obj);          
471 }
472
473 static GtkAdjustment *
474 get_vadjustment (ModestWebkitMsgView *self)
475 {
476         return gtk_viewport_get_vadjustment (GTK_VIEWPORT (self));
477 }
478
479 static GtkAdjustment *
480 get_hadjustment (ModestWebkitMsgView *self)
481 {
482         return gtk_viewport_get_hadjustment (GTK_VIEWPORT (self));
483 }
484
485 static void
486 set_hadjustment (ModestWebkitMsgView *self, GtkAdjustment *hadj)
487 {
488         gtk_viewport_set_hadjustment (GTK_VIEWPORT (self), hadj);
489 }
490
491 static void
492 set_vadjustment (ModestWebkitMsgView *self, GtkAdjustment *vadj)
493 {
494         gtk_viewport_set_vadjustment (GTK_VIEWPORT (self), vadj);
495 }
496
497 static void
498 set_shadow_type (ModestWebkitMsgView *self,
499                  GtkShadowType shadow_type)
500 {
501         gtk_viewport_set_shadow_type (GTK_VIEWPORT (self), shadow_type);
502 }
503
504 static GtkShadowType
505 get_shadow_type (ModestWebkitMsgView *self)
506 {
507         return gtk_viewport_get_shadow_type (GTK_VIEWPORT (self));
508 }
509
510 /* INTERNAL METHODS */
511 GtkWidget*
512 modest_msg_view_new (TnyMsg *msg)
513 {
514         GObject *obj;
515         ModestWebkitMsgView* self;
516         
517         obj  = G_OBJECT(g_object_new(MODEST_TYPE_WEBKIT_MSG_VIEW, NULL));
518         self = MODEST_WEBKIT_MSG_VIEW(obj);
519         tny_msg_view_set_msg (TNY_MSG_VIEW (self), msg);
520
521         return GTK_WIDGET(self);
522 }
523
524
525 static void
526 on_recpt_activated (ModestMailHeaderView *header_view, 
527                     const gchar *address,
528                     ModestWebkitMsgView *self)
529 {
530         g_signal_emit_by_name (G_OBJECT (self), "recpt-activated", address);
531 }
532
533 static void
534 on_show_details (ModestMailHeaderView *header_view, 
535                  ModestWebkitMsgView *self)
536 {
537         g_signal_emit_by_name (G_OBJECT (self), "show-details");
538 }
539
540 static void
541 on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer self)
542 {
543
544         g_signal_emit_by_name (G_OBJECT(self), "attachment_clicked", mime_part);
545 }
546
547 static void
548 request_fetch_images (ModestWebkitMsgView *self)
549 {
550         ModestWebkitMsgViewPrivate *priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
551         TnyMimePart *part;
552
553         /* The message could have not been downloaded yet */
554         if (priv->msg) {
555                 modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), TRUE);
556                 part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (priv->body_view));
557                 if (part) {
558                         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->body_view), part);
559                         g_object_unref (part);
560                 }
561                 tny_msg_set_allow_external_images (TNY_MSG (priv->msg), TRUE);
562         }
563 }
564
565 static void
566 set_branding (ModestWebkitMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
567 {
568         ModestWebkitMsgViewPrivate *priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
569
570         modest_mail_header_view_set_branding (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), brand_name, brand_icon);
571 }
572
573 static gboolean
574 has_blocked_external_images (ModestWebkitMsgView *self)
575 {
576         ModestWebkitMsgViewPrivate *priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
577
578         return (modest_mime_part_view_has_external_images (MODEST_MIME_PART_VIEW (priv->body_view)) &&
579                 !modest_mime_part_view_get_view_images (MODEST_MIME_PART_VIEW (priv->body_view)));
580 }
581
582 static gboolean
583 on_activate_link (GtkWidget *widget, const gchar *uri, ModestWebkitMsgView *self)
584 {
585         gboolean result;
586         g_return_val_if_fail (self, FALSE);
587
588         g_signal_emit_by_name (G_OBJECT(self), "activate-link", uri, &result);
589
590         return result;
591 }
592
593
594 static gboolean
595 on_link_hover (GtkWidget *widget, const gchar *uri, ModestWebkitMsgView *self)
596 {
597         ModestWebkitMsgViewPrivate *priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
598         gboolean result;
599
600         g_free (priv->last_url);
601         priv->last_url = g_strdup (uri);
602
603         g_signal_emit_by_name (G_OBJECT(self), "link-hover", uri, &result);
604
605         return result;
606 }
607
608 static void 
609 on_limit_error (GtkWidget *widget, ModestWebkitMsgView *msg_view)
610 {
611         g_signal_emit_by_name (G_OBJECT (msg_view), "limit-error");
612 }
613
614
615 static TnyMimePart *
616 find_cid_image (TnyMsg *msg, const gchar *cid)
617 {
618         TnyMimePart *part = NULL;
619         TnyList *parts;
620         TnyIterator *iter;
621         
622         g_return_val_if_fail (msg, NULL);
623         g_return_val_if_fail (cid, NULL);
624         
625         parts  = TNY_LIST (tny_simple_list_new());
626
627         tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); 
628         iter   = tny_list_create_iterator (parts);
629         
630         while (!tny_iterator_is_done(iter)) {
631                 const gchar *part_cid;
632
633                 part = TNY_MIME_PART(tny_iterator_get_current(iter));
634                 part_cid = tny_mime_part_get_content_id (part);
635
636                 /* if there is no content id, try the content location;
637                  * this is what Outlook seems to use when it converts
638                  * it's internal richtext to html
639                  */
640                 if (!part_cid)
641                         part_cid = tny_mime_part_get_content_location (part);
642                 
643                 if (part_cid && strcmp (cid, part_cid) == 0)
644                         break;
645
646                 if (tny_mime_part_content_type_is (part, "multipart/related")) {
647                         TnyList *related_parts = TNY_LIST (tny_simple_list_new ());
648                         TnyIterator *related_iter = NULL;
649                         TnyMimePart *related_part = NULL;
650
651                         tny_mime_part_get_parts (part, related_parts);
652                         related_iter = tny_list_create_iterator (related_parts);
653
654                         while (!tny_iterator_is_done (related_iter)) {
655                                 related_part = TNY_MIME_PART (tny_iterator_get_current (related_iter));
656                                 part_cid = tny_mime_part_get_content_id (related_part);
657                                 if (part_cid && strcmp (cid, part_cid) == 0) {
658                                         break;
659                                 }
660                                 g_object_unref (related_part);
661                                 related_part = NULL;
662                                 tny_iterator_next (related_iter);
663                         }
664
665                         g_object_unref (related_iter);
666                         g_object_unref (related_parts);
667                         if (related_part != NULL) {
668                                 g_object_unref (part);
669                                 part = related_part;
670                                 break;
671                         }
672                 }
673
674                 g_object_unref (G_OBJECT(part));
675         
676                 part = NULL;
677                 tny_iterator_next (iter);
678         }
679         
680         g_object_unref (G_OBJECT(iter));        
681         g_object_unref (G_OBJECT(parts));
682         
683         return part;
684 }
685
686
687 static gboolean
688 on_fetch_url (GtkWidget *widget, const gchar *uri,
689               TnyStream *stream, ModestWebkitMsgView *self)
690 {
691         ModestWebkitMsgViewPrivate *priv;
692         const gchar* my_uri;
693         TnyMimePart *part = NULL;
694         
695
696
697         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
698
699         /*
700          * we search for either something starting with cid:, or something
701          * with no prefix at all; this latter case occurs when sending mails
702          * with MS Outlook in rich-text mode, and 'attach-as-object
703          */
704         if (g_str_has_prefix (uri, "cid:"))  
705                 my_uri = uri + 4;  /* +4 ==> skip "cid:" */
706         else
707                 my_uri = uri;
708         
709         /* now try to find the embedded image */
710         part = find_cid_image (priv->msg, my_uri);
711
712         if (!part) {
713                 if (g_str_has_prefix (uri, "http:")) {
714                         if (modest_mime_part_view_get_view_images (MODEST_MIME_PART_VIEW (priv->body_view))) {
715                                 gboolean result = FALSE;
716                                 g_signal_emit_by_name (self, "fetch-image", uri, stream, &result);
717                                 return result;
718                         } else {
719                                 /* we return immediately to get a "image not found" icon */
720                                 tny_stream_close (stream);
721                                 return TRUE;
722                         }
723                 } else {
724                         return FALSE;
725                 }
726         }
727
728         tny_mime_part_decode_to_stream ((TnyMimePart*)part, stream, NULL);
729         tny_stream_close (stream);
730         g_object_unref (G_OBJECT(part));
731         return TRUE;
732 }
733
734 static void
735 set_message (ModestWebkitMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
736 {
737         TnyMimePart *body;
738         ModestWebkitMsgViewPrivate *priv;
739         TnyHeader *header;
740
741         g_return_if_fail (self);
742
743         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE(self);
744         modest_mail_header_view_set_loading (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), FALSE);
745         gtk_widget_set_no_show_all (priv->mail_header_view, FALSE);
746         modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), FALSE);
747
748         if (msg != priv->msg) {
749                 if (priv->msg)
750                         g_object_unref (G_OBJECT(priv->msg));
751                 if (msg)
752                         g_object_ref   (G_OBJECT(msg));
753                 priv->msg = msg;
754         }
755
756         if (!msg) {
757                 tny_header_view_clear (TNY_HEADER_VIEW (priv->mail_header_view));
758                 modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
759                 gtk_widget_hide_all (priv->mail_header_view);
760                 gtk_widget_hide_all (priv->attachments_box);
761 #ifdef MODEST_TOOKIT_HILDON2
762                 gtk_widget_hide_all (priv->priority_box);
763 #endif
764                 gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
765                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
766
767                 gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1);
768                 gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1);
769
770                 gtk_widget_queue_resize (GTK_WIDGET (priv->body_view));
771
772                 gtk_widget_queue_resize (GTK_WIDGET(self));
773                 gtk_widget_queue_draw (GTK_WIDGET(self));
774                 return;
775         }
776
777         header = tny_msg_get_header (msg);
778         tny_header_view_set_header (TNY_HEADER_VIEW (priv->mail_header_view), header);
779         g_object_unref (header);
780
781         modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
782                                              other_body?NULL:msg);
783
784         modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), tny_msg_get_allow_external_images (msg));
785
786         if (other_body) {
787                 body = other_body;
788                 g_object_ref (body);
789         } else {
790                 body = modest_tny_msg_find_body_part (msg, TRUE);
791         }
792         if (body) {
793                 ModestAttachmentsView *widget;
794
795                 tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->body_view), body);
796                 g_object_unref (body);
797                 widget = MODEST_ATTACHMENTS_VIEW (priv->attachments_view);
798
799                 if (modest_attachments_view_has_attachments (widget)) {
800                         GtkLabel *label;
801                         GList *children = NULL;
802                         gchar *text = NULL;
803                         /* Ugly but... */
804                         children = gtk_container_get_children (GTK_CONTAINER (priv->attachments_box));
805                         label = GTK_LABEL (children->data);
806                         gtk_widget_show_all (priv->attachments_box);
807                         if (modest_attachments_view_get_num_attachments (widget) > 1) {
808                                 text = _("mail_va_attachments");
809                         } else {
810                                 text = _("mail_va_attachment");
811                         }
812                         gtk_label_set_text (label, text);
813                 } else {
814                         gtk_widget_hide_all (priv->attachments_box);
815                 }
816
817         } else {
818                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
819         }
820
821         /* Refresh priority */
822         set_priority (self, tny_header_get_flags (header));
823
824         gtk_widget_show (priv->body_view);
825         gtk_widget_set_no_show_all (priv->priority_box, TRUE);
826         gtk_widget_set_no_show_all (priv->attachments_box, TRUE);
827         gtk_widget_show_all (priv->mail_header_view);
828         gtk_widget_set_no_show_all (priv->attachments_box, FALSE);
829         gtk_widget_set_no_show_all (priv->priority_box, FALSE);
830         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
831
832         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1);
833         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1);
834
835         gtk_widget_queue_resize (GTK_WIDGET (priv->body_view));
836
837         gtk_widget_queue_resize (GTK_WIDGET(self));
838         gtk_widget_queue_draw (GTK_WIDGET(self));
839
840 }
841
842 static void
843 set_header (ModestWebkitMsgView *self, TnyHeader *header)
844 {
845         ModestWebkitMsgViewPrivate *priv;
846         
847         g_return_if_fail (self);
848
849         if (header == NULL) {
850                 set_message (self, NULL, NULL);
851                 return;
852         }
853         
854         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE(self);
855         modest_mail_header_view_set_loading (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), TRUE);
856         gtk_widget_set_no_show_all (priv->mail_header_view, FALSE);
857         modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), FALSE);
858
859         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1);
860         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1);
861         gtk_widget_queue_resize (GTK_WIDGET (priv->body_view));
862
863         if (priv->msg) {
864                 g_object_unref (G_OBJECT(priv->msg));
865         }
866         priv->msg = NULL;
867         
868         tny_header_view_set_header (TNY_HEADER_VIEW (priv->mail_header_view), header);
869         modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
870         gtk_widget_show_all (priv->mail_header_view);
871         gtk_widget_hide_all (priv->attachments_box);
872         gtk_widget_hide_all (priv->priority_box);
873         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
874         tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
875         gtk_widget_queue_resize (GTK_WIDGET(self));
876         gtk_widget_queue_draw (GTK_WIDGET(self));
877 }
878
879
880 static TnyMsg*
881 get_message (ModestWebkitMsgView *self)
882 {
883         TnyMsg *msg;
884
885         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), NULL);
886
887         msg = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE(self)->msg;
888
889         if (msg)
890                 g_object_ref (msg);
891         
892         return msg;
893 }
894
895 static gboolean 
896 is_empty (ModestWebkitMsgView *self)
897 {
898         ModestWebkitMsgViewPrivate *priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
899
900         return modest_mime_part_view_is_empty (MODEST_MIME_PART_VIEW (priv->body_view));
901 }
902
903 static void
904 set_zoom (ModestWebkitMsgView *self, gdouble zoom)
905 {
906         ModestWebkitMsgViewPrivate *priv;
907
908         g_return_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self));
909         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
910
911         modest_zoomable_set_zoom (MODEST_ZOOMABLE(priv->body_view), zoom);
912
913         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), 1, 1);
914         gtk_widget_set_size_request (GTK_WIDGET (priv->body_view), -1, -1);
915
916         gtk_widget_queue_resize (priv->body_view);
917 }
918
919 static gdouble
920 get_zoom (ModestWebkitMsgView *self)
921 {
922         ModestWebkitMsgViewPrivate *priv;
923
924         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), 1.0);
925         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
926
927         return modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->body_view));
928 }
929
930 static TnyHeaderFlags
931 get_priority (ModestWebkitMsgView *self)
932 {
933         ModestWebkitMsgViewPrivate *priv;
934
935         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), 0);
936
937         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
938
939         return modest_mail_header_view_get_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view));
940 }
941
942 static void
943 set_priority (ModestWebkitMsgView *self, TnyHeaderFlags flags)
944 {
945         ModestWebkitMsgViewPrivate *priv;
946
947         g_return_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self));
948         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
949
950         modest_mail_header_view_set_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), flags);
951
952         gboolean show_priority = FALSE;
953         TnyHeaderFlags priority_flags;
954
955         priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK;
956         if (priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
957                 show_priority = TRUE;
958                 gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), MODEST_HEADER_ICON_HIGH, GTK_ICON_SIZE_MENU);
959         } else if (priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
960                 show_priority = TRUE;
961                 gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), MODEST_HEADER_ICON_LOW, GTK_ICON_SIZE_MENU);
962         }
963
964         if (show_priority && MODEST_IS_COMPACT_MAIL_HEADER_VIEW (priv->mail_header_view)) {
965                 gtk_widget_show_all  (priv->priority_box);
966         } else {
967                 gtk_widget_hide_all (priv->priority_box);
968         }
969
970 }
971
972 /* INCREMENTAL SEARCH IMPLEMENTATION */
973
974 static gboolean 
975 search (ModestWebkitMsgView *self, const gchar *search)
976 {
977         ModestWebkitMsgViewPrivate *priv;
978         gboolean result;
979
980         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), FALSE);
981
982         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
983         result = modest_isearch_view_search (MODEST_ISEARCH_VIEW (priv->body_view),
984                                              search);
985
986         return result;
987 }
988
989 static gboolean
990 search_next (ModestWebkitMsgView *self)
991 {
992         ModestWebkitMsgViewPrivate *priv;
993         gboolean result;
994
995         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), FALSE);
996
997         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
998         result = modest_isearch_view_search_next (MODEST_ISEARCH_VIEW (priv->body_view));
999
1000         return result;
1001 }
1002
1003 static TnyList *
1004 get_selected_attachments (ModestWebkitMsgView *self)
1005 {
1006         ModestWebkitMsgViewPrivate *priv;
1007
1008         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), NULL);
1009         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
1010
1011         return modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
1012         
1013 }
1014
1015 static TnyList *
1016 get_attachments (ModestWebkitMsgView *self)
1017 {
1018         ModestWebkitMsgViewPrivate *priv;
1019
1020         g_return_val_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self), NULL);
1021         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
1022
1023         return modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
1024         
1025 }
1026
1027 static void
1028 grab_focus (ModestWebkitMsgView *self)
1029 {
1030         ModestWebkitMsgViewPrivate *priv = NULL;
1031
1032         g_return_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self));
1033         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
1034
1035         gtk_widget_grab_focus (priv->body_view);
1036 }
1037
1038 static void
1039 remove_attachment (ModestWebkitMsgView *self, TnyMimePart *attachment)
1040 {
1041         ModestWebkitMsgViewPrivate *priv;
1042
1043         g_return_if_fail (MODEST_IS_WEBKIT_MSG_VIEW (self));
1044         g_return_if_fail (TNY_IS_MIME_PART (attachment));
1045         priv = MODEST_WEBKIT_MSG_VIEW_GET_PRIVATE (self);
1046
1047         modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
1048                                                    attachment);
1049         
1050 }
1051
1052 /* TNY HEADER VIEW IMPLEMENTATION */
1053
1054 static void
1055 tny_header_view_init (gpointer g, gpointer iface_data)
1056 {
1057         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
1058
1059         klass->set_header = modest_msg_view_set_header;
1060         klass->clear = modest_msg_view_clear_header;
1061
1062         return;
1063 }
1064
1065 static void
1066 modest_msg_view_set_header (TnyHeaderView *self, TnyHeader *header)
1067 {
1068         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_header_func (self, header);
1069 }
1070
1071
1072 static void
1073 modest_msg_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
1074 {
1075         set_header (MODEST_WEBKIT_MSG_VIEW (self), header);
1076 }
1077
1078 static void
1079 modest_msg_view_clear_header (TnyHeaderView *self)
1080 {
1081         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->clear_header_func (self);
1082 }
1083
1084
1085 static void
1086 modest_msg_view_clear_header_default (TnyHeaderView *self)
1087 {
1088         set_message (MODEST_WEBKIT_MSG_VIEW (self), NULL, NULL);
1089 }
1090
1091 /* TNY MSG IMPLEMENTATION */
1092
1093 static void
1094 tny_msg_view_init (gpointer g, gpointer iface_data)
1095 {
1096         TnyMsgViewIface *klass = (TnyMsgViewIface *)g;
1097
1098         klass->get_msg = modest_msg_view_get_msg;
1099         klass->set_msg = modest_msg_view_set_msg;
1100         klass->set_unavailable = modest_msg_view_set_unavailable;
1101         klass->clear = modest_msg_view_clear;
1102         klass->create_mime_part_view_for = modest_msg_view_create_mime_part_view_for;
1103         klass->create_new_inline_viewer = modest_msg_view_create_new_inline_viewer;
1104
1105         return;
1106 }
1107
1108 static TnyMsg *
1109 modest_msg_view_get_msg (TnyMsgView *self)
1110 {
1111         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_msg_func (self);
1112 }
1113
1114 static TnyMsg *
1115 modest_msg_view_get_msg_default (TnyMsgView *self)
1116 {
1117         return TNY_MSG (tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (self)));
1118 }
1119
1120 static void
1121 modest_msg_view_set_msg (TnyMsgView *self, TnyMsg *msg)
1122 {
1123         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_msg_func (self, msg);
1124 }
1125
1126 static void 
1127 modest_msg_view_set_msg_default (TnyMsgView *self, TnyMsg *msg)
1128 {
1129
1130         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (self), TNY_MIME_PART (msg));
1131
1132         return;
1133 }
1134
1135 static void
1136 modest_msg_view_set_unavailable (TnyMsgView *self)
1137 {
1138         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_unavailable_func (self);
1139 }
1140
1141 static void
1142 modest_msg_view_set_unavailable_default (TnyMsgView *self)
1143 {
1144         tny_msg_view_clear (self);
1145
1146         return;
1147 }
1148
1149 static void
1150 modest_msg_view_clear (TnyMsgView *self)
1151 {
1152         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->clear_func (self);
1153 }
1154
1155 static void
1156 modest_msg_view_clear_default (TnyMsgView *self)
1157 {
1158         set_message (MODEST_WEBKIT_MSG_VIEW (self), NULL, NULL);
1159 }
1160
1161 static TnyMimePartView*
1162 modest_msg_view_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part)
1163 {
1164         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->create_mime_part_view_for_func (self, part);
1165 }
1166
1167 static TnyMimePartView*
1168 modest_msg_view_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part)
1169 {
1170         g_warning ("modest_msg_view_create_mime_part_view_for_default is not implemented");
1171         return NULL;
1172 }
1173
1174 static TnyMsgView*
1175 modest_msg_view_create_new_inline_viewer (TnyMsgView *self)
1176 {
1177         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->create_new_inline_viewer_func (self);
1178 }
1179
1180 static TnyMsgView*
1181 modest_msg_view_create_new_inline_viewer_default (TnyMsgView *self)
1182 {
1183         g_warning ("modest_msg_view_create_new_inline_viewer_default is not implemented");
1184
1185         return NULL;
1186 }
1187
1188 /* TNY MIME PART IMPLEMENTATION */
1189
1190 static void
1191 tny_mime_part_view_init (gpointer g, gpointer iface_data)
1192 {
1193         TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
1194
1195         klass->get_part = modest_msg_view_mp_get_part;
1196         klass->set_part = modest_msg_view_mp_set_part;
1197         klass->clear = modest_msg_view_mp_clear;
1198
1199         return;
1200 }
1201
1202 static TnyMimePart* 
1203 modest_msg_view_mp_get_part (TnyMimePartView *self)
1204 {
1205         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_part_func (self);
1206 }
1207
1208
1209 static TnyMimePart* 
1210 modest_msg_view_mp_get_part_default (TnyMimePartView *self)
1211 {
1212         return TNY_MIME_PART (get_message (MODEST_WEBKIT_MSG_VIEW (self)));
1213 }
1214
1215 static void
1216 modest_msg_view_mp_set_part (TnyMimePartView *self,
1217                              TnyMimePart *part)
1218 {
1219         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_part_func (self, part);
1220 }
1221
1222 static void
1223 modest_msg_view_mp_set_part_default (TnyMimePartView *self,
1224                                      TnyMimePart *part)
1225 {
1226         g_return_if_fail ((part == NULL) || TNY_IS_MSG (part));
1227
1228         set_message (MODEST_WEBKIT_MSG_VIEW (self), TNY_MSG (part), NULL);
1229 }
1230
1231 static void
1232 modest_msg_view_mp_clear (TnyMimePartView *self)
1233 {
1234         tny_msg_view_clear (TNY_MSG_VIEW (self));
1235 }
1236
1237 /* MODEST MIME PART VIEW IMPLEMENTATION */
1238
1239 static void
1240 modest_mime_part_view_init (gpointer g, gpointer iface_data)
1241 {
1242         ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
1243
1244         klass->is_empty_func = modest_msg_view_mp_is_empty;
1245
1246         return;
1247 }
1248
1249 static gboolean
1250 modest_msg_view_mp_is_empty (ModestMimePartView *self)
1251 {
1252         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->is_empty_func (self);
1253 }
1254
1255 static gboolean
1256 modest_msg_view_mp_is_empty_default (ModestMimePartView *self)
1257 {
1258         return is_empty (MODEST_WEBKIT_MSG_VIEW (self));
1259 }
1260
1261 /* MODEST ZOOMABLE IMPLEMENTATION */
1262 static void
1263 modest_zoomable_init (gpointer g, gpointer iface_data)
1264 {
1265         ModestZoomableIface *klass = (ModestZoomableIface *)g;
1266
1267         klass->get_zoom_func = modest_msg_view_get_zoom;
1268         klass->set_zoom_func = modest_msg_view_set_zoom;
1269         klass->zoom_minus_func = modest_msg_view_zoom_minus;
1270         klass->zoom_plus_func = modest_msg_view_zoom_plus;
1271
1272         return;
1273 }
1274
1275 static gdouble
1276 modest_msg_view_get_zoom (ModestZoomable *self)
1277 {
1278         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_zoom_func (self);
1279 }
1280
1281 static gdouble
1282 modest_msg_view_get_zoom_default (ModestZoomable *self)
1283 {
1284         return get_zoom (MODEST_WEBKIT_MSG_VIEW (self));
1285 }
1286
1287 static void
1288 modest_msg_view_set_zoom (ModestZoomable *self, gdouble value)
1289 {
1290         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
1291 }
1292
1293 static void
1294 modest_msg_view_set_zoom_default (ModestZoomable *self, gdouble value)
1295 {
1296         set_zoom (MODEST_WEBKIT_MSG_VIEW (self), value);
1297 }
1298
1299 static gboolean
1300 modest_msg_view_zoom_minus (ModestZoomable *self)
1301 {
1302         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->zoom_minus_func (self);
1303 }
1304
1305 static gboolean
1306 modest_msg_view_zoom_minus_default (ModestZoomable *self)
1307 {
1308         /* operation not supported in ModestMsgView */
1309         return FALSE;
1310 }
1311
1312 static gboolean
1313 modest_msg_view_zoom_plus (ModestZoomable *self)
1314 {
1315         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->zoom_plus_func (self);
1316 }
1317
1318 static gboolean
1319 modest_msg_view_zoom_plus_default (ModestZoomable *self)
1320 {
1321         /* operation not supported in ModestMsgView */
1322         return FALSE;
1323 }
1324
1325 /* MODEST ISEARCH VIEW IMPLEMENTATION */
1326 static void
1327 modest_isearch_view_init (gpointer g, gpointer iface_data)
1328 {
1329         ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
1330
1331         klass->search_func = modest_msg_view_search;
1332         klass->search_next_func = modest_msg_view_search_next;
1333
1334         return;
1335 }
1336
1337 static gboolean
1338 modest_msg_view_search (ModestISearchView *self, const gchar *string)
1339 {
1340         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->search_func (self, string);
1341 }
1342
1343 static gboolean
1344 modest_msg_view_search_default (ModestISearchView *self, const gchar *string)
1345 {
1346         return search (MODEST_WEBKIT_MSG_VIEW (self), string);
1347 }
1348
1349 static gboolean
1350 modest_msg_view_search_next (ModestISearchView *self)
1351 {
1352         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->search_next_func (self);
1353 }
1354
1355 static gboolean
1356 modest_msg_view_search_next_default (ModestISearchView *self)
1357 {
1358         return search_next (MODEST_WEBKIT_MSG_VIEW (self));
1359 }
1360
1361 /* MODEST MSG VIEW IMPLEMENTATION */
1362 static void
1363 modest_msg_view_init (gpointer g, gpointer iface_data)
1364 {
1365         ModestMsgViewIface *klass = (ModestMsgViewIface *)g;
1366
1367         klass->set_msg_with_other_body_func = modest_webkit_msg_view_set_msg_with_other_body;
1368         klass->get_vadjustment_func = modest_webkit_msg_view_get_vadjustment;
1369         klass->get_hadjustment_func = modest_webkit_msg_view_get_hadjustment;
1370         klass->set_vadjustment_func = modest_webkit_msg_view_set_vadjustment;
1371         klass->set_hadjustment_func = modest_webkit_msg_view_set_hadjustment;
1372         klass->set_shadow_type_func = modest_webkit_msg_view_set_shadow_type;
1373         klass->get_shadow_type_func = modest_webkit_msg_view_get_shadow_type;
1374         klass->get_priority_func = modest_webkit_msg_view_get_priority;
1375         klass->set_priority_func = modest_webkit_msg_view_set_priority;
1376         klass->get_selected_attachments_func = modest_webkit_msg_view_get_selected_attachments;
1377         klass->get_attachments_func = modest_webkit_msg_view_get_attachments;
1378         klass->grab_focus_func = modest_webkit_msg_view_grab_focus;
1379         klass->remove_attachment_func = modest_webkit_msg_view_remove_attachment;
1380         klass->request_fetch_images_func = modest_webkit_msg_view_request_fetch_images;
1381         klass->set_branding_func = modest_webkit_msg_view_set_branding;
1382         klass->has_blocked_external_images_func = modest_webkit_msg_view_has_blocked_external_images;
1383
1384         return;
1385 }
1386
1387 static void
1388 modest_webkit_msg_view_set_msg_with_other_body (ModestMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
1389 {
1390         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_msg_with_other_body_func (self, msg, other_body);
1391 }
1392
1393 static void
1394 modest_webkit_msg_view_set_msg_with_other_body_default (ModestMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
1395 {
1396         set_message (MODEST_WEBKIT_MSG_VIEW (self), msg, other_body);
1397 }
1398
1399 static GtkAdjustment*
1400 modest_webkit_msg_view_get_vadjustment (ModestMsgView *self)
1401 {
1402         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_vadjustment_func (self);
1403 }
1404
1405 static GtkAdjustment*
1406 modest_webkit_msg_view_get_vadjustment_default (ModestMsgView *self)
1407 {
1408         return get_vadjustment (MODEST_WEBKIT_MSG_VIEW (self));
1409 }
1410
1411 static GtkAdjustment*
1412 modest_webkit_msg_view_get_hadjustment (ModestMsgView *self)
1413 {
1414         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_hadjustment_func (self);
1415 }
1416
1417 static GtkAdjustment*
1418 modest_webkit_msg_view_get_hadjustment_default (ModestMsgView *self)
1419 {
1420         return get_hadjustment (MODEST_WEBKIT_MSG_VIEW (self));
1421 }
1422
1423 static void
1424 modest_webkit_msg_view_set_vadjustment (ModestMsgView *self, GtkAdjustment *adj)
1425 {
1426         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_vadjustment_func (self, adj);
1427 }
1428
1429 static void
1430 modest_webkit_msg_view_set_vadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1431 {
1432         set_vadjustment (MODEST_WEBKIT_MSG_VIEW (self), adj);
1433 }
1434
1435 static void
1436 modest_webkit_msg_view_set_hadjustment (ModestMsgView *self, GtkAdjustment *adj)
1437 {
1438         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_hadjustment_func (self, adj);
1439 }
1440
1441 static void
1442 modest_webkit_msg_view_set_hadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1443 {
1444         set_hadjustment (MODEST_WEBKIT_MSG_VIEW (self), adj);
1445 }
1446
1447 static void
1448 modest_webkit_msg_view_set_shadow_type (ModestMsgView *self, GtkShadowType type)
1449 {
1450         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_shadow_type_func (self, type);
1451 }
1452
1453 static void
1454 modest_webkit_msg_view_set_shadow_type_default (ModestMsgView *self, GtkShadowType type)
1455 {
1456         set_shadow_type (MODEST_WEBKIT_MSG_VIEW (self), type);
1457 }
1458
1459 static GtkShadowType
1460 modest_webkit_msg_view_get_shadow_type (ModestMsgView *self)
1461 {
1462         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_shadow_type_func (self);
1463 }
1464
1465 static GtkShadowType
1466 modest_webkit_msg_view_get_shadow_type_default (ModestMsgView *self)
1467 {
1468         return get_shadow_type (MODEST_WEBKIT_MSG_VIEW (self));
1469 }
1470
1471 static void
1472 modest_webkit_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags)
1473 {
1474         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
1475 }
1476
1477 static void
1478 modest_webkit_msg_view_set_priority_default (ModestMsgView *self, TnyHeaderFlags flags)
1479 {
1480         set_priority (MODEST_WEBKIT_MSG_VIEW (self), flags);
1481 }
1482
1483 static TnyHeaderFlags
1484 modest_webkit_msg_view_get_priority (ModestMsgView *self)
1485 {
1486         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_priority_func (self);
1487 }
1488
1489 static TnyHeaderFlags
1490 modest_webkit_msg_view_get_priority_default (ModestMsgView *self)
1491 {
1492         return get_priority (MODEST_WEBKIT_MSG_VIEW (self));
1493 }
1494
1495 static TnyList*
1496 modest_webkit_msg_view_get_selected_attachments (ModestMsgView *self)
1497 {
1498         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_selected_attachments_func (self);
1499 }
1500
1501 static TnyList*
1502 modest_webkit_msg_view_get_selected_attachments_default (ModestMsgView *self)
1503 {
1504         return get_selected_attachments (MODEST_WEBKIT_MSG_VIEW (self));
1505 }
1506
1507 static TnyList*
1508 modest_webkit_msg_view_get_attachments (ModestMsgView *self)
1509 {
1510         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->get_attachments_func (self);
1511 }
1512
1513 static TnyList*
1514 modest_webkit_msg_view_get_attachments_default (ModestMsgView *self)
1515 {
1516         return get_attachments (MODEST_WEBKIT_MSG_VIEW (self));
1517 }
1518
1519 static void
1520 modest_webkit_msg_view_grab_focus (ModestMsgView *self)
1521 {
1522         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->grab_focus_func (self);
1523 }
1524
1525 static void
1526 modest_webkit_msg_view_grab_focus_default (ModestMsgView *self)
1527 {
1528         grab_focus (MODEST_WEBKIT_MSG_VIEW (self));
1529 }
1530
1531 static void
1532 modest_webkit_msg_view_remove_attachment (ModestMsgView *self, TnyMimePart *attachment)
1533 {
1534         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->remove_attachment_func (self, attachment);
1535 }
1536
1537 static void
1538 modest_webkit_msg_view_remove_attachment_default (ModestMsgView *self, TnyMimePart *attachment)
1539 {
1540         remove_attachment (MODEST_WEBKIT_MSG_VIEW (self), attachment);
1541 }
1542
1543 static void
1544 modest_webkit_msg_view_request_fetch_images (ModestMsgView *self)
1545 {
1546         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->request_fetch_images_func (self);
1547 }
1548
1549 static void
1550 modest_webkit_msg_view_request_fetch_images_default (ModestMsgView *self)
1551 {
1552         request_fetch_images (MODEST_WEBKIT_MSG_VIEW (self));
1553 }
1554
1555 static void
1556 modest_webkit_msg_view_set_branding (ModestMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
1557 {
1558         MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->set_branding_func (self, brand_name, brand_icon);
1559 }
1560
1561 static void
1562 modest_webkit_msg_view_set_branding_default (ModestMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
1563 {
1564         set_branding (MODEST_WEBKIT_MSG_VIEW (self), brand_name, brand_icon);
1565 }
1566
1567 static gboolean
1568 modest_webkit_msg_view_has_blocked_external_images (ModestMsgView *self)
1569 {
1570         return MODEST_WEBKIT_MSG_VIEW_GET_CLASS (self)->has_blocked_external_images_func (self);
1571 }
1572
1573 static gboolean
1574 modest_webkit_msg_view_has_blocked_external_images_default (ModestMsgView *self)
1575 {
1576         return has_blocked_external_images (MODEST_WEBKIT_MSG_VIEW (self));
1577 }