From 63d84c5b52ce4326c2d3fe0a9fd6f92477ac12e6 Mon Sep 17 00:00:00 2001 From: "buster%netscape.com" Date: Tue, 17 Nov 1998 22:20:59 +0000 Subject: [PATCH] new module --- .../content/src/GenericElementCollection.cpp | 124 ++++++++++++++++++ .../content/src/GenericElementCollection.h | 51 +++++++ .../content/src/GenericElementCollection.cpp | 124 ++++++++++++++++++ .../content/src/GenericElementCollection.h | 51 +++++++ 4 files changed, 350 insertions(+) create mode 100644 content/html/content/src/GenericElementCollection.cpp create mode 100644 content/html/content/src/GenericElementCollection.h create mode 100644 layout/html/content/src/GenericElementCollection.cpp create mode 100644 layout/html/content/src/GenericElementCollection.h diff --git a/content/html/content/src/GenericElementCollection.cpp b/content/html/content/src/GenericElementCollection.cpp new file mode 100644 index 000000000000..42fce07e9d5b --- /dev/null +++ b/content/html/content/src/GenericElementCollection.cpp @@ -0,0 +1,124 @@ +/* -*- 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 "GenericElementCollection.h" +#include "nsIDOMElement.h" +#include "nsGenericHTMLElement.h" + +GenericElementCollection::GenericElementCollection(nsIContent *aParent, + nsIAtom *aTag) + : nsGenericDOMHTMLCollection() +{ + mParent = aParent; + mTag = aTag; +} + +GenericElementCollection::~GenericElementCollection() +{ + // we do NOT have a ref-counted reference to mParent, so do NOT release it! + // this is to avoid circular references. The instantiator who provided mParent + // is responsible for managing our reference for us. + NS_IF_RELEASE(mTag); +} + +// we re-count every call. A better implementation would be to set ourselves up as +// an observer of contentAppended, contentInserted, and contentDeleted +NS_IMETHODIMP +GenericElementCollection::GetLength(PRUint32* aLength) +{ + if (nsnull==aLength) + return NS_ERROR_NULL_POINTER; + *aLength=0; + nsresult result = NS_OK; + if (nsnull!=mParent) + { + nsIContent *child=nsnull; + PRUint32 childIndex=0; + mParent->ChildAt(childIndex, child); + while (nsnull!=child) + { + nsIAtom *childTag; + child->GetTag(childTag); + if (mTag==childTag) + { + (*aLength)++; + } + NS_RELEASE(childTag); + NS_RELEASE(child); + childIndex++; + mParent->ChildAt(childIndex, child); + } + } + return result; +} + +NS_IMETHODIMP +GenericElementCollection::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +{ + *aReturn=nsnull; + PRUint32 index = 0; + nsresult rv = NS_OK; + if (nsnull!=mParent) + { + nsIContent *child=nsnull; + PRUint32 childIndex=0; + mParent->ChildAt(childIndex, child); + while (nsnull!=child) + { + nsIAtom *childTag; + child->GetTag(childTag); + if (mTag==childTag) + { + if (aIndex==index) + { + child->QueryInterface(kIDOMNodeIID, (void**)aReturn); // out-param addref + NS_ASSERTION(nsnull!=aReturn, "content element must be an nsIDOMNode"); + NS_RELEASE(childTag); + NS_RELEASE(child); + break; + } + index++; + } + NS_RELEASE(childTag); + NS_RELEASE(child); + childIndex++; + mParent->ChildAt(childIndex, child); + } + } + return rv; +} + +NS_IMETHODIMP +GenericElementCollection::NamedItem(const nsString& aName, nsIDOMNode** aReturn) +{ + nsresult rv = NS_OK; + if (nsnull!=mParent) + { + } + return rv; +} + +NS_IMETHODIMP +GenericElementCollection::ParentDestroyed() +{ + // see comment in destructor, do NOT release mParent! + mParent = nsnull; + return NS_OK; +} + diff --git a/content/html/content/src/GenericElementCollection.h b/content/html/content/src/GenericElementCollection.h new file mode 100644 index 000000000000..08c2a08f4bbc --- /dev/null +++ b/content/html/content/src/GenericElementCollection.h @@ -0,0 +1,51 @@ +/* -*- 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 GenericElementCollection_h__ +#define GenericElementCollection_h__ + +#include "nsGenericDOMHTMLCollection.h" + +class nsIContent; +class nsIAtom; + +/** + * This class provides a late-bound collection of elements that are + * direct decendents of an element. + * mParent is NOT ref-counted to avoid circular references + */ +class GenericElementCollection : public nsGenericDOMHTMLCollection +{ +public: + GenericElementCollection(nsIContent *aParent, + nsIAtom *aTag); + virtual ~GenericElementCollection(); + + NS_IMETHOD GetLength(PRUint32* aLength); + NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn); + NS_IMETHOD NamedItem(const nsString& aName, nsIDOMNode** aReturn); + + NS_IMETHOD ParentDestroyed(); + +protected: + nsIContent * mParent; + nsIAtom * mTag; +}; + +#endif \ No newline at end of file diff --git a/layout/html/content/src/GenericElementCollection.cpp b/layout/html/content/src/GenericElementCollection.cpp new file mode 100644 index 000000000000..42fce07e9d5b --- /dev/null +++ b/layout/html/content/src/GenericElementCollection.cpp @@ -0,0 +1,124 @@ +/* -*- 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 "GenericElementCollection.h" +#include "nsIDOMElement.h" +#include "nsGenericHTMLElement.h" + +GenericElementCollection::GenericElementCollection(nsIContent *aParent, + nsIAtom *aTag) + : nsGenericDOMHTMLCollection() +{ + mParent = aParent; + mTag = aTag; +} + +GenericElementCollection::~GenericElementCollection() +{ + // we do NOT have a ref-counted reference to mParent, so do NOT release it! + // this is to avoid circular references. The instantiator who provided mParent + // is responsible for managing our reference for us. + NS_IF_RELEASE(mTag); +} + +// we re-count every call. A better implementation would be to set ourselves up as +// an observer of contentAppended, contentInserted, and contentDeleted +NS_IMETHODIMP +GenericElementCollection::GetLength(PRUint32* aLength) +{ + if (nsnull==aLength) + return NS_ERROR_NULL_POINTER; + *aLength=0; + nsresult result = NS_OK; + if (nsnull!=mParent) + { + nsIContent *child=nsnull; + PRUint32 childIndex=0; + mParent->ChildAt(childIndex, child); + while (nsnull!=child) + { + nsIAtom *childTag; + child->GetTag(childTag); + if (mTag==childTag) + { + (*aLength)++; + } + NS_RELEASE(childTag); + NS_RELEASE(child); + childIndex++; + mParent->ChildAt(childIndex, child); + } + } + return result; +} + +NS_IMETHODIMP +GenericElementCollection::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +{ + *aReturn=nsnull; + PRUint32 index = 0; + nsresult rv = NS_OK; + if (nsnull!=mParent) + { + nsIContent *child=nsnull; + PRUint32 childIndex=0; + mParent->ChildAt(childIndex, child); + while (nsnull!=child) + { + nsIAtom *childTag; + child->GetTag(childTag); + if (mTag==childTag) + { + if (aIndex==index) + { + child->QueryInterface(kIDOMNodeIID, (void**)aReturn); // out-param addref + NS_ASSERTION(nsnull!=aReturn, "content element must be an nsIDOMNode"); + NS_RELEASE(childTag); + NS_RELEASE(child); + break; + } + index++; + } + NS_RELEASE(childTag); + NS_RELEASE(child); + childIndex++; + mParent->ChildAt(childIndex, child); + } + } + return rv; +} + +NS_IMETHODIMP +GenericElementCollection::NamedItem(const nsString& aName, nsIDOMNode** aReturn) +{ + nsresult rv = NS_OK; + if (nsnull!=mParent) + { + } + return rv; +} + +NS_IMETHODIMP +GenericElementCollection::ParentDestroyed() +{ + // see comment in destructor, do NOT release mParent! + mParent = nsnull; + return NS_OK; +} + diff --git a/layout/html/content/src/GenericElementCollection.h b/layout/html/content/src/GenericElementCollection.h new file mode 100644 index 000000000000..08c2a08f4bbc --- /dev/null +++ b/layout/html/content/src/GenericElementCollection.h @@ -0,0 +1,51 @@ +/* -*- 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 GenericElementCollection_h__ +#define GenericElementCollection_h__ + +#include "nsGenericDOMHTMLCollection.h" + +class nsIContent; +class nsIAtom; + +/** + * This class provides a late-bound collection of elements that are + * direct decendents of an element. + * mParent is NOT ref-counted to avoid circular references + */ +class GenericElementCollection : public nsGenericDOMHTMLCollection +{ +public: + GenericElementCollection(nsIContent *aParent, + nsIAtom *aTag); + virtual ~GenericElementCollection(); + + NS_IMETHOD GetLength(PRUint32* aLength); + NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn); + NS_IMETHOD NamedItem(const nsString& aName, nsIDOMNode** aReturn); + + NS_IMETHOD ParentDestroyed(); + +protected: + nsIContent * mParent; + nsIAtom * mTag; +}; + +#endif \ No newline at end of file