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.
30 #include <widgets/modest-gtkhtml-mime-part-view.h>
32 #include <gtkhtml/gtkhtml-stream.h>
33 #include <gtkhtml/gtkhtml-search.h>
34 #include <tny-stream.h>
35 #include <tny-mime-part-view.h>
36 #include <tny-gtk-text-buffer-stream.h>
37 #include <modest-text-utils.h>
38 #include <widgets/modest-mime-part-view.h>
39 #include <widgets/modest-zoomable.h>
40 #include <widgets/modest-tny-stream-gtkhtml.h>
42 /* gobject structure methods */
43 static void modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass);
44 static void tny_mime_part_view_init (gpointer g, gpointer iface_data);
45 static void modest_mime_part_view_init (gpointer g, gpointer iface_data);
46 static void modest_zoomable_init (gpointer g, gpointer iface_data);
47 static void modest_isearch_view_init (gpointer g, gpointer iface_data);
48 static void modest_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self);
49 static void modest_gtkhtml_mime_part_view_finalize (GObject *self);
51 /* GtkHTML signal handlers */
52 static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
53 static gboolean on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self);
54 static gboolean on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
55 ModestGtkhtmlMimePartView *self);
56 /* TnyMimePartView implementation */
57 static void modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self);
58 static void modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self);
59 static void modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self, TnyMimePart *part);
60 static void modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self, TnyMimePart *part);
61 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self);
62 static TnyMimePart* modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self);
63 /* ModestMimePartView implementation */
64 static gboolean modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self);
65 static gboolean modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self);
66 /* ModestZoomable implementation */
67 static gdouble modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self);
68 static void modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value);
69 static gboolean modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self);
70 static gboolean modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self);
71 static gdouble modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self);
72 static void modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value);
73 static gboolean modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self);
74 static gboolean modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self);
75 /* ModestISearchView implementation */
76 static gboolean modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string);
77 static gboolean modest_gtkhtml_mime_part_view_search_next (ModestISearchView *self);
78 static gboolean modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
79 gint *width, gint *height);
80 static gboolean modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string);
81 static gboolean modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self);
82 static gboolean modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
83 gint *width, gint *height);
87 static TnyMimePart *get_part (ModestGtkhtmlMimePartView *self);
88 static void set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
89 static void set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
90 static void set_empty_part (ModestGtkhtmlMimePartView *self);
91 static void set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part);
92 static gboolean is_empty (ModestGtkhtmlMimePartView *self);
93 static void set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom);
94 static gdouble get_zoom (ModestGtkhtmlMimePartView *self);
95 static gboolean has_contents_receiver (gpointer engine, const gchar *data,
96 size_t len, gboolean *has_contents);
97 static gboolean search (ModestGtkhtmlMimePartView *self, const gchar *string);
98 static gboolean search_next (ModestGtkhtmlMimePartView *self);
99 static gboolean get_selection_area (ModestGtkhtmlMimePartView *self, gint *x, gint *y,
100 gint *width, gint *height);
102 typedef struct _ModestGtkhtmlMimePartViewPrivate ModestGtkhtmlMimePartViewPrivate;
103 struct _ModestGtkhtmlMimePartViewPrivate {
105 gdouble current_zoom;
108 #define MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
109 MODEST_TYPE_GTKHTML_MIME_PART_VIEW, \
110 ModestGtkhtmlMimePartViewPrivate))
112 static GtkHTMLClass *parent_class = NULL;
115 modest_gtkhtml_mime_part_view_new ()
117 return g_object_new (MODEST_TYPE_GTKHTML_MIME_PART_VIEW, NULL);
120 /* GOBJECT IMPLEMENTATION */
122 modest_gtkhtml_mime_part_view_get_type (void)
124 static GType my_type = 0;
126 static const GTypeInfo my_info = {
127 sizeof(ModestGtkhtmlMimePartViewClass),
128 NULL, /* base init */
129 NULL, /* base finalize */
130 (GClassInitFunc) modest_gtkhtml_mime_part_view_class_init,
131 NULL, /* class finalize */
132 NULL, /* class data */
133 sizeof(ModestGtkhtmlMimePartView),
135 (GInstanceInitFunc) modest_gtkhtml_mime_part_view_init,
139 static const GInterfaceInfo tny_mime_part_view_info =
141 (GInterfaceInitFunc) tny_mime_part_view_init, /* interface_init */
142 NULL, /* interface_finalize */
143 NULL /* interface_data */
146 static const GInterfaceInfo modest_mime_part_view_info =
148 (GInterfaceInitFunc) modest_mime_part_view_init, /* interface_init */
149 NULL, /* interface_finalize */
150 NULL /* interface_data */
153 static const GInterfaceInfo modest_zoomable_info =
155 (GInterfaceInitFunc) modest_zoomable_init, /* interface_init */
156 NULL, /* interface_finalize */
157 NULL /* interface_data */
160 static const GInterfaceInfo modest_isearch_view_info =
162 (GInterfaceInitFunc) modest_isearch_view_init, /* interface_init */
163 NULL, /* interface_finalize */
164 NULL /* interface_data */
167 my_type = g_type_register_static (GTK_TYPE_HTML,
168 "ModestGtkhtmlMimePartView",
171 g_type_add_interface_static (my_type, TNY_TYPE_MIME_PART_VIEW,
172 &tny_mime_part_view_info);
174 g_type_add_interface_static (my_type, MODEST_TYPE_MIME_PART_VIEW,
175 &modest_mime_part_view_info);
177 g_type_add_interface_static (my_type, MODEST_TYPE_ZOOMABLE,
178 &modest_zoomable_info);
179 g_type_add_interface_static (my_type, MODEST_TYPE_ISEARCH_VIEW,
180 &modest_isearch_view_info);
186 modest_gtkhtml_mime_part_view_class_init (ModestGtkhtmlMimePartViewClass *klass)
188 GObjectClass *gobject_class;
189 gobject_class = (GObjectClass*) klass;
191 parent_class = g_type_class_peek_parent (klass);
192 gobject_class->finalize = modest_gtkhtml_mime_part_view_finalize;
194 klass->get_part_func = modest_gtkhtml_mime_part_view_get_part_default;
195 klass->set_part_func = modest_gtkhtml_mime_part_view_set_part_default;
196 klass->clear_func = modest_gtkhtml_mime_part_view_clear_default;
197 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty_default;
198 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom_default;
199 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom_default;
200 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus_default;
201 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus_default;
202 klass->search_func = modest_gtkhtml_mime_part_view_search_default;
203 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next_default;
204 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area_default;
206 g_type_class_add_private (gobject_class, sizeof(ModestGtkhtmlMimePartViewPrivate));
211 modest_gtkhtml_mime_part_view_init (ModestGtkhtmlMimePartView *self)
213 ModestGtkhtmlMimePartViewPrivate *priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
215 gtk_html_set_editable (GTK_HTML(self), FALSE);
216 gtk_html_allow_selection (GTK_HTML(self), TRUE);
217 gtk_html_set_caret_mode (GTK_HTML(self), FALSE);
218 gtk_html_set_blocking (GTK_HTML(self), FALSE);
219 gtk_html_set_images_blocking (GTK_HTML(self), FALSE);
221 g_signal_connect (G_OBJECT(self), "link_clicked",
222 G_CALLBACK(on_link_clicked), self);
223 g_signal_connect (G_OBJECT(self), "url_requested",
224 G_CALLBACK(on_url_requested), self);
225 g_signal_connect (G_OBJECT(self), "on_url",
226 G_CALLBACK(on_url), self);
229 priv->current_zoom = 1.0;
233 modest_gtkhtml_mime_part_view_finalize (GObject *obj)
235 G_OBJECT_CLASS (parent_class)->finalize (obj);
238 /* GTKHTML SIGNALS HANDLERS */
241 on_link_clicked (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
244 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
246 g_signal_emit_by_name (G_OBJECT (self), "activate-link", uri, &result);
251 on_url (GtkWidget *widget, const gchar *uri, ModestGtkhtmlMimePartView *self)
254 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
256 g_signal_emit_by_name (G_OBJECT (self), "link-hover", uri, &result);
261 on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
262 ModestGtkhtmlMimePartView *self)
265 TnyStream *tny_stream;
266 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), FALSE);
268 tny_stream = TNY_STREAM (modest_tny_stream_gtkhtml_new (stream));
269 g_signal_emit_by_name (MODEST_MIME_PART_VIEW (self), "fetch-url", uri, tny_stream, &result);
270 gtk_html_stream_close (stream, result?GTK_HTML_STREAM_OK:GTK_HTML_STREAM_ERROR);
271 g_object_unref (tny_stream);
278 set_html_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
280 GtkHTMLStream *gtkhtml_stream;
281 TnyStream *tny_stream;
283 g_return_if_fail (self);
284 g_return_if_fail (part);
286 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
288 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream));
289 tny_stream_reset (tny_stream);
291 tny_mime_part_decode_to_stream ((TnyMimePart*)part, tny_stream);
292 g_object_unref (G_OBJECT(tny_stream));
294 gtk_html_stream_destroy (gtkhtml_stream);
298 set_text_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
301 GtkTextIter begin, end;
302 TnyStream* txt_stream, *tny_stream;
303 GtkHTMLStream *gtkhtml_stream;
306 g_return_if_fail (self);
307 g_return_if_fail (part);
309 buf = gtk_text_buffer_new (NULL);
310 txt_stream = TNY_STREAM(tny_gtk_text_buffer_stream_new (buf));
312 tny_stream_reset (txt_stream);
314 gtkhtml_stream = gtk_html_begin(GTK_HTML(self));
315 tny_stream = TNY_STREAM(modest_tny_stream_gtkhtml_new (gtkhtml_stream));
318 tny_mime_part_decode_to_stream ((TnyMimePart*)part, txt_stream);
319 tny_stream_reset (txt_stream);
321 gtk_text_buffer_get_bounds (buf, &begin, &end);
322 txt = gtk_text_buffer_get_text (buf, &begin, &end, FALSE);
324 gchar *html = modest_text_utils_convert_to_html (txt);
325 tny_stream_write (tny_stream, html, strlen(html));
326 tny_stream_reset (tny_stream);
331 g_object_unref (G_OBJECT(tny_stream));
332 g_object_unref (G_OBJECT(txt_stream));
333 g_object_unref (G_OBJECT(buf));
335 gtk_html_stream_destroy (gtkhtml_stream);
339 set_empty_part (ModestGtkhtmlMimePartView *self)
341 g_return_if_fail (self);
343 gtk_html_load_from_string (GTK_HTML(self),
348 set_part (ModestGtkhtmlMimePartView *self, TnyMimePart *part)
350 ModestGtkhtmlMimePartViewPrivate *priv;
352 g_return_if_fail (self);
354 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self);
356 if (part != priv->part) {
358 g_object_unref (G_OBJECT(priv->part));
360 g_object_ref (G_OBJECT(part));
365 set_empty_part (self);
369 if (tny_mime_part_content_type_is (part, "text/html"))
370 set_html_part (self, part);
372 set_text_part (self, part);
377 get_part (ModestGtkhtmlMimePartView *self)
381 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), NULL);
383 part = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE(self)->part;
392 has_contents_receiver (gpointer engine, const gchar *data,
393 size_t len, gboolean *has_contents)
395 if (len > 1 || ((len == 1)&&(data[0]!='\n'))) {
396 *has_contents = TRUE;
403 is_empty (ModestGtkhtmlMimePartView *self)
405 /* TODO: Find some gtkhtml API to check whether there is any (visible, non markup)
406 * text in the message:
408 gboolean has_contents = FALSE;
410 gtk_html_export (GTK_HTML (self), "text/plain",
411 (GtkHTMLSaveReceiverFn) has_contents_receiver, &has_contents);
413 return !has_contents;
417 set_zoom (ModestGtkhtmlMimePartView *self, gdouble zoom)
419 ModestGtkhtmlMimePartViewPrivate *priv;
421 g_return_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self));
423 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
424 priv->current_zoom = zoom;
425 gtk_html_set_magnification (GTK_HTML(self), zoom);
427 gtk_widget_queue_resize (GTK_WIDGET (self));
431 get_zoom (ModestGtkhtmlMimePartView *self)
433 ModestGtkhtmlMimePartViewPrivate *priv;
435 g_return_val_if_fail (MODEST_IS_GTKHTML_MIME_PART_VIEW (self), 1.0);
437 priv = MODEST_GTKHTML_MIME_PART_VIEW_GET_PRIVATE (self);
439 return priv->current_zoom;
443 search (ModestGtkhtmlMimePartView *self,
446 return gtk_html_engine_search (GTK_HTML (self),
448 FALSE, /* case sensitive */
454 search_next (ModestGtkhtmlMimePartView *self)
456 return gtk_html_engine_search_next (GTK_HTML (self));
460 get_selection_area (ModestGtkhtmlMimePartView *self,
462 gint *width, gint *height)
464 gtk_html_get_selection_area (GTK_HTML (self), x, y, width, height);
469 /* TNY MIME PART IMPLEMENTATION */
472 tny_mime_part_view_init (gpointer g, gpointer iface_data)
474 TnyMimePartViewIface *klass = (TnyMimePartViewIface *)g;
476 klass->get_part_func = modest_gtkhtml_mime_part_view_get_part;
477 klass->set_part_func = modest_gtkhtml_mime_part_view_set_part;
478 klass->clear_func = modest_gtkhtml_mime_part_view_clear;
484 modest_gtkhtml_mime_part_view_get_part (TnyMimePartView *self)
486 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_part_func (self);
491 modest_gtkhtml_mime_part_view_get_part_default (TnyMimePartView *self)
493 return TNY_MIME_PART (get_part (MODEST_GTKHTML_MIME_PART_VIEW (self)));
497 modest_gtkhtml_mime_part_view_set_part (TnyMimePartView *self,
500 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_part_func (self, part);
504 modest_gtkhtml_mime_part_view_set_part_default (TnyMimePartView *self,
507 g_return_if_fail ((part == NULL) || TNY_IS_MIME_PART (part));
509 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), part);
513 modest_gtkhtml_mime_part_view_clear (TnyMimePartView *self)
515 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->clear_func (self);
519 modest_gtkhtml_mime_part_view_clear_default (TnyMimePartView *self)
521 set_part (MODEST_GTKHTML_MIME_PART_VIEW (self), NULL);
524 /* MODEST MIME PART VIEW IMPLEMENTATION */
527 modest_mime_part_view_init (gpointer g, gpointer iface_data)
529 ModestMimePartViewIface *klass = (ModestMimePartViewIface *)g;
531 klass->is_empty_func = modest_gtkhtml_mime_part_view_is_empty;
537 modest_gtkhtml_mime_part_view_is_empty (ModestMimePartView *self)
539 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->is_empty_func (self);
543 modest_gtkhtml_mime_part_view_is_empty_default (ModestMimePartView *self)
545 return is_empty (MODEST_GTKHTML_MIME_PART_VIEW (self));
549 /* MODEST ZOOMABLE IMPLEMENTATION */
551 modest_zoomable_init (gpointer g, gpointer iface_data)
553 ModestZoomableIface *klass = (ModestZoomableIface *)g;
555 klass->get_zoom_func = modest_gtkhtml_mime_part_view_get_zoom;
556 klass->set_zoom_func = modest_gtkhtml_mime_part_view_set_zoom;
557 klass->zoom_minus_func = modest_gtkhtml_mime_part_view_zoom_minus;
558 klass->zoom_plus_func = modest_gtkhtml_mime_part_view_zoom_plus;
564 modest_gtkhtml_mime_part_view_get_zoom (ModestZoomable *self)
566 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_zoom_func (self);
570 modest_gtkhtml_mime_part_view_get_zoom_default (ModestZoomable *self)
572 return get_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self));
576 modest_gtkhtml_mime_part_view_set_zoom (ModestZoomable *self, gdouble value)
578 MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->set_zoom_func (self, value);
582 modest_gtkhtml_mime_part_view_set_zoom_default (ModestZoomable *self, gdouble value)
584 set_zoom (MODEST_GTKHTML_MIME_PART_VIEW (self), value);
588 modest_gtkhtml_mime_part_view_zoom_minus (ModestZoomable *self)
590 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_minus_func (self);
594 modest_gtkhtml_mime_part_view_zoom_minus_default (ModestZoomable *self)
596 /* operation not supported in ModestGtkhtmlMimePartView */
601 modest_gtkhtml_mime_part_view_zoom_plus (ModestZoomable *self)
603 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->zoom_plus_func (self);
607 modest_gtkhtml_mime_part_view_zoom_plus_default (ModestZoomable *self)
609 /* operation not supported in ModestGtkhtmlMimePartView */
613 /* ISEARCH VIEW IMPLEMENTATION */
615 modest_isearch_view_init (gpointer g, gpointer iface_data)
617 ModestISearchViewIface *klass = (ModestISearchViewIface *)g;
619 klass->search_func = modest_gtkhtml_mime_part_view_search;
620 klass->search_next_func = modest_gtkhtml_mime_part_view_search_next;
621 klass->get_selection_area_func = modest_gtkhtml_mime_part_view_get_selection_area;
627 modest_gtkhtml_mime_part_view_search (ModestISearchView *self, const gchar *string)
629 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_func (self, string);
633 modest_gtkhtml_mime_part_view_search_default (ModestISearchView *self, const gchar *string)
635 return search (MODEST_GTKHTML_MIME_PART_VIEW (self), string);
639 modest_gtkhtml_mime_part_view_search_next(ModestISearchView *self)
641 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->search_next_func (self);
645 modest_gtkhtml_mime_part_view_search_next_default (ModestISearchView *self)
647 return search_next (MODEST_GTKHTML_MIME_PART_VIEW (self));
651 modest_gtkhtml_mime_part_view_get_selection_area (ModestISearchView *self, gint *x, gint *y,
652 gint *width, gint *height)
654 return MODEST_GTKHTML_MIME_PART_VIEW_GET_CLASS (self)->get_selection_area_func (self, x, y, width, height);
658 modest_gtkhtml_mime_part_view_get_selection_area_default (ModestISearchView *self, gint *x, gint *y,
659 gint *width, gint *height)
661 return get_selection_area (MODEST_GTKHTML_MIME_PART_VIEW (self), x, y, width, height);