1999-08-25 08:35:06 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
1999-11-06 03:40:37 +00:00
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
1999-08-25 08:35:06 +00:00
|
|
|
*
|
1999-11-06 03:40:37 +00:00
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
1999-08-25 08:35:06 +00:00
|
|
|
*
|
1999-11-06 03:40:37 +00:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape
|
1999-08-25 08:35:06 +00:00
|
|
|
* Communications Corporation. Portions created by Netscape are
|
1999-11-06 03:40:37 +00:00
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
2001-05-10 02:35:00 +00:00
|
|
|
* Contributor(s):
|
|
|
|
* Dan Rosen <dr@netscape.com>
|
1999-08-25 08:35:06 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "nsIFactory.h"
|
|
|
|
#include "nsISupports.h"
|
|
|
|
#include "nsdefs.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
|
|
|
|
2000-03-22 10:26:22 +00:00
|
|
|
#include "nsFilePicker.h"
|
1999-08-25 08:35:06 +00:00
|
|
|
#include "nsFileWidget.h"
|
|
|
|
#include "nsFileSpecWithUIImpl.h"
|
|
|
|
#include "nsLookAndFeel.h"
|
|
|
|
#include "nsScrollbar.h"
|
|
|
|
#include "nsToolkit.h"
|
|
|
|
#include "nsWindow.h"
|
|
|
|
#include "nsAppShell.h"
|
|
|
|
#include "nsIServiceManager.h"
|
|
|
|
#include "nsFontRetrieverService.h"
|
|
|
|
#include "nsSound.h"
|
|
|
|
|
2001-02-14 23:13:07 +00:00
|
|
|
#ifdef IBMBIDI
|
|
|
|
#include "nsBidiKeyboard.h"
|
|
|
|
#endif
|
|
|
|
|
2000-01-21 21:56:09 +00:00
|
|
|
#include "nsWindowsTimer.h"
|
|
|
|
#include "nsTimerManager.h"
|
1999-08-25 08:35:06 +00:00
|
|
|
|
|
|
|
// Drag & Drop, Clipboard
|
|
|
|
#include "nsClipboard.h"
|
2001-05-10 02:35:00 +00:00
|
|
|
#include "nsClipboardHelper.h"
|
1999-08-25 08:35:06 +00:00
|
|
|
#include "nsTransferable.h"
|
Checking in for bug 50742, this change removes the use of XIF in mozilla and replaces the XIF converter with a HTML (and XML) serializer.
Contextual information added to HTML copy and intelligence added to HTML paste in the editor (fixes bugs 47014, 50568 and 46554, and partly (at least) fixes bug 53188).
Code written by vidur, jfrancis, jst, akkana. Tested by jfrancis, akkana, vidur, jst, kin. Reviwed (and super reviewed) by waterson, vidur, kin, jfrancis, jst
2000-10-07 10:57:30 +00:00
|
|
|
#include "nsHTMLFormatConverter.h"
|
1999-08-25 08:35:06 +00:00
|
|
|
#include "nsDragService.h"
|
|
|
|
|
|
|
|
static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID);
|
|
|
|
static NS_DEFINE_IID(kCChild, NS_CHILD_CID);
|
|
|
|
static NS_DEFINE_IID(kCFileOpen, NS_FILEWIDGET_CID);
|
2000-03-22 10:26:22 +00:00
|
|
|
static NS_DEFINE_IID(kCFilePicker, NS_FILEPICKER_CID);
|
1999-08-25 08:35:06 +00:00
|
|
|
static NS_DEFINE_IID(kCHorzScrollbar, NS_HORZSCROLLBAR_CID);
|
|
|
|
static NS_DEFINE_IID(kCVertScrollbar, NS_VERTSCROLLBAR_CID);
|
|
|
|
static NS_DEFINE_IID(kCAppShell, NS_APPSHELL_CID);
|
|
|
|
static NS_DEFINE_IID(kCToolkit, NS_TOOLKIT_CID);
|
|
|
|
static NS_DEFINE_IID(kCLookAndFeel, NS_LOOKANDFEEL_CID);
|
|
|
|
static NS_DEFINE_IID(kCFontRetrieverService, NS_FONTRETRIEVERSERVICE_CID);
|
|
|
|
|
2000-01-21 21:56:09 +00:00
|
|
|
static NS_DEFINE_IID(kCTimer, NS_TIMER_CID);
|
|
|
|
static NS_DEFINE_IID(kCTimerManager, NS_TIMERMANAGER_CID);
|
1999-08-25 08:35:06 +00:00
|
|
|
|
|
|
|
// Drag & Drop, Clipboard
|
|
|
|
static NS_DEFINE_IID(kCDataObj, NS_DATAOBJ_CID);
|
|
|
|
static NS_DEFINE_IID(kCClipboard, NS_CLIPBOARD_CID);
|
2001-05-10 02:35:00 +00:00
|
|
|
static NS_DEFINE_IID(kCClipboardHelper, NS_CLIPBOARDHELPER_CID);
|
1999-08-25 08:35:06 +00:00
|
|
|
static NS_DEFINE_IID(kCTransferable, NS_TRANSFERABLE_CID);
|
Checking in for bug 50742, this change removes the use of XIF in mozilla and replaces the XIF converter with a HTML (and XML) serializer.
Contextual information added to HTML copy and intelligence added to HTML paste in the editor (fixes bugs 47014, 50568 and 46554, and partly (at least) fixes bug 53188).
Code written by vidur, jfrancis, jst, akkana. Tested by jfrancis, akkana, vidur, jst, kin. Reviwed (and super reviewed) by waterson, vidur, kin, jfrancis, jst
2000-10-07 10:57:30 +00:00
|
|
|
static NS_DEFINE_IID(kCHTMLFormatConverter, NS_HTMLFORMATCONVERTER_CID);
|
1999-08-25 08:35:06 +00:00
|
|
|
static NS_DEFINE_IID(kCDragService, NS_DRAGSERVICE_CID);
|
|
|
|
|
|
|
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
|
|
|
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
|
|
|
|
|
|
|
|
|
|
|
// Sound services (just Beep for now)
|
|
|
|
static NS_DEFINE_CID(kCSound, NS_SOUND_CID);
|
|
|
|
static NS_DEFINE_CID(kCFileSpecWithUI, NS_FILESPECWITHUI_CID);
|
|
|
|
|
2001-02-14 23:13:07 +00:00
|
|
|
#ifdef IBMBIDI
|
|
|
|
static NS_DEFINE_IID(kCBidiKeyboard, NS_BIDIKEYBOARD_CID);
|
|
|
|
#endif
|
1999-08-25 08:35:06 +00:00
|
|
|
|
|
|
|
class nsWidgetFactory : public nsIFactory
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// nsISupports methods
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
// nsIFactory methods
|
|
|
|
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
|
|
|
const nsIID &aIID,
|
|
|
|
void **aResult);
|
|
|
|
|
|
|
|
|
|
|
|
NS_IMETHOD LockFactory(PRBool aLock);
|
|
|
|
|
|
|
|
nsWidgetFactory(const nsCID &aClass);
|
|
|
|
~nsWidgetFactory();
|
|
|
|
|
|
|
|
private:
|
|
|
|
nsCID mClassID;
|
|
|
|
};
|
|
|
|
|
|
|
|
NS_IMPL_ADDREF(nsWidgetFactory)
|
|
|
|
NS_IMPL_RELEASE(nsWidgetFactory)
|
|
|
|
|
|
|
|
nsWidgetFactory::nsWidgetFactory(const nsCID &aClass)
|
|
|
|
{
|
|
|
|
NS_INIT_REFCNT();
|
|
|
|
mClassID = aClass;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nsWidgetFactory::~nsWidgetFactory()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID,
|
|
|
|
void **aResult)
|
|
|
|
{
|
|
|
|
if (aResult == NULL) {
|
2000-01-31 22:53:35 +00:00
|
|
|
return NS_ERROR_NULL_POINTER;
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Always NULL result, in case of failure
|
|
|
|
*aResult = NULL;
|
|
|
|
|
|
|
|
if (aIID.Equals(kISupportsIID)) {
|
2000-01-31 22:53:35 +00:00
|
|
|
*aResult = (void *)(nsISupports*)this;
|
1999-08-25 08:35:06 +00:00
|
|
|
} else if (aIID.Equals(kIFactoryIID)) {
|
2000-01-31 22:53:35 +00:00
|
|
|
*aResult = (void *)(nsIFactory*)this;
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (*aResult == NULL) {
|
2000-01-31 22:53:35 +00:00
|
|
|
return NS_NOINTERFACE;
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_ADDREF_THIS(); // Increase reference count for caller
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nsresult nsWidgetFactory::CreateInstance( nsISupports* aOuter,
|
|
|
|
const nsIID &aIID,
|
|
|
|
void **aResult)
|
|
|
|
{
|
|
|
|
if (aResult == NULL) {
|
2000-01-31 22:53:35 +00:00
|
|
|
return NS_ERROR_NULL_POINTER;
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
*aResult = NULL;
|
|
|
|
if (nsnull != aOuter) {
|
2000-01-31 22:53:35 +00:00
|
|
|
return NS_ERROR_NO_AGGREGATION;
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsISupports *inst = nsnull;
|
|
|
|
if (mClassID.Equals(kCWindow)) {
|
1999-11-15 20:57:41 +00:00
|
|
|
inst = (nsISupports*)(nsBaseWidget*)new nsWindow();
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCChild)) {
|
1999-11-15 20:57:41 +00:00
|
|
|
inst = (nsISupports*)(nsBaseWidget*)new ChildWindow();
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCFileOpen)) {
|
|
|
|
inst = (nsISupports*)new nsFileWidget();
|
|
|
|
}
|
2000-03-22 10:26:22 +00:00
|
|
|
else if (mClassID.Equals(kCFilePicker)) {
|
|
|
|
inst = (nsISupports*)(nsBaseFilePicker*)new nsFilePicker();
|
|
|
|
}
|
1999-08-25 08:35:06 +00:00
|
|
|
else if (mClassID.Equals(kCHorzScrollbar)) {
|
1999-11-15 20:57:41 +00:00
|
|
|
inst = (nsISupports*)(nsBaseWidget*)(nsWindow*)new nsScrollbar(PR_FALSE);
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCVertScrollbar)) {
|
1999-11-15 20:57:41 +00:00
|
|
|
inst = (nsISupports*)(nsBaseWidget*)(nsWindow*)new nsScrollbar(PR_TRUE);
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCAppShell)) {
|
|
|
|
inst = (nsISupports*)new nsAppShell();
|
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCToolkit)) {
|
|
|
|
inst = (nsISupports*)new nsToolkit();
|
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCLookAndFeel)) {
|
|
|
|
inst = (nsISupports*)new nsLookAndFeel();
|
2000-02-09 19:30:25 +00:00
|
|
|
}
|
1999-08-25 08:35:06 +00:00
|
|
|
else if (mClassID.Equals(kCSound)) {
|
2000-06-04 07:13:40 +00:00
|
|
|
inst = (nsISupports*)(nsISound*)new nsSound();
|
2000-02-09 19:30:25 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCFileSpecWithUI)) {
|
1999-08-25 08:35:06 +00:00
|
|
|
inst = (nsISupports*) (nsIFileSpecWithUI *) new nsFileSpecWithUIImpl;
|
2000-02-09 19:30:25 +00:00
|
|
|
}
|
1999-08-25 08:35:06 +00:00
|
|
|
else if (mClassID.Equals(kCTransferable)) {
|
2000-01-31 22:53:35 +00:00
|
|
|
inst = (nsISupports*)new nsTransferable();
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
Checking in for bug 50742, this change removes the use of XIF in mozilla and replaces the XIF converter with a HTML (and XML) serializer.
Contextual information added to HTML copy and intelligence added to HTML paste in the editor (fixes bugs 47014, 50568 and 46554, and partly (at least) fixes bug 53188).
Code written by vidur, jfrancis, jst, akkana. Tested by jfrancis, akkana, vidur, jst, kin. Reviwed (and super reviewed) by waterson, vidur, kin, jfrancis, jst
2000-10-07 10:57:30 +00:00
|
|
|
else if (mClassID.Equals(kCHTMLFormatConverter)) {
|
|
|
|
inst = (nsISupports*)new nsHTMLFormatConverter();
|
1999-08-25 08:35:06 +00:00
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCClipboard)) {
|
|
|
|
inst = (nsISupports*)(nsBaseClipboard *)new nsClipboard();
|
|
|
|
}
|
2001-05-10 02:35:00 +00:00
|
|
|
else if (mClassID.Equals(kCClipboardHelper)) {
|
|
|
|
inst = (nsISupports*)new nsClipboardHelper();
|
|
|
|
}
|
1999-08-25 08:35:06 +00:00
|
|
|
else if (mClassID.Equals(kCDragService)) {
|
|
|
|
inst = (nsISupports*)(nsIDragService *)new nsDragService();
|
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCFontRetrieverService)) {
|
|
|
|
inst = (nsISupports*)(nsIFontRetrieverService *)new nsFontRetrieverService();
|
|
|
|
}
|
2000-01-21 21:56:09 +00:00
|
|
|
else if (mClassID.Equals(kCTimer)) {
|
|
|
|
inst = (nsISupports*)(nsITimer*) new nsTimer();
|
|
|
|
}
|
|
|
|
else if (mClassID.Equals(kCTimerManager)) {
|
|
|
|
inst = (nsISupports*)(nsITimerQueue*) new nsTimerManager();
|
|
|
|
}
|
2001-02-14 23:13:07 +00:00
|
|
|
#ifdef IBMBIDI
|
|
|
|
else if (mClassID.Equals(kCBidiKeyboard)) {
|
|
|
|
inst = (nsISupports*)(nsIBidiKeyboard*) new nsBidiKeyboard();
|
|
|
|
}
|
|
|
|
#endif // IBMBIDI
|
1999-08-25 08:35:06 +00:00
|
|
|
if (inst == NULL) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
1999-10-24 04:41:17 +00:00
|
|
|
NS_ADDREF(inst); // Stabilize
|
1999-08-25 08:35:06 +00:00
|
|
|
nsresult res = inst->QueryInterface(aIID, aResult);
|
1999-10-24 04:41:17 +00:00
|
|
|
NS_RELEASE(inst); // Destabilize and avoid leaks. Avoid calling delete <interface pointer>
|
1999-08-25 08:35:06 +00:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult nsWidgetFactory::LockFactory(PRBool aLock)
|
|
|
|
|
|
|
|
{
|
2000-01-31 22:53:35 +00:00
|
|
|
// Not implemented in simplest case.
|
|
|
|
return NS_OK;
|
1999-08-25 08:35:06 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// return the proper factory to the caller
|
|
|
|
extern "C" NS_WIDGET nsresult
|
|
|
|
NSGetFactory(nsISupports* serviceMgr,
|
|
|
|
const nsCID &aClass,
|
|
|
|
const char *aClassName,
|
2000-09-13 23:57:52 +00:00
|
|
|
const char *aContractID,
|
1999-08-25 08:35:06 +00:00
|
|
|
nsIFactory **aFactory)
|
|
|
|
{
|
|
|
|
if (nsnull == aFactory) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aFactory = new nsWidgetFactory(aClass);
|
|
|
|
if (nsnull == aFactory) {
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|