1 /* Copyright (c) 2006, 2007, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
31 #include <widgets/modest-webkit-mime-part-view.h>
33 #include <webkit/webkit.h>
34 #include <tny-stream.h>
35 #include <tny-mime-part-view.h>
36 #include "modest-tny-mime-part.h"
37 #include <modest-stream-text-to-html.h>
38 #include <modest-text-utils.h>
39 #include <modest-conf.h>
40 #include <modest-runtime.h>
41 #include <widgets/modest-mime-part-view.h>
42 #include <widgets/modest-zoomable.h>
43 #include <libgnomevfs/gnome-vfs.h>
44 #include <gdk/gdkkeysyms.h>
45 #include <modest-ui-constants.h>
46 #include <modest-tny-stream-webkit.h>
48 /* gobject structure methods */
49 static void modest_webkit_mime_part_view_class_init (ModestWebkitMimePartViewClass *klass);
50 static void tny_mime_part_view_init (gpointer g, gpointer iface_data);
51 static void modest_mime_part_view_init (gpointer g, gpointer iface_data);
52 static void modest_zoomable_init (gpointer g, gpointer iface_data);
53 static void modest_isearch_view_init (gpointer g, gpointer iface_data);
54 static void modest_webkit_mime_part_view_init (ModestWebkitMimePartView *self);
55 static void modest_webkit_mime_part_view_finalize (GObject *self);
56 static void modest_webkit_mime_part_view_dispose (GObject *self);
58 /* Webkit signal handlers */
59 static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
60 static gboolean update_style (ModestWebkitMimePartView *self);
61 /* TnyMimePartView implementation */
62 static void modest_webkit_mime_part_view_clear (TnyMimePartView *self);
63 static void modest_webkit_mime_part_view_clear_default (TnyMimePartView *self);
64 static void modest_webkit_mime_part_view_set_part (TnyMimePartView *self, TnyMimePart *part);
65 static void modest_webkit_mime_part_view_set_part_default (TnyMimePartView *self, TnyMimePart *part);
66 static TnyMimePart* modest_webkit_mime_part_view_get_part (TnyMimePartView *self);
67 static TnyMimePart* modest_webkit_mime_part_view_get_part_default (TnyMimePartView *self);
68 /* ModestMimePartView implementation */
69 static gboolean modest_webkit_mime_part_view_is_empty (ModestMimePartView *self);
70 static gboolean modest_webkit_mime_part_view_is_empty_default (ModestMimePartView *self);
71 static gboolean modest_webkit_mime_part_view_get_view_images (ModestMimePartView *self);
72 static gboolean modest_webkit_mime_part_view_get_view_images_default (ModestMimePartView *self);
73 static void modest_webkit_mime_part_view_set_view_images (ModestMimePartView *self, gboolean view_images);
74 static void modest_webkit_mime_part_view_set_view_images_default (ModestMimePartView *self, gboolean view_images);
75 static gboolean modest_webkit_mime_part_view_has_external_images (ModestMimePartView *self);
76 static gboolean modest_webkit_mime_part_view_has_external_images_default (ModestMimePartView *self);
77 /* ModestZoomable implementation */
78 static gdouble modest_webkit_mime_part_view_get_zoom (ModestZoomable *self);
79 static void modest_webkit_mime_part_view_set_zoom (ModestZoomable *self, gdouble value);
80 static gboolean modest_webkit_mime_part_view_zoom_minus (ModestZoomable *self);
81 static gboolean modest_webkit_mime_part_view_zoom_plus (ModestZoomable *self);
82 static gdouble modest_webkit_mime_part_view_get_zoom_default (ModestZoomable *self);
83 static void modest_webkit_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value);
84 static gboolean modest_webkit_mime_part_view_zoom_minus_default (ModestZoomable *self);
85 static gboolean modest_webkit_mime_part_view_zoom_plus_default (ModestZoomable *self);
86 /* ModestISearchView implementation */
87 static gboolean modest_webkit_mime_part_view_search (ModestISearchView *self, const gchar *string);
88 static gboolean modest_webkit_mime_part_view_search_next (ModestISearchView *self);
89 static gboolean modest_webkit_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
90 gint *width, gint *height);
91 static gboolean modest_webkit_mime_part_view_search_default (ModestISearchView *self, const gchar *string);
92 static gboolean modest_webkit_mime_part_view_search_next_default (ModestISearchView *self);
93 static gboolean modest_webkit_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
94 gint *width, gint *height);
98 static TnyMimePart *get_part (ModestWebkitMimePartView *self);
99 static void set_html_part (ModestWebkitMimePartView *self, TnyMimePart *part, const gchar *encoding);
100 static void set_text_part (ModestWebkitMimePartView *self, TnyMimePart *part);
101 static void set_empty_part (ModestWebkitMimePartView *self);
102 static void set_part (ModestWebkitMimePartView *self, TnyMimePart *part);
103 static gboolean is_empty (ModestWebkitMimePartView *self);
104 static gboolean get_view_images (ModestWebkitMimePartView *self);
105 static void set_view_images (ModestWebkitMimePartView *self, gboolean view_images);
106 static gboolean has_external_images (ModestWebkitMimePartView *self);
107 static void set_zoom (ModestWebkitMimePartView *self, gdouble zoom);
108 static gdouble get_zoom (ModestWebkitMimePartView *self);
109 static gboolean search (ModestWebkitMimePartView *self, const gchar *string);
110 static gboolean search_next (ModestWebkitMimePartView *self);
111 static gboolean get_selection_area (ModestWebkitMimePartView *self, gint *x, gint *y,
112 gint *width, gint *height);
114 typedef struct _ModestWebkitMimePartViewPrivate ModestWebkitMimePartViewPrivate;
115 struct _ModestWebkitMimePartViewPrivate {
117 gdouble current_zoom;
118 gboolean view_images;
119 gboolean has_external_images;
123 #define MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
124 MODEST_TYPE_WEBKIT_MIME_PART_VIEW, \
125 ModestWebkitMimePartViewPrivate))
133 static WebKitWebViewClass *parent_class = NULL;
135 static guint signals[LAST_SIGNAL] = {0};
138 modest_webkit_mime_part_view_new ()
140 return g_object_new (MODEST_TYPE_WEBKIT_MIME_PART_VIEW, NULL);
143 /* GOBJECT IMPLEMENTATION */
145 modest_webkit_mime_part_view_get_type (void)
147 static GType my_type = 0;
149 static const GTypeInfo my_info = {
150 sizeof(ModestWebkitMimePartViewClass),
151 NULL, /* base init */
152 NULL, /* base finalize */
153 (GClassInitFunc) modest_webkit_mime_part_view_class_init,
154 NULL, /* class finalize */
155 NULL, /* class data */
156 sizeof(ModestWebkitMimePartView),
158 (GInstanceInitFunc) modest_webkit_mime_part_view_init,
162 static const GInterfaceInfo tny_mime_part_view_info =
164 (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
165 NULL, /* interface_finalize */
166 NULL /* interface_data */
169 static const GInterfaceInfo modest_mime_part_view_info =
171 (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
172 NULL, /* interface_finalize */
173 NULL /* interface_data */
176 static const GInterfaceInfo modest_zoomable_info =
178 (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
179 NULL, /* interface_finalize */
180 NULL /* interface_data */
183 static const GInterfaceInfo modest_isearch_view_info =
185 (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
186 NULL, /* interface_finalize */
187 NULL /* interface_data */
190 my_type = g_type_register_static (WEBKIT_TYPE_WEB_VIEW,
191 "ModestWebkitMimePartView",
194 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW,
195 &tny_mime_part_view_info);
197 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW,
198 &modest_mime_part_view_info);
200 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE,
201 &modest_zoomable_info);
202 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW,
203 &modest_isearch_view_info);
209 modest_webkit_mime_part_view_class_init (ModestWebkitMimePartViewClass *klass)
211 GObjectClass *gobject_class;
212 GtkBindingSet *binding_set;
214 gobject_class = (GObjectClass*) klass;
216 parent_class = g_type_class_peek_parent (klass);
217 gobject_class->dispose = modest_webkit_mime_part_view_dispose;
218 gobject_class->finalize = modest_webkit_mime_part_view_finalize;
220 klass->get_part_func = modest_webkit_mime_part_view_get_part_default;
221 klass->set_part_func = modest_webkit_mime_part_view_set_part_default;
222 klass->clear_func = modest_webkit_mime_part_view_clear_default;
223 klass->is_empty_func = modest_webkit_mime_part_view_is_empty_default;
224 klass->get_view_images_func = modest_webkit_mime_part_view_get_view_images_default;
225 klass->set_view_images_func = modest_webkit_mime_part_view_set_view_images_default;
226 klass->has_external_images_func = modest_webkit_mime_part_view_has_external_images_default;
227 klass->get_zoom_func = modest_webkit_mime_part_view_get_zoom_default;
228 klass->set_zoom_func = modest_webkit_mime_part_view_set_zoom_default;
229 klass->zoom_minus_func = modest_webkit_mime_part_view_zoom_minus_default;
230 klass->zoom_plus_func = modest_webkit_mime_part_view_zoom_plus_default;
231 klass->search_func = modest_webkit_mime_part_view_search_default;
232 klass->search_next_func = modest_webkit_mime_part_view_search_next_default;
233 klass->get_selection_area_func = modest_webkit_mime_part_view_get_selection_area_default;
235 binding_set = gtk_binding_set_by_class (klass);
236 gtk_binding_entry_skip (binding_set, GDK_Down, 0);
237 gtk_binding_entry_skip (binding_set, GDK_Up, 0);
238 gtk_binding_entry_skip (binding_set, GDK_KP_Up, 0);
239 gtk_binding_entry_skip (binding_set, GDK_KP_Down, 0);
240 gtk_binding_entry_skip (binding_set, GDK_Page_Down, 0);
241 gtk_binding_entry_skip (binding_set, GDK_Page_Up, 0);
242 gtk_binding_entry_skip (binding_set, GDK_KP_Page_Up, 0);
243 gtk_binding_entry_skip (binding_set, GDK_KP_Page_Down, 0);
244 gtk_binding_entry_skip (binding_set, GDK_Home, 0);
245 gtk_binding_entry_skip (binding_set, GDK_End, 0);
246 gtk_binding_entry_skip (binding_set, GDK_KP_Home, 0);
247 gtk_binding_entry_skip (binding_set, GDK_KP_End, 0);
249 g_type_class_add_private (gobject_class, sizeof(ModestWebkitMimePartViewPrivate));
251 signals[STOP_STREAMS_SIGNAL] =
252 g_signal_new ("stop-streams",
253 G_TYPE_FROM_CLASS (gobject_class),
255 G_STRUCT_OFFSET (ModestWebkitMimePartViewClass,stop_streams),
257 g_cclosure_marshal_VOID__VOID,
260 signals[LIMIT_ERROR_SIGNAL] =
261 g_signal_new ("limit-error",
262 G_TYPE_FROM_CLASS (gobject_class),
264 G_STRUCT_OFFSET (ModestWebkitMimePartViewClass,limit_error),
266 g_cclosure_marshal_VOID__VOID,
272 modest_webkit_mime_part_view_init (ModestWebkitMimePartView *self)
274 ModestWebkitMimePartViewPrivate *priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
278 gdk_color_parse ("#fff", &base);
279 gdk_color_parse ("#000", &text);
280 gtk_widget_modify_base (GTK_WIDGET (self), GTK_STATE_NORMAL, &base);
281 gtk_widget_modify_text (GTK_WIDGET (self), GTK_STATE_NORMAL, &text);
283 priv->sighandlers = NULL;
285 priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
286 G_OBJECT(self), "notify::style",
287 G_CALLBACK (on_notify_style), (gpointer) self);
290 priv->current_zoom = 1.0;
291 priv->view_images = FALSE;
292 priv->has_external_images = FALSE;
296 modest_webkit_mime_part_view_finalize (GObject *obj)
298 ModestWebkitMimePartViewPrivate *priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (obj);
300 modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
301 priv->sighandlers = NULL;
303 G_OBJECT_CLASS (parent_class)->finalize (obj);
307 modest_webkit_mime_part_view_dispose (GObject *obj)
309 ModestWebkitMimePartViewPrivate *priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (obj);
311 g_signal_emit (G_OBJECT (obj), signals[STOP_STREAMS_SIGNAL], 0);
314 g_object_unref (priv->part);
318 G_OBJECT_CLASS (parent_class)->dispose (obj);
321 /* WEBKIT SIGNALS HANDLERS */
324 on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata)
326 if (strcmp ("style", spec->name) == 0) {
327 g_idle_add_full (G_PRIORITY_DEFAULT, (GSourceFunc) update_style,
328 g_object_ref (obj), g_object_unref);
329 gtk_widget_queue_draw (GTK_WIDGET (obj));
334 same_color (GdkColor *a, GdkColor *b)
336 return ((a->red == b->red) &&
337 (a->green == b->green) &&
338 (a->blue == b->blue));
342 update_style (ModestWebkitMimePartView *self)
346 GtkRcStyle *rc_style;
348 gdk_threads_enter ();
350 if (GTK_WIDGET_VISIBLE (self)) {
351 rc_style = gtk_widget_get_modifier_style (GTK_WIDGET (self));
353 gdk_color_parse ("#fff", &base);
354 gdk_color_parse ("#000", &text);
356 if (!same_color (&(rc_style->base[GTK_STATE_NORMAL]), &base) &&
357 !same_color (&(rc_style->text[GTK_STATE_NORMAL]), &text)) {
359 rc_style->base[GTK_STATE_NORMAL] = base;
360 rc_style->text[GTK_STATE_NORMAL] = text;
361 gtk_widget_modify_style (GTK_WIDGET (self), rc_style);
365 gdk_threads_leave ();
373 decode_to_stream_cb (TnyMimePart *self,
379 ModestWebkitMimePartView *view = (ModestWebkitMimePartView *) user_data;
381 if (MODEST_IS_STREAM_TEXT_TO_HTML (stream)) {
382 if (tny_stream_write (stream, "\n", 1) == -1) {
383 g_warning ("failed to write CR in %s", __FUNCTION__);
385 if (modest_stream_text_to_html_limit_reached (MODEST_STREAM_TEXT_TO_HTML (stream))) {
386 g_signal_emit (G_OBJECT (view), signals[LIMIT_ERROR_SIGNAL], 0);
388 tny_stream_reset (stream);
390 if (modest_tny_stream_webkit_limit_reached (MODEST_TNY_STREAM_WEBKIT (stream))) {
391 g_signal_emit (G_OBJECT (view), signals[LIMIT_ERROR_SIGNAL], 0);
394 tny_stream_close (stream);
398 set_html_part (ModestWebkitMimePartView *self, TnyMimePart *part, const gchar *encoding)
400 TnyStream *tny_stream;
402 g_return_if_fail (self);
403 g_return_if_fail (part);
405 g_signal_emit (G_OBJECT (self), signals[STOP_STREAMS_SIGNAL], 0);
407 tny_stream = TNY_STREAM(modest_tny_stream_webkit_new (WEBKIT_WEB_VIEW (self), "text/html", encoding));
408 modest_tny_stream_webkit_set_max_size (MODEST_TNY_STREAM_WEBKIT (tny_stream), 128*1024);
409 tny_stream_reset (tny_stream);
411 tny_mime_part_decode_to_stream_async (TNY_MIME_PART (part),
412 tny_stream, decode_to_stream_cb,
414 g_object_unref (tny_stream);
418 set_text_part (ModestWebkitMimePartView *self, TnyMimePart *part)
420 TnyStream* text_to_html_stream, *tny_stream;
422 g_return_if_fail (self);
423 g_return_if_fail (part);
425 g_signal_emit (G_OBJECT (self), signals[STOP_STREAMS_SIGNAL], 0);
427 tny_stream = TNY_STREAM(modest_tny_stream_webkit_new (WEBKIT_WEB_VIEW (self), "text/html", "utf-8"));
428 modest_tny_stream_webkit_set_max_size (MODEST_TNY_STREAM_WEBKIT (tny_stream), 128*1024);
429 text_to_html_stream = TNY_STREAM (modest_stream_text_to_html_new (tny_stream));
430 modest_stream_text_to_html_set_linkify_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream),
432 modest_stream_text_to_html_set_full_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream),
434 modest_stream_text_to_html_set_line_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream),
437 tny_mime_part_decode_to_stream_async (TNY_MIME_PART (part),
438 text_to_html_stream, decode_to_stream_cb,
441 g_object_unref (G_OBJECT(text_to_html_stream));
442 g_object_unref (G_OBJECT(tny_stream));
446 set_empty_part (ModestWebkitMimePartView *self)
448 g_return_if_fail (self);
450 g_signal_emit (G_OBJECT (self), signals[STOP_STREAMS_SIGNAL], 0);
451 webkit_web_view_load_string (WEBKIT_WEB_VIEW (self), "", "text/plain", "utf-8", NULL);
455 set_part (ModestWebkitMimePartView *self, TnyMimePart *part)
457 ModestWebkitMimePartViewPrivate *priv;
458 gchar *header_content_type, *header_content_type_lower;
460 gchar *charset = NULL;
462 g_return_if_fail (self);
464 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE(self);
465 priv->has_external_images = FALSE;
467 if (part != priv->part) {
469 g_object_unref (G_OBJECT(priv->part));
471 g_object_ref (G_OBJECT(part));
476 set_empty_part (self);
480 header_content_type = modest_tny_mime_part_get_header_value (part, "Content-Type");
481 if (header_content_type) {
482 header_content_type = g_strstrip (header_content_type);
483 header_content_type_lower = g_ascii_strdown (header_content_type, -1);
485 header_content_type_lower = NULL;
488 if (header_content_type_lower) {
489 tmp = strstr (header_content_type_lower, "charset=");
492 tmp = tmp + strlen ("charset=");
494 tmp2 = strstr (tmp, ";");
496 charset = g_strndup (tmp, tmp2-tmp);
498 charset = g_strdup (tmp);
503 if (tny_mime_part_content_type_is (part, "text/html")) {
504 set_html_part (self, part, charset);
506 if (tny_mime_part_content_type_is (part, "message/rfc822")) {
507 if (header_content_type) {
508 if (g_str_has_prefix (header_content_type_lower, "text/html"))
509 set_html_part (self, part, charset);
511 set_text_part (self, part);
514 set_text_part (self, part);
517 set_text_part (self, part);
520 g_free (header_content_type_lower);
521 g_free (header_content_type);
526 get_part (ModestWebkitMimePartView *self)
530 g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), NULL);
532 part = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE(self)->part;
541 is_empty (ModestWebkitMimePartView *self)
547 get_view_images (ModestWebkitMimePartView *self)
549 ModestWebkitMimePartViewPrivate *priv;
551 g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), FALSE);
553 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
554 return priv->view_images;
558 set_view_images (ModestWebkitMimePartView *self, gboolean view_images)
560 ModestWebkitMimePartViewPrivate *priv;
562 g_return_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self));
564 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
565 priv->view_images = view_images;
569 has_external_images (ModestWebkitMimePartView *self)
571 ModestWebkitMimePartViewPrivate *priv;
573 g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), FALSE);
575 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
576 return priv->has_external_images;
580 set_zoom (ModestWebkitMimePartView *self, gdouble zoom)
582 ModestWebkitMimePartViewPrivate *priv;
584 g_return_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self));
586 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
587 priv->current_zoom = zoom;
589 gtk_widget_queue_resize (GTK_WIDGET (self));
593 get_zoom (ModestWebkitMimePartView *self)
595 ModestWebkitMimePartViewPrivate *priv;
597 g_return_val_if_fail (MODEST_IS_WEBKIT_MIME_PART_VIEW (self), 1.0);
599 priv = MODEST_WEBKIT_MIME_PART_VIEW_GET_PRIVATE (self);
601 return priv->current_zoom;
605 search (ModestWebkitMimePartView *self,
612 search_next (ModestWebkitMimePartView *self)
618 get_selection_area (ModestWebkitMimePartView *self,
620 gint *width, gint *height)
626 /* TNY MIME PART IMPLEMENTATION */
629 tny_mime_part_view_init (gpointer g, gpointer iface_data)
631 TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
633 klass->get_part = modest_webkit_mime_part_view_get_part;
634 klass->set_part = modest_webkit_mime_part_view_set_part;
635 klass->clear = modest_webkit_mime_part_view_clear;
641 modest_webkit_mime_part_view_get_part (TnyMimePartView *self)
643 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->get_part_func (self);
648 modest_webkit_mime_part_view_get_part_default (TnyMimePartView *self)
650 return TNY_MIME_PART (get_part (MODEST_WEBKIT_MIME_PART_VIEW (self)));
654 modest_webkit_mime_part_view_set_part (TnyMimePartView *self,
657 MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->set_part_func (self, part);
661 modest_webkit_mime_part_view_set_part_default (TnyMimePartView *self,
664 g_return_if_fail ((part == NULL) || TNY_IS_MIME_PART (part));
666 set_part (MODEST_WEBKIT_MIME_PART_VIEW (self), part);
670 modest_webkit_mime_part_view_clear (TnyMimePartView *self)
672 MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->clear_func (self);
676 modest_webkit_mime_part_view_clear_default (TnyMimePartView *self)
678 set_part (MODEST_WEBKIT_MIME_PART_VIEW (self), NULL);
681 /* MODEST MIME PART VIEW IMPLEMENTATION */
684 modest_mime_part_view_init (gpointer g, gpointer iface_data)
686 ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
688 klass->is_empty_func = modest_webkit_mime_part_view_is_empty;
689 klass->get_view_images_func = modest_webkit_mime_part_view_get_view_images;
690 klass->set_view_images_func = modest_webkit_mime_part_view_set_view_images;
691 klass->has_external_images_func = modest_webkit_mime_part_view_has_external_images;
697 modest_webkit_mime_part_view_is_empty (ModestMimePartView *self)
699 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->is_empty_func (self);
703 modest_webkit_mime_part_view_get_view_images (ModestMimePartView *self)
705 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->get_view_images_func (self);
709 modest_webkit_mime_part_view_set_view_images (ModestMimePartView *self, gboolean view_images)
711 MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->set_view_images_func (self, view_images);
715 modest_webkit_mime_part_view_has_external_images (ModestMimePartView *self)
717 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->has_external_images_func (self);
721 modest_webkit_mime_part_view_is_empty_default (ModestMimePartView *self)
723 return is_empty (MODEST_WEBKIT_MIME_PART_VIEW (self));
727 modest_webkit_mime_part_view_get_view_images_default (ModestMimePartView *self)
729 return get_view_images (MODEST_WEBKIT_MIME_PART_VIEW (self));
733 modest_webkit_mime_part_view_set_view_images_default (ModestMimePartView *self, gboolean view_images)
735 set_view_images (MODEST_WEBKIT_MIME_PART_VIEW (self), view_images);
739 modest_webkit_mime_part_view_has_external_images_default (ModestMimePartView *self)
741 return has_external_images (MODEST_WEBKIT_MIME_PART_VIEW (self));
745 /* MODEST ZOOMABLE IMPLEMENTATION */
747 modest_zoomable_init (gpointer g, gpointer iface_data)
749 ModestZoomableIface *klass = (ModestZoomableIface *)g;
751 klass->get_zoom_func = modest_webkit_mime_part_view_get_zoom;
752 klass->set_zoom_func = modest_webkit_mime_part_view_set_zoom;
753 klass->zoom_minus_func = modest_webkit_mime_part_view_zoom_minus;
754 klass->zoom_plus_func = modest_webkit_mime_part_view_zoom_plus;
760 modest_webkit_mime_part_view_get_zoom (ModestZoomable *self)
762 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->get_zoom_func (self);
766 modest_webkit_mime_part_view_get_zoom_default (ModestZoomable *self)
768 return get_zoom (MODEST_WEBKIT_MIME_PART_VIEW (self));
772 modest_webkit_mime_part_view_set_zoom (ModestZoomable *self, gdouble value)
774 MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
778 modest_webkit_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value)
780 set_zoom (MODEST_WEBKIT_MIME_PART_VIEW (self), value);
784 modest_webkit_mime_part_view_zoom_minus (ModestZoomable *self)
786 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->zoom_minus_func (self);
790 modest_webkit_mime_part_view_zoom_minus_default (ModestZoomable *self)
792 /* operation not supported in ModestWebkitMimePartView */
797 modest_webkit_mime_part_view_zoom_plus (ModestZoomable *self)
799 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->zoom_plus_func (self);
803 modest_webkit_mime_part_view_zoom_plus_default (ModestZoomable *self)
805 /* operation not supported in ModestWebkitMimePartView */
809 /* ISEARCH VIEW IMPLEMENTATION */
811 modest_isearch_view_init (gpointer g, gpointer iface_data)
813 ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
815 klass->search_func = modest_webkit_mime_part_view_search;
816 klass->search_next_func = modest_webkit_mime_part_view_search_next;
817 klass->get_selection_area_func = modest_webkit_mime_part_view_get_selection_area;
823 modest_webkit_mime_part_view_search (ModestISearchView *self, const gchar *string)
825 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->search_func (self, string);
829 modest_webkit_mime_part_view_search_default (ModestISearchView *self, const gchar *string)
831 return search (MODEST_WEBKIT_MIME_PART_VIEW (self), string);
835 modest_webkit_mime_part_view_search_next(ModestISearchView *self)
837 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->search_next_func (self);
841 modest_webkit_mime_part_view_search_next_default (ModestISearchView *self)
843 return search_next (MODEST_WEBKIT_MIME_PART_VIEW (self));
847 modest_webkit_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
848 gint *width, gint *height)
850 return MODEST_WEBKIT_MIME_PART_VIEW_GET_CLASS (self)->get_selection_area_func (self, x, y, width, height);
854 modest_webkit_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
855 gint *width, gint *height)
857 return get_selection_area (MODEST_WEBKIT_MIME_PART_VIEW (self), x, y, width, height);