From 1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Tue, 17 Jun 2008 14:47:01 +0000 Subject: Implement search in page for the WebKit embed. svn path=/trunk/; revision=8284 --- embed/webkit/webkit-embed-find.c | 90 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/embed/webkit/webkit-embed-find.c b/embed/webkit/webkit-embed-find.c index 7b9887840..b91545989 100644 --- a/embed/webkit/webkit-embed-find.c +++ b/embed/webkit/webkit-embed-find.c @@ -25,19 +25,43 @@ #include "ephy-embed-find.h" #include "ephy-embed-shell.h" +#include + #include "webkit-embed-find.h" #define WEBKIT_EMBED_FIND_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), WEBKIT_TYPE_EMBED_FIND, WebKitEmbedFindPrivate)) struct _WebKitEmbedFindPrivate { - + WebKitWebView *web_view; + char *find_string; + gboolean case_sensitive; }; static void impl_set_embed (EphyEmbedFind *efind, EphyEmbed *embed) { + WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv; + + priv->web_view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (gtk_bin_get_child (GTK_BIN (embed))))); +} + +static void +set_string_and_highlight (WebKitEmbedFindPrivate *priv, const char *find_string) +{ + WebKitWebView *web_view = priv->web_view; + + if (g_strcmp0 (priv->find_string, find_string) != 0) { + g_free (priv->find_string); + priv->find_string = g_strdup (find_string); + } + webkit_web_view_unmark_text_matches (web_view); + webkit_web_view_mark_text_matches (web_view, + priv->find_string, + priv->case_sensitive, + 0); + webkit_web_view_set_highlight_text_matches (web_view, TRUE); } static void @@ -45,6 +69,33 @@ impl_set_properties (EphyEmbedFind *efind, const char *find_string, gboolean case_sensitive) { + WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv; + + priv->case_sensitive = case_sensitive; + set_string_and_highlight (priv, find_string); +} + +static EphyEmbedFindResult +real_find (WebKitEmbedFind *wefind, + gboolean forward) +{ + WebKitEmbedFindPrivate *priv = wefind->priv; + WebKitWebView *web_view = priv->web_view; + + if (!webkit_web_view_search_text + (web_view, priv->find_string, priv->case_sensitive, TRUE, FALSE)) { + /* not found, try to wrap */ + if (!webkit_web_view_search_text + (web_view, priv->find_string, priv->case_sensitive, TRUE, TRUE)) { + /* there's no result */ + return EPHY_EMBED_FIND_NOTFOUND; + } else { + /* found wrapped */ + return EPHY_EMBED_FIND_FOUNDWRAPPED; + } + } + + return EPHY_EMBED_FIND_FOUND; } static EphyEmbedFindResult @@ -52,7 +103,11 @@ impl_find (EphyEmbedFind *efind, const char *find_string, gboolean links_only) { - return EPHY_EMBED_FIND_FOUND; + WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv; + + set_string_and_highlight (priv, find_string); + + return real_find (WEBKIT_EMBED_FIND (efind), TRUE); } static EphyEmbedFindResult @@ -60,13 +115,16 @@ impl_find_again (EphyEmbedFind *efind, gboolean forward, gboolean links_only) { - return EPHY_EMBED_FIND_FOUND; + return real_find (WEBKIT_EMBED_FIND (efind), forward); } static void impl_set_selection (EphyEmbedFind *efind, gboolean attention) { + WebKitWebView *web_view = WEBKIT_EMBED_FIND (efind)->priv->web_view; + + webkit_web_view_set_highlight_text_matches (web_view, attention); } static gboolean @@ -90,18 +148,32 @@ ephy_find_iface_init (EphyEmbedFindIface *iface) static void webkit_embed_find_init (WebKitEmbedFind *find) { + WebKitEmbedFindPrivate *priv = find->priv = WEBKIT_EMBED_FIND_GET_PRIVATE (find); + + priv->web_view = NULL; + priv->case_sensitive = FALSE; + priv->find_string = NULL; +} + +G_DEFINE_TYPE_WITH_CODE (WebKitEmbedFind, webkit_embed_find, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_FIND, + ephy_find_iface_init)) + +static void +webkit_embed_find_finalize (GObject *o) +{ + WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (o)->priv; + + g_free (priv->find_string); + G_OBJECT_CLASS (webkit_embed_find_parent_class)->finalize (o); } static void webkit_embed_find_class_init (WebKitEmbedFindClass *klass) { -#if 0 GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = webkit_embed_find_finalize; g_type_class_add_private (object_class, sizeof (WebKitEmbedFindPrivate)); -#endif } - -G_DEFINE_TYPE_WITH_CODE (WebKitEmbedFind, webkit_embed_find, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_FIND, - ephy_find_iface_init)) -- cgit v1.2.3