From 07d4e1f07dd29446fa16d0b7a00a7c59db0ccc56 Mon Sep 17 00:00:00 2001 From: "jfrancis%netscape.com" Date: Wed, 17 Nov 1999 11:03:25 +0000 Subject: [PATCH] rewrote GetFirstEditableNode() / GetLastEditableNode(). This fixes bugs: 18922, 18938, 18723; r=floppy moose git-svn-id: svn://10.0.0.236/trunk@53769 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/nsEditor.cpp | 92 +++++++--------------- mozilla/editor/base/nsEditor.h | 4 +- mozilla/editor/libeditor/base/nsEditor.cpp | 92 +++++++--------------- mozilla/editor/libeditor/base/nsEditor.h | 4 +- 4 files changed, 58 insertions(+), 134 deletions(-) diff --git a/mozilla/editor/base/nsEditor.cpp b/mozilla/editor/base/nsEditor.cpp index 9b307ac07ee..b68c159d165 100644 --- a/mozilla/editor/base/nsEditor.cpp +++ b/mozilla/editor/base/nsEditor.cpp @@ -671,7 +671,7 @@ NS_IMETHODIMP nsEditor::BeginningOfDocument() { // Get the first child of the body node: nsCOMPtr firstNode; - result = GetFirstEditableNode(bodyNode, getter_AddRefs(firstNode)); + result = GetFirstEditableNode(bodyNode, &firstNode); if (firstNode) { // if firstNode is text, set selection to beginning of the text node @@ -722,8 +722,8 @@ NS_IMETHODIMP nsEditor::EndOfDocument() result = nodeList->Item(0, getter_AddRefs(bodyNode)); if ((NS_SUCCEEDED(result)) && bodyNode) { - nsCOMPtr lastChild; // = GetDeepLastChild(bodyNode); - result = GetLastEditableNode(bodyNode, getter_AddRefs(lastChild)); + nsCOMPtr lastChild; + result = GetLastEditableNode(bodyNode, &lastChild); if ((NS_SUCCEEDED(result)) && lastChild) { // See if the last child is a text node; if so, set offset: @@ -1767,85 +1767,47 @@ NS_IMETHODIMP nsEditor::SelectEntireDocument(nsIDOMSelection *aSelection) } -nsresult nsEditor::GetFirstEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outFirstNode) +nsresult nsEditor::GetFirstEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outFirstNode) { + if (!aRoot || !outFirstNode) return NS_ERROR_NULL_POINTER; + *outFirstNode = nsnull; - - nsCOMPtr iter; - nsresult rv = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull, - nsIContentIterator::GetIID(), - getter_AddRefs(iter)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr contentRoot = do_QueryInterface(aRoot); - rv = iter->Init(contentRoot); + + nsCOMPtr node,next; + nsresult rv = GetLeftmostChild(aRoot, getter_AddRefs(node)); if (NS_FAILED(rv)) return rv; - iter->MakePre(); - - while (iter->IsDone() == NS_ENUMERATOR_FALSE) + if (node && !IsEditable(node)) { - nsCOMPtr curNode; - rv = iter->CurrentNode(getter_AddRefs(curNode)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr domNode = do_QueryInterface(curNode); - if (domNode) - { // we have a DOM node, see if it is a leaf node - PRBool canContainChildren; - curNode->CanContainChildren(canContainChildren); - if ((PR_FALSE==canContainChildren) || IsTextNode(domNode)) - { // we have a leaf node, if it's editable, return it. - if (IsEditable(domNode)) - { - *outFirstNode = domNode; - NS_ADDREF(*outFirstNode); - return NS_OK; - } - } - } - iter->Next(); + rv = GetNextNode(node, PR_TRUE, getter_AddRefs(next)); + node = next; } - return NS_OK; + *outFirstNode = node; + + return rv; } -nsresult nsEditor::GetLastEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outLastNode) +nsresult nsEditor::GetLastEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outLastNode) { + if (!aRoot || !outLastNode) return NS_ERROR_NULL_POINTER; + *outLastNode = nsnull; - - nsCOMPtr iter; - nsresult rv = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull, - nsIContentIterator::GetIID(), - getter_AddRefs(iter)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr contentRoot = do_QueryInterface(aRoot); - rv = iter->Init(contentRoot); + + nsCOMPtr node,next; + nsresult rv = GetRightmostChild(aRoot, getter_AddRefs(node)); if (NS_FAILED(rv)) return rv; - iter->MakePre(); - iter->Last(); - - while (iter->IsDone() == NS_ENUMERATOR_FALSE) + if (node && !IsEditable(node)) { - nsCOMPtr curNode; - rv = iter->CurrentNode(getter_AddRefs(curNode)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr domNode = do_QueryInterface(curNode); - if (domNode && IsTextNode(domNode) && IsEditable(domNode)) - { - *outLastNode = domNode; - NS_ADDREF(*outLastNode); - return NS_OK; - } - - iter->Prev(); + rv = GetPriorNode(node, PR_TRUE, getter_AddRefs(next)); + node = next; } - return NS_OK; + *outLastNode = node; + + return rv; } diff --git a/mozilla/editor/base/nsEditor.h b/mozilla/editor/base/nsEditor.h index 4614f2d22a5..d64c1e594b9 100644 --- a/mozilla/editor/base/nsEditor.h +++ b/mozilla/editor/base/nsEditor.h @@ -568,8 +568,8 @@ public: nsresult CountEditableChildren(nsIDOMNode *aNode, PRUint32 &outCount); /** Find the deep first and last children. Returned nodes are AddReffed */ - nsresult GetFirstEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outFirstNode); - nsresult GetLastEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outLastNode); + nsresult GetFirstEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outFirstNode); + nsresult GetLastEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outLastNode); /** from html rules code - migration in progress */ diff --git a/mozilla/editor/libeditor/base/nsEditor.cpp b/mozilla/editor/libeditor/base/nsEditor.cpp index 9b307ac07ee..b68c159d165 100644 --- a/mozilla/editor/libeditor/base/nsEditor.cpp +++ b/mozilla/editor/libeditor/base/nsEditor.cpp @@ -671,7 +671,7 @@ NS_IMETHODIMP nsEditor::BeginningOfDocument() { // Get the first child of the body node: nsCOMPtr firstNode; - result = GetFirstEditableNode(bodyNode, getter_AddRefs(firstNode)); + result = GetFirstEditableNode(bodyNode, &firstNode); if (firstNode) { // if firstNode is text, set selection to beginning of the text node @@ -722,8 +722,8 @@ NS_IMETHODIMP nsEditor::EndOfDocument() result = nodeList->Item(0, getter_AddRefs(bodyNode)); if ((NS_SUCCEEDED(result)) && bodyNode) { - nsCOMPtr lastChild; // = GetDeepLastChild(bodyNode); - result = GetLastEditableNode(bodyNode, getter_AddRefs(lastChild)); + nsCOMPtr lastChild; + result = GetLastEditableNode(bodyNode, &lastChild); if ((NS_SUCCEEDED(result)) && lastChild) { // See if the last child is a text node; if so, set offset: @@ -1767,85 +1767,47 @@ NS_IMETHODIMP nsEditor::SelectEntireDocument(nsIDOMSelection *aSelection) } -nsresult nsEditor::GetFirstEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outFirstNode) +nsresult nsEditor::GetFirstEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outFirstNode) { + if (!aRoot || !outFirstNode) return NS_ERROR_NULL_POINTER; + *outFirstNode = nsnull; - - nsCOMPtr iter; - nsresult rv = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull, - nsIContentIterator::GetIID(), - getter_AddRefs(iter)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr contentRoot = do_QueryInterface(aRoot); - rv = iter->Init(contentRoot); + + nsCOMPtr node,next; + nsresult rv = GetLeftmostChild(aRoot, getter_AddRefs(node)); if (NS_FAILED(rv)) return rv; - iter->MakePre(); - - while (iter->IsDone() == NS_ENUMERATOR_FALSE) + if (node && !IsEditable(node)) { - nsCOMPtr curNode; - rv = iter->CurrentNode(getter_AddRefs(curNode)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr domNode = do_QueryInterface(curNode); - if (domNode) - { // we have a DOM node, see if it is a leaf node - PRBool canContainChildren; - curNode->CanContainChildren(canContainChildren); - if ((PR_FALSE==canContainChildren) || IsTextNode(domNode)) - { // we have a leaf node, if it's editable, return it. - if (IsEditable(domNode)) - { - *outFirstNode = domNode; - NS_ADDREF(*outFirstNode); - return NS_OK; - } - } - } - iter->Next(); + rv = GetNextNode(node, PR_TRUE, getter_AddRefs(next)); + node = next; } - return NS_OK; + *outFirstNode = node; + + return rv; } -nsresult nsEditor::GetLastEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outLastNode) +nsresult nsEditor::GetLastEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outLastNode) { + if (!aRoot || !outLastNode) return NS_ERROR_NULL_POINTER; + *outLastNode = nsnull; - - nsCOMPtr iter; - nsresult rv = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull, - nsIContentIterator::GetIID(), - getter_AddRefs(iter)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr contentRoot = do_QueryInterface(aRoot); - rv = iter->Init(contentRoot); + + nsCOMPtr node,next; + nsresult rv = GetRightmostChild(aRoot, getter_AddRefs(node)); if (NS_FAILED(rv)) return rv; - iter->MakePre(); - iter->Last(); - - while (iter->IsDone() == NS_ENUMERATOR_FALSE) + if (node && !IsEditable(node)) { - nsCOMPtr curNode; - rv = iter->CurrentNode(getter_AddRefs(curNode)); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr domNode = do_QueryInterface(curNode); - if (domNode && IsTextNode(domNode) && IsEditable(domNode)) - { - *outLastNode = domNode; - NS_ADDREF(*outLastNode); - return NS_OK; - } - - iter->Prev(); + rv = GetPriorNode(node, PR_TRUE, getter_AddRefs(next)); + node = next; } - return NS_OK; + *outLastNode = node; + + return rv; } diff --git a/mozilla/editor/libeditor/base/nsEditor.h b/mozilla/editor/libeditor/base/nsEditor.h index 4614f2d22a5..d64c1e594b9 100644 --- a/mozilla/editor/libeditor/base/nsEditor.h +++ b/mozilla/editor/libeditor/base/nsEditor.h @@ -568,8 +568,8 @@ public: nsresult CountEditableChildren(nsIDOMNode *aNode, PRUint32 &outCount); /** Find the deep first and last children. Returned nodes are AddReffed */ - nsresult GetFirstEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outFirstNode); - nsresult GetLastEditableNode(nsIDOMNode *aRoot, nsIDOMNode* *outLastNode); + nsresult GetFirstEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outFirstNode); + nsresult GetLastEditableNode(nsIDOMNode *aRoot, nsCOMPtr *outLastNode); /** from html rules code - migration in progress */