/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
/*
* Copyright © 2000-2004 Marco Pesenti Gritti
* Copyright © 2003, 2004 Christian Persch
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "config.h"
#include "ephy-debug.h"
#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
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
impl_find (EphyEmbedFind *efind,
const char *find_string,
gboolean links_only)
{
WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv;
set_string_and_highlight (priv, find_string);
return real_find (WEBKIT_EMBED_FIND (efind), TRUE);
}
static EphyEmbedFindResult
impl_find_again (EphyEmbedFind *efind,
gboolean forward,
gboolean links_only)
{
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
impl_activate_link (EphyEmbedFind *efind,
GdkModifierType mask)
{
return FALSE;
}
static void
ephy_find_iface_init (EphyEmbedFindIface *iface)
{
iface->set_embed = impl_set_embed;
iface->set_properties = impl_set_properties;
iface->find = impl_find;
iface->find_again = impl_find_again;
iface->set_selection = impl_set_selection;
iface->activate_link = impl_activate_link;
}
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)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = webkit_embed_find_finalize;
g_type_class_add_private (object_class, sizeof (WebKitEmbedFindPrivate));
}