From d0cc3530df347aed28b20fb884321a42b1b1958d Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Sat, 28 May 2005 21:58:47 +0000 Subject: Check for toolkit nsITypeAheadFind. 2005-05-28 Christian Persch * 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. --- ChangeLog | 40 ++++++++ configure.ac | 17 +++- embed/Makefile.am | 2 + embed/ephy-embed-factory.c | 6 ++ embed/ephy-embed-find.c | 93 +++++++++++++++++ embed/ephy-embed-find.h | 77 ++++++++++++++ embed/ephy-embed.c | 37 ------- embed/ephy-embed.h | 15 --- embed/mozilla/EphyBrowser.cpp | 30 ------ embed/mozilla/EphyBrowser.h | 6 -- embed/mozilla/EphyFind.cpp | 188 +++++++++++++++++++++++++++++++++++ embed/mozilla/EphyFind.h | 55 ++++++++++ embed/mozilla/Makefile.am | 5 + embed/mozilla/mozilla-embed-find.cpp | 175 ++++++++++++++++++++++++++++++++ embed/mozilla/mozilla-embed-find.h | 57 +++++++++++ embed/mozilla/mozilla-embed.cpp | 31 ------ src/ephy-find-toolbar.c | 165 ++++++++++++++++++++---------- src/ephy-find-toolbar.h | 15 +-- src/ephy-window.c | 94 ++++-------------- src/ephy-window.h | 2 + src/window-commands.c | 17 ++-- 21 files changed, 867 insertions(+), 260 deletions(-) create mode 100644 embed/ephy-embed-find.c create mode 100644 embed/ephy-embed-find.h create mode 100644 embed/mozilla/EphyFind.cpp create mode 100644 embed/mozilla/EphyFind.h create mode 100644 embed/mozilla/mozilla-embed-find.cpp create mode 100644 embed/mozilla/mozilla-embed-find.h diff --git a/ChangeLog b/ChangeLog index 4a471bf52..20ba8b74c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,43 @@ +2005-05-28 Christian Persch + + * 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 * src/bookmarks/ephy-bookmarks-import.c: 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 ]], + [[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 +#include + +#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 @@ -713,43 +713,6 @@ ephy_embed_show_page_certificate (EphyEmbed *embed) iface->show_page_certificate (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 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 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 +#define MOZILLA_INTERNAL_API 1 + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_TYPEAHEADFIND +#include +#include +#else +#include +#include +#endif + +#include + +#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 webBrowser; + gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (aEmbed), + getter_AddRefs (webBrowser)); + NS_ENSURE_TRUE (webBrowser, rv); + +#ifdef HAVE_TYPEAHEADFIND + nsCOMPtr 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 + +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 mFinder; +#else + nsCOMPtr 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 +#include + +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,41 +172,12 @@ 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) { gtk_widget_grab_focus (GTK_BIN (embed)->child); } -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) { @@ -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 @@ -34,6 +36,7 @@ #include #include #include +#include #include #include @@ -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) { @@ -1921,10 +1909,9 @@ ephy_window_set_active_tab (EphyWindow *window, EphyTab *new_tab) embed = ephy_tab_get_embed (old_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); @@ -2689,56 +2673,6 @@ ephy_window_open_link (EphyLink *link, return new_tab; } -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), @@ -3056,6 +2984,22 @@ ephy_window_get_notebook (EphyWindow *window) return GTK_WIDGET (window->priv->notebook); } +/** + * 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 #include @@ -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 -- cgit v1.2.3