aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog40
-rw-r--r--configure.ac17
-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
-rw-r--r--src/ephy-find-toolbar.c165
-rw-r--r--src/ephy-find-toolbar.h15
-rw-r--r--src/ephy-window.c94
-rw-r--r--src/ephy-window.h2
-rw-r--r--src/window-commands.c17
21 files changed, 867 insertions, 260 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a471bf52..20ba8b74c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,45 @@
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.
+
+2005-05-28 Christian Persch <chpe@cvs.gnome.org>
+
* src/bookmarks/ephy-bookmarks-import.c:
(gul_general_read_line_from_file):
diff --git a/configure.ac b/configure.ac
index d17dc2b70..e53aa02ce 100644
--- a/configure.ac
+++ b/configure.ac
@@ -390,6 +390,21 @@ AC_MSG_RESULT([$have_psm])
AM_CONDITIONAL([HAVE_MOZILLA_PSM],[test "x$have_psm" = "xyes"])
+dnl This is only present on toolkit
+
+AC_MSG_CHECKING([for toolkit's nsITypeAheadFind])
+
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <fastfind/nsITypeAheadFind.h>]],
+ [[nsITypeAheadFind *p;
+ p->SetDocShell(nsnull);]]
+ )],
+ [AC_DEFINE([HAVE_TYPEAHEADFIND],[1],[Define if we have tookit's typeaheadfind]) result=yes],
+ [result=no])
+
+AC_MSG_RESULT([$result])
+
dnl restore flags
CPPFLAGS=$_SAVE_CPPFLAGS
CXXFLAGS=$_SAVE_CXXFLAGS
@@ -483,7 +498,7 @@ dnl ******
dnl Python
dnl ******
-AC_MSG_CHECKING([whether python support is requested])
+AC_MSG_CHECKING([whether Python support is requested])
AC_ARG_ENABLE([python],
AS_HELP_STRING([--enable-python],[Enable python support]),
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;
diff --git a/src/ephy-find-toolbar.c b/src/ephy-find-toolbar.c
index 93ce237fe..10e244a1a 100644
--- a/src/ephy-find-toolbar.c
+++ b/src/ephy-find-toolbar.c
@@ -22,6 +22,8 @@
#include "config.h"
#include "ephy-find-toolbar.h"
+#include "ephy-embed-find.h"
+#include "ephy-embed-factory.h"
#include "ephy-debug.h"
#include <gdk/gdkkeysyms.h>
@@ -34,6 +36,7 @@
#include <gtk/gtkseparatortoolitem.h>
#include <gtk/gtkstock.h>
#include <gtk/gtktoolbutton.h>
+#include <gtk/gtkalignment.h>
#include <gtk/gtkmain.h>
#include <string.h>
@@ -41,7 +44,8 @@
struct _EphyFindToolbarPrivate
{
- EphyWindow *window;
+ EphyEmbedFind *find;
+ EphyEmbed *embed;
GtkWidget *entry;
GtkToolItem *next;
GtkToolItem *prev;
@@ -66,20 +70,29 @@ static guint signals[LAST_SIGNAL] = { 0 };
static GObjectClass *parent_class = NULL;
-/* public functions */
+/* private functions */
-const char *
-ephy_find_toolbar_get_text (EphyFindToolbar *toolbar)
+static EphyEmbedFind *
+get_find (EphyFindToolbar *toolbar)
{
EphyFindToolbarPrivate *priv = toolbar->priv;
- return gtk_entry_get_text (GTK_ENTRY (priv->entry));
+ if (priv->find == NULL)
+ {
+ priv->find = EPHY_EMBED_FIND (ephy_embed_factory_new_object (EPHY_TYPE_EMBED_FIND));
+
+ g_return_val_if_fail (priv->embed == NULL || GTK_WIDGET_REALIZED (GTK_WIDGET (priv->embed)), priv->find);
+
+ ephy_embed_find_set_embed (priv->find, priv->embed);
+ }
+
+ return priv->find;
}
-void
-ephy_find_toolbar_set_controls (EphyFindToolbar *toolbar,
- gboolean can_find_next,
- gboolean can_find_prev)
+static void
+set_controls (EphyFindToolbar *toolbar,
+ gboolean can_find_next,
+ gboolean can_find_prev)
{
EphyFindToolbarPrivate *priv = toolbar->priv;
@@ -87,7 +100,13 @@ ephy_find_toolbar_set_controls (EphyFindToolbar *toolbar,
gtk_widget_set_sensitive (GTK_WIDGET (priv->prev), can_find_prev);
}
-/* private functions */
+static void
+tab_content_changed_cb (EphyEmbed *embed,
+ const char *uri,
+ EphyFindToolbar *toolbar)
+{
+ set_controls (toolbar, TRUE, TRUE);
+}
static void
find_next_cb (EphyFindToolbar *toolbar)
@@ -103,9 +122,19 @@ find_prev_cb (EphyFindToolbar *toolbar)
static void
entry_changed_cb (GtkEntry *entry,
- GObject *toolbar)
+ EphyFindToolbar *toolbar)
{
- g_object_notify (toolbar, "text");
+ EphyFindToolbarPrivate *priv = toolbar->priv;
+ const char *text;
+ gboolean found = TRUE;
+
+ text = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+#ifdef HAVE_TYPEAHEADFIND
+ found = ephy_embed_find_find (get_find (toolbar), text, FALSE);
+#else
+ ephy_embed_find_set_properties (get_find (toolbar), text, FALSE);
+#endif
+ set_controls (toolbar, found, found);
}
static gboolean
@@ -200,7 +229,7 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
EphyFindToolbarPrivate *priv;
GtkToolbar *gtoolbar;
GtkToolItem *item;
- GtkWidget *arrow, *box, *label;
+ GtkWidget *alignment, *arrow, *box, *label;
priv = toolbar->priv = EPHY_FIND_TOOLBAR_GET_PRIVATE (toolbar);
gtoolbar = GTK_TOOLBAR (toolbar);
@@ -208,7 +237,11 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
gtk_toolbar_set_style (gtoolbar, GTK_TOOLBAR_BOTH_HORIZ);
/* Find: |_____| */
+ alignment = gtk_alignment_new (0.0, 0.5, 1.0, 0.0);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 2, 2);
+
box = gtk_hbox_new (FALSE, 12);
+ gtk_container_add (GTK_CONTAINER (alignment), box);
label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), _("Find:"));
@@ -220,7 +253,7 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
gtk_box_pack_start (GTK_BOX (box), priv->entry, TRUE, TRUE, 0);
item = gtk_tool_item_new ();
- gtk_container_add (GTK_CONTAINER (item), box);
+ gtk_container_add (GTK_CONTAINER (item), alignment);
//gtk_tool_item_set_expand (item, TRUE);
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
gtk_widget_show_all (GTK_WIDGET (item));
@@ -265,53 +298,35 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
}
static void
-ephy_find_toolbar_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+ephy_find_toolbar_finalize (GObject *object)
{
EphyFindToolbar *toolbar = EPHY_FIND_TOOLBAR (object);
EphyFindToolbarPrivate *priv = toolbar->priv;
- switch (prop_id)
+ if (priv->find != NULL)
{
- case PROP_TEXT:
- gtk_entry_set_text (GTK_ENTRY (priv->entry),
- g_value_get_string (value));
- break;
+ g_object_unref (priv->find);
}
-}
-
-static void
-ephy_find_toolbar_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EphyFindToolbar *toolbar = EPHY_FIND_TOOLBAR (object);
- switch (prop_id)
- {
- case PROP_TEXT:
- g_value_set_string (value, ephy_find_toolbar_get_text (toolbar));
- break;
- }
+ parent_class->finalize (object);
}
static void
ephy_find_toolbar_class_init (EphyFindToolbarClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
- object_class->set_property = ephy_find_toolbar_set_property;
- object_class->get_property = ephy_find_toolbar_get_property;
+ object_class->finalize = ephy_find_toolbar_finalize;
widget_class->parent_set = ephy_find_toolbar_parent_set;
widget_class->grab_focus = ephy_find_toolbar_grab_focus;
+ klass->next = ephy_find_toolbar_find_next;
+ klass->previous = ephy_find_toolbar_find_previous;
+
signals[NEXT] =
g_signal_new ("next",
G_OBJECT_CLASS_TYPE (object_class),
@@ -339,18 +354,11 @@ ephy_find_toolbar_class_init (EphyFindToolbarClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
- g_object_class_install_property
- (object_class,
- PROP_TEXT,
- g_param_spec_string ("text",
- "Search string",
- "Search string",
- "",
- G_PARAM_READWRITE));
-
g_type_class_add_private (klass, sizeof (EphyFindToolbarPrivate));
}
+/* public functions */
+
GType
ephy_find_toolbar_get_type (void)
{
@@ -384,3 +392,60 @@ ephy_find_toolbar_new (void)
{
return EPHY_FIND_TOOLBAR (g_object_new (EPHY_TYPE_FIND_TOOLBAR, NULL));
}
+
+const char *
+ephy_find_toolbar_get_text (EphyFindToolbar *toolbar)
+{
+ EphyFindToolbarPrivate *priv = toolbar->priv;
+
+ return gtk_entry_get_text (GTK_ENTRY (priv->entry));
+}
+
+void
+ephy_find_toolbar_set_embed (EphyFindToolbar *toolbar,
+ EphyEmbed *embed)
+{
+ EphyFindToolbarPrivate *priv = toolbar->priv;
+
+ if (priv->embed == embed) return;
+
+ if (priv->embed != NULL)
+ {
+ g_signal_handlers_disconnect_by_func
+ (embed, G_CALLBACK (tab_content_changed_cb), toolbar);
+ }
+
+ priv->embed = embed;
+ if (embed != NULL)
+ {
+ set_controls (toolbar, TRUE, TRUE);
+ g_signal_connect_object (embed, "ge-content-change",
+ G_CALLBACK (tab_content_changed_cb),
+ toolbar, G_CONNECT_AFTER);
+
+ if (priv->find != NULL)
+ {
+ g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (priv->embed)));
+
+ ephy_embed_find_set_embed (priv->find, embed);
+ }
+ }
+}
+
+void
+ephy_find_toolbar_find_next (EphyFindToolbar *toolbar)
+{
+ gboolean found;
+
+ found = ephy_embed_find_find_again (get_find (toolbar), TRUE);
+ set_controls (toolbar, found, found);
+}
+
+void
+ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar)
+{
+ gboolean found;
+
+ found = ephy_embed_find_find_again (get_find (toolbar), FALSE);
+ set_controls (toolbar, found, found);
+}
diff --git a/src/ephy-find-toolbar.h b/src/ephy-find-toolbar.h
index 8f3ef4567..b55a2f2cf 100644
--- a/src/ephy-find-toolbar.h
+++ b/src/ephy-find-toolbar.h
@@ -57,15 +57,18 @@ struct _EphyFindToolbarClass
void (* close) (EphyFindToolbar *toolbar);
};
-GType ephy_find_toolbar_get_type (void) G_GNUC_CONST;
+GType ephy_find_toolbar_get_type (void) G_GNUC_CONST;
-EphyFindToolbar *ephy_find_toolbar_new (void);
+EphyFindToolbar *ephy_find_toolbar_new (void);
-const char *ephy_find_toolbar_get_text (EphyFindToolbar *toolbar);
+const char *ephy_find_toolbar_get_text (EphyFindToolbar *toolbar);
-void ephy_find_toolbar_set_controls (EphyFindToolbar *toolbar,
- gboolean next,
- gboolean previous);
+void ephy_find_toolbar_set_embed (EphyFindToolbar *toolbar,
+ EphyEmbed *embed);
+
+void ephy_find_toolbar_find_next (EphyFindToolbar *toolbar);
+
+void ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar);
G_END_DECLS
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 79c5efee4..e48c73704 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -1790,18 +1790,6 @@ tab_context_menu_cb (EphyEmbed *embed,
return TRUE;
}
-static void
-tab_content_changed_cb (EphyEmbed *embed,
- const char *uri,
- EphyWindow *window)
-{
- EphyWindowPrivate *priv = window->priv;
-
- if (priv->closing) return;
-
- ephy_find_toolbar_set_controls (priv->find_toolbar, TRUE, TRUE);
-}
-
static gboolean
let_me_resize_hack (EphyWindow *window)
{
@@ -1922,9 +1910,8 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
g_signal_handlers_disconnect_by_func
(embed, G_CALLBACK (tab_context_menu_cb), window);
g_signal_handlers_disconnect_by_func
- (embed, G_CALLBACK (tab_content_changed_cb), window);
- g_signal_handlers_disconnect_by_func
(embed, G_CALLBACK (tab_size_to_cb), window);
+
}
window->priv->active_tab = new_tab;
@@ -1985,9 +1972,6 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab)
g_signal_connect_object (embed, "ge-context-menu",
G_CALLBACK (tab_context_menu_cb),
window, G_CONNECT_AFTER);
- g_signal_connect_object (embed, "ge-content-change",
- G_CALLBACK (tab_content_changed_cb),
- window, G_CONNECT_AFTER);
g_signal_connect_object (embed, "size-to",
G_CALLBACK (tab_size_to_cb),
window, 0);
@@ -2690,56 +2674,6 @@ ephy_window_open_link (EphyLink *link,
}
static void
-sync_find_toolbar_text_cb (EphyFindToolbar *toolbar,
- GParamSpec *pspec,
- EphyWindow *window)
-{
- EphyEmbed *embed;
- const char *text;
-
- embed = ephy_window_get_active_embed (window);
- g_return_if_fail (embed != NULL);
-
- text = ephy_find_toolbar_get_text (toolbar);
- ephy_embed_find_set_properties (embed, text, FALSE, TRUE);
- ephy_find_toolbar_set_controls (toolbar, TRUE, TRUE);
-}
-
-static void
-find_toolbar_find_next_cb (EphyFindToolbar *toolbar,
- EphyWindow *window)
-{
- EphyEmbed *embed;
- const char *text;
- gboolean found;
-
- embed = ephy_window_get_active_embed (window);
- g_return_if_fail (embed != NULL);
-
- text = ephy_find_toolbar_get_text (toolbar);
- ephy_embed_find_set_properties (embed, text, FALSE, TRUE);
- found = ephy_embed_find_next (embed, FALSE);
- ephy_find_toolbar_set_controls (toolbar, found, found);
-}
-
-static void
-find_toolbar_find_previous_cb (EphyFindToolbar *toolbar,
- EphyWindow *window)
-{
- EphyEmbed *embed;
- const char *text;
- gboolean found;
-
- embed = ephy_window_get_active_embed (window);
- g_return_if_fail (embed != NULL);
-
- text = ephy_find_toolbar_get_text (toolbar);
- ephy_embed_find_set_properties (embed, text, FALSE, TRUE);
- found = ephy_embed_find_next (embed, TRUE);
- ephy_find_toolbar_set_controls (toolbar, found, found);
-}
-
-static void
find_toolbar_close_cb (EphyFindToolbar *toolbar,
EphyWindow *window)
{
@@ -2777,12 +2711,6 @@ ephy_window_init (EphyWindow *window)
gtk_widget_show (GTK_WIDGET (window->priv->notebook));
priv->find_toolbar = ephy_find_toolbar_new ();
- g_signal_connect (priv->find_toolbar, "notify::text",
- G_CALLBACK (sync_find_toolbar_text_cb), window);
- g_signal_connect (priv->find_toolbar, "next",
- G_CALLBACK (find_toolbar_find_next_cb), window);
- g_signal_connect (priv->find_toolbar, "previous",
- G_CALLBACK (find_toolbar_find_previous_cb), window);
g_signal_connect (priv->find_toolbar, "close",
G_CALLBACK (find_toolbar_close_cb), window);
gtk_box_pack_start (GTK_BOX (window->priv->main_vbox),
@@ -3057,6 +2985,22 @@ ephy_window_get_notebook (EphyWindow *window)
}
/**
+ * ephy_window_get_find_toolbar:
+ * @window: an #EphyWindow
+ *
+ * Returns the #EphyFindToolbar used by this window.
+ *
+ * Return value: the @window's #EphyFindToolbar
+ **/
+GtkWidget *
+ephy_window_get_find_toolbar (EphyWindow *window)
+{
+ g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL);
+
+ return GTK_WIDGET (window->priv->find_toolbar);
+}
+
+/**
* ephy_window_get_statusbar:
* @window: an #EphyWindow
*
@@ -3291,16 +3235,18 @@ ephy_window_notebook_switch_page_cb (GtkNotebook *notebook,
{
EphyWindowPrivate *priv = window->priv;
EphyTab *tab;
+ EphyEmbed *embed;
if (priv->closing) return;
/* get the new tab */
tab = real_get_active_tab (window, page_num);
+ embed = ephy_tab_get_embed (tab);
/* update new tab */
ephy_window_set_active_tab (window, tab);
- ephy_find_toolbar_set_controls (priv->find_toolbar, TRUE, TRUE);
+ ephy_find_toolbar_set_embed (priv->find_toolbar, embed);
/* update window controls */
update_tabs_menu_sensitivity (window);
diff --git a/src/ephy-window.h b/src/ephy-window.h
index df0486c8f..6cd3fa9bc 100644
--- a/src/ephy-window.h
+++ b/src/ephy-window.h
@@ -72,6 +72,8 @@ GtkWidget *ephy_window_get_bookmarksbar (EphyWindow *window);
GtkWidget *ephy_window_get_notebook (EphyWindow *window);
+GtkWidget *ephy_window_get_find_toolbar (EphyWindow *window);
+
GtkWidget *ephy_window_get_statusbar (EphyWindow *window);
void ephy_window_add_tab (EphyWindow *window,
diff --git a/src/window-commands.c b/src/window-commands.c
index f6f59b1ee..7f4893aab 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -44,6 +44,7 @@
#include "ephy-zoom.h"
#include "ephy-notebook.h"
#include "ephy-toolbar-editor.h"
+#include "ephy-find-toolbar.h"
#include <string.h>
#include <glib.h>
@@ -559,24 +560,20 @@ void
window_cmd_edit_find_next (GtkAction *action,
EphyWindow *window)
{
- EphyEmbed *embed;
-
- embed = ephy_window_get_active_embed (window);
- g_return_if_fail (embed != NULL);
+ EphyFindToolbar *toolbar;
- ephy_embed_find_next (embed, FALSE);
+ toolbar = EPHY_FIND_TOOLBAR (ephy_window_get_find_toolbar (window));
+ ephy_find_toolbar_find_next (toolbar);
}
void
window_cmd_edit_find_prev (GtkAction *action,
EphyWindow *window)
{
- EphyEmbed *embed;
-
- embed = ephy_window_get_active_embed (window);
- g_return_if_fail (embed != NULL);
+ EphyFindToolbar *toolbar;
- ephy_embed_find_next (embed, TRUE);
+ toolbar = EPHY_FIND_TOOLBAR (ephy_window_get_find_toolbar (window));
+ ephy_find_toolbar_find_previous (toolbar);
}
void