Priority flags changes.
[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 #ifdef MAEMO_CHANGES
75 static void     on_tap_and_hold (GtkWidget *widget, gpointer userdata); 
76 #endif /*MAEMO_CHANGES*/
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 GList *modest_mozembed_msg_view_get_selected_attachments (ModestMsgView *self);
124 static GList *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 GList *modest_mozembed_msg_view_get_selected_attachments_default (ModestMsgView *self);
136 static GList *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 GList *get_selected_attachments (ModestMozembedMsgView *self);
157 static GList *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_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                 gchar *att_label = g_strconcat (_("mcen_me_viewer_attachments"), ":", NULL);
352
353                 priv->attachments_box = (GtkWidget *)
354                         modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view),
355                                                                    att_label,
356                                                                    priv->attachments_view,
357                                                                    FALSE, FALSE);
358                 gtk_widget_hide_all (priv->attachments_box);
359                 g_free (att_label);
360         }
361
362         separator = gtk_hseparator_new ();
363         gtk_box_pack_start (GTK_BOX(priv->headers_box), separator, FALSE, FALSE, 0);
364
365         body_box = gtk_vbox_new (FALSE, 0);
366
367         main_vbox = gtk_vbox_new (FALSE, 0);
368         gtk_box_pack_start (GTK_BOX (main_vbox), priv->headers_box, FALSE, FALSE, 0);
369         gtk_box_pack_start (GTK_BOX (main_vbox), body_box, TRUE, TRUE, 0);
370
371         if (priv->body_view) {
372                 gtk_widget_set_size_request (priv->body_view, -1, 1000);
373                 scroll_area = modest_scroll_area_new (GTK_WIDGET (obj), priv->body_view);
374                 gtk_container_add (GTK_CONTAINER (body_box), scroll_area);
375
376 /*              gtk_container_add (GTK_CONTAINER (body_box), priv->body_view); */
377 /*              scroll_area = NULL; */
378
379 /*              scroll_area = gtk_scrolled_window_new (NULL, NULL); */
380 /*              gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_area), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); */
381 /*              gtk_container_add (GTK_CONTAINER (scroll_area), priv->body_view); */
382 /*              gtk_container_add (GTK_CONTAINER (body_box), scroll_area); */
383
384 #ifdef MAEMO_CHANGES
385                 gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->body_view), NULL, NULL, 0);
386                 g_signal_connect (G_OBJECT (priv->body_view), "tap-and-hold", G_CALLBACK (on_tap_and_hold), obj);
387 #endif
388         }
389
390         gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (obj), main_vbox);
391         
392
393         g_signal_connect (G_OBJECT(priv->body_view), "activate_link",
394                                        G_CALLBACK(on_activate_link), obj);
395         g_signal_connect (G_OBJECT(priv->body_view), "fetch_url",
396                                        G_CALLBACK(on_fetch_url), obj);
397         g_signal_connect (G_OBJECT(priv->body_view), "link_hover",
398                                        G_CALLBACK(on_link_hover), obj);
399
400         g_signal_connect (G_OBJECT (priv->mail_header_view), "recpt-activated", 
401                           G_CALLBACK (on_recpt_activated), obj);
402
403         g_signal_connect (G_OBJECT (priv->attachments_view), "activate",
404                           G_CALLBACK (on_attachment_activated), obj);
405
406 }
407         
408
409 static void
410 modest_mozembed_msg_view_finalize (GObject *obj)
411 {       
412         ModestMozembedMsgViewPrivate *priv;
413         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (obj);
414
415         if (priv->msg) {
416                 g_object_unref (G_OBJECT(priv->msg));
417                 priv->msg = NULL;
418         }
419         
420         priv->body_view = NULL;
421         priv->attachments_view = NULL;
422
423         G_OBJECT_CLASS(parent_class)->finalize (obj);           
424 }
425
426 static void
427 modest_mozembed_msg_view_destroy (GtkObject *obj)
428 {       
429         GTK_OBJECT_CLASS(parent_class)->destroy (obj);          
430 }
431
432 /* INTERNAL METHODS */
433
434 static GtkAdjustment *
435 get_vadjustment (ModestMozembedMsgView *self)
436 {
437         return gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self));
438         
439 }
440
441 static GtkAdjustment *
442 get_hadjustment (ModestMozembedMsgView *self)
443 {
444         return gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (self));
445 }
446
447 static void
448 set_hadjustment (ModestMozembedMsgView *self, GtkAdjustment *hadj)
449 {
450         gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (self), hadj);
451 }
452
453 static void
454 set_vadjustment (ModestMozembedMsgView *self, GtkAdjustment *vadj)
455 {
456         gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (self), vadj);
457 }
458
459 static void
460 set_shadow_type (ModestMozembedMsgView *self,
461                  GtkShadowType shadow_type)
462 {
463         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), shadow_type);
464 }
465
466 static GtkShadowType
467 get_shadow_type (ModestMozembedMsgView *self)
468 {
469         return gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (self));
470 }
471
472 GtkWidget*
473 modest_mozembed_msg_view_new (TnyMsg *msg)
474 {
475         GObject *obj;
476         ModestMozembedMsgView* self;
477         
478         obj  = G_OBJECT(g_object_new(MODEST_TYPE_MOZEMBED_MSG_VIEW, NULL));
479         self = MODEST_MOZEMBED_MSG_VIEW(obj);
480         tny_msg_view_set_msg (TNY_MSG_VIEW (self), msg);
481
482         return GTK_WIDGET(self);
483 }
484
485 #ifdef MAEMO_CHANGES
486 static void
487 on_tap_and_hold (GtkWidget *widget,
488                  gpointer data)
489 {
490         ModestMozembedMsgView *self = (ModestMozembedMsgView *) data;
491         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
492
493         g_signal_emit_by_name (G_OBJECT (self), "link-contextual", priv->last_url);
494 }
495 #endif
496
497 static void
498 on_recpt_activated (ModestMailHeaderView *header_view, 
499                     const gchar *address,
500                     ModestMozembedMsgView *self)
501 {
502         g_signal_emit_by_name (G_OBJECT (self), "recpt-activated", address);
503 }
504
505 static void
506 on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer self)
507 {
508
509         g_signal_emit_by_name (G_OBJECT(self), "attachment_clicked", mime_part);
510 }
511
512 static gboolean
513 on_activate_link (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *self)
514 {
515         gboolean result;
516         g_return_val_if_fail (self, FALSE);
517         
518         g_signal_emit_by_name (G_OBJECT(self), "activate-link", uri, &result);
519
520         return result;
521 }
522
523
524 static gboolean
525 on_link_hover (GtkWidget *widget, const gchar *uri, ModestMozembedMsgView *self)
526 {
527         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
528         gboolean result;
529
530         g_free (priv->last_url);
531         priv->last_url = g_strdup (uri);
532
533         g_signal_emit_by_name (G_OBJECT(self), "link-hover", uri, &result);
534
535         return result;
536 }
537
538
539
540 static TnyMimePart *
541 find_cid_image (TnyMsg *msg, const gchar *cid)
542 {
543         TnyMimePart *part = NULL;
544         TnyList *parts;
545         TnyIterator *iter;
546         
547         g_return_val_if_fail (msg, NULL);
548         g_return_val_if_fail (cid, NULL);
549         
550         parts  = TNY_LIST (tny_simple_list_new());
551
552         tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); 
553         iter   = tny_list_create_iterator (parts);
554         
555         while (!tny_iterator_is_done(iter)) {
556                 const gchar *part_cid;
557
558                 part = TNY_MIME_PART(tny_iterator_get_current(iter));
559                 part_cid = tny_mime_part_get_content_id (part);
560
561                 if (part_cid && strcmp (cid, part_cid) == 0)
562                         break;
563
564                 if (tny_mime_part_content_type_is (part, "multipart/related")) {
565                         TnyList *related_parts = TNY_LIST (tny_simple_list_new ());
566                         TnyIterator *related_iter = NULL;
567                         TnyMimePart *related_part = NULL;
568
569                         tny_mime_part_get_parts (part, related_parts);
570                         related_iter = tny_list_create_iterator (related_parts);
571
572                         while (!tny_iterator_is_done (related_iter)) {
573                                 related_part = TNY_MIME_PART (tny_iterator_get_current (related_iter));
574                                 part_cid = tny_mime_part_get_content_id (related_part);
575                                 if (part_cid && strcmp (cid, part_cid) == 0) {
576                                         break;
577                                 }
578                                 g_object_unref (related_part);
579                                 related_part = NULL;
580                                 tny_iterator_next (related_iter);
581                         }
582
583                         g_object_unref (related_iter);
584                         g_object_unref (related_parts);
585                         if (related_part != NULL) {
586                                 g_object_unref (part);
587                                 part = related_part;
588                                 break;
589                         }
590                 }
591
592                 g_object_unref (G_OBJECT(part));
593         
594                 part = NULL;
595                 tny_iterator_next (iter);
596         }
597         
598         g_object_unref (G_OBJECT(iter));        
599         g_object_unref (G_OBJECT(parts));
600         
601         return part;
602 }
603
604
605 static gboolean
606 on_fetch_url (GtkWidget *widget, const gchar *uri,
607               TnyStream *stream, ModestMozembedMsgView *self)
608 {
609         ModestMozembedMsgViewPrivate *priv;
610         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
611         gboolean result = FALSE;
612         
613         if (g_str_has_prefix (uri, "cid:")) {
614                 /* +4 ==> skip "cid:" */
615                 TnyMimePart *part = find_cid_image (priv->msg, uri + 4);
616                 if (!part) {
617                         g_printerr ("modest: '%s' not found\n", uri + 4);
618                         result = FALSE;
619                 } else {
620                         tny_mime_part_decode_to_stream ((TnyMimePart*)part,
621                                                         stream);
622                         g_object_unref (G_OBJECT(part));
623                         result = TRUE;
624                 }
625         } else {
626                 return TRUE;
627         }
628
629         return result;
630 }
631
632 static void
633 set_message (ModestMozembedMsgView *self, TnyMsg *msg)
634 {
635         TnyMimePart *body;
636         ModestMozembedMsgViewPrivate *priv;
637         TnyHeader *header;
638         
639         g_return_if_fail (self);
640         
641         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(self);
642         gtk_widget_set_no_show_all (priv->mail_header_view, FALSE);
643
644         if (msg != priv->msg) {
645                 if (priv->msg)
646                         g_object_unref (G_OBJECT(priv->msg));
647                 if (msg)
648                         g_object_ref   (G_OBJECT(msg));
649                 priv->msg = msg;
650         }
651         
652         if (!msg) {
653                 tny_header_view_clear (TNY_HEADER_VIEW (priv->mail_header_view));
654                 modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), NULL);
655                 gtk_widget_hide_all (priv->mail_header_view);
656                 gtk_widget_hide_all (priv->attachments_box);
657                 gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
658                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
659                 return;
660         }
661
662         header = tny_msg_get_header (msg);
663         tny_header_view_set_header (TNY_HEADER_VIEW (priv->mail_header_view), header);
664         g_object_unref (header);
665
666         modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW(priv->attachments_view),
667                                              msg);
668         
669         body = modest_tny_msg_find_body_part (msg, TRUE);
670         if (body) {
671                 tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (priv->body_view), body);
672
673                 if(modest_attachments_view_has_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view))) {
674                         gtk_widget_show_all (priv->attachments_box);
675                 } else {
676                         gtk_widget_hide_all (priv->attachments_box);
677                 }
678
679         } else 
680                 tny_mime_part_view_clear (TNY_MIME_PART_VIEW (priv->body_view));
681
682         gtk_widget_show (priv->body_view);
683         gtk_widget_set_no_show_all (priv->attachments_box, TRUE);
684         gtk_widget_show_all (priv->mail_header_view);
685         gtk_widget_set_no_show_all (priv->attachments_box, FALSE);
686         gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
687
688 }
689
690
691 static TnyMsg*
692 get_message (ModestMozembedMsgView *self)
693 {
694         TnyMsg *msg;
695
696         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
697
698         msg = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE(self)->msg;
699
700         if (msg)
701                 g_object_ref (msg);
702         
703         return msg;
704 }
705
706 static gboolean 
707 is_empty (ModestMozembedMsgView *self)
708 {
709         ModestMozembedMsgViewPrivate *priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
710
711         return modest_mime_part_view_is_empty (MODEST_MIME_PART_VIEW (priv->body_view));
712 }
713
714 static void
715 set_zoom (ModestMozembedMsgView *self, gdouble zoom)
716 {
717         ModestMozembedMsgViewPrivate *priv;
718
719         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
720         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
721
722         modest_zoomable_set_zoom (MODEST_ZOOMABLE(priv->body_view), zoom);
723
724         gtk_widget_queue_resize (priv->body_view);
725 }
726
727 static gdouble
728 get_zoom (ModestMozembedMsgView *self)
729 {
730         ModestMozembedMsgViewPrivate *priv;
731
732         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), 1.0);
733         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
734
735         return modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->body_view));
736 }
737
738 static TnyHeaderFlags
739 get_priority (ModestMozembedMsgView *self)
740 {
741         ModestMozembedMsgViewPrivate *priv;
742
743         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), 0);
744
745         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
746
747         return modest_mail_header_view_get_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view));
748 }
749
750 static void
751 set_priority (ModestMozembedMsgView *self, TnyHeaderFlags flags)
752 {
753         ModestMozembedMsgViewPrivate *priv;
754
755         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
756         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
757
758         modest_mail_header_view_set_priority (MODEST_MAIL_HEADER_VIEW (priv->mail_header_view), flags);
759 }
760
761 /* INCREMENTAL SEARCH IMPLEMENTATION */
762
763 static gboolean 
764 search (ModestMozembedMsgView *self, const gchar *search)
765 {
766         ModestMozembedMsgViewPrivate *priv;
767         gboolean result;
768
769         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), FALSE);
770
771         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
772         result = modest_isearch_view_search (MODEST_ISEARCH_VIEW (priv->body_view),
773                                              search);
774
775         return result;
776 }
777
778 static gboolean
779 search_next (ModestMozembedMsgView *self)
780 {
781         ModestMozembedMsgViewPrivate *priv;
782         gboolean result;
783
784         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), FALSE);
785
786         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
787         result = modest_isearch_view_search_next (MODEST_ISEARCH_VIEW (priv->body_view));
788
789         return result;
790 }
791
792 static GList *
793 get_selected_attachments (ModestMozembedMsgView *self)
794 {
795         ModestMozembedMsgViewPrivate *priv;
796
797         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
798         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
799
800         return modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
801         
802 }
803
804 static GList *
805 get_attachments (ModestMozembedMsgView *self)
806 {
807         ModestMozembedMsgViewPrivate *priv;
808
809         g_return_val_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self), NULL);
810         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
811
812         return modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
813         
814 }
815
816 static void
817 grab_focus (ModestMozembedMsgView *self)
818 {
819         ModestMozembedMsgViewPrivate *priv = NULL;
820
821         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
822         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
823
824         gtk_widget_grab_focus (priv->body_view);
825 }
826
827 static void
828 remove_attachment (ModestMozembedMsgView *self, TnyMimePart *attachment)
829 {
830         ModestMozembedMsgViewPrivate *priv;
831
832         g_return_if_fail (MODEST_IS_MOZEMBED_MSG_VIEW (self));
833         g_return_if_fail (TNY_IS_MIME_PART (attachment));
834         priv = MODEST_MOZEMBED_MSG_VIEW_GET_PRIVATE (self);
835
836         modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
837                                                    attachment);
838         
839 }
840
841 /* TNY MSG IMPLEMENTATION */
842
843 static void
844 tny_msg_view_init (gpointer g, gpointer iface_data)
845 {
846         TnyMsgViewIface *klass = (TnyMsgViewIface *)g;
847
848         klass->get_msg_func = modest_msg_view_get_msg;
849         klass->set_msg_func = modest_msg_view_set_msg;
850         klass->set_unavailable_func = modest_msg_view_set_unavailable;
851         klass->clear_func = modest_msg_view_clear;
852         klass->create_mime_part_view_for_func = modest_msg_view_create_mime_part_view_for;
853         klass->create_new_inline_viewer_func = modest_msg_view_create_new_inline_viewer;
854
855         return;
856 }
857
858 static TnyMsg *
859 modest_msg_view_get_msg (TnyMsgView *self)
860 {
861         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_msg_func (self);
862 }
863
864 static TnyMsg *
865 modest_msg_view_get_msg_default (TnyMsgView *self)
866 {
867         return TNY_MSG (tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (self)));
868 }
869
870 static void
871 modest_msg_view_set_msg (TnyMsgView *self, TnyMsg *msg)
872 {
873         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_msg_func (self, msg);
874 }
875
876 static void 
877 modest_msg_view_set_msg_default (TnyMsgView *self, TnyMsg *msg)
878 {
879
880         tny_mime_part_view_set_part (TNY_MIME_PART_VIEW (self), TNY_MIME_PART (msg));
881
882         return;
883 }
884
885 static void
886 modest_msg_view_set_unavailable (TnyMsgView *self)
887 {
888         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_unavailable_func (self);
889 }
890
891 static void
892 modest_msg_view_set_unavailable_default (TnyMsgView *self)
893 {
894         tny_msg_view_clear (self);
895
896         return;
897 }
898
899 static void
900 modest_msg_view_clear (TnyMsgView *self)
901 {
902         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->clear_func (self);
903 }
904
905 static void
906 modest_msg_view_clear_default (TnyMsgView *self)
907 {
908         set_message (MODEST_MOZEMBED_MSG_VIEW (self), NULL);
909 }
910
911 static TnyMimePartView*
912 modest_msg_view_create_mime_part_view_for (TnyMsgView *self, TnyMimePart *part)
913 {
914         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->create_mime_part_view_for_func (self, part);
915 }
916
917 static TnyMimePartView*
918 modest_msg_view_create_mime_part_view_for_default (TnyMsgView *self, TnyMimePart *part)
919 {
920         g_warning ("modest_msg_view_create_mime_part_view_for_default is not implemented");
921         return NULL;
922 }
923
924 static TnyMsgView*
925 modest_msg_view_create_new_inline_viewer (TnyMsgView *self)
926 {
927         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->create_new_inline_viewer_func (self);
928 }
929
930 static TnyMsgView*
931 modest_msg_view_create_new_inline_viewer_default (TnyMsgView *self)
932 {
933         g_warning ("modest_msg_view_create_new_inline_viewer_default is not implemented");
934
935         return NULL;
936 }
937
938 /* TNY MIME PART IMPLEMENTATION */
939
940 static void
941 tny_mime_part_view_init (gpointer g, gpointer iface_data)
942 {
943         TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
944
945         klass->get_part_func = modest_msg_view_mp_get_part;
946         klass->set_part_func = modest_msg_view_mp_set_part;
947         klass->clear_func = modest_msg_view_mp_clear;
948
949         return;
950 }
951
952 static TnyMimePart* 
953 modest_msg_view_mp_get_part (TnyMimePartView *self)
954 {
955         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_part_func (self);
956 }
957
958
959 static TnyMimePart* 
960 modest_msg_view_mp_get_part_default (TnyMimePartView *self)
961 {
962         return TNY_MIME_PART (get_message (MODEST_MOZEMBED_MSG_VIEW (self)));
963 }
964
965 static void
966 modest_msg_view_mp_set_part (TnyMimePartView *self,
967                              TnyMimePart *part)
968 {
969         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_part_func (self, part);
970 }
971
972 static void
973 modest_msg_view_mp_set_part_default (TnyMimePartView *self,
974                                      TnyMimePart *part)
975 {
976         g_return_if_fail ((part == NULL) || TNY_IS_MSG (part));
977
978         set_message (MODEST_MOZEMBED_MSG_VIEW (self), TNY_MSG (part));
979 }
980
981 static void
982 modest_msg_view_mp_clear (TnyMimePartView *self)
983 {
984         tny_msg_view_clear (TNY_MSG_VIEW (self));
985 }
986
987 /* MODEST MIME PART VIEW IMPLEMENTATION */
988
989 static void
990 modest_mime_part_view_init (gpointer g, gpointer iface_data)
991 {
992         ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
993
994         klass->is_empty_func = modest_msg_view_mp_is_empty;
995
996         return;
997 }
998
999 static gboolean
1000 modest_msg_view_mp_is_empty (ModestMimePartView *self)
1001 {
1002         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->is_empty_func (self);
1003 }
1004
1005 static gboolean
1006 modest_msg_view_mp_is_empty_default (ModestMimePartView *self)
1007 {
1008         return is_empty (MODEST_MOZEMBED_MSG_VIEW (self));
1009 }
1010
1011 /* MODEST ZOOMABLE IMPLEMENTATION */
1012 static void
1013 modest_zoomable_init (gpointer g, gpointer iface_data)
1014 {
1015         ModestZoomableIface *klass = (ModestZoomableIface *)g;
1016
1017         klass->get_zoom_func = modest_msg_view_get_zoom;
1018         klass->set_zoom_func = modest_msg_view_set_zoom;
1019         klass->zoom_minus_func = modest_msg_view_zoom_minus;
1020         klass->zoom_plus_func = modest_msg_view_zoom_plus;
1021
1022         return;
1023 }
1024
1025 static gdouble
1026 modest_msg_view_get_zoom (ModestZoomable *self)
1027 {
1028         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_zoom_func (self);
1029 }
1030
1031 static gdouble
1032 modest_msg_view_get_zoom_default (ModestZoomable *self)
1033 {
1034         return get_zoom (MODEST_MOZEMBED_MSG_VIEW (self));
1035 }
1036
1037 static void
1038 modest_msg_view_set_zoom (ModestZoomable *self, gdouble value)
1039 {
1040         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
1041 }
1042
1043 static void
1044 modest_msg_view_set_zoom_default (ModestZoomable *self, gdouble value)
1045 {
1046         set_zoom (MODEST_MOZEMBED_MSG_VIEW (self), value);
1047 }
1048
1049 static gboolean
1050 modest_msg_view_zoom_minus (ModestZoomable *self)
1051 {
1052         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->zoom_minus_func (self);
1053 }
1054
1055 static gboolean
1056 modest_msg_view_zoom_minus_default (ModestZoomable *self)
1057 {
1058         /* operation not supported in ModestMsgView */
1059         return FALSE;
1060 }
1061
1062 static gboolean
1063 modest_msg_view_zoom_plus (ModestZoomable *self)
1064 {
1065         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->zoom_plus_func (self);
1066 }
1067
1068 static gboolean
1069 modest_msg_view_zoom_plus_default (ModestZoomable *self)
1070 {
1071         /* operation not supported in ModestMsgView */
1072         return FALSE;
1073 }
1074
1075 /* MODEST ISEARCH VIEW IMPLEMENTATION */
1076 static void
1077 modest_isearch_view_init (gpointer g, gpointer iface_data)
1078 {
1079         ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
1080
1081         klass->search_func = modest_msg_view_search;
1082         klass->search_next_func = modest_msg_view_search_next;
1083
1084         return;
1085 }
1086
1087 static gboolean
1088 modest_msg_view_search (ModestISearchView *self, const gchar *string)
1089 {
1090         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->search_func (self, string);
1091 }
1092
1093 static gboolean
1094 modest_msg_view_search_default (ModestISearchView *self, const gchar *string)
1095 {
1096         return search (MODEST_MOZEMBED_MSG_VIEW (self), string);
1097 }
1098
1099 static gboolean
1100 modest_msg_view_search_next (ModestISearchView *self)
1101 {
1102         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->search_next_func (self);
1103 }
1104
1105 static gboolean
1106 modest_msg_view_search_next_default (ModestISearchView *self)
1107 {
1108         return search_next (MODEST_MOZEMBED_MSG_VIEW (self));
1109 }
1110
1111 /* MODEST MSG VIEW IMPLEMENTATION */
1112 static void
1113 modest_msg_view_init (gpointer g, gpointer iface_data)
1114 {
1115         ModestMsgViewIface *klass = (ModestMsgViewIface *)g;
1116
1117         klass->get_vadjustment_func = modest_mozembed_msg_view_get_vadjustment;
1118         klass->get_hadjustment_func = modest_mozembed_msg_view_get_hadjustment;
1119         klass->set_vadjustment_func = modest_mozembed_msg_view_set_vadjustment;
1120         klass->set_hadjustment_func = modest_mozembed_msg_view_set_hadjustment;
1121         klass->set_shadow_type_func = modest_mozembed_msg_view_set_shadow_type;
1122         klass->get_shadow_type_func = modest_mozembed_msg_view_get_shadow_type;
1123         klass->get_priority_func = modest_mozembed_msg_view_get_priority;
1124         klass->set_priority_func = modest_mozembed_msg_view_set_priority;
1125         klass->get_selected_attachments_func = modest_mozembed_msg_view_get_selected_attachments;
1126         klass->get_attachments_func = modest_mozembed_msg_view_get_attachments;
1127         klass->grab_focus_func = modest_mozembed_msg_view_grab_focus;
1128         klass->remove_attachment_func = modest_mozembed_msg_view_remove_attachment;
1129
1130         return;
1131 }
1132
1133 static GtkAdjustment*
1134 modest_mozembed_msg_view_get_vadjustment (ModestMsgView *self)
1135 {
1136         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_vadjustment_func (self);
1137 }
1138
1139 static GtkAdjustment*
1140 modest_mozembed_msg_view_get_vadjustment_default (ModestMsgView *self)
1141 {
1142         return get_vadjustment (MODEST_MOZEMBED_MSG_VIEW (self));
1143 }
1144
1145 static GtkAdjustment*
1146 modest_mozembed_msg_view_get_hadjustment (ModestMsgView *self)
1147 {
1148         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_hadjustment_func (self);
1149 }
1150
1151 static GtkAdjustment*
1152 modest_mozembed_msg_view_get_hadjustment_default (ModestMsgView *self)
1153 {
1154         return get_hadjustment (MODEST_MOZEMBED_MSG_VIEW (self));
1155 }
1156
1157 static void
1158 modest_mozembed_msg_view_set_vadjustment (ModestMsgView *self, GtkAdjustment *adj)
1159 {
1160         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_vadjustment_func (self, adj);
1161 }
1162
1163 static void
1164 modest_mozembed_msg_view_set_vadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1165 {
1166         set_vadjustment (MODEST_MOZEMBED_MSG_VIEW (self), adj);
1167 }
1168
1169 static void
1170 modest_mozembed_msg_view_set_hadjustment (ModestMsgView *self, GtkAdjustment *adj)
1171 {
1172         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_hadjustment_func (self, adj);
1173 }
1174
1175 static void
1176 modest_mozembed_msg_view_set_hadjustment_default (ModestMsgView *self, GtkAdjustment *adj)
1177 {
1178         set_hadjustment (MODEST_MOZEMBED_MSG_VIEW (self), adj);
1179 }
1180
1181 static void
1182 modest_mozembed_msg_view_set_shadow_type (ModestMsgView *self, GtkShadowType type)
1183 {
1184         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_shadow_type_func (self, type);
1185 }
1186
1187 static void
1188 modest_mozembed_msg_view_set_shadow_type_default (ModestMsgView *self, GtkShadowType type)
1189 {
1190         set_shadow_type (MODEST_MOZEMBED_MSG_VIEW (self), type);
1191 }
1192
1193 static GtkShadowType
1194 modest_mozembed_msg_view_get_shadow_type (ModestMsgView *self)
1195 {
1196         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_shadow_type_func (self);
1197 }
1198
1199 static GtkShadowType
1200 modest_mozembed_msg_view_get_shadow_type_default (ModestMsgView *self)
1201 {
1202         return get_shadow_type (MODEST_MOZEMBED_MSG_VIEW (self));
1203 }
1204
1205 static void
1206 modest_mozembed_msg_view_set_priority (ModestMsgView *self, TnyHeaderFlags flags)
1207 {
1208         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
1209 }
1210
1211 static void
1212 modest_mozembed_msg_view_set_priority_default (ModestMsgView *self, TnyHeaderFlags flags)
1213 {
1214         set_priority (MODEST_MOZEMBED_MSG_VIEW (self), flags);
1215 }
1216
1217 static TnyHeaderFlags
1218 modest_mozembed_msg_view_get_priority (ModestMsgView *self)
1219 {
1220         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_priority_func (self);
1221 }
1222
1223 static TnyHeaderFlags
1224 modest_mozembed_msg_view_get_priority_default (ModestMsgView *self)
1225 {
1226         return get_priority (MODEST_MOZEMBED_MSG_VIEW (self));
1227 }
1228
1229 static GList*
1230 modest_mozembed_msg_view_get_selected_attachments (ModestMsgView *self)
1231 {
1232         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_selected_attachments_func (self);
1233 }
1234
1235 static GList*
1236 modest_mozembed_msg_view_get_selected_attachments_default (ModestMsgView *self)
1237 {
1238         return get_selected_attachments (MODEST_MOZEMBED_MSG_VIEW (self));
1239 }
1240
1241 static GList*
1242 modest_mozembed_msg_view_get_attachments (ModestMsgView *self)
1243 {
1244         return MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->get_attachments_func (self);
1245 }
1246
1247 static GList*
1248 modest_mozembed_msg_view_get_attachments_default (ModestMsgView *self)
1249 {
1250         return get_attachments (MODEST_MOZEMBED_MSG_VIEW (self));
1251 }
1252
1253 static void
1254 modest_mozembed_msg_view_grab_focus (ModestMsgView *self)
1255 {
1256         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->grab_focus_func (self);
1257 }
1258
1259 static void
1260 modest_mozembed_msg_view_grab_focus_default (ModestMsgView *self)
1261 {
1262         grab_focus (MODEST_MOZEMBED_MSG_VIEW (self));
1263 }
1264
1265 static void
1266 modest_mozembed_msg_view_remove_attachment (ModestMsgView *self, TnyMimePart *attachment)
1267 {
1268         MODEST_MOZEMBED_MSG_VIEW_GET_CLASS (self)->remove_attachment_func (self, attachment);
1269 }
1270
1271 static void
1272 modest_mozembed_msg_view_remove_attachment_default (ModestMsgView *self, TnyMimePart *attachment)
1273 {
1274         remove_attachment (MODEST_MOZEMBED_MSG_VIEW (self), attachment);
1275 }
1276