From 695763bc3df69b53390f97ac176a3603c3fa2aa3 Mon Sep 17 00:00:00 2001 From: "jfrancis%netscape.com" Date: Fri, 2 Jun 2000 06:03:46 +0000 Subject: [PATCH] fixes 41075: forward delete can delete wrong char, 41149: incorrect format feedback when in lists git-svn-id: svn://10.0.0.236/trunk@71346 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/editor/base/nsHTMLEditRules.cpp | 65 ++++++++++++++++++- mozilla/editor/base/nsHTMLEditRules.h | 1 + .../editor/libeditor/html/nsHTMLEditRules.cpp | 65 ++++++++++++++++++- .../editor/libeditor/html/nsHTMLEditRules.h | 1 + 4 files changed, 126 insertions(+), 6 deletions(-) diff --git a/mozilla/editor/base/nsHTMLEditRules.cpp b/mozilla/editor/base/nsHTMLEditRules.cpp index 84a9aff3574..cf503e5f5ae 100644 --- a/mozilla/editor/base/nsHTMLEditRules.cpp +++ b/mozilla/editor/base/nsHTMLEditRules.cpp @@ -1042,11 +1042,10 @@ nsHTMLEditRules::WillDeleteSelection(nsIDOMSelection *aSelection, // is next node a text node? else if ( mEditor->IsTextNode(nextNode) ) { - // delete last character + // delete first character nsCOMPtrnodeAsText; nodeAsText = do_QueryInterface(nextNode); - nodeAsText->GetLength((PRUint32*)&offset); - res = aSelection->Collapse(nextNode,offset); + res = aSelection->Collapse(nextNode,0); // just return without setting handled to true. // default code will take care of actual deletion return res; @@ -2415,6 +2414,58 @@ nsHTMLEditRules::GetTableContent(nsIDOMNode *aNode, nsCOMPtr * return res; } +/////////////////////////////////////////////////////////////////////////// +// GetListContent: take a list element and get it's editable, non-list contents +// +nsresult +nsHTMLEditRules::GetListContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes) +{ + if (!aNode || !outArrayOfNodes) return NS_ERROR_NULL_POINTER; + + // make a array + nsresult res = NS_NewISupportsArray(getter_AddRefs(*outArrayOfNodes)); + if (NS_FAILED(res)) return res; + + // make an iter + nsCOMPtr iter; + res = nsComponentManager::CreateInstance(kContentIteratorCID, nsnull, + NS_GET_IID(nsIContentIterator), + getter_AddRefs(iter)); + if (NS_FAILED(res)) return res; + if (!iter) return NS_ERROR_FAILURE; + + nsCOMPtr content; + nsCOMPtr node; + nsCOMPtr isupports; + + // iterate node and build up array of non-list content + content = do_QueryInterface(aNode); + iter->Init(content); + while (NS_ENUMERATOR_FALSE == iter->IsDone()) + { + res = iter->CurrentNode(getter_AddRefs(content)); + if (NS_FAILED(res)) return res; + node = do_QueryInterface(content); + if (!node) return NS_ERROR_FAILURE; + if (nsHTMLEditUtils::IsList(node) || nsHTMLEditUtils::IsListItem(node)) + { + nsCOMPtr child, tmp; + res = mEditor->GetFirstEditableChild(node, &child); + if (NS_FAILED(res)) return res; + while (child) + { + isupports = do_QueryInterface(child); + (*outArrayOfNodes)->AppendElement(isupports); + mEditor->GetNextHTMLSibling(child, &tmp); + child = tmp; + } + } + res = iter->Next(); + if (NS_FAILED(res)) return res; + } + return res; +} + /////////////////////////////////////////////////////////////////////////// // IsFirstNode: Are we the first edittable node in our parent? // @@ -3038,6 +3089,14 @@ nsHTMLEditRules::GetParagraphFormatNodes(nsCOMPtr *outArrayOfN if (NS_FAILED(res)) return res; (*outArrayOfNodes)->AppendElements(arrayOfTableContent); } + else if (nsHTMLEditUtils::IsList(testNode) || nsHTMLEditUtils::IsListItem(testNode)) + { + (*outArrayOfNodes)->RemoveElementAt(i); + nsCOMPtr arrayOfTableContent; + res = GetListContent(testNode, &arrayOfTableContent); + if (NS_FAILED(res)) return res; + (*outArrayOfNodes)->AppendElements(arrayOfTableContent); + } } return res; } diff --git a/mozilla/editor/base/nsHTMLEditRules.h b/mozilla/editor/base/nsHTMLEditRules.h index 92027abc924..c70838963fe 100644 --- a/mozilla/editor/base/nsHTMLEditRules.h +++ b/mozilla/editor/base/nsHTMLEditRules.h @@ -110,6 +110,7 @@ protected: nsresult AlignTableElement(nsIDOMNode *aNode, const nsString *alignType); nsresult AlignTableCellContents(nsIDOMNode *aNode, const nsString *alignType); nsresult GetTableContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes); + nsresult GetListContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes); nsresult InsertTab(nsIDOMSelection *aSelection, nsString *outString); diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp index 84a9aff3574..cf503e5f5ae 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp +++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp @@ -1042,11 +1042,10 @@ nsHTMLEditRules::WillDeleteSelection(nsIDOMSelection *aSelection, // is next node a text node? else if ( mEditor->IsTextNode(nextNode) ) { - // delete last character + // delete first character nsCOMPtrnodeAsText; nodeAsText = do_QueryInterface(nextNode); - nodeAsText->GetLength((PRUint32*)&offset); - res = aSelection->Collapse(nextNode,offset); + res = aSelection->Collapse(nextNode,0); // just return without setting handled to true. // default code will take care of actual deletion return res; @@ -2415,6 +2414,58 @@ nsHTMLEditRules::GetTableContent(nsIDOMNode *aNode, nsCOMPtr * return res; } +/////////////////////////////////////////////////////////////////////////// +// GetListContent: take a list element and get it's editable, non-list contents +// +nsresult +nsHTMLEditRules::GetListContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes) +{ + if (!aNode || !outArrayOfNodes) return NS_ERROR_NULL_POINTER; + + // make a array + nsresult res = NS_NewISupportsArray(getter_AddRefs(*outArrayOfNodes)); + if (NS_FAILED(res)) return res; + + // make an iter + nsCOMPtr iter; + res = nsComponentManager::CreateInstance(kContentIteratorCID, nsnull, + NS_GET_IID(nsIContentIterator), + getter_AddRefs(iter)); + if (NS_FAILED(res)) return res; + if (!iter) return NS_ERROR_FAILURE; + + nsCOMPtr content; + nsCOMPtr node; + nsCOMPtr isupports; + + // iterate node and build up array of non-list content + content = do_QueryInterface(aNode); + iter->Init(content); + while (NS_ENUMERATOR_FALSE == iter->IsDone()) + { + res = iter->CurrentNode(getter_AddRefs(content)); + if (NS_FAILED(res)) return res; + node = do_QueryInterface(content); + if (!node) return NS_ERROR_FAILURE; + if (nsHTMLEditUtils::IsList(node) || nsHTMLEditUtils::IsListItem(node)) + { + nsCOMPtr child, tmp; + res = mEditor->GetFirstEditableChild(node, &child); + if (NS_FAILED(res)) return res; + while (child) + { + isupports = do_QueryInterface(child); + (*outArrayOfNodes)->AppendElement(isupports); + mEditor->GetNextHTMLSibling(child, &tmp); + child = tmp; + } + } + res = iter->Next(); + if (NS_FAILED(res)) return res; + } + return res; +} + /////////////////////////////////////////////////////////////////////////// // IsFirstNode: Are we the first edittable node in our parent? // @@ -3038,6 +3089,14 @@ nsHTMLEditRules::GetParagraphFormatNodes(nsCOMPtr *outArrayOfN if (NS_FAILED(res)) return res; (*outArrayOfNodes)->AppendElements(arrayOfTableContent); } + else if (nsHTMLEditUtils::IsList(testNode) || nsHTMLEditUtils::IsListItem(testNode)) + { + (*outArrayOfNodes)->RemoveElementAt(i); + nsCOMPtr arrayOfTableContent; + res = GetListContent(testNode, &arrayOfTableContent); + if (NS_FAILED(res)) return res; + (*outArrayOfNodes)->AppendElements(arrayOfTableContent); + } } return res; } diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.h b/mozilla/editor/libeditor/html/nsHTMLEditRules.h index 92027abc924..c70838963fe 100644 --- a/mozilla/editor/libeditor/html/nsHTMLEditRules.h +++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.h @@ -110,6 +110,7 @@ protected: nsresult AlignTableElement(nsIDOMNode *aNode, const nsString *alignType); nsresult AlignTableCellContents(nsIDOMNode *aNode, const nsString *alignType); nsresult GetTableContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes); + nsresult GetListContent(nsIDOMNode *aNode, nsCOMPtr *outArrayOfNodes); nsresult InsertTab(nsIDOMSelection *aSelection, nsString *outString);