epiphany r8284 - trunk/embed/webkit



Author: cosimoc
Date: Tue Jun 17 14:47:01 2008
New Revision: 8284
URL: http://svn.gnome.org/viewvc/epiphany?rev=8284&view=rev

Log:
Implement search in page for the WebKit embed.


Modified:
   trunk/embed/webkit/webkit-embed-find.c

Modified: trunk/embed/webkit/webkit-embed-find.c
==============================================================================
--- trunk/embed/webkit/webkit-embed-find.c	(original)
+++ trunk/embed/webkit/webkit-embed-find.c	Tue Jun 17 14:47:01 2008
@@ -25,19 +25,43 @@
 #include "ephy-embed-find.h"
 #include "ephy-embed-shell.h"
 
+#include <webkit/webkit.h>
+
 #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 @@
                      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 @@
            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 @@
                  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 @@
 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))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]