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