aboutsummaryrefslogtreecommitdiffstats
path: root/embed
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2005-05-29 05:58:47 +0800
committerChristian Persch <chpe@src.gnome.org>2005-05-29 05:58:47 +0800
commitd0cc3530df347aed28b20fb884321a42b1b1958d (patch)
treeec070c45a016178c79322d426114bcde3b596ce6 /embed
parent995f6539fb26444a0496b6311fecdbe9ad9cc8ff (diff)
downloadgsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar.gz
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar.bz2
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar.lz
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar.xz
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.tar.zst
gsoc2013-epiphany-d0cc3530df347aed28b20fb884321a42b1b1958d.zip
Check for toolkit nsITypeAheadFind.
2005-05-28 Christian Persch <chpe@cvs.gnome.org> * configure.ac: Check for toolkit nsITypeAheadFind. * embed/Makefile.am: * embed/ephy-embed-factory.c: (ephy_embed_factory_new_object): * embed/ephy-embed-find.c: (ephy_embed_find_set_embed), (ephy_embed_find_set_properties), (ephy_embed_find_find), (ephy_embed_find_find_again), (ephy_embed_find_get_type): * embed/ephy-embed-find.h: * embed/ephy-embed.c: * embed/ephy-embed.h: * embed/mozilla/EphyBrowser.cpp: * embed/mozilla/EphyBrowser.h: * embed/mozilla/EphyFind.cpp: * embed/mozilla/EphyFind.h: * embed/mozilla/Makefile.am: * embed/mozilla/mozilla-embed-find.cpp: * embed/mozilla/mozilla-embed-find.h: * embed/mozilla/mozilla-embed.cpp: * src/bookmarks/ephy-bookmarks-import.c: (gul_general_read_line_from_file): * src/ephy-find-toolbar.c: (get_find), (set_controls), (tab_content_changed_cb), (entry_changed_cb), (ephy_find_toolbar_init), (ephy_find_toolbar_finalize), (ephy_find_toolbar_class_init), (ephy_find_toolbar_new), (ephy_find_toolbar_get_text), (ephy_find_toolbar_set_embed), (ephy_find_toolbar_find_next), (ephy_find_toolbar_find_previous): * src/ephy-find-toolbar.h: * src/ephy-window.c: (ephy_window_set_active_tab), (ephy_window_init), (ephy_window_get_find_toolbar), (ephy_window_notebook_switch_page_cb): * src/ephy-window.h: * src/window-commands.c: (window_cmd_edit_find_next), (window_cmd_edit_find_prev): Implement typeaheadfind for the find toolbar.
Diffstat (limited to 'embed')
-rw-r--r--embed/Makefile.am2
-rw-r--r--embed/ephy-embed-factory.c6
-rw-r--r--embed/ephy-embed-find.c93
-rw-r--r--embed/ephy-embed-find.h77
-rw-r--r--embed/ephy-embed.c37
-rw-r--r--embed/ephy-embed.h15
-rw-r--r--embed/mozilla/EphyBrowser.cpp30
-rw-r--r--embed/mozilla/EphyBrowser.h6
-rw-r--r--embed/mozilla/EphyFind.cpp188
-rw-r--r--embed/mozilla/EphyFind.h55
-rw-r--r--embed/mozilla/Makefile.am5
-rw-r--r--embed/mozilla/mozilla-embed-find.cpp175
-rw-r--r--embed/mozilla/mozilla-embed-find.h57
-rw-r--r--embed/mozilla/mozilla-embed.cpp31
14 files changed, 658 insertions, 119 deletions
diff --git a/embed/Makefile.am b/embed/Makefile.am
index ba50008f5..07e23bc68 100644
--- a/embed/Makefile.am
+++ b/embed/Makefile.am
@@ -11,6 +11,7 @@ NOINST_H_FILES = \
downloader-view.h \
ephy-download.h \
ephy-embed-dialog.h \
+ ephy-embed-find.h \
ephy-encodings.h \
ephy-favicon-cache.h \
print-dialog.h
@@ -37,6 +38,7 @@ libephyembed_la_SOURCES = \
ephy-embed.c \
ephy-embed-dialog.c \
ephy-embed-event.c \
+ ephy-embed-find.c \
ephy-embed-persist.c \
ephy-embed-single.c \
ephy-embed-shell.c \
diff --git a/embed/ephy-embed-factory.c b/embed/ephy-embed-factory.c
index ebbc9a22e..1d2b832f6 100644
--- a/embed/ephy-embed-factory.c
+++ b/embed/ephy-embed-factory.c
@@ -22,9 +22,11 @@
#include "ephy-embed-factory.h"
#include "mozilla-embed.h"
+#include "mozilla-embed-find.h"
#include "mozilla-embed-persist.h"
#include "mozilla-embed-single.h"
#include "ephy-embed.h"
+#include "ephy-embed-find.h"
#include "ephy-embed-persist.h"
#include "ephy-embed-single.h"
@@ -49,6 +51,10 @@ ephy_embed_factory_new_object (GType type)
{
object = g_object_new (MOZILLA_TYPE_EMBED_PERSIST, NULL);
}
+ else if (type == EPHY_TYPE_EMBED_FIND)
+ {
+ object = g_object_new (MOZILLA_TYPE_EMBED_FIND, NULL);
+ }
else if (type == EPHY_TYPE_EMBED_SINGLE)
{
object = g_object_new (MOZILLA_TYPE_EMBED_SINGLE, NULL);
diff --git a/embed/ephy-embed-find.c b/embed/ephy-embed-find.c
new file mode 100644
index 000000000..596c0b8bc
--- /dev/null
+++ b/embed/ephy-embed-find.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2005 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "config.h"
+
+#include "ephy-embed-find.h"
+
+void
+ephy_embed_find_set_embed (EphyEmbedFind *find,
+ EphyEmbed *embed)
+{
+ EphyEmbedFindIface *iface = EPHY_EMBED_FIND_GET_IFACE (find);
+ iface->set_embed (find, embed);
+}
+
+/**
+ * ephy_embed_find_set_properties:
+ * @find: an #EphyEmbedFind
+ * @case_sensitive: %TRUE for "case sensitive" to be set
+ *
+ * Sets the properties of @find
+ **/
+void
+ephy_embed_find_set_properties (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean case_sensitive)
+{
+ EphyEmbedFindIface *iface = EPHY_EMBED_FIND_GET_IFACE (find);
+ iface->set_properties (find, search_string, case_sensitive);
+}
+
+gboolean
+ephy_embed_find_find (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean links_only)
+{
+ EphyEmbedFindIface *iface = EPHY_EMBED_FIND_GET_IFACE (find);
+ return iface->find (find, search_string, links_only);
+}
+
+/**
+ * ephy_embed_find_search_again:
+ * @embed: an #EphyEmbedFind
+ * @forward %TRUE to search forwards in the document
+ *
+ * Return value: %TRUE if a match was found
+ **/
+gboolean
+ephy_embed_find_find_again (EphyEmbedFind *find,
+ gboolean forward)
+{
+ EphyEmbedFindIface *iface = EPHY_EMBED_FIND_GET_IFACE (find);
+ return iface->find_again (find, forward);
+}
+
+GType
+ephy_embed_find_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (EphyEmbedFindIface),
+ NULL,
+ NULL,
+ };
+
+ type = g_type_register_static (G_TYPE_INTERFACE,
+ "EphyEmbedFind",
+ &our_info, (GTypeFlags) 0);
+ }
+
+ return type;
+}
diff --git a/embed/ephy-embed-find.h b/embed/ephy-embed-find.h
new file mode 100644
index 000000000..6dbabe7db
--- /dev/null
+++ b/embed/ephy-embed-find.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2005 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef EPHY_EMBED_FIND_H
+#define EPHY_EMBED_FIND_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+#include "ephy-embed.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_EMBED_FIND (ephy_embed_find_get_type ())
+#define EPHY_EMBED_FIND(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_EMBED_FIND, EphyEmbedFind))
+#define EPHY_EMBED_FIND_IFACE(k) (G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_EMBED_FIND, EphyEmbedFindIface))
+#define EPHY_IS_EMBED_FIND(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_EMBED_FIND))
+#define EPHY_IS_EMBED_FIND_IFACE(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_EMBED_FIND))
+#define EPHY_EMBED_FIND_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EPHY_TYPE_EMBED_FIND, EphyEmbedFindIface))
+
+typedef struct _EphyEmbedFind EphyEmbedFind;
+typedef struct _EphyEmbedFindIface EphyEmbedFindIface;
+
+
+struct _EphyEmbedFindIface
+{
+ GTypeInterface base_iface;
+
+ /* Methods */
+ void (* set_embed) (EphyEmbedFind *find,
+ EphyEmbed *embed);
+ void (* set_properties) (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean case_sensitive);
+ gboolean (* find) (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean links_only);
+ gboolean (* find_again) (EphyEmbedFind *find,
+ gboolean forward);
+};
+
+GType ephy_embed_find_get_type (void);
+
+void ephy_embed_find_set_embed (EphyEmbedFind *find,
+ EphyEmbed *embed);
+
+void ephy_embed_find_set_properties (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean case_sensitive);
+
+gboolean ephy_embed_find_find (EphyEmbedFind *find,
+ const char *search_string,
+ gboolean links_only);
+
+gboolean ephy_embed_find_find_again (EphyEmbedFind *find,
+ gboolean forward);
+
+G_END_DECLS
+
+#endif
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index f6547f8fc..79d95e51b 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -714,43 +714,6 @@ ephy_embed_show_page_certificate (EphyEmbed *embed)
}
/**
- * ephy_embed_find_set_properties:
- * @embed: an #EphyEmbed
- * @search_string: the desired search string
- * @case_sensitive: %TRUE for "case sensitive" to be set
- * @wrap_around: %TRUE for "wrap around" to be set
- *
- * Sets the properties of @embed's "Find" dialog.
- **/
-void
-ephy_embed_find_set_properties (EphyEmbed *embed,
- const char *search_string,
- gboolean case_sensitive,
- gboolean wrap_around)
-{
- EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
- iface->find_set_properties (embed, search_string, case_sensitive,
- wrap_around);
-}
-
-/**
- * ephy_embed_find_next:
- * @embed: an #EphyEmbed
- * @backwards: %FALSE to search forwards in the document
- *
- * Equivalent to pressing "Next" in @embed's Find dialog.
- *
- * Return value: %TRUE if a next match was found
- **/
-gboolean
-ephy_embed_find_next (EphyEmbed *embed,
- gboolean backwards)
-{
- EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed);
- return iface->find_next (embed, backwards);
-}
-
-/**
* ephy_embed_activate:
* @embed: an #EphyEmbed
*
diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h
index b16a25e86..c3dff5b33 100644
--- a/embed/ephy-embed.h
+++ b/embed/ephy-embed.h
@@ -182,12 +182,6 @@ struct _EphyEmbedIface
void (* set_zoom) (EphyEmbed *embed,
float zoom);
float (* get_zoom) (EphyEmbed *embed);
- void (* find_set_properties) (EphyEmbed *embed,
- const char *search_string,
- gboolean case_sensitive,
- gboolean wrap_around);
- gboolean (* find_next) (EphyEmbed *embed,
- gboolean backwards);
char * (* get_encoding) (EphyEmbed *embed);
gboolean (* has_automatic_encoding) (EphyEmbed *embed);
void (* set_encoding) (EphyEmbed *embed,
@@ -273,15 +267,6 @@ void ephy_embed_set_zoom (EphyEmbed *embed,
float ephy_embed_get_zoom (EphyEmbed *embed);
-/* Find */
-void ephy_embed_find_set_properties (EphyEmbed *embed,
- const char *search_string,
- gboolean case_sensitive,
- gboolean wrap_around);
-
-gboolean ephy_embed_find_next (EphyEmbed *embed,
- gboolean backwards);
-
/* Encoding */
char *ephy_embed_get_encoding (EphyEmbed *embed);
diff --git a/embed/mozilla/EphyBrowser.cpp b/embed/mozilla/EphyBrowser.cpp
index e20bb86b0..24258db6b 100644
--- a/embed/mozilla/EphyBrowser.cpp
+++ b/embed/mozilla/EphyBrowser.cpp
@@ -41,7 +41,6 @@
#include "nsISimpleEnumerator.h"
#include "nsIContentViewer.h"
-#include "nsIWebBrowserFind.h"
#include "nsIWebBrowserFocus.h"
#include "nsICommandManager.h"
#include "nsIWebBrowserPrint.h"
@@ -919,35 +918,6 @@ nsresult EphyBrowser::GetSHUrlAtIndex (PRInt32 index, nsACString &url)
return NS_OK;
}
-nsresult EphyBrowser::FindSetProperties (const PRUnichar *search_string,
- PRBool case_sensitive,
- PRBool wrap_around)
-{
- NS_ENSURE_TRUE (mWebBrowser, NS_ERROR_FAILURE);
-
- nsCOMPtr<nsIWebBrowserFind> finder (do_GetInterface(mWebBrowser));
- NS_ENSURE_TRUE (finder, NS_ERROR_FAILURE);
-
- finder->SetSearchString (search_string);
- finder->SetMatchCase (case_sensitive);
- finder->SetWrapFind (wrap_around);
-
- return NS_OK;
-}
-
-nsresult EphyBrowser::Find (PRBool backwards,
- PRBool *didFind)
-{
- NS_ENSURE_TRUE (mWebBrowser, NS_ERROR_FAILURE);
-
- nsCOMPtr<nsIWebBrowserFind> finder (do_GetInterface(mWebBrowser));
- NS_ENSURE_TRUE (finder, NS_ERROR_FAILURE);
-
- finder->SetFindBackwards (backwards);
-
- return finder->FindNext(didFind);
-}
-
nsresult EphyBrowser::GetPageDescriptor(nsISupports **aPageDescriptor)
{
NS_ENSURE_TRUE (mWebBrowser, NS_ERROR_FAILURE);
diff --git a/embed/mozilla/EphyBrowser.h b/embed/mozilla/EphyBrowser.h
index 55b02e942..159f449b3 100644
--- a/embed/mozilla/EphyBrowser.h
+++ b/embed/mozilla/EphyBrowser.h
@@ -142,12 +142,6 @@ public:
nsresult PrintPreviewNumPages (int *numPages);
nsresult PrintPreviewNavigate(PRInt16 navType, PRInt32 pageNum);
- nsresult FindSetProperties (const PRUnichar *search_string,
- PRBool case_sensitive,
- PRBool wrap_around);
- nsresult Find (PRBool bacwards,
- PRBool *didFind);
-
nsresult GetPageDescriptor(nsISupports **aPageDescriptor);
nsresult GetSHInfo (PRInt32 *count, PRInt32 *index);
diff --git a/embed/mozilla/EphyFind.cpp b/embed/mozilla/EphyFind.cpp
new file mode 100644
index 000000000..ace176b23
--- /dev/null
+++ b/embed/mozilla/EphyFind.cpp
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2005 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "mozilla-config.h"
+
+#include "config.h"
+
+#include "EphyFind.h"
+
+#include "ephy-debug.h"
+
+#undef MOZILLA_INTERNAL_API
+#include <nsEmbedString.h>
+#define MOZILLA_INTERNAL_API 1
+
+#include <gtkmozembed.h>
+#include <gtkmozembed_internal.h>
+#include <nsCOMPtr.h>
+#include <nsIServiceManager.h>
+#include <nsIInterfaceRequestorUtils.h>
+#include <nsIDOMWindow.h>
+#include <nsIWebBrowser.h>
+
+#ifdef HAVE_TYPEAHEADFIND
+#include <nsIDocShell.h>
+#include <nsITypeAheadFind.h>
+#else
+#include <nsIWebBrowserFind.h>
+#include <nsMemory.h>
+#endif
+
+#include <glib.h>
+
+#ifdef HAVE_TYPEAHEADFIND
+#define NS_TYPEAHEADFIND_CONTRACTID "@mozilla.org/typeaheadfind;1"
+#endif /* HAVE_TYPEAHEADFIND */
+
+EphyFind::EphyFind ()
+: mCurrentEmbed(nsnull)
+{
+ LOG ("EphyFind ctor [%p]", this);
+}
+
+EphyFind::~EphyFind ()
+{
+ LOG ("EphyFind dtor [%p]", this);
+}
+
+nsresult
+EphyFind::SetEmbed (EphyEmbed *aEmbed)
+{
+ nsresult rv = NS_OK;
+ if (aEmbed == mCurrentEmbed) return rv;
+
+ mCurrentEmbed = nsnull;
+
+ rv = NS_ERROR_FAILURE;
+ nsCOMPtr<nsIWebBrowser> webBrowser;
+ gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (aEmbed),
+ getter_AddRefs (webBrowser));
+ NS_ENSURE_TRUE (webBrowser, rv);
+
+#ifdef HAVE_TYPEAHEADFIND
+ nsCOMPtr<nsIDocShell> docShell (do_GetInterface (webBrowser, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ if (!mFinder) {
+ mFinder = do_CreateInstance (NS_TYPEAHEADFIND_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ rv = mFinder->Init (docShell);
+ mFinder->SetFocusLinks (PR_TRUE);
+ } else {
+ rv = mFinder->SetDocShell (docShell);
+ }
+ NS_ENSURE_SUCCESS (rv, rv);
+#else
+ PRUnichar *string = nsnull;
+ if (mFinder) {
+ mFinder->GetSearchString (&string);
+ }
+
+ mFinder = do_GetInterface (webBrowser, &rv);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ mFinder->SetWrapFind (PR_TRUE);
+
+ if (string) {
+ mFinder->SetSearchString (string);
+ nsMemory::Free (string);
+ }
+#endif /* HAVE_TYPEAHEADFIND */
+
+ mCurrentEmbed = aEmbed;
+
+ return rv;
+}
+
+void
+EphyFind::SetFindProperties (const char *aSearchString,
+ PRBool aCaseSensitive)
+{
+ if (!mFinder) return;
+
+#ifdef HAVE_TYPEAHEADFIND
+ mFinder->SetCaseSensitive (aCaseSensitive);
+ /* search string is set on ::Find */
+#else
+ mFinder->SetMatchCase (aCaseSensitive);
+
+ nsEmbedString uSearchString;
+ NS_CStringToUTF16 (nsEmbedCString (aSearchString ? aSearchString : ""),
+ NS_CSTRING_ENCODING_UTF8, uSearchString);
+
+ mFinder->SetSearchString (uSearchString.get ());
+#endif /* TYPEAHEADFIND */
+}
+
+PRBool
+EphyFind::Find (const char *aSearchString,
+ PRBool aLinksOnly)
+{
+ if (!mFinder) return PR_FALSE;
+
+ nsEmbedString uSearchString;
+ NS_CStringToUTF16 (nsEmbedCString (aSearchString ? aSearchString : ""),
+ NS_CSTRING_ENCODING_UTF8, uSearchString);
+
+#ifdef HAVE_TYPEAHEADFIND
+ nsresult rv;
+ PRUint16 found = nsITypeAheadFind::FIND_NOTFOUND;
+ rv = mFinder->Find (uSearchString, aLinksOnly, &found);
+
+ return NS_SUCCEEDED (rv) && found != nsITypeAheadFind::FIND_NOTFOUND;
+#else
+ mFinder->SetSearchString (uSearchString.get ());
+ mFinder->SetFindBackwards (PR_FALSE);
+
+ nsresult rv;
+ PRBool didFind = PR_FALSE;
+ rv = mFinder->FindNext (&didFind);
+
+ return NS_SUCCEEDED (rv) && didFind;
+#endif /* HAVE_TYPEAHEADFIND */
+}
+
+PRBool
+EphyFind::FindAgain (PRBool aForward)
+{
+ if (!mFinder) return PR_FALSE;
+
+#ifdef HAVE_TYPEAHEADFIND
+ nsresult rv;
+ PRUint16 found = nsITypeAheadFind::FIND_NOTFOUND;
+ if (aForward) {
+ rv = mFinder->FindNext (&found);
+ } else {
+ rv = mFinder->FindPrevious (&found);
+ }
+
+ return NS_SUCCEEDED (rv) && found != nsITypeAheadFind::FIND_NOTFOUND;
+#else
+ mFinder->SetFindBackwards (!aForward);
+
+ nsresult rv;
+ PRBool didFind = PR_FALSE;
+ rv = mFinder->FindNext (&didFind);
+
+ return NS_SUCCEEDED (rv) && didFind;
+#endif /* HAVE_TYPEAHEADFIND */
+}
diff --git a/embed/mozilla/EphyFind.h b/embed/mozilla/EphyFind.h
new file mode 100644
index 000000000..7188ffb74
--- /dev/null
+++ b/embed/mozilla/EphyFind.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2005 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef TYPEAHEADFIND_H
+#define TYPEAHEADFIND_H
+
+#include "ephy-embed.h"
+
+#include <nsCOMPtr.h>
+
+class nsITypeAheadFind;
+class nsIWebBrowserFind;
+
+class EphyFind
+{
+ public:
+ EphyFind ();
+ ~EphyFind ();
+
+ nsresult SetEmbed (EphyEmbed *aEmbed);
+ void SetFindProperties (const char *aSearchString,
+ PRBool aCaseSensitive);
+
+ PRBool Find (const char *aSearchString,
+ PRBool aLinksOnly);
+ PRBool FindAgain (PRBool aForward);
+
+ private:
+ EphyEmbed *mCurrentEmbed;
+
+#ifdef HAVE_TYPEAHEADFIND
+ nsCOMPtr<nsITypeAheadFind> mFinder;
+#else
+ nsCOMPtr<nsIWebBrowserFind> mFinder;
+#endif
+};
+
+#endif /* !TYPEAHEADFIND_H */
diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am
index 63868e6af..30a05f0fb 100644
--- a/embed/mozilla/Makefile.am
+++ b/embed/mozilla/Makefile.am
@@ -9,6 +9,8 @@ libephymozillaembed_la_SOURCES = \
EphyHeaderSniffer.h \
EphyBrowser.cpp \
EphyBrowser.h \
+ EphyFind.cpp \
+ EphyFind.h \
EphyHistoryListener.cpp \
EphyHistoryListener.h \
EphySidebar.cpp \
@@ -35,6 +37,8 @@ libephymozillaembed_la_SOURCES = \
mozilla-embed.h \
mozilla-embed-event.cpp \
mozilla-embed-event.h \
+ mozilla-embed-find.cpp \
+ mozilla-embed-find.h \
mozilla-embed-persist.cpp \
mozilla-embed-persist.h \
mozilla-embed-single.cpp \
@@ -75,6 +79,7 @@ mozilla_include_subdirs = \
docshell \
dom \
exthandler \
+ fastfind \
helperAppDlg \
gfx \
history \
diff --git a/embed/mozilla/mozilla-embed-find.cpp b/embed/mozilla/mozilla-embed-find.cpp
new file mode 100644
index 000000000..d589630b5
--- /dev/null
+++ b/embed/mozilla/mozilla-embed-find.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2000-2004 Marco Pesenti Gritti
+ * Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "mozilla-config.h"
+
+#include "config.h"
+
+#include "EphyFind.h"
+
+#include "mozilla-embed-find.h"
+#include "ephy-embed-find.h"
+#include "ephy-embed-shell.h"
+
+#define MOZILLA_EMBED_FIND_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), MOZILLA_TYPE_EMBED_FIND, MozillaEmbedFindPrivate))
+
+struct _MozillaEmbedFindPrivate
+{
+ EphyFind *find;
+};
+
+static GObjectClass *parent_class = NULL;
+
+static void
+impl_set_embed (EphyEmbedFind *efind,
+ EphyEmbed *embed)
+{
+ MozillaEmbedFind *find = MOZILLA_EMBED_FIND (efind);
+ MozillaEmbedFindPrivate *priv = find->priv;
+
+ nsresult rv;
+ rv = priv->find->SetEmbed (embed);
+ g_return_if_fail (NS_SUCCEEDED (rv));
+}
+
+static void
+impl_set_properties (EphyEmbedFind *efind,
+ const char *find_string,
+ gboolean case_sensitive)
+{
+ MozillaEmbedFind *find = MOZILLA_EMBED_FIND (efind);
+ MozillaEmbedFindPrivate *priv = find->priv;
+
+ priv->find->SetFindProperties (find_string, case_sensitive);
+}
+
+static gboolean
+impl_find (EphyEmbedFind *efind,
+ const char *find_string,
+ gboolean links_only)
+{
+ MozillaEmbedFind *find = MOZILLA_EMBED_FIND (efind);
+ MozillaEmbedFindPrivate *priv = find->priv;
+
+ return priv->find->Find (find_string, links_only);
+}
+
+static gboolean
+impl_find_again (EphyEmbedFind *efind,
+ gboolean forward)
+{
+ MozillaEmbedFind *find = MOZILLA_EMBED_FIND (efind);
+ MozillaEmbedFindPrivate *priv = find->priv;
+
+ return priv->find->FindAgain (forward);
+}
+
+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;
+}
+
+static void
+mozilla_embed_find_init (MozillaEmbedFind *find)
+{
+ find->priv = MOZILLA_EMBED_FIND_GET_PRIVATE (find);
+ find->priv->find = new EphyFind ();
+}
+
+static GObject *
+mozilla_embed_find_constructor (GType type, guint n_construct_properties,
+ GObjectConstructParam *construct_params)
+{
+ g_object_ref (embed_shell);
+ /* we depend on single because of mozilla initialization */
+ ephy_embed_shell_get_embed_single (embed_shell);
+
+ return parent_class->constructor (type, n_construct_properties,
+ construct_params);
+}
+
+static void
+mozilla_embed_find_finalize (GObject *object)
+{
+ MozillaEmbedFind *find = MOZILLA_EMBED_FIND (object);
+
+ delete find->priv->find;
+
+ parent_class->finalize (object);
+
+ g_object_unref (embed_shell);
+}
+
+static void
+mozilla_embed_find_class_init (MozillaEmbedFindClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ parent_class = (GObjectClass *) g_type_class_peek_parent (klass);
+
+ object_class->constructor = mozilla_embed_find_constructor;
+ object_class->finalize = mozilla_embed_find_finalize;
+
+ g_type_class_add_private (object_class, sizeof (MozillaEmbedFindPrivate));
+}
+
+GType
+mozilla_embed_find_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (MozillaEmbedFindClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) mozilla_embed_find_class_init,
+ NULL,
+ NULL, /* class_data */
+ sizeof (MozillaEmbedFind),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) mozilla_embed_find_init
+ };
+
+ static const GInterfaceInfo find_info =
+ {
+ (GInterfaceInitFunc) ephy_find_iface_init,
+ NULL,
+ NULL
+ };
+
+ type = g_type_register_static (G_TYPE_OBJECT,
+ "MozillaEmbedFind",
+ &our_info,
+ (GTypeFlags)0);
+ g_type_add_interface_static (type,
+ EPHY_TYPE_EMBED_FIND,
+ &find_info);
+ }
+
+ return type;
+}
diff --git a/embed/mozilla/mozilla-embed-find.h b/embed/mozilla/mozilla-embed-find.h
new file mode 100644
index 000000000..a879b71b7
--- /dev/null
+++ b/embed/mozilla/mozilla-embed-find.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2000-2004 Marco Pesenti Gritti
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef MOZILLA_EMBED_FIND_H
+#define MOZILLA_EMBED_FIND_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define MOZILLA_TYPE_EMBED_FIND (mozilla_embed_find_get_type ())
+#define MOZILLA_EMBED_FIND(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MOZILLA_TYPE_EMBED_FIND, MozillaEmbedFind))
+#define MOZILLA_EMBED_FIND_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), MOZILLA_TYPE_EMBED_FIND, MozillaEmbedFindClass))
+#define MOZILLA_IS_EMBED_FIND(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MOZILLA_TYPE_EMBED_FIND))
+#define MOZILLA_IS_EMBED_FIND_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), MOZILLA_TYPE_EMBED_FIND))
+#define MOZILLA_EMBED_FIND_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), MOZILLA_TYPE_EMBED_FIND, MozillaEmbedFindClass))
+
+typedef struct _MozillaEmbedFindClass MozillaEmbedFindClass;
+typedef struct _MozillaEmbedFind MozillaEmbedFind;
+typedef struct _MozillaEmbedFindPrivate MozillaEmbedFindPrivate;
+
+struct _MozillaEmbedFind
+{
+ GObject parent_instance;
+
+ /*< private >*/
+ MozillaEmbedFindPrivate *priv;
+};
+
+struct _MozillaEmbedFindClass
+{
+ GObjectClass parent_class;
+};
+
+GType mozilla_embed_find_get_type (void);
+
+G_END_DECLS
+
+#endif
diff --git a/embed/mozilla/mozilla-embed.cpp b/embed/mozilla/mozilla-embed.cpp
index 109f7ea76..1d87d77ab 100644
--- a/embed/mozilla/mozilla-embed.cpp
+++ b/embed/mozilla/mozilla-embed.cpp
@@ -172,19 +172,6 @@ mozilla_embed_get_type (void)
return type;
}
-static gboolean
-impl_find_next (EphyEmbed *embed,
- gboolean backwards)
-{
- MozillaEmbedPrivate *mpriv = MOZILLA_EMBED(embed)->priv;
- nsresult rv;
- PRBool didFind;
-
- rv = mpriv->browser->Find (backwards, &didFind);
-
- return NS_SUCCEEDED (rv) ? didFind : FALSE;
-}
-
static void
impl_activate (EphyEmbed *embed)
{
@@ -192,22 +179,6 @@ impl_activate (EphyEmbed *embed)
}
static void
-impl_find_set_properties (EphyEmbed *embed,
- const char *search_string,
- gboolean case_sensitive,
- gboolean wrap_around)
-{
- MozillaEmbedPrivate *mpriv = MOZILLA_EMBED(embed)->priv;
-
- nsEmbedString searchString;
- NS_CStringToUTF16 (nsEmbedCString(search_string),
- NS_CSTRING_ENCODING_UTF8, searchString);
-
- mpriv->browser->FindSetProperties (searchString.get(), case_sensitive,
- wrap_around);
-}
-
-static void
mozilla_embed_realize (GtkWidget *widget)
{
MozillaEmbedPrivate *mpriv = MOZILLA_EMBED (widget)->priv;
@@ -1067,9 +1038,7 @@ ephy_embed_iface_init (EphyEmbedIface *iface)
iface->shistory_go_nth = impl_shistory_go_nth;
iface->get_security_level = impl_get_security_level;
iface->show_page_certificate = impl_show_page_certificate;
- iface->find_next = impl_find_next;
iface->activate = impl_activate;
- iface->find_set_properties = impl_find_set_properties;
iface->set_encoding = impl_set_encoding;
iface->get_encoding = impl_get_encoding;
iface->has_automatic_encoding = impl_has_automatic_encoding;