mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
ground work for new content subtree iterator
This commit is contained in:
parent
f15faad70f
commit
9dcb3ba518
@ -68,7 +68,7 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
static nsIContent* GetDeepFirstChild(nsIContent* aRoot);
|
||||
static nsCOMPtr<nsIContent> GetDeepFirstChild(nsCOMPtr<nsIContent> aRoot);
|
||||
|
||||
nsCOMPtr<nsIContent> mCurNode;
|
||||
nsCOMPtr<nsIContent> mFirst;
|
||||
@ -84,11 +84,13 @@ private:
|
||||
|
||||
};
|
||||
|
||||
nsresult NS_NewContentIterator(nsIContentIterator** aInstancePtrResult);
|
||||
|
||||
|
||||
/******************************************************
|
||||
* repository cruft
|
||||
******************************************************/
|
||||
|
||||
|
||||
nsresult NS_NewContentIterator(nsIContentIterator** aInstancePtrResult)
|
||||
{
|
||||
nsContentIterator * iter = new nsContentIterator();
|
||||
@ -107,20 +109,24 @@ nsresult nsContentIterator::QueryInterface(const nsIID& aIID,
|
||||
void** aInstancePtrResult)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer");
|
||||
if (nsnull == aInstancePtrResult) {
|
||||
if (nsnull == aInstancePtrResult)
|
||||
{
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
if (aIID.Equals(kISupportsIID))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsISupports*)(nsIContentIterator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
/* if (aIID.Equals(nsIEnumerator::IID())) {
|
||||
/* if (aIID.Equals(nsIEnumerator::IID()))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsIEnumerator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
} */
|
||||
if (aIID.Equals(nsIContentIterator::IID())) {
|
||||
if (aIID.Equals(nsIContentIterator::IID()))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsIContentIterator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
@ -155,9 +161,11 @@ nsContentIterator::~nsContentIterator()
|
||||
|
||||
nsresult nsContentIterator::Init(nsIContent* aRoot)
|
||||
{
|
||||
if (!aRoot) return NS_ERROR_NULL_POINTER;
|
||||
if (!aRoot)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
mFirst = GetDeepFirstChild(aRoot);
|
||||
nsCOMPtr<nsIContent> root(aRoot);
|
||||
mFirst = GetDeepFirstChild(root);
|
||||
mLast = aRoot;
|
||||
mCurNode = mFirst;
|
||||
return NS_OK;
|
||||
@ -166,15 +174,18 @@ nsresult nsContentIterator::Init(nsIContent* aRoot)
|
||||
|
||||
nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
{
|
||||
if (!aRange) return NS_ERROR_NULL_POINTER;
|
||||
if (!aRange)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
// get the start node and offset, convert to nsIContent
|
||||
nsCOMPtr<nsIContent> cN;
|
||||
nsCOMPtr<nsIDOMNode> dN;
|
||||
aRange->GetStartParent(getter_AddRefs(dN));
|
||||
if (!dN) return NS_ERROR_ILLEGAL_VALUE;
|
||||
if (!dN)
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
cN = dN;
|
||||
if (!cN) return NS_ERROR_FAILURE;
|
||||
if (!cN)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 indx;
|
||||
aRange->GetStartOffset(&indx);
|
||||
@ -182,6 +193,7 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
// find first node in range
|
||||
nsCOMPtr<nsIContent> cChild;
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
|
||||
if (!cChild) // no children, must be a text node
|
||||
{
|
||||
mFirst = cN;
|
||||
@ -199,14 +211,19 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aRange->GetEndParent(getter_AddRefs(dN));
|
||||
if (!dN) return NS_ERROR_ILLEGAL_VALUE;
|
||||
if (!dN)
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
cN = dN;
|
||||
if (!cN) return NS_ERROR_FAILURE;
|
||||
if (!cN)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
aRange->GetEndOffset(&indx);
|
||||
|
||||
// find last node in range
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
|
||||
if (!cChild) // no children, must be a text node
|
||||
{
|
||||
mLast = cN;
|
||||
@ -217,24 +234,18 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
}
|
||||
else
|
||||
{
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild));
|
||||
cN->ChildAt(--indx,*getter_AddRefs(cChild));
|
||||
if (!cChild) // offset after last child, last child is last node
|
||||
{
|
||||
cN->ChildCount(indx);
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild)); // XXX off by one???
|
||||
cN->ChildAt(--indx,*getter_AddRefs(cChild));
|
||||
if (!cChild)
|
||||
{
|
||||
NS_NOTREACHED("nsContentIterator::nsContentIterator");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mLast = cChild;
|
||||
}
|
||||
else // child just before indx is last node
|
||||
{
|
||||
--indx;
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild));
|
||||
mLast = cChild;
|
||||
}
|
||||
mLast = cChild;
|
||||
}
|
||||
|
||||
mCurNode = mFirst;
|
||||
@ -243,21 +254,20 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Private helper routines
|
||||
* Helper routines
|
||||
******************************************************/
|
||||
|
||||
nsIContent* nsContentIterator::GetDeepFirstChild(nsIContent* aRoot)
|
||||
nsCOMPtr<nsIContent> nsContentIterator::GetDeepFirstChild(nsCOMPtr<nsIContent> aRoot)
|
||||
{
|
||||
// THIS ROUTINE DOES NOT ADDREF
|
||||
if (!aRoot) return nsnull;
|
||||
nsIContent *cN = aRoot;
|
||||
nsIContent *cChild;
|
||||
cN->ChildAt(0,cChild);
|
||||
if (!aRoot)
|
||||
return aRoot;
|
||||
nsCOMPtr<nsIContent> cN = aRoot;
|
||||
nsCOMPtr<nsIContent> cChild;
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
while ( cChild )
|
||||
{
|
||||
NS_IF_RELEASE(cN); // balance addref inside ChildAt()
|
||||
cN = cChild;
|
||||
cN->ChildAt(0,cChild);
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
}
|
||||
return cN;
|
||||
}
|
||||
@ -268,9 +278,11 @@ nsIContent* nsContentIterator::GetDeepFirstChild(nsIContent* aRoot)
|
||||
|
||||
nsresult nsContentIterator::First()
|
||||
{
|
||||
if (!mFirst) return NS_ERROR_FAILURE;
|
||||
if (!mFirst)
|
||||
return NS_ERROR_FAILURE;
|
||||
mIsDone = false;
|
||||
if (mFirst == mCurNode) return NS_OK;
|
||||
if (mFirst == mCurNode)
|
||||
return NS_OK;
|
||||
mCurNode = mFirst;
|
||||
return NS_OK;
|
||||
}
|
||||
@ -278,9 +290,11 @@ nsresult nsContentIterator::First()
|
||||
|
||||
nsresult nsContentIterator::Last()
|
||||
{
|
||||
if (!mLast) return NS_ERROR_FAILURE;
|
||||
if (!mLast)
|
||||
return NS_ERROR_FAILURE;
|
||||
mIsDone = false;
|
||||
if (mLast == mCurNode) return NS_OK;
|
||||
if (mLast == mCurNode)
|
||||
return NS_OK;
|
||||
mCurNode = mLast;
|
||||
return NS_OK;
|
||||
}
|
||||
@ -288,8 +302,10 @@ nsresult nsContentIterator::Last()
|
||||
|
||||
nsresult nsContentIterator::Next()
|
||||
{
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
if (!mCurNode) return NS_OK;
|
||||
if (mIsDone)
|
||||
return NS_ERROR_FAILURE;
|
||||
if (!mCurNode)
|
||||
return NS_OK;
|
||||
if (mCurNode == mLast)
|
||||
{
|
||||
mIsDone = true;
|
||||
@ -301,7 +317,8 @@ nsresult nsContentIterator::Next()
|
||||
|
||||
mCurNode->GetParent(*getter_AddRefs(cParent));
|
||||
// no parent and we are not done? something is wrong
|
||||
if (!cParent) return NS_ERROR_UNEXPECTED;
|
||||
if (!cParent)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
// get next sibling
|
||||
PRInt32 indx;
|
||||
@ -329,27 +346,114 @@ nsresult nsContentIterator::Prev()
|
||||
|
||||
nsresult nsContentIterator::IsDone()
|
||||
{
|
||||
if (mIsDone) return NS_OK;
|
||||
else return NS_COMFALSE;
|
||||
if (mIsDone)
|
||||
return NS_OK;
|
||||
else
|
||||
return NS_COMFALSE;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentIterator::CurrentNode(nsIContent **aNode)
|
||||
{
|
||||
if (!mCurNode) return NS_ERROR_FAILURE;
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
if (!mCurNode)
|
||||
return NS_ERROR_FAILURE;
|
||||
if (mIsDone)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mCurNode->QueryInterface(nsIContent::IID(), (void**) aNode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*====================================================================================*/
|
||||
/*====================================================================================*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Enumerator routines
|
||||
* nsContentSubtreeIterator
|
||||
******************************************************/
|
||||
|
||||
/*nsresult nsContentIterator::CurrentItem(nsISupports **aNode)
|
||||
|
||||
/*
|
||||
* A simple iterator class for traversing the content in "top subtree" order
|
||||
*/
|
||||
class nsContentSubtreeIterator : public nsContentIterator
|
||||
{
|
||||
if (!mCurNode) return NS_ERROR_FAILURE;
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
return mCurNode->QueryInterface(kISupportsIID, (void**) aNode);
|
||||
public:
|
||||
nsContentSubtreeIterator() {};
|
||||
virtual ~nsContentSubtreeIterator() {};
|
||||
|
||||
// nsContentIterator overrides ------------------------------
|
||||
|
||||
NS_IMETHOD Init(nsIContent* aRoot);
|
||||
|
||||
NS_IMETHOD Init(nsIDOMRange* aRange);
|
||||
|
||||
NS_IMETHOD Next();
|
||||
|
||||
NS_IMETHOD Prev();
|
||||
|
||||
private:
|
||||
|
||||
// no copy's or assigns FIX ME
|
||||
nsContentSubtreeIterator(const nsContentSubtreeIterator&);
|
||||
nsContentSubtreeIterator& operator=(const nsContentSubtreeIterator&);
|
||||
|
||||
};
|
||||
|
||||
nsresult NS_NewContentSubtreeIterator(nsIContentIterator** aInstancePtrResult);
|
||||
|
||||
/******************************************************
|
||||
* repository cruft
|
||||
******************************************************/
|
||||
|
||||
nsresult NS_NewContentSubtreeIterator(nsIContentIterator** aInstancePtrResult)
|
||||
{
|
||||
nsContentIterator * iter = new nsContentSubtreeIterator();
|
||||
return iter->QueryInterface(nsIContentIterator::IID(), (void**) aInstancePtrResult);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Init routines
|
||||
******************************************************/
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Init(nsIContent* aRoot)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Init(nsIDOMRange* aRange)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Helper routines
|
||||
******************************************************/
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* nsContentSubtreeIterator overrides of ContentIterator routines
|
||||
****************************************************************/
|
||||
|
||||
nsresult nsContentSubtreeIterator::Next()
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Prev()
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
static nsIContent* GetDeepFirstChild(nsIContent* aRoot);
|
||||
static nsCOMPtr<nsIContent> GetDeepFirstChild(nsCOMPtr<nsIContent> aRoot);
|
||||
|
||||
nsCOMPtr<nsIContent> mCurNode;
|
||||
nsCOMPtr<nsIContent> mFirst;
|
||||
@ -84,11 +84,13 @@ private:
|
||||
|
||||
};
|
||||
|
||||
nsresult NS_NewContentIterator(nsIContentIterator** aInstancePtrResult);
|
||||
|
||||
|
||||
/******************************************************
|
||||
* repository cruft
|
||||
******************************************************/
|
||||
|
||||
|
||||
nsresult NS_NewContentIterator(nsIContentIterator** aInstancePtrResult)
|
||||
{
|
||||
nsContentIterator * iter = new nsContentIterator();
|
||||
@ -107,20 +109,24 @@ nsresult nsContentIterator::QueryInterface(const nsIID& aIID,
|
||||
void** aInstancePtrResult)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer");
|
||||
if (nsnull == aInstancePtrResult) {
|
||||
if (nsnull == aInstancePtrResult)
|
||||
{
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
if (aIID.Equals(kISupportsIID))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsISupports*)(nsIContentIterator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
/* if (aIID.Equals(nsIEnumerator::IID())) {
|
||||
/* if (aIID.Equals(nsIEnumerator::IID()))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsIEnumerator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
} */
|
||||
if (aIID.Equals(nsIContentIterator::IID())) {
|
||||
if (aIID.Equals(nsIContentIterator::IID()))
|
||||
{
|
||||
*aInstancePtrResult = (void*)(nsIContentIterator*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
@ -155,9 +161,11 @@ nsContentIterator::~nsContentIterator()
|
||||
|
||||
nsresult nsContentIterator::Init(nsIContent* aRoot)
|
||||
{
|
||||
if (!aRoot) return NS_ERROR_NULL_POINTER;
|
||||
if (!aRoot)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
mFirst = GetDeepFirstChild(aRoot);
|
||||
nsCOMPtr<nsIContent> root(aRoot);
|
||||
mFirst = GetDeepFirstChild(root);
|
||||
mLast = aRoot;
|
||||
mCurNode = mFirst;
|
||||
return NS_OK;
|
||||
@ -166,15 +174,18 @@ nsresult nsContentIterator::Init(nsIContent* aRoot)
|
||||
|
||||
nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
{
|
||||
if (!aRange) return NS_ERROR_NULL_POINTER;
|
||||
if (!aRange)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
// get the start node and offset, convert to nsIContent
|
||||
nsCOMPtr<nsIContent> cN;
|
||||
nsCOMPtr<nsIDOMNode> dN;
|
||||
aRange->GetStartParent(getter_AddRefs(dN));
|
||||
if (!dN) return NS_ERROR_ILLEGAL_VALUE;
|
||||
if (!dN)
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
cN = dN;
|
||||
if (!cN) return NS_ERROR_FAILURE;
|
||||
if (!cN)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 indx;
|
||||
aRange->GetStartOffset(&indx);
|
||||
@ -182,6 +193,7 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
// find first node in range
|
||||
nsCOMPtr<nsIContent> cChild;
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
|
||||
if (!cChild) // no children, must be a text node
|
||||
{
|
||||
mFirst = cN;
|
||||
@ -199,14 +211,19 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aRange->GetEndParent(getter_AddRefs(dN));
|
||||
if (!dN) return NS_ERROR_ILLEGAL_VALUE;
|
||||
if (!dN)
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
cN = dN;
|
||||
if (!cN) return NS_ERROR_FAILURE;
|
||||
if (!cN)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
aRange->GetEndOffset(&indx);
|
||||
|
||||
// find last node in range
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
|
||||
if (!cChild) // no children, must be a text node
|
||||
{
|
||||
mLast = cN;
|
||||
@ -217,24 +234,18 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
}
|
||||
else
|
||||
{
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild));
|
||||
cN->ChildAt(--indx,*getter_AddRefs(cChild));
|
||||
if (!cChild) // offset after last child, last child is last node
|
||||
{
|
||||
cN->ChildCount(indx);
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild)); // XXX off by one???
|
||||
cN->ChildAt(--indx,*getter_AddRefs(cChild));
|
||||
if (!cChild)
|
||||
{
|
||||
NS_NOTREACHED("nsContentIterator::nsContentIterator");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mLast = cChild;
|
||||
}
|
||||
else // child just before indx is last node
|
||||
{
|
||||
--indx;
|
||||
cN->ChildAt(indx,*getter_AddRefs(cChild));
|
||||
mLast = cChild;
|
||||
}
|
||||
mLast = cChild;
|
||||
}
|
||||
|
||||
mCurNode = mFirst;
|
||||
@ -243,21 +254,20 @@ nsresult nsContentIterator::Init(nsIDOMRange* aRange)
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Private helper routines
|
||||
* Helper routines
|
||||
******************************************************/
|
||||
|
||||
nsIContent* nsContentIterator::GetDeepFirstChild(nsIContent* aRoot)
|
||||
nsCOMPtr<nsIContent> nsContentIterator::GetDeepFirstChild(nsCOMPtr<nsIContent> aRoot)
|
||||
{
|
||||
// THIS ROUTINE DOES NOT ADDREF
|
||||
if (!aRoot) return nsnull;
|
||||
nsIContent *cN = aRoot;
|
||||
nsIContent *cChild;
|
||||
cN->ChildAt(0,cChild);
|
||||
if (!aRoot)
|
||||
return aRoot;
|
||||
nsCOMPtr<nsIContent> cN = aRoot;
|
||||
nsCOMPtr<nsIContent> cChild;
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
while ( cChild )
|
||||
{
|
||||
NS_IF_RELEASE(cN); // balance addref inside ChildAt()
|
||||
cN = cChild;
|
||||
cN->ChildAt(0,cChild);
|
||||
cN->ChildAt(0,*getter_AddRefs(cChild));
|
||||
}
|
||||
return cN;
|
||||
}
|
||||
@ -268,9 +278,11 @@ nsIContent* nsContentIterator::GetDeepFirstChild(nsIContent* aRoot)
|
||||
|
||||
nsresult nsContentIterator::First()
|
||||
{
|
||||
if (!mFirst) return NS_ERROR_FAILURE;
|
||||
if (!mFirst)
|
||||
return NS_ERROR_FAILURE;
|
||||
mIsDone = false;
|
||||
if (mFirst == mCurNode) return NS_OK;
|
||||
if (mFirst == mCurNode)
|
||||
return NS_OK;
|
||||
mCurNode = mFirst;
|
||||
return NS_OK;
|
||||
}
|
||||
@ -278,9 +290,11 @@ nsresult nsContentIterator::First()
|
||||
|
||||
nsresult nsContentIterator::Last()
|
||||
{
|
||||
if (!mLast) return NS_ERROR_FAILURE;
|
||||
if (!mLast)
|
||||
return NS_ERROR_FAILURE;
|
||||
mIsDone = false;
|
||||
if (mLast == mCurNode) return NS_OK;
|
||||
if (mLast == mCurNode)
|
||||
return NS_OK;
|
||||
mCurNode = mLast;
|
||||
return NS_OK;
|
||||
}
|
||||
@ -288,8 +302,10 @@ nsresult nsContentIterator::Last()
|
||||
|
||||
nsresult nsContentIterator::Next()
|
||||
{
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
if (!mCurNode) return NS_OK;
|
||||
if (mIsDone)
|
||||
return NS_ERROR_FAILURE;
|
||||
if (!mCurNode)
|
||||
return NS_OK;
|
||||
if (mCurNode == mLast)
|
||||
{
|
||||
mIsDone = true;
|
||||
@ -301,7 +317,8 @@ nsresult nsContentIterator::Next()
|
||||
|
||||
mCurNode->GetParent(*getter_AddRefs(cParent));
|
||||
// no parent and we are not done? something is wrong
|
||||
if (!cParent) return NS_ERROR_UNEXPECTED;
|
||||
if (!cParent)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
// get next sibling
|
||||
PRInt32 indx;
|
||||
@ -329,27 +346,114 @@ nsresult nsContentIterator::Prev()
|
||||
|
||||
nsresult nsContentIterator::IsDone()
|
||||
{
|
||||
if (mIsDone) return NS_OK;
|
||||
else return NS_COMFALSE;
|
||||
if (mIsDone)
|
||||
return NS_OK;
|
||||
else
|
||||
return NS_COMFALSE;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentIterator::CurrentNode(nsIContent **aNode)
|
||||
{
|
||||
if (!mCurNode) return NS_ERROR_FAILURE;
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
if (!mCurNode)
|
||||
return NS_ERROR_FAILURE;
|
||||
if (mIsDone)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mCurNode->QueryInterface(nsIContent::IID(), (void**) aNode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*====================================================================================*/
|
||||
/*====================================================================================*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Enumerator routines
|
||||
* nsContentSubtreeIterator
|
||||
******************************************************/
|
||||
|
||||
/*nsresult nsContentIterator::CurrentItem(nsISupports **aNode)
|
||||
|
||||
/*
|
||||
* A simple iterator class for traversing the content in "top subtree" order
|
||||
*/
|
||||
class nsContentSubtreeIterator : public nsContentIterator
|
||||
{
|
||||
if (!mCurNode) return NS_ERROR_FAILURE;
|
||||
if (mIsDone) return NS_ERROR_FAILURE;
|
||||
return mCurNode->QueryInterface(kISupportsIID, (void**) aNode);
|
||||
public:
|
||||
nsContentSubtreeIterator() {};
|
||||
virtual ~nsContentSubtreeIterator() {};
|
||||
|
||||
// nsContentIterator overrides ------------------------------
|
||||
|
||||
NS_IMETHOD Init(nsIContent* aRoot);
|
||||
|
||||
NS_IMETHOD Init(nsIDOMRange* aRange);
|
||||
|
||||
NS_IMETHOD Next();
|
||||
|
||||
NS_IMETHOD Prev();
|
||||
|
||||
private:
|
||||
|
||||
// no copy's or assigns FIX ME
|
||||
nsContentSubtreeIterator(const nsContentSubtreeIterator&);
|
||||
nsContentSubtreeIterator& operator=(const nsContentSubtreeIterator&);
|
||||
|
||||
};
|
||||
|
||||
nsresult NS_NewContentSubtreeIterator(nsIContentIterator** aInstancePtrResult);
|
||||
|
||||
/******************************************************
|
||||
* repository cruft
|
||||
******************************************************/
|
||||
|
||||
nsresult NS_NewContentSubtreeIterator(nsIContentIterator** aInstancePtrResult)
|
||||
{
|
||||
nsContentIterator * iter = new nsContentSubtreeIterator();
|
||||
return iter->QueryInterface(nsIContentIterator::IID(), (void**) aInstancePtrResult);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Init routines
|
||||
******************************************************/
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Init(nsIContent* aRoot)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Init(nsIDOMRange* aRange)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************
|
||||
* Helper routines
|
||||
******************************************************/
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* nsContentSubtreeIterator overrides of ContentIterator routines
|
||||
****************************************************************/
|
||||
|
||||
nsresult nsContentSubtreeIterator::Next()
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsContentSubtreeIterator::Prev()
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
@ -89,6 +89,10 @@
|
||||
{/* {a6cf90e3-15b3-11d2-932e-00805f8add32}*/ \
|
||||
0xa6cf90e3, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } }
|
||||
|
||||
#define NS_SUBTREEITERATOR_CID \
|
||||
{/* {a6cf90e5-15b3-11d2-932e-00805f8add32}*/ \
|
||||
0xa6cf90e5, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } }
|
||||
|
||||
// {09F689E0-B4DA-11d2-A68B-00104BDE6048}
|
||||
#define NS_EVENTLISTENERMANAGER_CID \
|
||||
{ 0x9f689e0, 0xb4da, 0x11d2, { 0xa6, 0x8b, 0x0, 0x10, 0x4b, 0xde, 0x60, 0x48 } }
|
||||
|
@ -50,17 +50,18 @@ static NS_DEFINE_IID(kCHTMLImageElementCID, NS_HTMLIMAGEELEMENT_CID);
|
||||
static NS_DEFINE_IID(kCRangeListCID, NS_RANGELIST_CID);
|
||||
static NS_DEFINE_IID(kCRangeCID, NS_RANGE_CID);
|
||||
static NS_DEFINE_IID(kCContentIteratorCID, NS_CONTENTITERATOR_CID);
|
||||
static NS_DEFINE_IID(kCSubtreeIteratorCID, NS_SUBTREEITERATOR_CID);
|
||||
static NS_DEFINE_CID(kPresShellCID, NS_PRESSHELL_CID);
|
||||
static NS_DEFINE_CID(kTextNodeCID, NS_TEXTNODE_CID);
|
||||
static NS_DEFINE_CID(kNameSpaceManagerCID, NS_NAMESPACEMANAGER_CID);
|
||||
static NS_DEFINE_CID(kFrameUtilCID, NS_FRAME_UTIL_CID);
|
||||
static NS_DEFINE_CID(kRangeCID, NS_RANGE_CID);
|
||||
static NS_DEFINE_CID(kEventListenerManagerCID, NS_EVENTLISTENERMANAGER_CID);
|
||||
|
||||
|
||||
extern nsresult NS_NewRangeList(nsIDOMSelection **);
|
||||
extern nsresult NS_NewRange(nsIDOMRange **);
|
||||
extern nsresult NS_NewContentIterator(nsIContentIterator **);
|
||||
extern nsresult NS_NewContentSubtreeIterator(nsIContentIterator **);
|
||||
extern nsresult NS_NewFrameUtil(nsIFrameUtil** aResult);
|
||||
|
||||
|
||||
@ -218,6 +219,13 @@ nsresult nsLayoutFactory::CreateInstance(nsISupports *aOuter,
|
||||
}
|
||||
refCounted = PR_TRUE;
|
||||
}
|
||||
else if (mClassID.Equals(kCSubtreeIteratorCID)) {
|
||||
res = NS_NewContentSubtreeIterator((nsIContentIterator **)&inst);
|
||||
if (!NS_SUCCEEDED(res)) {
|
||||
return res;
|
||||
}
|
||||
refCounted = PR_TRUE;
|
||||
}
|
||||
else if (mClassID.Equals(kCCSSParserCID)) {
|
||||
// XXX this should really be factored into a style-specific DLL so
|
||||
// that all the HTML, generic layout, and style stuff isn't munged
|
||||
@ -249,11 +257,6 @@ nsresult nsLayoutFactory::CreateInstance(nsISupports *aOuter,
|
||||
return res;
|
||||
refCounted = PR_TRUE;
|
||||
}
|
||||
else if (mClassID.Equals(kRangeCID)) {
|
||||
if (NS_FAILED(res = NS_NewRange((nsIDOMRange**) &inst)))
|
||||
return res;
|
||||
refCounted = PR_TRUE;
|
||||
}
|
||||
else if (mClassID.Equals(kEventListenerManagerCID)) {
|
||||
if (NS_FAILED(res = NS_NewEventListenerManager((nsIEventListenerManager**) &inst)))
|
||||
return res;
|
||||
|
Loading…
Reference in New Issue
Block a user