From 8999f2e890891e4286f501d2076716d523c7d169 Mon Sep 17 00:00:00 2001 From: Crispin Flowerday Date: Sat, 1 Jan 2005 21:32:57 +0000 Subject: Add an "add-sidebar" signal on the EphyEmbedSingle interface, it gets 2005-01-01 Crispin Flowerday * embed/ephy-embed-single.c: (ephy_embed_single_iface_init): * embed/ephy-embed-single.h: * embed/mozilla/EphySidebar.cpp: * embed/mozilla/EphySidebar.h: * embed/mozilla/Makefile.am: * embed/mozilla/MozRegisterComponents.cpp: Add an "add-sidebar" signal on the EphyEmbedSingle interface, it gets emitted when a user clicks on a link that wants to add a url to the sidebar. --- ChangeLog | 13 +++ embed/ephy-embed-single.c | 20 ++++ embed/ephy-embed-single.h | 5 + embed/mozilla/EphySidebar.cpp | 181 ++++++++++++++++++++++++++++++++ embed/mozilla/EphySidebar.h | 53 ++++++++++ embed/mozilla/Makefile.am | 3 + embed/mozilla/MozRegisterComponents.cpp | 23 ++++ 7 files changed, 298 insertions(+) create mode 100644 embed/mozilla/EphySidebar.cpp create mode 100644 embed/mozilla/EphySidebar.h diff --git a/ChangeLog b/ChangeLog index 69a0687e5..f494ccc62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-01-01 Crispin Flowerday + + * embed/ephy-embed-single.c: (ephy_embed_single_iface_init): + * embed/ephy-embed-single.h: + * embed/mozilla/EphySidebar.cpp: + * embed/mozilla/EphySidebar.h: + * embed/mozilla/Makefile.am: + * embed/mozilla/MozRegisterComponents.cpp: + + Add an "add-sidebar" signal on the EphyEmbedSingle interface, + it gets emitted when a user clicks on a link that wants + to add a url to the sidebar. + 2005-01-01 Christian Persch * configure.ac: diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c index 9f07d7aa7..012b11795 100644 --- a/embed/ephy-embed-single.c +++ b/embed/ephy-embed-single.c @@ -96,6 +96,26 @@ ephy_embed_single_iface_init (gpointer g_class) 1, G_TYPE_BOOLEAN); +/** + * EphyEmbedSingle::add-sidebar: + * @single: + * @url: The url of the sidebar to be added + * @title: The title of the sidebar to be added + * + * The ::add-sidebar signal is emitted when the user clicks a javascript link that + * requests adding a url to the sidebar. + **/ + g_signal_new ("add-sidebar", + EPHY_TYPE_EMBED_SINGLE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EphyEmbedSingleIface, add_sidebar), + g_signal_accumulator_true_handled, NULL, + ephy_marshal_BOOLEAN__STRING_STRING, + G_TYPE_BOOLEAN, + 2, + G_TYPE_STRING, + G_TYPE_STRING); + initialised = TRUE; } } diff --git a/embed/ephy-embed-single.h b/embed/ephy-embed-single.h index f37460a82..7c3850b82 100644 --- a/embed/ephy-embed-single.h +++ b/embed/ephy-embed-single.h @@ -48,6 +48,11 @@ struct _EphyEmbedSingleIface void (* network_status) (EphyEmbedSingle *single, gboolean offline); + + gboolean (* add_sidebar) (EphyEmbedSingle *single, + const char * url, + const char * title); + /* Methods */ GtkWidget * (* open_window) (EphyEmbedSingle *single, diff --git a/embed/mozilla/EphySidebar.cpp b/embed/mozilla/EphySidebar.cpp new file mode 100644 index 000000000..9b2ea9cda --- /dev/null +++ b/embed/mozilla/EphySidebar.cpp @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2002 Philip Langdale + * Copyright (C) 2004 Crispin Flowerday + * + * 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 +#include +#include + +#define MOZILLA_STRICT_API +#include +#undef MOZILLA_STRICT_API + +#include "EphySidebar.h" +#include "ephy-embed-shell.h" +#include "ephy-embed-single.h" +#include "ephy-debug.h" + +/* Implementation file */ +NS_IMPL_ISUPPORTS2(EphySidebar, nsISidebar, nsIClassInfo) + +EphySidebar::EphySidebar() +{ +} + +EphySidebar::~EphySidebar() +{ +} + + +/* void addPanel (in wstring aTitle, in string aContentURL, in string aCustomizeURL); */ +NS_IMETHODIMP +EphySidebar::AddPanel (const PRUnichar *aTitle, + const char *aContentURL, + const char *aCustomizeURL) +{ + nsEmbedCString title; + EphyEmbedSingle *single; + + NS_UTF16ToCString (nsEmbedString(aTitle), + NS_CSTRING_ENCODING_UTF8, title); + + LOG ("Adding sidebar, url=%s title=%s", aContentURL, title.get()); + + single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell)); + + g_signal_emit_by_name (single, "add-sidebar", + aContentURL, title.get()); + + return NS_OK; +} + +/* void addPersistentPanel (in wstring aTitle, in string aContentURL, in string aCustomizeURL); */ +NS_IMETHODIMP +EphySidebar::AddPersistentPanel (const PRUnichar *aTitle, + const char *aContentURL, + const char *aCustomizeURL) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +/* void addSearchEngine (in string engineURL, in string iconURL, in wstring suggestedTitle, in wst +ring suggestedCategory); */ +NS_IMETHODIMP +EphySidebar::AddSearchEngine (const char *engineURL, + const char *iconURL, + const PRUnichar *suggestedTitle, + const PRUnichar *suggestedCategory) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + + + +//------------------------------------------------------------------------------ +//nsIClassInfo Impl. +//------------------------------------------------------------------------------ + +/* void getInterfaces (out PRUint32 count, [array, size_is (count), retval] out nsIIDPtr array); */ +NS_IMETHODIMP EphySidebar::GetInterfaces(PRUint32 *aCount, nsIID * **aArray) +{ + PRUint32 count = 2; + + *aCount = count; + + *aArray = NS_STATIC_CAST(nsIID **, nsMemory::Alloc(count * sizeof(nsIID *))); + NS_ENSURE_TRUE(*aArray, NS_ERROR_OUT_OF_MEMORY); + + nsIID *iid = NS_STATIC_CAST(nsIID *, + nsMemory::Clone(&(NS_GET_IID(nsISidebar)), + sizeof(nsIID))); + if (!iid) + { + NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(0, *aArray); + + return NS_ERROR_OUT_OF_MEMORY; + } + (*aArray)[0] = iid; + + + iid = NS_STATIC_CAST(nsIID *, + nsMemory::Clone(&(NS_GET_IID(nsIClassInfo)), + sizeof(nsIID))); + if (!iid) + { + NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(1, *aArray); + + return NS_ERROR_OUT_OF_MEMORY; + } + (*aArray)[1] = iid; + + return NS_OK; +} + +/* nsISupports getHelperForLanguage (in PRUint32 language); */ +NS_IMETHODIMP EphySidebar::GetHelperForLanguage(PRUint32 language, nsISupports **_retval) +{ + *_retval = nsnull; + return NS_OK; +} + +/* readonly attribute string contractID; */ +NS_IMETHODIMP EphySidebar::GetContractID(char * *aContractID) +{ + *aContractID = nsCRT::strdup(NS_SIDEBAR_CONTRACTID); + return NS_OK; +} + +/* readonly attribute string classDescription; */ +NS_IMETHODIMP EphySidebar::GetClassDescription(char * *aClassDescription) +{ + *aClassDescription = nsCRT::strdup("Sidebar"); + return NS_OK; +} + +/* readonly attribute nsCIDPtr classID; */ +NS_IMETHODIMP EphySidebar::GetClassID(nsCID * *aClassID) +{ + *aClassID = nsnull; + return NS_OK; +} + +/* readonly attribute PRUint32 implementationLanguage; */ +NS_IMETHODIMP EphySidebar::GetImplementationLanguage(PRUint32 *aImplementationLanguage) +{ + *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; + return NS_OK; +} + +/* readonly attribute PRUint32 flags; */ +NS_IMETHODIMP EphySidebar::GetFlags(PRUint32 *aFlags) +{ + *aFlags = nsIClassInfo::DOM_OBJECT; + return NS_OK; +} + +/* [notxpcom] readonly attribute nsCID classIDNoAlloc; */ +NS_IMETHODIMP EphySidebar::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) +{ + return NS_ERROR_NOT_AVAILABLE; +} diff --git a/embed/mozilla/EphySidebar.h b/embed/mozilla/EphySidebar.h new file mode 100644 index 000000000..fe5b98a48 --- /dev/null +++ b/embed/mozilla/EphySidebar.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2002 Philip Langdale + * Copyright (C) 2004 Crispin Flowerday + * + * 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_SIDEBAR_H +#define EPHY_SIDEBAR_H + +#include +#include +#include + +#define EPHY_SIDEBAR_CLASSNAME \ + "Epiphany's Sidebar Implementation" + +#define EPHY_SIDEBAR_CID \ +{ /* {50f13159-f9b9-44b3-b18e-6ee5d85a202a} */ \ + 0x50f13159, \ + 0xf9b9, \ + 0x44b3, \ + {0xb1, 0x8e, 0x6e, 0xe5, 0xd8, 0x5a, 0x20, 0x2a} \ +} + +class EphySidebar : public nsISidebar, nsIClassInfo +{ + public: + NS_DECL_ISUPPORTS + NS_DECL_NSICLASSINFO + NS_DECL_NSISIDEBAR + + EphySidebar(); + virtual ~EphySidebar(); + private: +}; + +#endif /* ! EPHY_SIDEBAR_H */ + diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am index 5c4b96ed1..9ad41b50f 100644 --- a/embed/mozilla/Makefile.am +++ b/embed/mozilla/Makefile.am @@ -11,6 +11,8 @@ libephymozillaembed_la_SOURCES = \ EphyBrowser.h \ EphyHistoryListener.cpp \ EphyHistoryListener.h \ + EphySidebar.cpp \ + EphySidebar.h \ EphySingle.cpp \ EphySingle.h \ EphyUtils.cpp \ @@ -78,6 +80,7 @@ mozilla_include_subdirs = \ pipboot \ pipnss \ shistory \ + sidebar \ uriloader \ uconv \ webbrowserpersist \ diff --git a/embed/mozilla/MozRegisterComponents.cpp b/embed/mozilla/MozRegisterComponents.cpp index 5cebf9f38..7d8b3223d 100644 --- a/embed/mozilla/MozRegisterComponents.cpp +++ b/embed/mozilla/MozRegisterComponents.cpp @@ -28,6 +28,7 @@ #include "PrintingPromptService.h" #include "MozDownload.h" #include "EphyContentPolicy.h" +#include "EphySidebar.h" #ifdef ENABLE_FILEPICKER #include "FilePicker.h" @@ -55,6 +56,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(GContentHandler) NS_GENERIC_FACTORY_CONSTRUCTOR(MozGlobalHistory) NS_GENERIC_FACTORY_CONSTRUCTOR(GPrintingPromptService) NS_GENERIC_FACTORY_CONSTRUCTOR(EphyContentPolicy) +NS_GENERIC_FACTORY_CONSTRUCTOR(EphySidebar) #ifdef ENABLE_FILEPICKER NS_GENERIC_FACTORY_CONSTRUCTOR(GFilePicker) @@ -86,6 +88,20 @@ RegisterContentPolicy(nsIComponentManager *aCompMgr, nsIFile *aPath, return rv; } +static NS_METHOD +RegisterSidebar(nsIComponentManager *aCompMgr, nsIFile *aPath, + const char *registryLocation, const char *componentType, + const nsModuleComponentInfo *info) +{ + nsCOMPtr cm = + do_GetService(NS_CATEGORYMANAGER_CONTRACTID); + NS_ENSURE_TRUE (cm, NS_ERROR_FAILURE); + + return cm->AddCategoryEntry("JavaScript global property", + "sidebar", NS_SIDEBAR_CONTRACTID, + PR_FALSE, PR_TRUE, nsnull); +} + static const nsModuleComponentInfo sAppComps[] = { { MOZ_DOWNLOAD_CLASSNAME, @@ -152,6 +168,13 @@ static const nsModuleComponentInfo sAppComps[] = { EphyContentPolicyConstructor, RegisterContentPolicy }, + { + EPHY_SIDEBAR_CLASSNAME, + EPHY_SIDEBAR_CID, + NS_SIDEBAR_CONTRACTID, + EphySidebarConstructor, + RegisterSidebar + }, }; -- cgit v1.2.3