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