Do ignore empty recipients when checking names
[modest] / src / widgets / modest-mozembed-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
40 #include <modest-tny-msg.h>
41 #include <modest-text-utils.h>
42 #include <widgets/modest-msg-view.h>
43 #include <widgets/modest-compact-mail-header-view.h>
44 #include <widgets/modest-attachments-view.h>
45 #include <modest-marshal.h>
46 #include <widgets/modest-isearch-view.h>
47 #include <widgets/modest-mozembed-msg-view.h>
48 #include <widgets/modest-mozembed-mime-part-view.h>
49 #include <widgets/modest-scroll-area.h>
50
51
52 /* 'private'/'protected' functions */
53 static void     modest_mozembed_msg_view_class_init   (ModestMozembedMsgViewClass *klass);
54 static void     tny_header_view_init (gpointer g, gpointer iface_data);
55 static void     tny_msg_view_init (gpointer g, gpointer iface_data);
56 static void     tny_mime_part_view_init (gpointer g, gpointer iface_data);
57 static void     modest_mime_part_view_init (gpointer g, gpointer iface_data);
58 static void     modest_zoomable_init (gpointer g, gpointer iface_data);
59 static void     modest_isearch_view_init (gpointer g, gpointer iface_data);
60 static void     modest_msg_view_init (gpointer g, gpointer iface_data);
61 static void     modest_mozembed_msg_view_init         (ModestMozembedMsgView *obj);
62 static void     modest_mozembed_msg_view_finalize     (GObject *obj);
63 static void     modest_mozembed_msg_view_destroy     (GtkObject *obj);
64
65 /* headers signals */
66 static void on_recpt_activated (ModestMailHeaderView *header_view, const gchar *address, ModestMozembedMsgView *msg_view);
67 static void on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer userdata);
68
69 /* body view signals */
70 static gboolean on_activate_link (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *msg_view);
71 static gboolean on_fetch_url (GtkWidget *widget, const gchar *uri, TnyStream *stream,
72                               ModestMozembedMsgView *msg_view);
73 static gboolean on_link_hover (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *msg_view);
74
75 #if HAVE_DECL_GTK_WIDGET_TAP_AND_HOLD_SETUP
76 static void     on_tap_and_hold (GtkWidget *widget, gpointer userdata); 
77 #endif /*HAVE_DECL_GTK_WIDGET_TAP_AND_HOLD_SETUP*/
78
79 /* TnyMimePartView implementation */
80 static void modest_msg_view_mp_clear (TnyMimePartView *self);
81 static void modest_msg_view_mp_set_part (TnyMimePartView *self, TnyMimePart *part);
82 static void modest_msg_view_mp_set_part_default (TnyMimePartView *self, TnyMimePart *part);
83 static TnyMimePart* modest_msg_view_mp_get_part (TnyMimePartView *self);
84 static TnyMimePart* modest_msg_view_mp_get_part_default (TnyMimePartView *self);
85 /* ModestMimePartView implementation */
86 static gboolean modest_msg_view_mp_is_empty (ModestMimePartView *self);
87 static gboolean modest_msg_view_mp_is_empty_default (ModestMimePartView *self);
88 /* TnyHeaderView implementation */
89 static void modest_msg_view_set_header (TnyHeaderView *self, TnyHeader *header);
90 static void modest_msg_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
91 static void modest_msg_view_clear_header (TnyHeaderView *self);
92 static void modest_msg_view_clear_header_default (TnyHeaderView *self);
93 /* TnyMsgView implementation */
94 static TnyMsg *modest_msg_view_get_msg (TnyMsgView *self);
95 static TnyMsg *modest_msg_view_get_msg_default (TnyMsgView *self);
96 static void modest_msg_view_set_msg (TnyMsgView *self, TnyMsg *msg);
97 static void modest_msg_view_set_msg_default (TnyMsgView *self, TnyMsg *msg);
98 static void modest_msg_view_clear (TnyMsgView *self);
99 static void modest_msg_view_clear_default (TnyMsgView *self);
100 static void modest_msg_view_set_unavailable (TnyMsgView *self);
101 static void modest_msg_view_set_unavailable_default (TnyMsgView *self);
102 static TnyMimePartView *modest_msg_view_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part);
103 static TnyMimePartView *modest_msg_view_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part);
104 static TnyMsgView *modest_msg_view_create_new_inline_viewer (TnyMsgView *self);
105 static TnyMsgView *modest_msg_view_create_new_inline_viewer_default (TnyMsgView *self);
106 /* ModestZoomable implementation */
107 static gdouble modest_msg_view_get_zoom (ModestZoomable *self);
108 static void modest_msg_view_set_zoom (ModestZoomable *self, gdouble value);
109 static gboolean modest_msg_view_zoom_minus (ModestZoomable *self);
110 static gboolean modest_msg_view_zoom_plus (ModestZoomable *self);
111 static gdouble modest_msg_view_get_zoom_default (ModestZoomable *self);
112 static void modest_msg_view_set_zoom_default (ModestZoomable *self, gdouble value);
113 static gboolean modest_msg_view_zoom_minus_default (ModestZoomable *self);
114 static gboolean modest_msg_view_zoom_plus_default (ModestZoomable *self);
115 /* ModestISearchView implementation */
116 static gboolean modest_msg_view_search (ModestISearchView *self, const gchar *string);
117 static gboolean modest_msg_view_search_default (ModestISearchView *self, const gchar *string);
118 static gboolean modest_msg_view_search_next (ModestISearchView *self);
119 static gboolean modest_msg_view_search_next_default (ModestISearchView *self);
120 /* ModestMsgView implementation */
121 static void modest_mozembed_msg_view_set_msg_with_other_body (ModestMsgView *self, TnyMsg *msg, TnyMimePart *part);
122 static GtkAdjustment *modest_mozembed_msg_view_get_vadjustment (ModestMsgView *self);
123 static GtkAdjustment *modest_mozembed_msg_view_get_hadjustment (ModestMsgView *self);
124 static void modest_mozembed_msg_view_set_vadjustment (ModestMsgView *self, GtkAdjustment *vadj);
125 static void modest_mozembed_msg_view_set_hadjustment (ModestMsgView *self, GtkAdjustment *hadj);
126 static void modest_mozembed_msg_view_set_shadow_type (ModestMsgView *self, GtkShadowType type);
127 static GtkShadowType modest_mozembed_msg_view_get_shadow_type (ModestMsgView *self);
128 static TnyHeaderFlags modest_mozembed_msg_view_get_priority (ModestMsgView *self);
129 static void modest_mozembed_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags);
130 static TnyList *modest_mozembed_msg_view_get_selected_attachments (ModestMsgView *self);
131 static TnyList *modest_mozembed_msg_view_get_attachments (ModestMsgView *self);
132 static void modest_mozembed_msg_view_grab_focus (ModestMsgView *self);
133 static void modest_mozembed_msg_view_remove_attachment (ModestMsgView *view, TnyMimePart *attachment);
134 static void modest_mozembed_msg_view_request_fetch_images (ModestMsgView *view);
135 static void modest_mozembed_msg_view_set_branding (ModestMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
136 static gboolean modest_mozembed_msg_view_has_blocked_external_images (ModestMsgView *view);
137 static void modest_mozembed_msg_view_set_msg_with_other_body_default (ModestMsgView *self, TnyMsg *msg, TnyMimePart *part);
138 static GtkAdjustment *modest_mozembed_msg_view_get_vadjustment_default (ModestMsgView *self);
139 static GtkAdjustment *modest_mozembed_msg_view_get_hadjustment_default (ModestMsgView *self);
140 static void modest_mozembed_msg_view_set_vadjustment_default (ModestMsgView *self, GtkAdjustment *vadj);
141 static void modest_mozembed_msg_view_set_hadjustment_default (ModestMsgView *self, GtkAdjustment *hadj);
142 static void modest_mozembed_msg_view_set_shadow_type_default (ModestMsgView *self, GtkShadowType type);
143 static GtkShadowType modest_mozembed_msg_view_get_shadow_type_default (ModestMsgView *self);
144 static TnyHeaderFlags modest_mozembed_msg_view_get_priority_default (ModestMsgView *self);
145 static void modest_mozembed_msg_view_set_priority_default (ModestMsgView *self, TnyHeaderFlags flags);
146 static TnyList *modest_mozembed_msg_view_get_selected_attachments_default (ModestMsgView *self);
147 static TnyList *modest_mozembed_msg_view_get_attachments_default (ModestMsgView *self);
148 static void modest_mozembed_msg_view_grab_focus_default (ModestMsgView *self);
149 static void modest_mozembed_msg_view_remove_attachment_default (ModestMsgView *view, TnyMimePart *attachment);
150 static gboolean modest_mozembed_msg_view_has_blocked_external_images_default (ModestMsgView *view);
151 static void modest_mozembed_msg_view_request_fetch_images_default (ModestMsgView *view);
152 static void modest_mozembed_msg_view_set_branding_default (ModestMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
153
154 /* internal api */
155 static void     set_header     (ModestMozembedMsgView *self, TnyHeader *header);
156 static TnyMsg   *get_message   (ModestMozembedMsgView *self);
157 static void     set_message    (ModestMozembedMsgView *self, TnyMsg *msg, TnyMimePart *other_body);
158 static gboolean is_empty       (ModestMozembedMsgView *self); 
159 static void     set_zoom       (ModestMozembedMsgView *self, gdouble zoom);
160 static gdouble  get_zoom       (ModestMozembedMsgView *self);
161 static gboolean search         (ModestMozembedMsgView *self, const gchar *search);
162 static gboolean search_next    (ModestMozembedMsgView *self);
163 static GtkAdjustment *get_vadjustment (ModestMozembedMsgView *self);
164 static GtkAdjustment *get_hadjustment (ModestMozembedMsgView *self);
165 static void set_vadjustment (ModestMozembedMsgView *self, GtkAdjustment *vadj);
166 static void set_hadjustment (ModestMozembedMsgView *self, GtkAdjustment *hadj);
167 static void set_shadow_type (ModestMozembedMsgView *self, GtkShadowType type);
168 static GtkShadowType get_shadow_type (ModestMozembedMsgView *self);
169 static TnyHeaderFlags get_priority (ModestMozembedMsgView *self);
170 static void set_priority (ModestMozembedMsgView *self, TnyHeaderFlags flags);
171 static TnyList *get_selected_attachments (ModestMozembedMsgView *self);
172 static TnyList *get_attachments (ModestMozembedMsgView *self);
173 static void grab_focus (ModestMozembedMsgView *self);
174 static void remove_attachment (ModestMozembedMsgView *view, TnyMimePart *attachment);
175 static void request_fetch_images (ModestMozembedMsgView *view);
176 static void set_branding (ModestMozembedMsgView *view, const gchar *brand_name, const GdkPixbuf *brand_icon);
177 static gboolean has_blocked_external_images (ModestMozembedMsgView *view);
178
179 typedef struct _ModestMozembedMsgViewPrivate ModestMozembedMsgViewPrivate;
180 struct _ModestMozembedMsgViewPrivate {
181         GtkWidget   *body_view;
182         GtkWidget   *mail_header_view;
183         GtkWidget   *attachments_view;
184
185         TnyMsg      *msg;
186
187         /* embedded elements */
188         GtkWidget   *headers_box;
189         GtkWidget   *attachments_box;
190
191         /* zoom */
192         gdouble current_zoom;
193
194         /* link click management */
195         gchar *last_url;
196
197 };
198
199 #define MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
200                                                                                   MODEST_TYPE_MOZEMBED_MSG_VIEW, \
201                                                                                   ModestMozembedMsgViewPrivate))
202
203 /* globals */
204 static GtkContainerClass *parent_class = NULL;
205
206 GType
207 modest_mozembed_msg_view_get_type (void)
208 {
209         static GType my_type = 0;
210         if (!my_type) {
211                 static const GTypeInfo my_info = {
212                         sizeof(ModestMozembedMsgViewClass),
213                         NULL,           /* base init */
214                         NULL,           /* base finalize */
215                         (GClassInitFunc) modest_mozembed_msg_view_class_init,
216                         NULL,           /* class finalize */
217                         NULL,           /* class data */
218                         sizeof(ModestMozembedMsgView),
219                         1,              /* n_preallocs */
220                         (GInstanceInitFunc) modest_mozembed_msg_view_init,
221                         NULL
222                 };
223                 static const GInterfaceInfo tny_msg_view_info = 
224                 {
225                   (GInterfaceInitFunc) tny_msg_view_init, /* interface_init */
226                   NULL,         /* interface_finalize */
227                   NULL          /* interface_data */
228                 };
229
230                 static const GInterfaceInfo tny_mime_part_view_info = 
231                 {
232                   (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
233                   NULL,         /* interface_finalize */
234                   NULL          /* interface_data */
235                 };
236
237                 static const GInterfaceInfo tny_header_view_info = 
238                 {
239                   (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
240                   NULL,         /* interface_finalize */
241                   NULL          /* interface_data */
242                 };
243
244                 static const GInterfaceInfo modest_mime_part_view_info = 
245                 {
246                   (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
247                   NULL,         /* interface_finalize */
248                   NULL          /* interface_data */
249                 };
250
251                 static const GInterfaceInfo modest_zoomable_info = 
252                 {
253                   (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
254                   NULL,         /* interface_finalize */
255                   NULL          /* interface_data */
256                 };
257
258                 static const GInterfaceInfo modest_isearch_view_info = 
259                 {
260                   (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
261                   NULL,         /* interface_finalize */
262                   NULL          /* interface_data */
263                 };
264
265                 static const GInterfaceInfo modest_msg_view_info = 
266                 {
267                   (GInterfaceInitFunc) modest_msg_view_init, /* interface_init */
268                   NULL,         /* interface_finalize */
269                   NULL          /* interface_data */
270                 };
271
272                 my_type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW,
273                                                   "ModestMozembedMsgView",
274                                                   &my_info, 0);
275
276                 g_type_add_interface_static (my_type, TNY_TYPE_HEADER_VIEW, 
277                         &tny_header_view_info);
278
279                 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW, 
280                         &tny_mime_part_view_info);
281
282                 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW, 
283                         &modest_mime_part_view_info);
284
285                 g_type_add_interface_static (my_type, TNY_TYPE_MSG_VIEW, 
286                         &tny_msg_view_info);
287
288                 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE, 
289                         &modest_zoomable_info);
290
291                 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW, 
292                         &modest_isearch_view_info);
293
294                 g_type_add_interface_static (my_type, MODEST_TYPE_MSG_VIEW, 
295                         &modest_msg_view_info);
296         }
297         return my_type;
298 }
299
300 static void
301 modest_mozembed_msg_view_class_init (ModestMozembedMsgViewClass *klass)
302 {
303         GObjectClass *gobject_class;
304         GtkWidgetClass *widget_class;
305         GtkObjectClass *gtkobject_class;
306         GtkContainerClass *container_class;
307         gobject_class = (GObjectClass*) klass;
308         widget_class = (GtkWidgetClass *) klass;
309         gtkobject_class = (GtkObjectClass *) klass;
310         container_class = (GtkContainerClass *) klass;
311
312         parent_class            = g_type_class_peek_parent (klass);
313         gobject_class->finalize = modest_mozembed_msg_view_finalize;
314         gtkobject_class->destroy = modest_mozembed_msg_view_destroy;
315
316         klass->set_header_func = modest_msg_view_set_header_default;
317         klass->clear_header_func = modest_msg_view_clear_header_default;
318         klass->set_scroll_adjustments = NULL;
319         klass->get_part_func = modest_msg_view_mp_get_part_default;
320         klass->set_part_func = modest_msg_view_mp_set_part_default;
321         klass->is_empty_func = modest_msg_view_mp_is_empty_default;
322         klass->get_msg_func = modest_msg_view_get_msg_default;
323         klass->set_msg_func = modest_msg_view_set_msg_default;
324         klass->set_unavailable_func = modest_msg_view_set_unavailable_default;
325         klass->clear_func = modest_msg_view_clear_default;
326         klass->create_mime_part_view_for_func = modest_msg_view_create_mime_part_view_for_default;
327         klass->create_new_inline_viewer_func = modest_msg_view_create_new_inline_viewer_default;
328         klass->get_zoom_func = modest_msg_view_get_zoom_default;
329         klass->set_zoom_func = modest_msg_view_set_zoom_default;
330         klass->zoom_minus_func = modest_msg_view_zoom_minus_default;
331         klass->zoom_plus_func = modest_msg_view_zoom_plus_default;
332         klass->search_func = modest_msg_view_search_default;
333         klass->search_next_func = modest_msg_view_search_next_default;
334         klass->set_msg_with_other_body_func = modest_mozembed_msg_view_set_msg_with_other_body_default;
335         klass->get_vadjustment_func = modest_mozembed_msg_view_get_vadjustment_default;
336         klass->get_hadjustment_func = modest_mozembed_msg_view_get_hadjustment_default;
337         klass->set_vadjustment_func = modest_mozembed_msg_view_set_vadjustment_default;
338         klass->set_hadjustment_func = modest_mozembed_msg_view_set_hadjustment_default;
339         klass->get_shadow_type_func = modest_mozembed_msg_view_get_shadow_type_default;
340         klass->set_shadow_type_func = modest_mozembed_msg_view_set_shadow_type_default;
341         klass->get_priority_func = modest_mozembed_msg_view_get_priority_default;
342         klass->set_priority_func = modest_mozembed_msg_view_set_priority_default;
343         klass->get_selected_attachments_func = modest_mozembed_msg_view_get_selected_attachments_default;
344         klass->get_attachments_func = modest_mozembed_msg_view_get_attachments_default;
345         klass->grab_focus_func = modest_mozembed_msg_view_grab_focus_default;
346         klass->remove_attachment_func = modest_mozembed_msg_view_remove_attachment_default;
347         klass->request_fetch_images_func = modest_mozembed_msg_view_request_fetch_images_default;
348         klass->set_branding_func = modest_mozembed_msg_view_set_branding_default;
349         klass->has_blocked_external_images_func = modest_mozembed_msg_view_has_blocked_external_images_default;
350
351         g_type_class_add_private (gobject_class, sizeof(ModestMozembedMsgViewPrivate));
352
353 }
354
355 static void
356 modest_mozembed_msg_view_init (ModestMozembedMsgView *obj)
357 {
358         ModestMozembedMsgViewPrivate *priv;
359         GtkWidget *separator;
360         GtkWidget *main_vbox;
361         GtkWidget *scroll_area;
362         GtkWidget *body_box;
363
364         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(obj);
365
366         priv->current_zoom = 1.0;
367
368         priv->body_view                 = GTK_WIDGET (g_object_new (MODEST_TYPE_MOZEMBED_MIME_PART_VIEW, NULL));
369         priv->mail_header_view        = GTK_WIDGET(modest_compact_mail_header_view_new (TRUE));
370         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
371         priv->attachments_view        = GTK_WIDGET(modest_attachments_view_new (NULL));
372
373         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (obj), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
374         gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (obj), NULL);
375         gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW (obj), NULL);
376
377         priv->msg                     = NULL;
378
379         priv->headers_box = gtk_vbox_new (0, FALSE);
380
381         if (priv->mail_header_view)
382                 gtk_box_pack_start (GTK_BOX(priv->headers_box), priv->mail_header_view, FALSE, FALSE, 0);
383         
384         if (priv->attachments_view) {
385 #ifndef MODEST_TOOLKIT_HILDON2
386                 gchar *att_label = g_strconcat (_("mcen_me_viewer_attachments"), ":", NULL);
387 #else
388                 gchar *att_label = g_strconcat (_("mail_va_attachment"), ":", NULL);
389 #endif
390
391                 priv->attachments_box = (GtkWidget *)
392                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view),
393                                                                    att_label,
394                                                                    priv->attachments_view,
395                                                                    FALSE, FALSE);
396                 gtk_widget_hide_all (priv->attachments_box);
397                 g_free (att_label);
398         }
399
400         separator = gtk_hseparator_new ();
401         gtk_box_pack_start (GTK_BOX(priv->headers_box), separator, FALSE, FALSE, 0);
402
403         body_box = gtk_vbox_new (FALSE, 0);
404
405         main_vbox = gtk_vbox_new (FALSE, 0);
406         gtk_box_pack_start (GTK_BOX (main_vbox), priv->headers_box, FALSE, FALSE, 0);
407         gtk_box_pack_start (GTK_BOX (main_vbox), body_box, TRUE, TRUE, 0);
408
409         if (priv->body_view) {
410                 /* gtk_widget_set_size_request (priv->body_view, 610, 1000); */
411                 /* scroll_area = modest_scroll_area_new (GTK_WIDGET (obj), priv->body_view); */
412                 /* gtk_container_add (GTK_CONTAINER (body_box), scroll_area); */
413
414                 /* gtk_container_add (GTK_CONTAINER (body_box), priv->body_view); */
415                 /* scroll_area = NULL; */
416
417                 scroll_area = gtk_scrolled_window_new (NULL, NULL);
418                 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_area), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
419                 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll_area), priv->body_view);
420                 gtk_box_pack_start (GTK_BOX (body_box), scroll_area, TRUE, TRUE, 0);
421                 gtk_widget_show_all (body_box);
422
423 #if HAVE_DECL_GTK_WIDGET_TAP_AND_HOLD_SETUP
424                 gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->body_view), NULL, NULL, 0);
425                 g_signal_connect (G_OBJECT (priv->body_view), "tap-and-hold", G_CALLBACK (on_tap_and_hold), obj);
426 #endif
427         }
428
429         gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (obj), main_vbox);
430         
431
432         g_signal_connect (G_OBJECT(priv->body_view), "activate_link",
433                                        G_CALLBACK(on_activate_link), obj);
434         g_signal_connect (G_OBJECT(priv->body_view), "fetch_url",
435                                        G_CALLBACK(on_fetch_url), obj);
436         g_signal_connect (G_OBJECT(priv->body_view), "link_hover",
437                                        G_CALLBACK(on_link_hover), obj);
438
439         g_signal_connect (G_OBJECT (priv->mail_header_view), "recpt-activated", 
440                           G_CALLBACK (on_recpt_activated), obj);
441
442         g_signal_connect (G_OBJECT (priv->attachments_view), "activate",
443                           G_CALLBACK (on_attachment_activated), obj);
444
445 }
446         
447
448 static void
449 modest_mozembed_msg_view_finalize (GObject *obj)
450 {       
451         ModestMozembedMsgViewPrivate *priv;
452         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (obj);
453
454         if (priv->msg) {
455                 g_object_unref (G_OBJECT(priv->msg));
456                 priv->msg = NULL;
457         }
458         
459         priv->body_view = NULL;
460         priv->attachments_view = NULL;
461
462         G_OBJECT_CLASS(parent_class)->finalize (obj);           
463 }
464
465 static void
466 modest_mozembed_msg_view_destroy (GtkObject *obj)
467 {       
468         GTK_OBJECT_CLASS(parent_class)->destroy (obj);          
469 }
470
471 /* INTERNAL METHODS */
472
473 static GtkAdjustment *
474 get_vadjustment (ModestMozembedMsgView *self)
475 {
476         return gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self));
477         
478 }
479
480 static GtkAdjustment *
481 get_hadjustment (ModestMozembedMsgView *self)
482 {
483         return gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (self));
484 }
485
486 static void
487 set_hadjustment (ModestMozembedMsgView *self, GtkAdjustment *hadj)
488 {
489         gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (self), hadj);
490 }
491
492 static void
493 set_vadjustment (ModestMozembedMsgView *self, GtkAdjustment *vadj)
494 {
495         gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (self), vadj);
496 }
497
498 static void
499 set_shadow_type (ModestMozembedMsgView *self,
500                  GtkShadowType shadow_type)
501 {
502         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), shadow_type);
503 }
504
505 static GtkShadowType
506 get_shadow_type (ModestMozembedMsgView *self)
507 {
508         return gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (self));
509 }
510
511 GtkWidget*
512 modest_mozembed_msg_view_new (TnyMsg *msg)
513 {
514         GObject *obj;
515         ModestMozembedMsgView* self;
516         
517         obj  = G_OBJECT(g_object_new(MODEST_TYPE_MOZEMBED_MSG_VIEW, NULL));
518         self = MODEST_MOZEMBED_MSG_VIEW(obj);
519         tny_msg_view_set_msg (TNY_MSG_VIEW (self), msg);
520
521         return GTK_WIDGET(self);
522 }
523
524 #if HAVE_DECL_GTK_WIDGET_TAP_AND_HOLD_SETUP
525 static void
526 on_tap_and_hold (GtkWidget *widget,
527                  gpointer data)
528 {
529         ModestMozembedMsgView *self = (ModestMozembedMsgView *) data;
530         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
531
532         g_signal_emit_by_name (G_OBJECT (self), "link-contextual", priv->last_url);
533 }
534 #endif
535
536 static void
537 on_recpt_activated (ModestMailHeaderView *header_view, 
538                     const gchar *address,
539                     ModestMozembedMsgView *self)
540 {
541         g_signal_emit_by_name (G_OBJECT (self), "recpt-activated", address);
542 }
543
544 static void
545 on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer self)
546 {
547
548         g_signal_emit_by_name (G_OBJECT(self), "attachment_clicked", mime_part);
549 }
550
551
552 static void
553 request_fetch_images (ModestMozembedMsgView *self)
554 {
555         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
556         TnyMimePart *part;
557
558         /* The message could have not been downloaded yet */
559         if (priv->msg) {
560                 modest_mime_part_view_set_view_images (MODEST_MIME_PART_VIEW (priv->body_view), TRUE);
561                 part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (priv->body_view));
562                 if (part) {
563                         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->body_view), part);
564                         g_object_unref (part);
565                 }
566                 tny_msg_set_allow_external_images (TNY_MSG (priv->msg), TRUE);
567         }
568 }
569
570 static void
571 set_branding (ModestMozembedMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
572 {
573         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
574
575         modest_mail_header_view_set_branding (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), brand_name, brand_icon);
576 }
577
578 static gboolean
579 has_blocked_external_images (ModestMozembedMsgView *self)
580 {
581         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
582
583         return modest_mime_part_view_has_external_images (MODEST_MIME_PART_VIEW (priv->body_view));
584 }
585
586 static gboolean
587 on_activate_link (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *self)
588 {
589         gboolean result;
590         g_return_val_if_fail (self, FALSE);
591         
592         g_signal_emit_by_name (G_OBJECT(self), "activate-link", uri, &result);
593
594         return result;
595 }
596
597
598 static gboolean
599 on_link_hover (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *self)
600 {
601         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
602         gboolean result;
603
604         g_free (priv->last_url);
605         priv->last_url = g_strdup (uri);
606
607         g_signal_emit_by_name (G_OBJECT(self), "link-hover", uri, &result);
608
609         return result;
610 }
611
612
613
614 static TnyMimePart *
615 find_cid_image (TnyMsg *msg, const gchar *cid)
616 {
617         TnyMimePart *part = NULL;
618         TnyList *parts;
619         TnyIterator *iter;
620         
621         g_return_val_if_fail (msg, NULL);
622         g_return_val_if_fail (cid, NULL);
623         
624         parts  = TNY_LIST (tny_simple_list_new());
625
626         tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); 
627         iter   = tny_list_create_iterator (parts);
628         
629         while (!tny_iterator_is_done(iter)) {
630                 const gchar *part_cid;
631
632                 part = TNY_MIME_PART(tny_iterator_get_current(iter));
633                 part_cid = tny_mime_part_get_content_id (part);
634
635                 if (part_cid && strcmp (cid, part_cid) == 0)
636                         break;
637
638                 if (tny_mime_part_content_type_is (part, "multipart/related")) {
639                         TnyList *related_parts = TNY_LIST (tny_simple_list_new ());
640                         TnyIterator *related_iter = NULL;
641                         TnyMimePart *related_part = NULL;
642
643                         tny_mime_part_get_parts (part, related_parts);
644                         related_iter = tny_list_create_iterator (related_parts);
645
646                         while (!tny_iterator_is_done (related_iter)) {
647                                 related_part = TNY_MIME_PART (tny_iterator_get_current (related_iter));
648                                 part_cid = tny_mime_part_get_content_id (related_part);
649                                 if (part_cid && strcmp (cid, part_cid) == 0) {
650                                         break;
651                                 }
652                                 g_object_unref (related_part);
653                                 related_part = NULL;
654                                 tny_iterator_next (related_iter);
655                         }
656
657                         g_object_unref (related_iter);
658                         g_object_unref (related_parts);
659                         if (related_part != NULL) {
660                                 g_object_unref (part);
661                                 part = related_part;
662                                 break;
663                         }
664                 }
665
666                 g_object_unref (G_OBJECT(part));
667         
668                 part = NULL;
669                 tny_iterator_next (iter);
670         }
671         
672         g_object_unref (G_OBJECT(iter));        
673         g_object_unref (G_OBJECT(parts));
674         
675         return part;
676 }
677
678
679 static gboolean
680 on_fetch_url (GtkWidget *widget, const gchar *uri,
681               TnyStream *stream, ModestMozembedMsgView *self)
682 {
683         ModestMozembedMsgViewPrivate *priv;
684         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
685         gboolean result = FALSE;
686         
687         if (g_str_has_prefix (uri, "cid:")) {
688                 /* +4 ==> skip "cid:" */
689                 TnyMimePart *part = find_cid_image (priv->msg, uri + 4);
690                 if (!part) {
691                         g_printerr ("modest: '%s' not found\n", uri + 4);
692                         result = FALSE;
693                 } else {
694                         tny_mime_part_decode_to_stream ((TnyMimePart*)part,
695                                                         stream, NULL);
696                         g_object_unref (G_OBJECT(part));
697                         result = TRUE;
698                 }
699         } else {
700                 return TRUE;
701         }
702
703         return result;
704 }
705
706 static void
707 set_message (ModestMozembedMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
708 {
709         TnyMimePart *body;
710         ModestMozembedMsgViewPrivate *priv;
711         TnyHeader *header;
712         
713         g_return_if_fail (self);
714         
715         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(self);
716         gtk_widget_set_no_show_all (priv->mail_header_view, FALSE);
717
718         if (msg != priv->msg) {
719                 if (priv->msg)
720                         g_object_unref (G_OBJECT(priv->msg));
721                 if (msg)
722                         g_object_ref   (G_OBJECT(msg));
723                 priv->msg = msg;
724         }
725         
726         if (!msg) {
727                 tny_header_view_clear (TNY_HEADER_VIEW (priv->mail_header_view));
728                 modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
729                 gtk_widget_hide_all (priv->mail_header_view);
730                 gtk_widget_hide_all (priv->attachments_box);
731                 gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
732                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
733                 return;
734         }
735
736         header = tny_msg_get_header (msg);
737         tny_header_view_set_header (TNY_HEADER_VIEW (priv->mail_header_view), header);
738         g_object_unref (header);
739
740         modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW(priv->attachments_view),
741                                              other_body?NULL:msg);
742         
743         if (other_body) {
744                 body = other_body;
745                 g_object_ref (body);
746         } else {
747                 body = modest_tny_msg_find_body_part (msg, TRUE);
748         }
749
750         if (body) {
751                 tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->body_view), body);
752
753                 if(modest_attachments_view_has_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view))) {
754                         gtk_widget_show_all (priv->attachments_box);
755                 } else {
756                         gtk_widget_hide_all (priv->attachments_box);
757                 }
758
759         } else 
760                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
761
762         gtk_widget_show (priv->body_view);
763         gtk_widget_set_no_show_all (priv->attachments_box, TRUE);
764         gtk_widget_show_all (priv->mail_header_view);
765         gtk_widget_set_no_show_all (priv->attachments_box, FALSE);
766         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
767
768 }
769
770 static void
771 set_header (ModestMozembedMsgView *self, TnyHeader *header)
772 {
773         ModestMozembedMsgViewPrivate *priv;
774         
775         g_return_if_fail (self);
776
777         if (header == NULL)
778                 set_message (self, NULL, NULL);
779         
780         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(self);
781         gtk_widget_set_no_show_all (priv->mail_header_view, FALSE);
782
783         if (priv->msg)
784                 g_object_unref (G_OBJECT(priv->msg));
785         priv->msg = NULL;
786         
787         tny_header_view_set_header (TNY_HEADER_VIEW (priv->mail_header_view), header);
788         modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
789         gtk_widget_show_all (priv->mail_header_view);
790         gtk_widget_hide_all (priv->attachments_box);
791         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
792         tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
793 }
794
795
796 static TnyMsg*
797 get_message (ModestMozembedMsgView *self)
798 {
799         TnyMsg *msg;
800
801         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
802
803         msg = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(self)->msg;
804
805         if (msg)
806                 g_object_ref (msg);
807         
808         return msg;
809 }
810
811 static gboolean 
812 is_empty (ModestMozembedMsgView *self)
813 {
814         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
815
816         return modest_mime_part_view_is_empty (MODEST_MIME_PART_VIEW (priv->body_view));
817 }
818
819 static void
820 set_zoom (ModestMozembedMsgView *self, gdouble zoom)
821 {
822         ModestMozembedMsgViewPrivate *priv;
823
824         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
825         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
826
827         modest_zoomable_set_zoom (MODEST_ZOOMABLE(priv->body_view), zoom);
828
829         gtk_widget_queue_resize (priv->body_view);
830 }
831
832 static gdouble
833 get_zoom (ModestMozembedMsgView *self)
834 {
835         ModestMozembedMsgViewPrivate *priv;
836
837         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), 1.0);
838         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
839
840         return modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->body_view));
841 }
842
843 static TnyHeaderFlags
844 get_priority (ModestMozembedMsgView *self)
845 {
846         ModestMozembedMsgViewPrivate *priv;
847
848         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), 0);
849
850         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
851
852         return modest_mail_header_view_get_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view));
853 }
854
855 static void
856 set_priority (ModestMozembedMsgView *self, TnyHeaderFlags flags)
857 {
858         ModestMozembedMsgViewPrivate *priv;
859
860         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
861         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
862
863         modest_mail_header_view_set_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), flags);
864 }
865
866 /* INCREMENTAL SEARCH IMPLEMENTATION */
867
868 static gboolean 
869 search (ModestMozembedMsgView *self, const gchar *search)
870 {
871         ModestMozembedMsgViewPrivate *priv;
872         gboolean result;
873
874         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), FALSE);
875
876         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
877         result = modest_isearch_view_search (MODEST_ISEARCH_VIEW (priv->body_view),
878                                              search);
879
880         return result;
881 }
882
883 static gboolean
884 search_next (ModestMozembedMsgView *self)
885 {
886         ModestMozembedMsgViewPrivate *priv;
887         gboolean result;
888
889         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), FALSE);
890
891         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
892         result = modest_isearch_view_search_next (MODEST_ISEARCH_VIEW (priv->body_view));
893
894         return result;
895 }
896
897 static TnyList *
898 get_selected_attachments (ModestMozembedMsgView *self)
899 {
900         ModestMozembedMsgViewPrivate *priv;
901
902         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
903         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
904
905         return modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
906         
907 }
908
909 static TnyList *
910 get_attachments (ModestMozembedMsgView *self)
911 {
912         ModestMozembedMsgViewPrivate *priv;
913
914         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
915         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
916
917         return modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
918         
919 }
920
921 static void
922 grab_focus (ModestMozembedMsgView *self)
923 {
924         ModestMozembedMsgViewPrivate *priv = NULL;
925
926         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
927         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
928
929         gtk_widget_grab_focus (priv->body_view);
930 }
931
932 static void
933 remove_attachment (ModestMozembedMsgView *self, TnyMimePart *attachment)
934 {
935         ModestMozembedMsgViewPrivate *priv;
936
937         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
938         g_return_if_fail (TNY_IS_MIME_PART (attachment));
939         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
940
941         modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
942                                                    attachment);
943         
944 }
945
946 /* TNY HEADER VIEW IMPLEMENTATION */
947
948 static void
949 tny_header_view_init (gpointer g, gpointer iface_data)
950 {
951         TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
952
953         klass->set_header = modest_msg_view_set_header;
954         klass->clear = modest_msg_view_clear_header;
955
956         return;
957 }
958
959 static void
960 modest_msg_view_set_header (TnyHeaderView *self, TnyHeader *header)
961 {
962         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_header_func (self, header);
963 }
964
965
966 static void
967 modest_msg_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
968 {
969         set_header (MODEST_MOZEMBED_MSG_VIEW (self), header);
970 }
971
972 static void
973 modest_msg_view_clear_header (TnyHeaderView *self)
974 {
975         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->clear_header_func (self);
976 }
977
978
979 static void
980 modest_msg_view_clear_header_default (TnyHeaderView *self)
981 {
982         set_message (MODEST_MOZEMBED_MSG_VIEW (self), NULL, NULL);
983 }
984
985 /* TNY MSG IMPLEMENTATION */
986
987 static void
988 tny_msg_view_init (gpointer g, gpointer iface_data)
989 {
990         TnyMsgViewIface *klass = (TnyMsgViewIface *)g;
991
992         klass->get_msg = modest_msg_view_get_msg;
993         klass->set_msg = modest_msg_view_set_msg;
994         klass->set_unavailable = modest_msg_view_set_unavailable;
995         klass->clear = modest_msg_view_clear;
996         klass->create_mime_part_view_for = modest_msg_view_create_mime_part_view_for;
997         klass->create_new_inline_viewer = modest_msg_view_create_new_inline_viewer;
998
999         return;
1000 }
1001
1002 static TnyMsg *
1003 modest_msg_view_get_msg (TnyMsgView *self)
1004 {
1005         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_msg_func (self);
1006 }
1007
1008 static TnyMsg *
1009 modest_msg_view_get_msg_default (TnyMsgView *self)
1010 {
1011         return TNY_MSG (tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (self)));
1012 }
1013
1014 static void
1015 modest_msg_view_set_msg (TnyMsgView *self, TnyMsg *msg)
1016 {
1017         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_msg_func (self, msg);
1018 }
1019
1020 static void 
1021 modest_msg_view_set_msg_default (TnyMsgView *self, TnyMsg *msg)
1022 {
1023
1024         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (self), TNY_MIME_PART (msg));
1025
1026         return;
1027 }
1028
1029 static void
1030 modest_msg_view_set_unavailable (TnyMsgView *self)
1031 {
1032         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_unavailable_func (self);
1033 }
1034
1035 static void
1036 modest_msg_view_set_unavailable_default (TnyMsgView *self)
1037 {
1038         tny_msg_view_clear (self);
1039
1040         return;
1041 }
1042
1043 static void
1044 modest_msg_view_clear (TnyMsgView *self)
1045 {
1046         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->clear_func (self);
1047 }
1048
1049 static void
1050 modest_msg_view_clear_default (TnyMsgView *self)
1051 {
1052         set_message (MODEST_MOZEMBED_MSG_VIEW (self), NULL, NULL);
1053 }
1054
1055 static TnyMimePartView*
1056 modest_msg_view_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part)
1057 {
1058         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->create_mime_part_view_for_func (self, part);
1059 }
1060
1061 static TnyMimePartView*
1062 modest_msg_view_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part)
1063 {
1064         g_warning ("modest_msg_view_create_mime_part_view_for_default is not implemented");
1065         return NULL;
1066 }
1067
1068 static TnyMsgView*
1069 modest_msg_view_create_new_inline_viewer (TnyMsgView *self)
1070 {
1071         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->create_new_inline_viewer_func (self);
1072 }
1073
1074 static TnyMsgView*
1075 modest_msg_view_create_new_inline_viewer_default (TnyMsgView *self)
1076 {
1077         g_warning ("modest_msg_view_create_new_inline_viewer_default is not implemented");
1078
1079         return NULL;
1080 }
1081
1082 /* TNY MIME PART IMPLEMENTATION */
1083
1084 static void
1085 tny_mime_part_view_init (gpointer g, gpointer iface_data)
1086 {
1087         TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
1088
1089         klass->get_part = modest_msg_view_mp_get_part;
1090         klass->set_part = modest_msg_view_mp_set_part;
1091         klass->clear = modest_msg_view_mp_clear;
1092
1093         return;
1094 }
1095
1096 static TnyMimePart* 
1097 modest_msg_view_mp_get_part (TnyMimePartView *self)
1098 {
1099         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_part_func (self);
1100 }
1101
1102
1103 static TnyMimePart* 
1104 modest_msg_view_mp_get_part_default (TnyMimePartView *self)
1105 {
1106         return TNY_MIME_PART (get_message (MODEST_MOZEMBED_MSG_VIEW (self)));
1107 }
1108
1109 static void
1110 modest_msg_view_mp_set_part (TnyMimePartView *self,
1111                              TnyMimePart *part)
1112 {
1113         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_part_func (self, part);
1114 }
1115
1116 static void
1117 modest_msg_view_mp_set_part_default (TnyMimePartView *self,
1118                                      TnyMimePart *part)
1119 {
1120         g_return_if_fail ((part == NULL) || TNY_IS_MSG (part));
1121
1122         set_message (MODEST_MOZEMBED_MSG_VIEW (self), TNY_MSG (part), NULL);
1123 }
1124
1125 static void
1126 modest_msg_view_mp_clear (TnyMimePartView *self)
1127 {
1128         tny_msg_view_clear (TNY_MSG_VIEW (self));
1129 }
1130
1131 /* MODEST MIME PART VIEW IMPLEMENTATION */
1132
1133 static void
1134 modest_mime_part_view_init (gpointer g, gpointer iface_data)
1135 {
1136         ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
1137
1138         klass->is_empty_func = modest_msg_view_mp_is_empty;
1139
1140         return;
1141 }
1142
1143 static gboolean
1144 modest_msg_view_mp_is_empty (ModestMimePartView *self)
1145 {
1146         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->is_empty_func (self);
1147 }
1148
1149 static gboolean
1150 modest_msg_view_mp_is_empty_default (ModestMimePartView *self)
1151 {
1152         return is_empty (MODEST_MOZEMBED_MSG_VIEW (self));
1153 }
1154
1155 /* MODEST ZOOMABLE IMPLEMENTATION */
1156 static void
1157 modest_zoomable_init (gpointer g, gpointer iface_data)
1158 {
1159         ModestZoomableIface *klass = (ModestZoomableIface *)g;
1160
1161         klass->get_zoom_func = modest_msg_view_get_zoom;
1162         klass->set_zoom_func = modest_msg_view_set_zoom;
1163         klass->zoom_minus_func = modest_msg_view_zoom_minus;
1164         klass->zoom_plus_func = modest_msg_view_zoom_plus;
1165
1166         return;
1167 }
1168
1169 static gdouble
1170 modest_msg_view_get_zoom (ModestZoomable *self)
1171 {
1172         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_zoom_func (self);
1173 }
1174
1175 static gdouble
1176 modest_msg_view_get_zoom_default (ModestZoomable *self)
1177 {
1178         return get_zoom (MODEST_MOZEMBED_MSG_VIEW (self));
1179 }
1180
1181 static void
1182 modest_msg_view_set_zoom (ModestZoomable *self, gdouble value)
1183 {
1184         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
1185 }
1186
1187 static void
1188 modest_msg_view_set_zoom_default (ModestZoomable *self, gdouble value)
1189 {
1190         set_zoom (MODEST_MOZEMBED_MSG_VIEW (self), value);
1191 }
1192
1193 static gboolean
1194 modest_msg_view_zoom_minus (ModestZoomable *self)
1195 {
1196         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->zoom_minus_func (self);
1197 }
1198
1199 static gboolean
1200 modest_msg_view_zoom_minus_default (ModestZoomable *self)
1201 {
1202         /* operation not supported in ModestMsgView */
1203         return FALSE;
1204 }
1205
1206 static gboolean
1207 modest_msg_view_zoom_plus (ModestZoomable *self)
1208 {
1209         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->zoom_plus_func (self);
1210 }
1211
1212 static gboolean
1213 modest_msg_view_zoom_plus_default (ModestZoomable *self)
1214 {
1215         /* operation not supported in ModestMsgView */
1216         return FALSE;
1217 }
1218
1219 /* MODEST ISEARCH VIEW IMPLEMENTATION */
1220 static void
1221 modest_isearch_view_init (gpointer g, gpointer iface_data)
1222 {
1223         ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
1224
1225         klass->search_func = modest_msg_view_search;
1226         klass->search_next_func = modest_msg_view_search_next;
1227
1228         return;
1229 }
1230
1231 static gboolean
1232 modest_msg_view_search (ModestISearchView *self, const gchar *string)
1233 {
1234         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->search_func (self, string);
1235 }
1236
1237 static gboolean
1238 modest_msg_view_search_default (ModestISearchView *self, const gchar *string)
1239 {
1240         return search (MODEST_MOZEMBED_MSG_VIEW (self), string);
1241 }
1242
1243 static gboolean
1244 modest_msg_view_search_next (ModestISearchView *self)
1245 {
1246         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->search_next_func (self);
1247 }
1248
1249 static gboolean
1250 modest_msg_view_search_next_default (ModestISearchView *self)
1251 {
1252         return search_next (MODEST_MOZEMBED_MSG_VIEW (self));
1253 }
1254
1255 /* MODEST MSG VIEW IMPLEMENTATION */
1256 static void
1257 modest_msg_view_init (gpointer g, gpointer iface_data)
1258 {
1259         ModestMsgViewIface *klass = (ModestMsgViewIface *)g;
1260
1261         klass->set_msg_with_other_body_func = modest_mozembed_msg_view_set_msg_with_other_body;
1262         klass->get_vadjustment_func = modest_mozembed_msg_view_get_vadjustment;
1263         klass->get_hadjustment_func = modest_mozembed_msg_view_get_hadjustment;
1264         klass->set_vadjustment_func = modest_mozembed_msg_view_set_vadjustment;
1265         klass->set_hadjustment_func = modest_mozembed_msg_view_set_hadjustment;
1266         klass->set_shadow_type_func = modest_mozembed_msg_view_set_shadow_type;
1267         klass->get_shadow_type_func = modest_mozembed_msg_view_get_shadow_type;
1268         klass->get_priority_func = modest_mozembed_msg_view_get_priority;
1269         klass->set_priority_func = modest_mozembed_msg_view_set_priority;
1270         klass->get_selected_attachments_func = modest_mozembed_msg_view_get_selected_attachments;
1271         klass->get_attachments_func = modest_mozembed_msg_view_get_attachments;
1272         klass->grab_focus_func = modest_mozembed_msg_view_grab_focus;
1273         klass->remove_attachment_func = modest_mozembed_msg_view_remove_attachment;
1274         klass->request_fetch_images_func = modest_mozembed_msg_view_request_fetch_images;
1275         klass->set_branding_func = modest_mozembed_msg_view_set_branding;
1276         klass->has_blocked_external_images_func = modest_mozembed_msg_view_has_blocked_external_images;
1277
1278         return;
1279 }
1280
1281 static void
1282 modest_mozembed_msg_view_set_msg_with_other_body (ModestMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
1283 {
1284         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_msg_with_other_body_func (self, msg, other_body);
1285 }
1286
1287 static void
1288 modest_mozembed_msg_view_set_msg_with_other_body_default (ModestMsgView *self, TnyMsg *msg, TnyMimePart *other_body)
1289 {
1290         set_message (MODEST_MOZEMBED_MSG_VIWE (self), msg, other_body);
1291 }
1292
1293 static GtkAdjustment*
1294 modest_mozembed_msg_view_get_vadjustment (ModestMsgView *self)
1295 {
1296         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_vadjustment_func (self);
1297 }
1298
1299 static GtkAdjustment*
1300 modest_mozembed_msg_view_get_vadjustment_default (ModestMsgView *self)
1301 {
1302         return get_vadjustment (MODEST_MOZEMBED_MSG_VIEW (self));
1303 }
1304
1305 static GtkAdjustment*
1306 modest_mozembed_msg_view_get_hadjustment (ModestMsgView *self)
1307 {
1308         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_hadjustment_func (self);
1309 }
1310
1311 static GtkAdjustment*
1312 modest_mozembed_msg_view_get_hadjustment_default (ModestMsgView *self)
1313 {
1314         return get_hadjustment (MODEST_MOZEMBED_MSG_VIEW (self));
1315 }
1316
1317 static void
1318 modest_mozembed_msg_view_set_vadjustment (ModestMsgView *self, GtkAdjustment *adj)
1319 {
1320         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_vadjustment_func (self, adj);
1321 }
1322
1323 static void
1324 modest_mozembed_msg_view_set_vadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1325 {
1326         set_vadjustment (MODEST_MOZEMBED_MSG_VIEW (self), adj);
1327 }
1328
1329 static void
1330 modest_mozembed_msg_view_set_hadjustment (ModestMsgView *self, GtkAdjustment *adj)
1331 {
1332         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_hadjustment_func (self, adj);
1333 }
1334
1335 static void
1336 modest_mozembed_msg_view_set_hadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1337 {
1338         set_hadjustment (MODEST_MOZEMBED_MSG_VIEW (self), adj);
1339 }
1340
1341 static void
1342 modest_mozembed_msg_view_set_shadow_type (ModestMsgView *self, GtkShadowType type)
1343 {
1344         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_shadow_type_func (self, type);
1345 }
1346
1347 static void
1348 modest_mozembed_msg_view_set_shadow_type_default (ModestMsgView *self, GtkShadowType type)
1349 {
1350         set_shadow_type (MODEST_MOZEMBED_MSG_VIEW (self), type);
1351 }
1352
1353 static GtkShadowType
1354 modest_mozembed_msg_view_get_shadow_type (ModestMsgView *self)
1355 {
1356         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_shadow_type_func (self);
1357 }
1358
1359 static GtkShadowType
1360 modest_mozembed_msg_view_get_shadow_type_default (ModestMsgView *self)
1361 {
1362         return get_shadow_type (MODEST_MOZEMBED_MSG_VIEW (self));
1363 }
1364
1365 static void
1366 modest_mozembed_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags)
1367 {
1368         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
1369 }
1370
1371 static void
1372 modest_mozembed_msg_view_set_priority_default (ModestMsgView *self, TnyHeaderFlags flags)
1373 {
1374         set_priority (MODEST_MOZEMBED_MSG_VIEW (self), flags);
1375 }
1376
1377 static TnyHeaderFlags
1378 modest_mozembed_msg_view_get_priority (ModestMsgView *self)
1379 {
1380         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_priority_func (self);
1381 }
1382
1383 static TnyHeaderFlags
1384 modest_mozembed_msg_view_get_priority_default (ModestMsgView *self)
1385 {
1386         return get_priority (MODEST_MOZEMBED_MSG_VIEW (self));
1387 }
1388
1389 static TnyList*
1390 modest_mozembed_msg_view_get_selected_attachments (ModestMsgView *self)
1391 {
1392         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_selected_attachments_func (self);
1393 }
1394
1395 static TnyList*
1396 modest_mozembed_msg_view_get_selected_attachments_default (ModestMsgView *self)
1397 {
1398         return get_selected_attachments (MODEST_MOZEMBED_MSG_VIEW (self));
1399 }
1400
1401 static TnyList*
1402 modest_mozembed_msg_view_get_attachments (ModestMsgView *self)
1403 {
1404         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_attachments_func (self);
1405 }
1406
1407 static TnyList*
1408 modest_mozembed_msg_view_get_attachments_default (ModestMsgView *self)
1409 {
1410         return get_attachments (MODEST_MOZEMBED_MSG_VIEW (self));
1411 }
1412
1413 static void
1414 modest_mozembed_msg_view_grab_focus (ModestMsgView *self)
1415 {
1416         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->grab_focus_func (self);
1417 }
1418
1419 static void
1420 modest_mozembed_msg_view_grab_focus_default (ModestMsgView *self)
1421 {
1422         grab_focus (MODEST_MOZEMBED_MSG_VIEW (self));
1423 }
1424
1425 static void
1426 modest_mozembed_msg_view_remove_attachment (ModestMsgView *self, TnyMimePart *attachment)
1427 {
1428         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->remove_attachment_func (self, attachment);
1429 }
1430
1431 static void
1432 modest_mozembed_msg_view_remove_attachment_default (ModestMsgView *self, TnyMimePart *attachment)
1433 {
1434         remove_attachment (MODEST_MOZEMBED_MSG_VIEW (self), attachment);
1435 }
1436
1437 static void
1438 modest_mozembed_msg_view_request_fetch_images (ModestMsgView *self)
1439 {
1440         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->request_fetch_images_func (self);
1441 }
1442
1443 static void
1444 modest_mozembed_msg_view_request_fetch_images_default (ModestMsgView *self)
1445 {
1446         request_fetch_images (MODEST_MOZEMBED_MSG_VIEW (self));
1447 }
1448
1449 static void
1450 modest_mozembed_msg_view_set_branding (ModestMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
1451 {
1452         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_branding_func (self, brand_name, brand_icon);
1453 }
1454
1455 static void
1456 modest_mozembed_msg_view_set_branding_default (ModestMsgView *self, const gchar *brand_name, const GdkPixbuf *brand_icon)
1457 {
1458         set_branding (MODEST_MOZEMBED_MSG_VIEW (self), brand_name, brand_icon);
1459 }
1460
1461 static gboolean
1462 modest_mozembed_msg_view_has_blocked_external_images (ModestMsgView *self)
1463 {
1464         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->has_blocked_external_images_func (self);
1465 }
1466
1467 static gboolean
1468 modest_mozembed_msg_view_has_blocked_external_images_default (ModestMsgView *self)
1469 {
1470         return has_blocked_external_images (MODEST_MOZEMBED_MSG_VIEW (self));
1471 }