From 70ffe624ced8f82dfb31cf5f32f5dd40c9d66012 Mon Sep 17 00:00:00 2001 From: "jfrancis%netscape.com" Date: Thu, 4 May 2000 23:54:00 +0000 Subject: [PATCH] fix for 29320; deletion putting caret in wrong table cell git-svn-id: svn://10.0.0.236/trunk@68292 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/nsHTMLEditRules.cpp | 44 ++++++++++++++++--- mozilla/editor/base/nsHTMLEditRules.h | 1 + .../editor/libeditor/html/nsHTMLEditRules.cpp | 44 ++++++++++++++++--- .../editor/libeditor/html/nsHTMLEditRules.h | 1 + 4 files changed, 80 insertions(+), 10 deletions(-) diff --git a/mozilla/editor/base/nsHTMLEditRules.cpp b/mozilla/editor/base/nsHTMLEditRules.cpp index 6b1d768dac5..eac6d0173de 100644 --- a/mozilla/editor/base/nsHTMLEditRules.cpp +++ b/mozilla/editor/base/nsHTMLEditRules.cpp @@ -4087,10 +4087,6 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode, || nsHTMLEditUtils::IsBreak(nearNode) || nsHTMLEditUtils::IsImage(nearNode))) { - // dont cross any table elements - if (mEditor->IsTableElement(nearNode)) - return NS_OK; - curNode = nearNode; if (aDirection == nsIEditor::ePrevious) res = mEditor->GetPriorHTMLNode(curNode, &nearNode); @@ -4099,11 +4095,49 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode, if (NS_FAILED(res)) return res; } - if (nearNode) *outSelectableNode = do_QueryInterface(nearNode); + if (nearNode) + { + // dont cross any table elements + PRBool bInDifTblElems; + res = InDifferentTableElements(nearNode, aSelNode, &bInDifTblElems); + if (NS_FAILED(res)) return res; + if (bInDifTblElems) return NS_OK; + + // otherwise, ok, we have found a good spot to put the selection + *outSelectableNode = do_QueryInterface(nearNode); + } return res; } +nsresult +nsHTMLEditRules::InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult) +{ + if (!aNode1 || !aNode2 || !aResult) NS_ERROR_NULL_POINTER; + + nsCOMPtr tn1, tn2, node = aNode1, temp; + + while (node && !mEditor->IsTableElement(node)) + { + node->GetParentNode(getter_AddRefs(temp)); + node = temp; + } + tn1 = node; + + node = aNode2; + while (node && !mEditor->IsTableElement(node)) + { + node->GetParentNode(getter_AddRefs(temp)); + node = temp; + } + tn2 = node; + + *aResult = (tn1 != tn2); + + return NS_OK; +} + + nsresult nsHTMLEditRules::RemoveEmptyNodes() { diff --git a/mozilla/editor/base/nsHTMLEditRules.h b/mozilla/editor/base/nsHTMLEditRules.h index 478fbd7a1e5..cd9292d9c01 100644 --- a/mozilla/editor/base/nsHTMLEditRules.h +++ b/mozilla/editor/base/nsHTMLEditRules.h @@ -167,6 +167,7 @@ protected: PRInt32 aSelOffset, nsIEditor::EDirection aDirection, nsCOMPtr *outSelectableNode); + nsresult InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult); nsresult RemoveEmptyNodes(); nsresult SelectionEndpointInNode(nsIDOMNode *aNode, PRBool *aResult); nsresult DoTextNodeWhitespace(nsIDOMCharacterData *aTextNode, PRInt32 aStart, PRInt32 aEnd); diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp index 6b1d768dac5..eac6d0173de 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp +++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp @@ -4087,10 +4087,6 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode, || nsHTMLEditUtils::IsBreak(nearNode) || nsHTMLEditUtils::IsImage(nearNode))) { - // dont cross any table elements - if (mEditor->IsTableElement(nearNode)) - return NS_OK; - curNode = nearNode; if (aDirection == nsIEditor::ePrevious) res = mEditor->GetPriorHTMLNode(curNode, &nearNode); @@ -4099,11 +4095,49 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode, if (NS_FAILED(res)) return res; } - if (nearNode) *outSelectableNode = do_QueryInterface(nearNode); + if (nearNode) + { + // dont cross any table elements + PRBool bInDifTblElems; + res = InDifferentTableElements(nearNode, aSelNode, &bInDifTblElems); + if (NS_FAILED(res)) return res; + if (bInDifTblElems) return NS_OK; + + // otherwise, ok, we have found a good spot to put the selection + *outSelectableNode = do_QueryInterface(nearNode); + } return res; } +nsresult +nsHTMLEditRules::InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult) +{ + if (!aNode1 || !aNode2 || !aResult) NS_ERROR_NULL_POINTER; + + nsCOMPtr tn1, tn2, node = aNode1, temp; + + while (node && !mEditor->IsTableElement(node)) + { + node->GetParentNode(getter_AddRefs(temp)); + node = temp; + } + tn1 = node; + + node = aNode2; + while (node && !mEditor->IsTableElement(node)) + { + node->GetParentNode(getter_AddRefs(temp)); + node = temp; + } + tn2 = node; + + *aResult = (tn1 != tn2); + + return NS_OK; +} + + nsresult nsHTMLEditRules::RemoveEmptyNodes() { diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.h b/mozilla/editor/libeditor/html/nsHTMLEditRules.h index 478fbd7a1e5..cd9292d9c01 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditRules.h +++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.h @@ -167,6 +167,7 @@ protected: PRInt32 aSelOffset, nsIEditor::EDirection aDirection, nsCOMPtr *outSelectableNode); + nsresult InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult); nsresult RemoveEmptyNodes(); nsresult SelectionEndpointInNode(nsIDOMNode *aNode, PRBool *aResult); nsresult DoTextNodeWhitespace(nsIDOMCharacterData *aTextNode, PRInt32 aStart, PRInt32 aEnd);