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);