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-gtkhtml-mime-part-view.h>
33 #include <gtkhtml/gtkhtml-stream.h>
34 #include <gtkhtml/gtkhtml-search.h>
35 #include <tny-stream.h>
36 #include <tny-mime-part-view.h>
37 #include "modest-tny-mime-part.h"
38 #include <modest-stream-text-to-html.h>
39 #include <modest-text-utils.h>
40 #include <modest-conf.h>
41 #include <modest-runtime.h>
42 #include <widgets/modest-mime-part-view.h>
43 #include <widgets/modest-zoomable.h>
44 #include <widgets/modest-tny-stream-gtkhtml.h>
45 #include <libgnomevfs/gnome-vfs.h>
46 #include <gdk/gdkkeysyms.h>
48 /* gobject structure methods */
49 static void modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *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_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self);
55 static void modest_gtkhtml_mime_part_view_finalize (GObject *self);
56 static void modest_gtkhtml_mime_part_view_dispose (GObject *self);
58 /* GtkHTML signal handlers */
59 static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
60 static gboolean on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
61 static gboolean on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
62 ModestGtkhtmlMimePartView *self);
63 static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
64 static gboolean update_style (ModestGtkhtmlMimePartView *self);
65 /* TnyMimePartView implementation */
66 static void modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self);
67 static void modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self);
68 static void modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self, TnyMimePart *part);
69 static void modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self, TnyMimePart *part);
70 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self);
71 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self);
72 /* ModestMimePartView implementation */
73 static gboolean modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self);
74 static gboolean modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self);
75 static gboolean modest_gtkhtml_mime_part_view_get_view_images (ModestMimePartView *self);
76 static gboolean modest_gtkhtml_mime_part_view_get_view_images_default (ModestMimePartView *self);
77 static void modest_gtkhtml_mime_part_view_set_view_images (ModestMimePartView *self, gboolean view_images);
78 static void modest_gtkhtml_mime_part_view_set_view_images_default (ModestMimePartView *self, gboolean view_images);
79 static gboolean modest_gtkhtml_mime_part_view_has_external_images (ModestMimePartView *self);
80 static gboolean modest_gtkhtml_mime_part_view_has_external_images_default (ModestMimePartView *self);
81 /* ModestZoomable implementation */
82 static gdouble modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self);
83 static void modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value);
84 static gboolean modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self);
85 static gboolean modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self);
86 static gdouble modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self);
87 static void modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value);
88 static gboolean modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self);
89 static gboolean modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self);
90 /* ModestISearchView implementation */
91 static gboolean modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string);
92 static gboolean modest_gtkhtml_mime_part_view_search_next (ModestISearchView *self);
93 static gboolean modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
94 gint *width, gint *height);
95 static gboolean modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string);
96 static gboolean modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self);
97 static gboolean modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
98 gint *width, gint *height);
102 static TnyMimePart *get_part (ModestGtkhtmlMimePartView *self);
103 static void set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
104 static void set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
105 static void set_empty_part (ModestGtkhtmlMimePartView *self);
106 static void set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
107 static gboolean is_empty (ModestGtkhtmlMimePartView *self);
108 static gboolean get_view_images (ModestGtkhtmlMimePartView *self);
109 static void set_view_images (ModestGtkhtmlMimePartView *self, gboolean view_images);
110 static gboolean has_external_images (ModestGtkhtmlMimePartView *self);
111 static void set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom);
112 static gdouble get_zoom (ModestGtkhtmlMimePartView *self);
113 static gboolean has_contents_receiver (gpointer engine, const gchar *data,
114 size_t len, gboolean *has_contents);
115 static gboolean search (ModestGtkhtmlMimePartView *self, const gchar *string);
116 static gboolean search_next (ModestGtkhtmlMimePartView *self);
117 static gboolean get_selection_area (ModestGtkhtmlMimePartView *self, gint *x, gint *y,
118 gint *width, gint *height);
120 typedef struct _ModestGtkhtmlMimePartViewPrivate ModestGtkhtmlMimePartViewPrivate;
121 struct _ModestGtkhtmlMimePartViewPrivate {
123 gdouble current_zoom;
124 gboolean view_images;
125 gboolean has_external_images;
128 #define MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
129 MODEST_TYPE_GTKHTML_MIME_PART_VIEW, \
130 ModestGtkhtmlMimePartViewPrivate))
132 static GtkHTMLClass *parent_class = NULL;
135 modest_gtkhtml_mime_part_view_new ()
137 return g_object_new (MODEST_TYPE_GTKHTML_MIME_PART_VIEW, NULL);
140 /* GOBJECT IMPLEMENTATION */
142 modest_gtkhtml_mime_part_view_get_type (void)
144 static GType my_type = 0;
146 static const GTypeInfo my_info = {
147 sizeof(ModestGtkhtmlMimePartViewClass),
148 NULL, /* base init */
149 NULL, /* base finalize */
150 (GClassInitFunc) modest_gtkhtml_mime_part_view_class_init,
151 NULL, /* class finalize */
152 NULL, /* class data */
153 sizeof(ModestGtkhtmlMimePartView),
155 (GInstanceInitFunc) modest_gtkhtml_mime_part_view_init,
159 static const GInterfaceInfo tny_mime_part_view_info =
161 (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
162 NULL, /* interface_finalize */
163 NULL /* interface_data */
166 static const GInterfaceInfo modest_mime_part_view_info =
168 (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
169 NULL, /* interface_finalize */
170 NULL /* interface_data */
173 static const GInterfaceInfo modest_zoomable_info =
175 (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
176 NULL, /* interface_finalize */
177 NULL /* interface_data */
180 static const GInterfaceInfo modest_isearch_view_info =
182 (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
183 NULL, /* interface_finalize */
184 NULL /* interface_data */
187 my_type = g_type_register_static (GTK_TYPE_HTML,
188 "ModestGtkhtmlMimePartView",
191 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW,
192 &tny_mime_part_view_info);
194 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW,
195 &modest_mime_part_view_info);
197 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE,
198 &modest_zoomable_info);
199 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW,
200 &modest_isearch_view_info);
206 modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass)
208 GObjectClass *gobject_class;
209 GtkBindingSet *binding_set;
211 gobject_class = (GObjectClass*) klass;
213 parent_class = g_type_class_peek_parent (klass);
214 gobject_class->dispose = modest_gtkhtml_mime_part_view_dispose;
215 gobject_class->finalize = modest_gtkhtml_mime_part_view_finalize;
217 klass->get_part_func = modest_gtkhtml_mime_part_view_get_part_default;
218 klass->set_part_func = modest_gtkhtml_mime_part_view_set_part_default;
219 klass->clear_func = modest_gtkhtml_mime_part_view_clear_default;
220 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty_default;
221 klass->get_view_images_func = modest_gtkhtml_mime_part_view_get_view_images_default;
222 klass->set_view_images_func = modest_gtkhtml_mime_part_view_set_view_images_default;
223 klass->has_external_images_func = modest_gtkhtml_mime_part_view_has_external_images_default;
224 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom_default;
225 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom_default;
226 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus_default;
227 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus_default;
228 klass->search_func = modest_gtkhtml_mime_part_view_search_default;
229 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next_default;
230 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area_default;
232 binding_set = gtk_binding_set_by_class (klass);
233 gtk_binding_entry_skip (binding_set, GDK_Down, 0);
234 gtk_binding_entry_skip (binding_set, GDK_Up, 0);
235 gtk_binding_entry_skip (binding_set, GDK_KP_Up, 0);
236 gtk_binding_entry_skip (binding_set, GDK_KP_Down, 0);
237 gtk_binding_entry_skip (binding_set, GDK_Page_Down, 0);
238 gtk_binding_entry_skip (binding_set, GDK_Page_Up, 0);
239 gtk_binding_entry_skip (binding_set, GDK_KP_Page_Up, 0);
240 gtk_binding_entry_skip (binding_set, GDK_KP_Page_Down, 0);
241 gtk_binding_entry_skip (binding_set, GDK_Home, 0);
242 gtk_binding_entry_skip (binding_set, GDK_End, 0);
243 gtk_binding_entry_skip (binding_set, GDK_KP_Home, 0);
244 gtk_binding_entry_skip (binding_set, GDK_KP_End, 0);
246 g_type_class_add_private (gobject_class, sizeof(ModestGtkhtmlMimePartViewPrivate));
251 modest_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self)
253 ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
257 gtk_html_set_editable (GTK_HTML(self), FALSE);
258 gtk_html_allow_selection (GTK_HTML(self), TRUE);
259 gtk_html_set_caret_mode (GTK_HTML(self), FALSE);
260 gtk_html_set_blocking (GTK_HTML(self), TRUE);
261 gtk_html_set_images_blocking (GTK_HTML(self), TRUE);
263 gdk_color_parse ("#fff", &base);
264 gdk_color_parse ("#000", &text);
265 gtk_widget_modify_base (GTK_WIDGET (self), GTK_STATE_NORMAL, &base);
266 gtk_widget_modify_text (GTK_WIDGET (self), GTK_STATE_NORMAL, &text);
268 g_signal_connect (G_OBJECT(self), "link_clicked",
269 G_CALLBACK(on_link_clicked), self);
270 g_signal_connect (G_OBJECT(self), "url_requested",
271 G_CALLBACK(on_url_requested), self);
272 g_signal_connect (G_OBJECT(self), "on_url",
273 G_CALLBACK(on_url), self);
274 g_signal_connect (G_OBJECT(self), "notify::style",
275 G_CALLBACK (on_notify_style), (gpointer) self);
278 priv->current_zoom = 1.0;
279 priv->view_images = FALSE;
280 priv->has_external_images = FALSE;
284 modest_gtkhtml_mime_part_view_finalize (GObject *obj)
286 G_OBJECT_CLASS (parent_class)->finalize (obj);
290 modest_gtkhtml_mime_part_view_dispose (GObject *obj)
292 ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (obj);
295 g_object_unref (priv->part);
299 G_OBJECT_CLASS (parent_class)->dispose (obj);
302 /* GTKHTML SIGNALS HANDLERS */
305 on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata)
307 if (strcmp ("style", spec->name) == 0) {
308 g_idle_add ((GSourceFunc) update_style, (gpointer) obj);
309 gtk_widget_queue_draw (GTK_WIDGET (obj));
314 same_color (GdkColor *a, GdkColor *b)
316 return ((a->red == b->red) &&
317 (a->green == b->green) &&
318 (a->blue == b->blue));
322 update_style (ModestGtkhtmlMimePartView *self)
326 GtkRcStyle *rc_style;
328 rc_style = gtk_widget_get_modifier_style (GTK_WIDGET (self));
330 gdk_color_parse ("#fff", &base);
331 gdk_color_parse ("#000", &text);
333 if (!same_color (&(rc_style->base[GTK_STATE_NORMAL]), &base) &&
334 !same_color (&(rc_style->text[GTK_STATE_NORMAL]), &text)) {
336 rc_style->base[GTK_STATE_NORMAL] = base;
337 rc_style->text[GTK_STATE_NORMAL] = text;
338 gtk_widget_modify_style (GTK_WIDGET (self), rc_style);
348 on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
351 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
353 g_signal_emit_by_name (G_OBJECT (self), "activate-link", uri, &result);
358 on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
361 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
363 g_signal_emit_by_name (G_OBJECT (self), "link-hover", uri, &result);
370 GtkHTMLStream *stream;
374 on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
375 ModestGtkhtmlMimePartView *self)
378 TnyStream *tny_stream;
379 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
381 if (g_str_has_prefix (uri, "http:")) {
382 ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
384 if (!priv->view_images)
385 priv->has_external_images = TRUE;
388 tny_stream = TNY_STREAM (modest_tny_stream_gtkhtml_new (stream, GTK_HTML (widget)));
389 g_signal_emit_by_name (MODEST_MIME_PART_VIEW (self), "fetch-url", uri, tny_stream, &result);
390 g_object_unref (tny_stream);
397 set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
399 GtkHTMLStream *gtkhtml_stream;
400 TnyStream *tny_stream;
402 g_return_if_fail (self);
403 g_return_if_fail (part);
405 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
407 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream, GTK_HTML (self)));
408 tny_stream_reset (tny_stream);
410 tny_mime_part_decode_to_stream ((TnyMimePart*)part, tny_stream, NULL);
411 tny_stream_close (tny_stream);
412 g_object_unref (G_OBJECT(tny_stream));
416 set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
418 TnyStream* text_to_html_stream, *tny_stream;
419 GtkHTMLStream *gtkhtml_stream;
421 g_return_if_fail (self);
422 g_return_if_fail (part);
424 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
425 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream, GTK_HTML (self)));
426 text_to_html_stream = TNY_STREAM (modest_stream_text_to_html_new (tny_stream));
427 modest_stream_text_to_html_set_linkify_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream), 64*1024);
428 modest_stream_text_to_html_set_full_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream), 640*1024);
431 tny_mime_part_decode_to_stream ((TnyMimePart*)part, text_to_html_stream, NULL);
432 tny_stream_write (text_to_html_stream, "\n", 1);
433 tny_stream_reset (text_to_html_stream);
434 tny_stream_close (text_to_html_stream);
436 g_object_unref (G_OBJECT(text_to_html_stream));
437 g_object_unref (G_OBJECT(tny_stream));
438 /* gtk_html_stream_destroy (gtkhtml_stream); */
442 set_empty_part (ModestGtkhtmlMimePartView *self)
444 g_return_if_fail (self);
446 gtk_html_load_from_string (GTK_HTML(self),
451 set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
453 ModestGtkhtmlMimePartViewPrivate *priv;
455 g_return_if_fail (self);
457 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self);
458 priv->has_external_images = FALSE;
460 if (part != priv->part) {
462 g_object_unref (G_OBJECT(priv->part));
464 g_object_ref (G_OBJECT(part));
469 set_empty_part (self);
473 if (tny_mime_part_content_type_is (part, "text/html")) {
474 set_html_part (self, part);
476 if (tny_mime_part_content_type_is (part, "message/rfc822")) {
477 gchar *header_content_type, *header_content_type_lower;
478 header_content_type = modest_tny_mime_part_get_header_value (part, "Content-Type");
479 if (header_content_type) {
480 header_content_type = g_strstrip (header_content_type);
481 header_content_type_lower = g_ascii_strdown (header_content_type, -1);
483 if (!g_ascii_strcasecmp (header_content_type_lower, "text/html"))
484 set_html_part (self, part);
486 set_text_part (self, part);
488 g_free (header_content_type_lower);
489 g_free (header_content_type);
491 set_text_part (self, part);
494 set_text_part (self, part);
501 get_part (ModestGtkhtmlMimePartView *self)
505 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), NULL);
507 part = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self)->part;
516 has_contents_receiver (gpointer engine, const gchar *data,
517 size_t len, gboolean *has_contents)
519 if (len > 1 || ((len == 1)&&(data[0]!='\n'))) {
520 *has_contents = TRUE;
527 is_empty (ModestGtkhtmlMimePartView *self)
529 /* TODO: Find some gtkhtml API to check whether there is any (visible, non markup)
530 * text in the message:
532 gboolean has_contents = FALSE;
534 gtk_html_export (GTK_HTML (self), "text/plain",
535 (GtkHTMLSaveReceiverFn) has_contents_receiver, &has_contents);
537 return !has_contents;
541 get_view_images (ModestGtkhtmlMimePartView *self)
543 ModestGtkhtmlMimePartViewPrivate *priv;
545 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
547 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
548 return priv->view_images;
552 set_view_images (ModestGtkhtmlMimePartView *self, gboolean view_images)
554 ModestGtkhtmlMimePartViewPrivate *priv;
556 g_return_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self));
558 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
559 priv->view_images = view_images;
563 has_external_images (ModestGtkhtmlMimePartView *self)
565 ModestGtkhtmlMimePartViewPrivate *priv;
567 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
569 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
570 return priv->has_external_images;
574 set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom)
576 ModestGtkhtmlMimePartViewPrivate *priv;
578 g_return_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self));
580 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
581 priv->current_zoom = zoom;
582 gtk_html_set_magnification (GTK_HTML(self), zoom);
584 gtk_widget_queue_resize (GTK_WIDGET (self));
588 get_zoom (ModestGtkhtmlMimePartView *self)
590 ModestGtkhtmlMimePartViewPrivate *priv;
592 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), 1.0);
594 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
596 return priv->current_zoom;
600 search (ModestGtkhtmlMimePartView *self,
603 return gtk_html_engine_search (GTK_HTML (self),
605 FALSE, /* case sensitive */
611 search_next (ModestGtkhtmlMimePartView *self)
613 return gtk_html_engine_search_next (GTK_HTML (self));
617 get_selection_area (ModestGtkhtmlMimePartView *self,
619 gint *width, gint *height)
621 #ifdef HAVE_GTK_HTML_GET_SELECTION_AREA
622 gtk_html_get_selection_area (GTK_HTML (self), x, y, width, height);
630 /* TNY MIME PART IMPLEMENTATION */
633 tny_mime_part_view_init (gpointer g, gpointer iface_data)
635 TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
637 klass->get_part = modest_gtkhtml_mime_part_view_get_part;
638 klass->set_part = modest_gtkhtml_mime_part_view_set_part;
639 klass->clear = modest_gtkhtml_mime_part_view_clear;
645 modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self)
647 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_part_func (self);
652 modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self)
654 return TNY_MIME_PART (get_part (MODEST_GTKHTML_MIME_PART_VIEW (self)));
658 modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self,
661 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_part_func (self, part);
665 modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self,
668 g_return_if_fail ((part == NULL) || TNY_IS_MIME_PART (part));
670 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), part);
674 modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self)
676 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->clear_func (self);
680 modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self)
682 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), NULL);
685 /* MODEST MIME PART VIEW IMPLEMENTATION */
688 modest_mime_part_view_init (gpointer g, gpointer iface_data)
690 ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
692 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty;
693 klass->get_view_images_func = modest_gtkhtml_mime_part_view_get_view_images;
694 klass->set_view_images_func = modest_gtkhtml_mime_part_view_set_view_images;
695 klass->has_external_images_func = modest_gtkhtml_mime_part_view_has_external_images;
701 modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self)
703 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->is_empty_func (self);
707 modest_gtkhtml_mime_part_view_get_view_images (ModestMimePartView *self)
709 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_view_images_func (self);
713 modest_gtkhtml_mime_part_view_set_view_images (ModestMimePartView *self, gboolean view_images)
715 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_view_images_func (self, view_images);
719 modest_gtkhtml_mime_part_view_has_external_images (ModestMimePartView *self)
721 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->has_external_images_func (self);
725 modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self)
727 return is_empty (MODEST_GTKHTML_MIME_PART_VIEW (self));
731 modest_gtkhtml_mime_part_view_get_view_images_default (ModestMimePartView *self)
733 return get_view_images (MODEST_GTKHTML_MIME_PART_VIEW (self));
737 modest_gtkhtml_mime_part_view_set_view_images_default (ModestMimePartView *self, gboolean view_images)
739 set_view_images (MODEST_GTKHTML_MIME_PART_VIEW (self), view_images);
743 modest_gtkhtml_mime_part_view_has_external_images_default (ModestMimePartView *self)
745 return has_external_images (MODEST_GTKHTML_MIME_PART_VIEW (self));
749 /* MODEST ZOOMABLE IMPLEMENTATION */
751 modest_zoomable_init (gpointer g, gpointer iface_data)
753 ModestZoomableIface *klass = (ModestZoomableIface *)g;
755 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom;
756 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom;
757 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus;
758 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus;
764 modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self)
766 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_zoom_func (self);
770 modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self)
772 return get_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self));
776 modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value)
778 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
782 modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value)
784 set_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self), value);
788 modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self)
790 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_minus_func (self);
794 modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self)
796 /* operation not supported in ModestGtkhtmlMimePartView */
801 modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self)
803 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_plus_func (self);
807 modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self)
809 /* operation not supported in ModestGtkhtmlMimePartView */
813 /* ISEARCH VIEW IMPLEMENTATION */
815 modest_isearch_view_init (gpointer g, gpointer iface_data)
817 ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
819 klass->search_func = modest_gtkhtml_mime_part_view_search;
820 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next;
821 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area;
827 modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string)
829 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_func (self, string);
833 modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string)
835 return search (MODEST_GTKHTML_MIME_PART_VIEW (self), string);
839 modest_gtkhtml_mime_part_view_search_next(ModestISearchView *self)
841 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_next_func (self);
845 modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self)
847 return search_next (MODEST_GTKHTML_MIME_PART_VIEW (self));
851 modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
852 gint *width, gint *height)
854 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_selection_area_func (self, x, y, width, height);
858 modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
859 gint *width, gint *height)
861 return get_selection_area (MODEST_GTKHTML_MIME_PART_VIEW (self), x, y, width, height);