diff options
author | Christian Persch <chpe@cvs.gnome.org> | 2005-05-29 05:58:47 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2005-05-29 05:58:47 +0800 |
commit | d0cc3530df347aed28b20fb884321a42b1b1958d (patch) | |
tree | ec070c45a016178c79322d426114bcde3b596ce6 /embed | |
parent | 995f6539fb26444a0496b6311fecdbe9ad9cc8ff (diff) | |
download | gsoc2013-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.am | 2 | ||||
-rw-r--r-- | embed/ephy-embed-factory.c | 6 | ||||
-rw-r--r-- | embed/ephy-embed-find.c | 93 | ||||
-rw-r--r-- | embed/ephy-embed-find.h | 77 | ||||
-rw-r--r-- | embed/ephy-embed.c | 37 | ||||
-rw-r--r-- | embed/ephy-embed.h | 15 | ||||
-rw-r--r-- | embed/mozilla/EphyBrowser.cpp | 30 | ||||
-rw-r--r-- | embed/mozilla/EphyBrowser.h | 6 | ||||
-rw-r--r-- | embed/mozilla/EphyFind.cpp | 188 | ||||
-rw-r--r-- | embed/mozilla/EphyFind.h | 55 | ||||
-rw-r--r-- | embed/mozilla/Makefile.am | 5 | ||||
-rw-r--r-- | embed/mozilla/mozilla-embed-find.cpp | 175 | ||||
-rw-r--r-- | embed/mozilla/mozilla-embed-find.h | 57 | ||||
-rw-r--r-- | embed/mozilla/mozilla-embed.cpp | 31 |
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; |