This commit is contained in:
rods%netscape.com 1999-01-26 15:08:23 +00:00
Родитель 4e1c6c2d09
Коммит 975dd2c36f
2 изменённых файлов: 605 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,492 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (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/
*
* 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.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are Copyright (C) 1998
* Netscape Communications Corporation. All Rights Reserved.
*/
#include "nsIDOMNode.h"
#include "nsIDOMElement.h"
#include "nsIDOMEvent.h"
#include "nsIDOMEventReceiver.h"
#include "nsIDOMHTMLInputElement.h"
#include "nsIDOMHTMLButtonElement.h"
// FOr JS Execution
#include "nsIScriptContextOwner.h"
#include "nsIWebShell.h"
#include "nsRepository.h"
#include "nsXULCommand.h"
//----------------------------------------------------------------------
// Class IID's
static NS_DEFINE_IID(kXULCommandCID, NS_XULCOMMAND_CID);
// IID's
static NS_DEFINE_IID(kIXULCommandIID, NS_IXULCOMMAND_IID);
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIDOMMouseListenerIID, NS_IDOMMOUSELISTENER_IID);
static NS_DEFINE_IID(kIDOMKeyListenerIID, NS_IDOMKEYLISTENER_IID);
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
static NS_DEFINE_IID(kIDOMHTMLInputElementIID, NS_IDOMHTMLINPUTELEMENT_IID);
static NS_DEFINE_IID(kIDOMHTMLButtonElement, NS_IDOMHTMLBUTTONELEMENT_IID);
static NS_DEFINE_IID(kIScriptContextOwnerIID, NS_ISCRIPTCONTEXTOWNER_IID);
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// Note: operator new zeros our memory
nsXULCommand::nsXULCommand()
{
NS_INIT_REFCNT();
mWebShell = nsnull;
mDOMElement = nsnull;
mIsEnabled = PR_FALSE;
}
//----------------------------------------------------------------------
nsXULCommand::~nsXULCommand()
{
NS_IF_RELEASE(mWebShell);
NS_IF_RELEASE(mDOMElement);
while (mSrcWidgets.Count() > 0) {
nsIDOMNode* node = (nsIDOMNode*) mSrcWidgets.ElementAt(0);
mSrcWidgets.RemoveElementAt(0);
NS_RELEASE(node);
}
}
NS_IMPL_ADDREF(nsXULCommand)
NS_IMPL_RELEASE(nsXULCommand)
//----------------------------------------------------------------------
nsresult
nsXULCommand::QueryInterface(REFNSIID aIID, void** aInstancePtr)
{
nsresult rv = NS_NOINTERFACE;
if (NULL == aInstancePtr) {
return NS_ERROR_NULL_POINTER;
}
if (aIID.Equals(kIXULCommandIID)) {
*aInstancePtr = (void*)(nsIXULCommand*)this;
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(kIDOMMouseListenerIID)) {
NS_ADDREF_THIS(); // Increase reference count for caller
*aInstancePtr = (void *)((nsIDOMMouseListener*)this);
return NS_OK;
}
if (aIID.Equals(kIDOMKeyListenerIID)) {
NS_ADDREF_THIS(); // Increase reference count for caller
*aInstancePtr = (void *)((nsIDOMKeyListener*)this);
return NS_OK;
}
if (aIID.Equals(kISupportsIID)) {
*aInstancePtr = (void*)(nsISupports*)(nsIXULCommand*)this;
NS_ADDREF_THIS();
return NS_OK;
}
return rv;
}
// XUL UI Objects
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetName(const nsString &aName)
{
mName = aName;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::GetName(nsString &aName) const
{
aName = mName;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::AddUINode(nsIDOMNode * aNode)
{
nsIDOMEventReceiver * receiver;
NS_PRECONDITION(nsnull != aNode, "adding event listener to null node");
if (NS_OK == aNode->QueryInterface(kIDOMEventReceiverIID, (void**) &receiver)) {
receiver->AddEventListener((nsIDOMMouseListener*)this, kIDOMMouseListenerIID);
receiver->AddEventListener((nsIDOMKeyListener*)this, kIDOMKeyListenerIID);
mSrcWidgets.AppendElement(aNode);
NS_ADDREF(aNode);
NS_RELEASE(receiver);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::RemoveUINode(nsIDOMNode * aCmd)
{
PRInt32 index = mSrcWidgets.IndexOf(aCmd);
if (index > 0) {
mSrcWidgets.RemoveElementAt(index);
}
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetEnabled(PRBool aIsEnabled)
{
mIsEnabled = aIsEnabled;
PRInt32 i, n = mSrcWidgets.Count();
for (i = 0; i < n; i++) {
nsIDOMNode* node = (nsIDOMNode*) mSrcWidgets.ElementAt(i);
nsIDOMHTMLInputElement * input;
if (NS_OK == node->QueryInterface(kIDOMHTMLInputElementIID,(void**)&input)) {
input->SetDisabled(aIsEnabled);
NS_RELEASE(input);
} else {
nsIDOMHTMLButtonElement * btn;
if (NS_OK == node->QueryInterface(kIDOMHTMLButtonElement,(void**)&btn)) {
btn->SetDisabled(aIsEnabled);
NS_RELEASE(btn);
}
}
}
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::GetEnabled(PRBool & aIsEnabled)
{
aIsEnabled = mIsEnabled;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetCommand(const nsString & aStrCmd)
{
mCommandStr = aStrCmd;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::DoCommand()
{
//printf("DoCommand mWebShell is 0x%x\n", mWebShell);
return ExecuteJavaScriptString(mWebShell, mCommandStr);
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetWebShell(nsIWebShell * aWebShell)
{
mWebShell = aWebShell;
NS_ADDREF(mWebShell);
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetDOMElement(nsIDOMElement * aDOMElement)
{
mDOMElement = aDOMElement;
NS_ADDREF(mDOMElement);
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::ExecuteJavaScriptString(nsIWebShell* aWebShell, nsString& aJavaScript)
{
if (0 == aJavaScript.Length()) {
return NS_ERROR_FAILURE;
}
nsresult status;
NS_ASSERTION(nsnull != aWebShell, "null webshell passed to EvaluateJavaScriptString");
// Get nsIScriptContextOwner
nsIScriptContextOwner* scriptContextOwner;
status = aWebShell->QueryInterface(kIScriptContextOwnerIID,(void**)&scriptContextOwner);
if (NS_OK == status) {
const char* url = "";
// Get nsIScriptContext
nsIScriptContext* scriptContext;
status = scriptContextOwner->GetScriptContext(&scriptContext);
if (NS_OK == status) {
// Ask the script context to evalute the javascript string
PRBool isUndefined;
nsString rVal;
scriptContext->EvaluateString(aJavaScript, url, 0, rVal, &isUndefined);
NS_RELEASE(scriptContext);
} NS_RELEASE(scriptContextOwner);
}
return status;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetTooltip(const nsString &aTip)
{
mTooltip = aTip;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::GetTooltip(nsString &aTip) const
{
aTip = mTooltip;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::SetDescription(const nsString &aDescription)
{
mDescription = aDescription;
return NS_OK;
}
//----------------------------------------------------------------------
NS_IMETHODIMP nsXULCommand::GetDescription(nsString &aDescription) const
{
aDescription = mDescription;
return NS_OK;
}
//-----------------------------------------------------------------
//-- nsIDOMMouseListener
//-----------------------------------------------------------------
//-----------------------------------------------------------------
nsresult nsXULCommand::ProcessEvent(nsIDOMEvent* aEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseUp(nsIDOMEvent* aMouseEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseDown(nsIDOMEvent* aMouseEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseClick(nsIDOMEvent* aMouseEvent)
{
//printf("Executing [%s]\n", mCommandStr.ToNewCString());
DoCommand();
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseDblClick(nsIDOMEvent* aMouseEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseOver(nsIDOMEvent* aMouseEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::MouseOut(nsIDOMEvent* aMouseEvent)
{
return NS_OK;
}
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// nsIDOMKeyListener
//-----------------------------------------------------------------
nsresult nsXULCommand::KeyDown(nsIDOMEvent* aKeyEvent)
{
PRUint32 type;
aKeyEvent->GetKeyCode(&type);
//printf("Key KeyDown: [%d]\n", type);
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::KeyUp(nsIDOMEvent* aKeyEvent)
{
PRUint32 type;
aKeyEvent->GetKeyCode(&type);
//printf("Key Pressed: [%d]\n", type);
if (nsIDOMEvent::VK_RETURN != type) {
return NS_OK;
}
nsIDOMHTMLInputElement * input;
if (NS_OK == mDOMElement->QueryInterface(kIDOMHTMLInputElementIID,(void**)&input)) {
nsAutoString value;
input->GetValue(value);
//printf("Value [%s]\n", value.ToNewCString());
mWebShell->LoadURL(value);
NS_RELEASE(input);
}
return NS_OK;
}
//-----------------------------------------------------------------
nsresult nsXULCommand::KeyPress(nsIDOMEvent* aKeyEvent)
{
return NS_OK;
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// Factory code for creating nsXULCommand's
class nsXULCommandFactory : public nsIFactory
{
public:
nsXULCommandFactory();
virtual ~nsXULCommandFactory();
// nsISupports methods
NS_IMETHOD QueryInterface(const nsIID &aIID, void **aResult);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
// nsIFactory methods
NS_IMETHOD CreateInstance(nsISupports *aOuter,
const nsIID &aIID,
void **aResult);
NS_IMETHOD LockFactory(PRBool aLock);
private:
nsrefcnt mRefCnt;
};
nsXULCommandFactory::nsXULCommandFactory()
{
mRefCnt = 0;
}
nsXULCommandFactory::~nsXULCommandFactory()
{
NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction");
}
nsresult
nsXULCommandFactory::QueryInterface(const nsIID &aIID, void **aResult)
{
if (aResult == NULL) {
return NS_ERROR_NULL_POINTER;
}
// Always NULL result, in case of failure
*aResult = NULL;
if (aIID.Equals(kISupportsIID)) {
*aResult = (void *)(nsISupports*)this;
} else if (aIID.Equals(kIFactoryIID)) {
*aResult = (void *)(nsIFactory*)this;
}
if (*aResult == NULL) {
return NS_NOINTERFACE;
}
NS_ADDREF_THIS(); // Increase reference count for caller
return NS_OK;
}
nsrefcnt
nsXULCommandFactory::AddRef()
{
return ++mRefCnt;
}
nsrefcnt
nsXULCommandFactory::Release()
{
if (--mRefCnt == 0) {
delete this;
return 0; // Don't access mRefCnt after deleting!
}
return mRefCnt;
}
nsresult
nsXULCommandFactory::CreateInstance(nsISupports *aOuter,
const nsIID &aIID,
void **aResult)
{
nsresult rv;
nsXULCommand *inst;
if (aResult == NULL) {
return NS_ERROR_NULL_POINTER;
}
*aResult = NULL;
if (nsnull != aOuter) {
rv = NS_ERROR_NO_AGGREGATION;
goto done;
}
NS_NEWXPCOM(inst, nsXULCommand);
if (inst == NULL) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto done;
}
NS_ADDREF(inst);
rv = inst->QueryInterface(aIID, aResult);
NS_RELEASE(inst);
done:
return rv;
}
nsresult
nsXULCommandFactory::LockFactory(PRBool aLock)
{
// Not implemented in simplest case.
return NS_OK;
}
extern "C" nsresult
NS_NewXULCommandFactory(nsIFactory** aFactory)
{
nsresult rv = NS_OK;
nsIFactory* inst = new nsXULCommandFactory();
if (nsnull == inst) {
rv = NS_ERROR_OUT_OF_MEMORY;
}
else {
NS_ADDREF(inst);
}
*aFactory = inst;
return rv;
}

Просмотреть файл

@ -0,0 +1,113 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (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/
*
* 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.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are Copyright (C) 1998
* Netscape Communications Corporation. All Rights Reserved.
*/
#ifndef nsXULCommand_h__
#define nsXULCommand_h__
#include "nsIXULCommand.h"
#include "nsIDOMMouseListener.h"
#include "nsIDOMKeyListener.h"
#include "nsVoidArray.h"
#include "nsString.h"
#include "nsCRT.h"
// Forward Declarations
class nsIDOMNode;
class nsIDOMElement;
class nsIDOMEvent;
class nsIWebShell;
//----------------------------------------------------------------------
class nsXULCommand : public nsIXULCommand,
public nsIDOMMouseListener,
public nsIDOMKeyListener
{
public:
nsXULCommand();
virtual ~nsXULCommand();
void* operator new(size_t sz) {
void* rv = new char[sz];
nsCRT::zero(rv, sz);
return rv;
}
// nsISupports
NS_DECL_ISUPPORTS
// XUL UI Objects
NS_IMETHOD SetName(const nsString &aName);
NS_IMETHOD GetName(nsString &aName) const;
NS_IMETHOD AddUINode(nsIDOMNode * aNode);
NS_IMETHOD RemoveUINode(nsIDOMNode * aCmd);
NS_IMETHOD SetEnabled(PRBool aIsEnabled);
NS_IMETHOD GetEnabled(PRBool & aIsEnabled);
NS_IMETHOD SetTooltip(const nsString &aTip);
NS_IMETHOD GetTooltip(nsString &aTip) const;
NS_IMETHOD SetDescription(const nsString &aDescription);
NS_IMETHOD GetDescription(nsString &aDescription) const;
NS_IMETHOD DoCommand();
// Non-Interface Methods
NS_IMETHOD SetDOMElement(nsIDOMElement * aDOMNode);
NS_IMETHOD SetWebShell(nsIWebShell * aWebShell);
NS_IMETHOD SetCommand(const nsString & aStrCmd);
// nsIDOMEventListener
virtual nsresult ProcessEvent(nsIDOMEvent* aEvent);
// nsIDOMMouseListener (is derived from nsIDOMEventListener)
virtual nsresult MouseDown(nsIDOMEvent* aMouseEvent);
virtual nsresult MouseUp(nsIDOMEvent* aMouseEvent);
virtual nsresult MouseClick(nsIDOMEvent* aMouseEvent);
virtual nsresult MouseDblClick(nsIDOMEvent* aMouseEvent);
virtual nsresult MouseOver(nsIDOMEvent* aMouseEvent);
virtual nsresult MouseOut(nsIDOMEvent* aMouseEvent);
// nsIDOMKeyListener
virtual nsresult KeyDown(nsIDOMEvent* aKeyEvent);
virtual nsresult KeyUp(nsIDOMEvent* aKeyEvent);
virtual nsresult KeyPress(nsIDOMEvent* aKeyEvent);
protected:
NS_IMETHOD ExecuteJavaScriptString(nsIWebShell* aWebShell, nsString& aJavaScript);
nsString mName;
nsString mCommandStr;
nsString mTooltip;
nsString mDescription;
PRBool mIsEnabled;
nsVoidArray mSrcWidgets;
nsIWebShell * mWebShell;
nsIDOMElement * mDOMElement;
};
#endif /* nsXULCommand_h__ */