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>
47 /* gobject structure methods */
48 static void modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass);
49 static void tny_mime_part_view_init (gpointer g, gpointer iface_data);
50 static void modest_mime_part_view_init (gpointer g, gpointer iface_data);
51 static void modest_zoomable_init (gpointer g, gpointer iface_data);
52 static void modest_isearch_view_init (gpointer g, gpointer iface_data);
53 static void modest_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self);
54 static void modest_gtkhtml_mime_part_view_finalize (GObject *self);
56 /* GtkHTML signal handlers */
57 static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
58 static gboolean on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
59 static gboolean on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
60 ModestGtkhtmlMimePartView *self);
61 /* TnyMimePartView implementation */
62 static void modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self);
63 static void modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self);
64 static void modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self, TnyMimePart *part);
65 static void modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self, TnyMimePart *part);
66 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self);
67 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self);
68 /* ModestMimePartView implementation */
69 static gboolean modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self);
70 static gboolean modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self);
71 /* ModestZoomable implementation */
72 static gdouble modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self);
73 static void modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value);
74 static gboolean modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self);
75 static gboolean modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self);
76 static gdouble modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self);
77 static void modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value);
78 static gboolean modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self);
79 static gboolean modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self);
80 /* ModestISearchView implementation */
81 static gboolean modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string);
82 static gboolean modest_gtkhtml_mime_part_view_search_next (ModestISearchView *self);
83 static gboolean modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
84 gint *width, gint *height);
85 static gboolean modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string);
86 static gboolean modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self);
87 static gboolean modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
88 gint *width, gint *height);
92 static TnyMimePart *get_part (ModestGtkhtmlMimePartView *self);
93 static void set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
94 static void set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
95 static void set_empty_part (ModestGtkhtmlMimePartView *self);
96 static void set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
97 static gboolean is_empty (ModestGtkhtmlMimePartView *self);
98 static void set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom);
99 static gdouble get_zoom (ModestGtkhtmlMimePartView *self);
100 static gboolean has_contents_receiver (gpointer engine, const gchar *data,
101 size_t len, gboolean *has_contents);
102 static gboolean search (ModestGtkhtmlMimePartView *self, const gchar *string);
103 static gboolean search_next (ModestGtkhtmlMimePartView *self);
104 static gboolean get_selection_area (ModestGtkhtmlMimePartView *self, gint *x, gint *y,
105 gint *width, gint *height);
107 typedef struct _ModestGtkhtmlMimePartViewPrivate ModestGtkhtmlMimePartViewPrivate;
108 struct _ModestGtkhtmlMimePartViewPrivate {
110 gdouble current_zoom;
113 #define MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
114 MODEST_TYPE_GTKHTML_MIME_PART_VIEW, \
115 ModestGtkhtmlMimePartViewPrivate))
117 static GtkHTMLClass *parent_class = NULL;
120 modest_gtkhtml_mime_part_view_new ()
122 return g_object_new (MODEST_TYPE_GTKHTML_MIME_PART_VIEW, NULL);
125 /* GOBJECT IMPLEMENTATION */
127 modest_gtkhtml_mime_part_view_get_type (void)
129 static GType my_type = 0;
131 static const GTypeInfo my_info = {
132 sizeof(ModestGtkhtmlMimePartViewClass),
133 NULL, /* base init */
134 NULL, /* base finalize */
135 (GClassInitFunc) modest_gtkhtml_mime_part_view_class_init,
136 NULL, /* class finalize */
137 NULL, /* class data */
138 sizeof(ModestGtkhtmlMimePartView),
140 (GInstanceInitFunc) modest_gtkhtml_mime_part_view_init,
144 static const GInterfaceInfo tny_mime_part_view_info =
146 (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
147 NULL, /* interface_finalize */
148 NULL /* interface_data */
151 static const GInterfaceInfo modest_mime_part_view_info =
153 (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
154 NULL, /* interface_finalize */
155 NULL /* interface_data */
158 static const GInterfaceInfo modest_zoomable_info =
160 (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
161 NULL, /* interface_finalize */
162 NULL /* interface_data */
165 static const GInterfaceInfo modest_isearch_view_info =
167 (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
168 NULL, /* interface_finalize */
169 NULL /* interface_data */
172 my_type = g_type_register_static (GTK_TYPE_HTML,
173 "ModestGtkhtmlMimePartView",
176 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW,
177 &tny_mime_part_view_info);
179 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW,
180 &modest_mime_part_view_info);
182 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE,
183 &modest_zoomable_info);
184 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW,
185 &modest_isearch_view_info);
191 modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass)
193 GObjectClass *gobject_class;
194 gobject_class = (GObjectClass*) klass;
196 parent_class = g_type_class_peek_parent (klass);
197 gobject_class->finalize = modest_gtkhtml_mime_part_view_finalize;
199 klass->get_part_func = modest_gtkhtml_mime_part_view_get_part_default;
200 klass->set_part_func = modest_gtkhtml_mime_part_view_set_part_default;
201 klass->clear_func = modest_gtkhtml_mime_part_view_clear_default;
202 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty_default;
203 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom_default;
204 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom_default;
205 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus_default;
206 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus_default;
207 klass->search_func = modest_gtkhtml_mime_part_view_search_default;
208 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next_default;
209 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area_default;
211 g_type_class_add_private (gobject_class, sizeof(ModestGtkhtmlMimePartViewPrivate));
216 modest_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self)
218 ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
220 gtk_html_set_editable (GTK_HTML(self), FALSE);
221 gtk_html_allow_selection (GTK_HTML(self), TRUE);
222 gtk_html_set_caret_mode (GTK_HTML(self), FALSE);
223 gtk_html_set_blocking (GTK_HTML(self), FALSE);
224 gtk_html_set_images_blocking (GTK_HTML(self), FALSE);
226 g_signal_connect (G_OBJECT(self), "link_clicked",
227 G_CALLBACK(on_link_clicked), self);
228 g_signal_connect (G_OBJECT(self), "url_requested",
229 G_CALLBACK(on_url_requested), self);
230 g_signal_connect (G_OBJECT(self), "on_url",
231 G_CALLBACK(on_url), self);
234 priv->current_zoom = 1.0;
238 modest_gtkhtml_mime_part_view_finalize (GObject *obj)
240 G_OBJECT_CLASS (parent_class)->finalize (obj);
243 /* GTKHTML SIGNALS HANDLERS */
246 on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
249 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
251 g_signal_emit_by_name (G_OBJECT (self), "activate-link", uri, &result);
256 on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
259 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
261 g_signal_emit_by_name (G_OBJECT (self), "link-hover", uri, &result);
268 GtkHTMLStream *stream;
269 gboolean html_finalized;
273 html_finalized_notify (ImageFetcherInfo *ifinfo,
276 ifinfo->html_finalized = TRUE;
280 image_fetcher_close (GnomeVFSAsyncHandle *handle,
281 GnomeVFSResult result,
287 image_fetcher_read (GnomeVFSAsyncHandle *handle,
288 GnomeVFSResult result,
290 GnomeVFSFileSize bytes_requested,
291 GnomeVFSFileSize bytes_read,
292 ImageFetcherInfo *ifinfo)
295 if (ifinfo->html_finalized || result != GNOME_VFS_OK) {
296 gnome_vfs_async_close (handle, (GnomeVFSAsyncCloseCallback) image_fetcher_close, (gpointer) NULL);
297 if (!ifinfo->html_finalized) {
298 gtk_html_stream_close (ifinfo->stream, GTK_HTML_STREAM_OK);
299 g_object_weak_unref ((GObject *) ifinfo->html, (GWeakNotify) html_finalized_notify, (gpointer) ifinfo);
301 g_slice_free1 (128, ifinfo->buffer);
302 g_slice_free (ImageFetcherInfo, ifinfo);
305 gtk_html_stream_write (ifinfo->stream, buffer, bytes_read);
306 gnome_vfs_async_read (handle, ifinfo->buffer, 128,
307 (GnomeVFSAsyncReadCallback)image_fetcher_read, ifinfo);
312 image_fetcher_open (GnomeVFSAsyncHandle *handle,
313 GnomeVFSResult result,
314 ImageFetcherInfo *ifinfo)
316 if (!ifinfo->html_finalized && result == GNOME_VFS_OK) {
317 ifinfo->buffer = g_slice_alloc (128);
318 gnome_vfs_async_read (handle, ifinfo->buffer, 128,
319 (GnomeVFSAsyncReadCallback) image_fetcher_read, ifinfo);
321 if (!ifinfo->html_finalized) {
322 gtk_html_stream_close (ifinfo->stream, GTK_HTML_STREAM_OK);
323 g_object_weak_unref ((GObject *) ifinfo->html, (GWeakNotify) html_finalized_notify, (gpointer) ifinfo);
325 g_slice_free (ImageFetcherInfo, ifinfo);
330 on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
331 ModestGtkhtmlMimePartView *self)
334 TnyStream *tny_stream;
335 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
337 if (g_str_has_prefix (uri, "http:") &&
338 modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_FETCH_HTML_EXTERNAL_IMAGES, NULL)) {
339 GnomeVFSAsyncHandle *handle;
340 ImageFetcherInfo *ifinfo;
342 ifinfo = g_slice_new (ImageFetcherInfo);
343 ifinfo->html_finalized = FALSE;
344 ifinfo->html = (GtkHTML *) self;
345 ifinfo->buffer = NULL;
346 ifinfo->stream = stream;
347 g_object_weak_ref ((GObject *) self, (GWeakNotify) html_finalized_notify, (gpointer) ifinfo);
348 gnome_vfs_async_open (&handle, uri, GNOME_VFS_OPEN_READ,
349 GNOME_VFS_PRIORITY_DEFAULT,
350 (GnomeVFSAsyncOpenCallback) image_fetcher_open, ifinfo);
354 tny_stream = TNY_STREAM (modest_tny_stream_gtkhtml_new (stream));
355 g_signal_emit_by_name (MODEST_MIME_PART_VIEW (self), "fetch-url", uri, tny_stream, &result);
356 tny_stream_close (tny_stream);
357 g_object_unref (tny_stream);
364 set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
366 GtkHTMLStream *gtkhtml_stream;
367 TnyStream *tny_stream;
369 g_return_if_fail (self);
370 g_return_if_fail (part);
372 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
374 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream));
375 tny_stream_reset (tny_stream);
377 tny_mime_part_decode_to_stream ((TnyMimePart*)part, tny_stream, NULL);
378 tny_stream_close (tny_stream);
379 g_object_unref (G_OBJECT(tny_stream));
383 set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
385 TnyStream* text_to_html_stream, *tny_stream;
386 GtkHTMLStream *gtkhtml_stream;
388 g_return_if_fail (self);
389 g_return_if_fail (part);
391 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
392 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream));
393 text_to_html_stream = TNY_STREAM (modest_stream_text_to_html_new (tny_stream));
394 modest_stream_text_to_html_set_linkify_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream), 64*1024);
395 modest_stream_text_to_html_set_full_limit (MODEST_STREAM_TEXT_TO_HTML (text_to_html_stream), 640*1024);
398 tny_mime_part_decode_to_stream ((TnyMimePart*)part, text_to_html_stream, NULL);
399 tny_stream_write (text_to_html_stream, "\n", 1);
400 tny_stream_reset (text_to_html_stream);
401 tny_stream_close (text_to_html_stream);
403 g_object_unref (G_OBJECT(text_to_html_stream));
404 g_object_unref (G_OBJECT(tny_stream));
405 /* gtk_html_stream_destroy (gtkhtml_stream); */
409 set_empty_part (ModestGtkhtmlMimePartView *self)
411 g_return_if_fail (self);
413 gtk_html_load_from_string (GTK_HTML(self),
418 set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
420 ModestGtkhtmlMimePartViewPrivate *priv;
422 g_return_if_fail (self);
424 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self);
426 if (part != priv->part) {
428 g_object_unref (G_OBJECT(priv->part));
430 g_object_ref (G_OBJECT(part));
435 set_empty_part (self);
439 if (tny_mime_part_content_type_is (part, "text/html")) {
440 set_html_part (self, part);
442 if (tny_mime_part_content_type_is (part, "message/rfc822")) {
443 gchar *header_content_type, *header_content_type_lower;
444 header_content_type = modest_tny_mime_part_get_header_value (part, "Content-Type");
445 if (header_content_type) {
446 header_content_type = g_strstrip (header_content_type);
447 header_content_type_lower = g_ascii_strdown (header_content_type, -1);
449 if (!g_ascii_strcasecmp (header_content_type_lower, "text/html"))
450 set_html_part (self, part);
452 set_text_part (self, part);
454 g_free (header_content_type_lower);
455 g_free (header_content_type);
457 set_text_part (self, part);
460 set_text_part (self, part);
467 get_part (ModestGtkhtmlMimePartView *self)
471 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), NULL);
473 part = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self)->part;
482 has_contents_receiver (gpointer engine, const gchar *data,
483 size_t len, gboolean *has_contents)
485 if (len > 1 || ((len == 1)&&(data[0]!='\n'))) {
486 *has_contents = TRUE;
493 is_empty (ModestGtkhtmlMimePartView *self)
495 /* TODO: Find some gtkhtml API to check whether there is any (visible, non markup)
496 * text in the message:
498 gboolean has_contents = FALSE;
500 gtk_html_export (GTK_HTML (self), "text/plain",
501 (GtkHTMLSaveReceiverFn) has_contents_receiver, &has_contents);
503 return !has_contents;
507 set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom)
509 ModestGtkhtmlMimePartViewPrivate *priv;
511 g_return_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self));
513 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
514 priv->current_zoom = zoom;
515 gtk_html_set_magnification (GTK_HTML(self), zoom);
517 gtk_widget_queue_resize (GTK_WIDGET (self));
521 get_zoom (ModestGtkhtmlMimePartView *self)
523 ModestGtkhtmlMimePartViewPrivate *priv;
525 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), 1.0);
527 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
529 return priv->current_zoom;
533 search (ModestGtkhtmlMimePartView *self,
536 return gtk_html_engine_search (GTK_HTML (self),
538 FALSE, /* case sensitive */
544 search_next (ModestGtkhtmlMimePartView *self)
546 return gtk_html_engine_search_next (GTK_HTML (self));
550 get_selection_area (ModestGtkhtmlMimePartView *self,
552 gint *width, gint *height)
554 #ifdef HAVE_GTK_HTML_GET_SELECTION_AREA
555 gtk_html_get_selection_area (GTK_HTML (self), x, y, width, height);
563 /* TNY MIME PART IMPLEMENTATION */
566 tny_mime_part_view_init (gpointer g, gpointer iface_data)
568 TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
570 klass->get_part = modest_gtkhtml_mime_part_view_get_part;
571 klass->set_part = modest_gtkhtml_mime_part_view_set_part;
572 klass->clear = modest_gtkhtml_mime_part_view_clear;
578 modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self)
580 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_part_func (self);
585 modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self)
587 return TNY_MIME_PART (get_part (MODEST_GTKHTML_MIME_PART_VIEW (self)));
591 modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self,
594 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_part_func (self, part);
598 modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self,
601 g_return_if_fail ((part == NULL) || TNY_IS_MIME_PART (part));
603 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), part);
607 modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self)
609 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->clear_func (self);
613 modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self)
615 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), NULL);
618 /* MODEST MIME PART VIEW IMPLEMENTATION */
621 modest_mime_part_view_init (gpointer g, gpointer iface_data)
623 ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
625 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty;
631 modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self)
633 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->is_empty_func (self);
637 modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self)
639 return is_empty (MODEST_GTKHTML_MIME_PART_VIEW (self));
643 /* MODEST ZOOMABLE IMPLEMENTATION */
645 modest_zoomable_init (gpointer g, gpointer iface_data)
647 ModestZoomableIface *klass = (ModestZoomableIface *)g;
649 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom;
650 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom;
651 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus;
652 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus;
658 modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self)
660 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_zoom_func (self);
664 modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self)
666 return get_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self));
670 modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value)
672 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
676 modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value)
678 set_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self), value);
682 modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self)
684 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_minus_func (self);
688 modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self)
690 /* operation not supported in ModestGtkhtmlMimePartView */
695 modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self)
697 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_plus_func (self);
701 modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self)
703 /* operation not supported in ModestGtkhtmlMimePartView */
707 /* ISEARCH VIEW IMPLEMENTATION */
709 modest_isearch_view_init (gpointer g, gpointer iface_data)
711 ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
713 klass->search_func = modest_gtkhtml_mime_part_view_search;
714 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next;
715 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area;
721 modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string)
723 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_func (self, string);
727 modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string)
729 return search (MODEST_GTKHTML_MIME_PART_VIEW (self), string);
733 modest_gtkhtml_mime_part_view_search_next(ModestISearchView *self)
735 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_next_func (self);
739 modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self)
741 return search_next (MODEST_GTKHTML_MIME_PART_VIEW (self));
745 modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
746 gint *width, gint *height)
748 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_selection_area_func (self, x, y, width, height);
752 modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
753 gint *width, gint *height)
755 return get_selection_area (MODEST_GTKHTML_MIME_PART_VIEW (self), x, y, width, height);