diff --git a/mozilla/editor/base/nsHTMLEditor.cpp b/mozilla/editor/base/nsHTMLEditor.cpp
index 2c9fdc1efb8..04d5ab81dba 100644
--- a/mozilla/editor/base/nsHTMLEditor.cpp
+++ b/mozilla/editor/base/nsHTMLEditor.cpp
@@ -18,11 +18,13 @@
#include "nsTextEditor.h"
#include "nsHTMLEditor.h"
+#include "nsHTMLEditRules.h"
#include "nsEditorEventListeners.h"
#include "nsIDOMDocument.h"
#include "nsIDOMEventReceiver.h"
#include "nsIDOMKeyListener.h"
#include "nsIDOMMouseListener.h"
+#include "nsIDOMSelection.h"
#include "nsEditorCID.h"
#include "nsIComponentManager.h"
@@ -96,6 +98,14 @@ NS_IMETHODIMP nsHTMLEditor::Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell)
return result;
}
+void nsHTMLEditor::InitRules()
+{
+// instantiate the rules for this text editor
+// XXX: we should be told which set of rules to instantiate
+ mRules = new nsHTMLEditRules();
+ mRules->Init(this);
+}
+
NS_IMETHODIMP nsHTMLEditor::SetTextProperty(nsIAtom *aProperty)
{
return nsTextEditor::SetTextProperty(aProperty);
@@ -123,7 +133,80 @@ NS_IMETHODIMP nsHTMLEditor::InsertText(const nsString& aStringToInsert)
NS_IMETHODIMP nsHTMLEditor::InsertBreak()
{
- return nsTextEditor::InsertBreak();
+ nsresult result;
+ if (!mRules) { return NS_ERROR_NOT_INITIALIZED; }
+
+ nsCOMPtr selection;
+ PRBool cancel= PR_FALSE;
+
+ result = nsEditor::BeginTransaction();
+ if (NS_FAILED(result)) { return result; }
+
+ // pre-process
+ nsEditor::GetSelection(getter_AddRefs(selection));
+ result = mRules->WillInsertBreak(selection, &cancel);
+ if ((PR_FALSE==cancel) && (NS_SUCCEEDED(result)))
+ {
+ // create the new BR node
+ nsCOMPtr newNode;
+ nsAutoString tag("BR");
+ result = nsEditor::DeleteSelectionAndCreateNode(tag, getter_AddRefs(newNode));
+ if (NS_SUCCEEDED(result) && newNode)
+ {
+ // set the selection to the new node
+ nsCOMPtrparent;
+ result = newNode->GetParentNode(getter_AddRefs(parent));
+ if (NS_SUCCEEDED(result) && parent)
+ {
+ PRInt32 offsetInParent=-1; // we use the -1 as a marker to see if we need to compute this or not
+ nsCOMPtrnextNode;
+ newNode->GetNextSibling(getter_AddRefs(nextNode));
+ if (nextNode)
+ {
+ nsCOMPtrnextTextNode;
+ nextTextNode = do_QueryInterface(nextNode);
+ if (!nextTextNode) {
+ nextNode = do_QueryInterface(newNode);
+ }
+ else {
+ offsetInParent=0;
+ }
+ }
+ else {
+ nextNode = do_QueryInterface(newNode);
+ }
+ result = nsEditor::GetSelection(getter_AddRefs(selection));
+ if (NS_SUCCEEDED(result))
+ {
+ if (-1==offsetInParent)
+ {
+ nextNode->GetParentNode(getter_AddRefs(parent));
+ result = nsIEditorSupport::GetChildOffset(nextNode, parent, offsetInParent);
+ if (NS_SUCCEEDED(result)) {
+ selection->Collapse(parent, offsetInParent+1); // +1 to insert just after the break
+ }
+ }
+ else
+ {
+ selection->Collapse(nextNode, offsetInParent);
+ }
+ }
+ }
+ }
+ // post-process, always called if WillInsertBreak didn't return cancel==PR_TRUE
+ result = mRules->DidInsertBreak(selection, result);
+ }
+ nsresult endTxnResult = nsEditor::EndTransaction(); // don't return this result!
+ NS_ASSERTION ((NS_SUCCEEDED(endTxnResult)), "bad end transaction result");
+
+// XXXX: Horrible hack! We are doing this because
+// of an error in Gecko which is not rendering the
+// document after a change via the DOM - gpk 2/13/99
+ // BEGIN HACK!!!
+ HACKForceRedraw();
+ // END HACK
+
+ return result;
}
// Methods shared with the base editor.
diff --git a/mozilla/editor/base/nsHTMLEditor.h b/mozilla/editor/base/nsHTMLEditor.h
index 40d57df3855..fdcdc17ed6d 100644
--- a/mozilla/editor/base/nsHTMLEditor.h
+++ b/mozilla/editor/base/nsHTMLEditor.h
@@ -110,8 +110,14 @@ public:
NS_IMETHOD JoinTableCells(PRBool aCellToRight);
// Data members
+
protected:
+// rules initialization
+
+ virtual void InitRules();
+
+
// EVENT LISTENERS AND COMMAND ROUTING NEEDS WORK
// For now, the listners are tied to the nsTextEditor class
//
diff --git a/mozilla/editor/base/nsTextEditRules.cpp b/mozilla/editor/base/nsTextEditRules.cpp
index 8f02e53138f..b2922bd7bcd 100644
--- a/mozilla/editor/base/nsTextEditRules.cpp
+++ b/mozilla/editor/base/nsTextEditRules.cpp
@@ -17,7 +17,7 @@
*/
#include "nsTextEditRules.h"
-#include "nsTextEditor.h"
+#include "nsEditor.h"
#include "PlaceholderTxn.h"
#include "InsertTextTxn.h"
#include "nsCOMPtr.h"
@@ -35,7 +35,11 @@ const static char* kMOZEditorBogusNodeValue="TRUE";
static NS_DEFINE_IID(kPlaceholderTxnIID, PLACEHOLDER_TXN_IID);
-static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
+/*-------------------------------------------------------------------*
+ * Helper Functions
+ *-------------------------------------------------------------------*/
+
+PRBool nsTextEditRules::NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
{
nsCOMPtrelement;
element = do_QueryInterface(aNode);
@@ -51,7 +55,7 @@ static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
return PR_FALSE;
}
-PRBool IsEditable(nsIDOMNode *aNode)
+PRBool nsTextEditRules::IsEditable(nsIDOMNode *aNode)
{
if (!aNode) return PR_FALSE;
nsCOMPtrelement;
@@ -91,6 +95,11 @@ PRBool IsEditable(nsIDOMNode *aNode)
}
+/*-------------------------------------------------------------------*
+ * Constructor/Destructor
+ *-------------------------------------------------------------------*/
+
+
nsTextEditRules::nsTextEditRules()
{
mEditor = nsnull;
@@ -101,8 +110,15 @@ nsTextEditRules::~nsTextEditRules()
// do NOT delete mEditor here. We do not hold a ref count to mEditor. mEditor owns our lifespan.
}
+
+
+/*-------------------------------------------------------------------*
+ * Public methods
+ *-------------------------------------------------------------------*/
+
+
NS_IMETHODIMP
-nsTextEditRules::Init(nsTextEditor *aEditor)
+nsTextEditRules::Init(nsEditor *aEditor)
{
// null aNextRule is ok
if (!aEditor) { return NS_ERROR_NULL_POINTER; }
@@ -110,6 +126,17 @@ nsTextEditRules::Init(nsTextEditor *aEditor)
return NS_OK;
}
+NS_IMETHODIMP
+nsTextEditRules::WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsTextEditRules::DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
NS_IMETHODIMP
nsTextEditRules::WillInsert(nsIDOMSelection *aSelection, PRBool *aCancel)
@@ -168,126 +195,6 @@ nsTextEditRules::DidInsertText(nsIDOMSelection *aSelection,
return DidInsert(aSelection, aResult);
}
-NS_IMETHODIMP
-nsTextEditRules::WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel)
-{
- if (!aSelection || !aCancel) { return NS_ERROR_NULL_POINTER; }
- // initialize out param
- *aCancel = PR_FALSE;
- return WillInsert(aSelection, aCancel);
-}
-
-// XXX: this code is all experimental, and has no effect on the content model yet
-// the point here is to collapse adjacent BR's into P's
-NS_IMETHODIMP
-nsTextEditRules::DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult)
-{
- nsresult result = aResult; // if aResult is an error, we return it.
- if (!aSelection) { return NS_ERROR_NULL_POINTER; }
- PRBool isCollapsed;
- aSelection->IsCollapsed(&isCollapsed);
- NS_ASSERTION(PR_TRUE==isCollapsed, "selection not collapsed after insert break.");
- // if the insert break resulted in consecutive BR tags,
- // collapse the two BR tags into a single P
- if (NS_SUCCEEDED(result))
- {
- nsCOMPtr enumerator;
- enumerator = do_QueryInterface(aSelection,&result);
- if (enumerator)
- {
- enumerator->First();
- nsISupports *currentItem;
- result = enumerator->CurrentItem(¤tItem);
- if ((NS_SUCCEEDED(result)) && currentItem)
- {
- result = NS_ERROR_UNEXPECTED;
- nsCOMPtr range( do_QueryInterface(currentItem) );
- if (range)
- {
- nsIAtom *brTag = NS_NewAtom("BR");
- nsCOMPtr startNode;
- result = range->GetStartParent(getter_AddRefs(startNode));
- if ((NS_SUCCEEDED(result)) && startNode)
- {
- PRInt32 offset;
- range->GetStartOffset(&offset);
- nsCOMPtrstartNodeChildren;
- result = startNode->GetChildNodes(getter_AddRefs(startNodeChildren));
- if ((NS_SUCCEEDED(result)) && startNodeChildren)
- {
- nsCOMPtr selectedNode;
- result = startNodeChildren->Item(offset, getter_AddRefs(selectedNode));
- if ((NS_SUCCEEDED(result)) && selectedNode)
- {
- nsCOMPtr prevNode;
- result = selectedNode->GetPreviousSibling(getter_AddRefs(prevNode));
- if ((NS_SUCCEEDED(result)) && prevNode)
- {
- if (PR_TRUE==NodeIsType(prevNode, brTag))
- { // the previous node is a BR, check it's siblings
- nsCOMPtr leftNode;
- result = prevNode->GetPreviousSibling(getter_AddRefs(leftNode));
- if ((NS_SUCCEEDED(result)) && leftNode)
- {
- if (PR_TRUE==NodeIsType(leftNode, brTag))
- { // left sibling is also a BR, collapse
- printf("1\n");
- }
- else
- {
- if (PR_TRUE==NodeIsType(selectedNode, brTag))
- { // right sibling is also a BR, collapse
- printf("2\n");
- }
- }
- }
- }
- }
- // now check the next node from selectedNode
- nsCOMPtr nextNode;
- result = selectedNode->GetNextSibling(getter_AddRefs(nextNode));
- if ((NS_SUCCEEDED(result)) && nextNode)
- {
- if (PR_TRUE==NodeIsType(nextNode, brTag))
- { // the previous node is a BR, check it's siblings
- nsCOMPtr rightNode;
- result = nextNode->GetNextSibling(getter_AddRefs(rightNode));
- if ((NS_SUCCEEDED(result)) && rightNode)
- {
- if (PR_TRUE==NodeIsType(rightNode, brTag))
- { // right sibling is also a BR, collapse
- printf("3\n");
- }
- else
- {
- if (PR_TRUE==NodeIsType(selectedNode, brTag))
- { // left sibling is also a BR, collapse
- printf("4\n");
- }
- }
- }
- }
- }
- }
- }
- }
- NS_RELEASE(brTag);
- }
- }
- }
- }
- return result;
-}
-
-NS_IMETHODIMP
-nsTextEditRules::GetInsertBreakTag(nsIAtom **aTag)
-{
- if (!aTag) { return NS_ERROR_NULL_POINTER; }
- *aTag = NS_NewAtom("BR");
- return NS_OK;
-}
-
-
NS_IMETHODIMP
nsTextEditRules::WillDeleteSelection(nsIDOMSelection *aSelection, PRBool *aCancel)
{
diff --git a/mozilla/editor/base/nsTextEditRules.h b/mozilla/editor/base/nsTextEditRules.h
index 6d32e09d221..8aecebc37c4 100644
--- a/mozilla/editor/base/nsTextEditRules.h
+++ b/mozilla/editor/base/nsTextEditRules.h
@@ -23,7 +23,7 @@
#include "nsCOMPtr.h"
#include "nsIDOMNode.h"
-class nsTextEditor;
+class nsEditor;
class PlaceholderTxn;
/** Object that encapsulates HTML text-specific editing rules.
@@ -44,11 +44,10 @@ public:
nsTextEditRules();
virtual ~nsTextEditRules();
- NS_IMETHOD Init(nsTextEditor *aEditor);
+ NS_IMETHOD Init(nsEditor *aEditor);
NS_IMETHOD WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel);
NS_IMETHOD DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult);
- NS_IMETHOD GetInsertBreakTag(nsIAtom **aTag);
NS_IMETHOD WillInsertText(nsIDOMSelection *aSelection,
const nsString& aInputString,
@@ -71,7 +70,11 @@ public:
protected:
- nsTextEditor *mEditor; // note that we do not refcount the editor
+ // helper functions
+ static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag);
+ static PRBool IsEditable(nsIDOMNode *aNode);
+
+ nsEditor *mEditor; // note that we do not refcount the editor
nsCOMPtr mBogusNode; // magic node acts as placeholder in empty doc
};
diff --git a/mozilla/editor/base/nsTextEditor.cpp b/mozilla/editor/base/nsTextEditor.cpp
index ebc43525050..a1ad04c16b2 100644
--- a/mozilla/editor/base/nsTextEditor.cpp
+++ b/mozilla/editor/base/nsTextEditor.cpp
@@ -175,6 +175,9 @@ NS_IMETHODIMP nsTextEditor::Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell)
if (NS_OK != result)
return result;
+ // Init the rules system
+ InitRules();
+
result = NS_NewEditorKeyListener(getter_AddRefs(mKeyListenerP), this);
if (NS_OK != result) {
return result;
@@ -217,15 +220,10 @@ NS_IMETHODIMP nsTextEditor::Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell)
}
//cmanske: Shouldn't we check result from this?
erP->AddEventListenerByIID(mKeyListenerP, kIDOMKeyListenerIID);
- //erP->AddEventListenerByIID(mDragListenerP, kIDOMDragListenerIID);
- //erP->AddEventListenerByIID(mMouseListenerP, kIDOMMouseListenerIID);
+ //erP->AddEventListener(mDragListenerP, kIDOMDragListenerIID);
+ //erP->AddEventListener(mMouseListenerP, kIDOMMouseListenerIID);
- erP->AddEventListenerByIID(mTextListenerP,kIDOMTextListenerIID);
-
- // instantiate the rules for this text editor
- // XXX: we should be told which set of rules to instantiate
- mRules = new nsTextEditRules();
- mRules->Init(this);
+ erP->AddEventListenerByIID(mTextListenerP,kIDOMTextListenerIID);
result = NS_OK;
@@ -234,6 +232,16 @@ NS_IMETHODIMP nsTextEditor::Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell)
return result;
}
+
+void nsTextEditor::InitRules()
+{
+// instantiate the rules for this text editor
+// XXX: we should be told which set of rules to instantiate
+ mRules = new nsTextEditRules();
+ mRules->Init(this);
+}
+
+
// this is a total hack for now. We don't yet have a way of getting the style properties
// of the current selection, so we can't do anything useful here except show off a little.
NS_IMETHODIMP nsTextEditor::SetTextProperty(nsIAtom *aProperty)
@@ -485,80 +493,11 @@ NS_IMETHODIMP nsTextEditor::InsertText(const nsString& aStringToInsert)
NS_IMETHODIMP nsTextEditor::InsertBreak()
{
- nsresult result;
- if (!mRules) { return NS_ERROR_NOT_INITIALIZED; }
+ // For plainttext just pass newlines through
+ nsAutoString key;
+ key += '\n';
- nsCOMPtr selection;
- PRBool cancel= PR_FALSE;
-
- result = nsEditor::BeginTransaction();
- if (NS_FAILED(result)) { return result; }
-
- // pre-process
- nsEditor::GetSelection(getter_AddRefs(selection));
- result = mRules->WillInsertBreak(selection, &cancel);
- if ((PR_FALSE==cancel) && (NS_SUCCEEDED(result)))
- {
- // create the new BR node
- nsCOMPtr newNode;
- nsAutoString tag("BR");
- result = nsEditor::DeleteSelectionAndCreateNode(tag, getter_AddRefs(newNode));
- if (NS_SUCCEEDED(result) && newNode)
- {
- // set the selection to the new node
- nsCOMPtrparent;
- result = newNode->GetParentNode(getter_AddRefs(parent));
- if (NS_SUCCEEDED(result) && parent)
- {
- PRInt32 offsetInParent=-1; // we use the -1 as a marker to see if we need to compute this or not
- nsCOMPtrnextNode;
- newNode->GetNextSibling(getter_AddRefs(nextNode));
- if (nextNode)
- {
- nsCOMPtrnextTextNode;
- nextTextNode = do_QueryInterface(nextNode);
- if (!nextTextNode) {
- nextNode = do_QueryInterface(newNode);
- }
- else {
- offsetInParent=0;
- }
- }
- else {
- nextNode = do_QueryInterface(newNode);
- }
- result = nsEditor::GetSelection(getter_AddRefs(selection));
- if (NS_SUCCEEDED(result))
- {
- if (-1==offsetInParent)
- {
- nextNode->GetParentNode(getter_AddRefs(parent));
- result = nsIEditorSupport::GetChildOffset(nextNode, parent, offsetInParent);
- if (NS_SUCCEEDED(result)) {
- selection->Collapse(parent, offsetInParent+1); // +1 to insert just after the break
- }
- }
- else
- {
- selection->Collapse(nextNode, offsetInParent);
- }
- }
- }
- }
- // post-process, always called if WillInsertBreak didn't return cancel==PR_TRUE
- result = mRules->DidInsertBreak(selection, result);
- }
- nsresult endTxnResult = nsEditor::EndTransaction(); // don't return this result!
- NS_ASSERTION ((NS_SUCCEEDED(endTxnResult)), "bad end transaction result");
-
-// XXXX: Horrible hack! We are doing this because
-// of an error in Gecko which is not rendering the
-// document after a change via the DOM - gpk 2/13/99
- // BEGIN HACK!!!
- HACKForceRedraw();
- // END HACK
-
- return result;
+ return InsertText(key);
}
diff --git a/mozilla/editor/base/nsTextEditor.h b/mozilla/editor/base/nsTextEditor.h
index d7f7d476ff1..d2d39209db3 100644
--- a/mozilla/editor/base/nsTextEditor.h
+++ b/mozilla/editor/base/nsTextEditor.h
@@ -89,6 +89,11 @@ public:
NS_IMETHOD OutputHTML(nsString& aOutputString);
protected:
+
+// rules initialization
+
+ virtual void InitRules();
+
// Utility Methods
virtual void IsTextStyleSet(nsIStyleContext *aSC,
diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp
index 2c9fdc1efb8..04d5ab81dba 100644
--- a/mozilla/editor/libeditor/html/nsHTMLEditor.cpp
+++ b/mozilla/editor/libeditor/html/nsHTMLEditor.cpp
@@ -18,11 +18,13 @@
#include "nsTextEditor.h"
#include "nsHTMLEditor.h"
+#include "nsHTMLEditRules.h"
#include "nsEditorEventListeners.h"
#include "nsIDOMDocument.h"
#include "nsIDOMEventReceiver.h"
#include "nsIDOMKeyListener.h"
#include "nsIDOMMouseListener.h"
+#include "nsIDOMSelection.h"
#include "nsEditorCID.h"
#include "nsIComponentManager.h"
@@ -96,6 +98,14 @@ NS_IMETHODIMP nsHTMLEditor::Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell)
return result;
}
+void nsHTMLEditor::InitRules()
+{
+// instantiate the rules for this text editor
+// XXX: we should be told which set of rules to instantiate
+ mRules = new nsHTMLEditRules();
+ mRules->Init(this);
+}
+
NS_IMETHODIMP nsHTMLEditor::SetTextProperty(nsIAtom *aProperty)
{
return nsTextEditor::SetTextProperty(aProperty);
@@ -123,7 +133,80 @@ NS_IMETHODIMP nsHTMLEditor::InsertText(const nsString& aStringToInsert)
NS_IMETHODIMP nsHTMLEditor::InsertBreak()
{
- return nsTextEditor::InsertBreak();
+ nsresult result;
+ if (!mRules) { return NS_ERROR_NOT_INITIALIZED; }
+
+ nsCOMPtr selection;
+ PRBool cancel= PR_FALSE;
+
+ result = nsEditor::BeginTransaction();
+ if (NS_FAILED(result)) { return result; }
+
+ // pre-process
+ nsEditor::GetSelection(getter_AddRefs(selection));
+ result = mRules->WillInsertBreak(selection, &cancel);
+ if ((PR_FALSE==cancel) && (NS_SUCCEEDED(result)))
+ {
+ // create the new BR node
+ nsCOMPtr newNode;
+ nsAutoString tag("BR");
+ result = nsEditor::DeleteSelectionAndCreateNode(tag, getter_AddRefs(newNode));
+ if (NS_SUCCEEDED(result) && newNode)
+ {
+ // set the selection to the new node
+ nsCOMPtrparent;
+ result = newNode->GetParentNode(getter_AddRefs(parent));
+ if (NS_SUCCEEDED(result) && parent)
+ {
+ PRInt32 offsetInParent=-1; // we use the -1 as a marker to see if we need to compute this or not
+ nsCOMPtrnextNode;
+ newNode->GetNextSibling(getter_AddRefs(nextNode));
+ if (nextNode)
+ {
+ nsCOMPtrnextTextNode;
+ nextTextNode = do_QueryInterface(nextNode);
+ if (!nextTextNode) {
+ nextNode = do_QueryInterface(newNode);
+ }
+ else {
+ offsetInParent=0;
+ }
+ }
+ else {
+ nextNode = do_QueryInterface(newNode);
+ }
+ result = nsEditor::GetSelection(getter_AddRefs(selection));
+ if (NS_SUCCEEDED(result))
+ {
+ if (-1==offsetInParent)
+ {
+ nextNode->GetParentNode(getter_AddRefs(parent));
+ result = nsIEditorSupport::GetChildOffset(nextNode, parent, offsetInParent);
+ if (NS_SUCCEEDED(result)) {
+ selection->Collapse(parent, offsetInParent+1); // +1 to insert just after the break
+ }
+ }
+ else
+ {
+ selection->Collapse(nextNode, offsetInParent);
+ }
+ }
+ }
+ }
+ // post-process, always called if WillInsertBreak didn't return cancel==PR_TRUE
+ result = mRules->DidInsertBreak(selection, result);
+ }
+ nsresult endTxnResult = nsEditor::EndTransaction(); // don't return this result!
+ NS_ASSERTION ((NS_SUCCEEDED(endTxnResult)), "bad end transaction result");
+
+// XXXX: Horrible hack! We are doing this because
+// of an error in Gecko which is not rendering the
+// document after a change via the DOM - gpk 2/13/99
+ // BEGIN HACK!!!
+ HACKForceRedraw();
+ // END HACK
+
+ return result;
}
// Methods shared with the base editor.
diff --git a/mozilla/editor/libeditor/html/nsHTMLEditor.h b/mozilla/editor/libeditor/html/nsHTMLEditor.h
index 40d57df3855..fdcdc17ed6d 100644
--- a/mozilla/editor/libeditor/html/nsHTMLEditor.h
+++ b/mozilla/editor/libeditor/html/nsHTMLEditor.h
@@ -110,8 +110,14 @@ public:
NS_IMETHOD JoinTableCells(PRBool aCellToRight);
// Data members
+
protected:
+// rules initialization
+
+ virtual void InitRules();
+
+
// EVENT LISTENERS AND COMMAND ROUTING NEEDS WORK
// For now, the listners are tied to the nsTextEditor class
//
diff --git a/mozilla/editor/libeditor/text/nsTextEditRules.cpp b/mozilla/editor/libeditor/text/nsTextEditRules.cpp
index 8f02e53138f..b2922bd7bcd 100644
--- a/mozilla/editor/libeditor/text/nsTextEditRules.cpp
+++ b/mozilla/editor/libeditor/text/nsTextEditRules.cpp
@@ -17,7 +17,7 @@
*/
#include "nsTextEditRules.h"
-#include "nsTextEditor.h"
+#include "nsEditor.h"
#include "PlaceholderTxn.h"
#include "InsertTextTxn.h"
#include "nsCOMPtr.h"
@@ -35,7 +35,11 @@ const static char* kMOZEditorBogusNodeValue="TRUE";
static NS_DEFINE_IID(kPlaceholderTxnIID, PLACEHOLDER_TXN_IID);
-static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
+/*-------------------------------------------------------------------*
+ * Helper Functions
+ *-------------------------------------------------------------------*/
+
+PRBool nsTextEditRules::NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
{
nsCOMPtrelement;
element = do_QueryInterface(aNode);
@@ -51,7 +55,7 @@ static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag)
return PR_FALSE;
}
-PRBool IsEditable(nsIDOMNode *aNode)
+PRBool nsTextEditRules::IsEditable(nsIDOMNode *aNode)
{
if (!aNode) return PR_FALSE;
nsCOMPtrelement;
@@ -91,6 +95,11 @@ PRBool IsEditable(nsIDOMNode *aNode)
}
+/*-------------------------------------------------------------------*
+ * Constructor/Destructor
+ *-------------------------------------------------------------------*/
+
+
nsTextEditRules::nsTextEditRules()
{
mEditor = nsnull;
@@ -101,8 +110,15 @@ nsTextEditRules::~nsTextEditRules()
// do NOT delete mEditor here. We do not hold a ref count to mEditor. mEditor owns our lifespan.
}
+
+
+/*-------------------------------------------------------------------*
+ * Public methods
+ *-------------------------------------------------------------------*/
+
+
NS_IMETHODIMP
-nsTextEditRules::Init(nsTextEditor *aEditor)
+nsTextEditRules::Init(nsEditor *aEditor)
{
// null aNextRule is ok
if (!aEditor) { return NS_ERROR_NULL_POINTER; }
@@ -110,6 +126,17 @@ nsTextEditRules::Init(nsTextEditor *aEditor)
return NS_OK;
}
+NS_IMETHODIMP
+nsTextEditRules::WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsTextEditRules::DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
NS_IMETHODIMP
nsTextEditRules::WillInsert(nsIDOMSelection *aSelection, PRBool *aCancel)
@@ -168,126 +195,6 @@ nsTextEditRules::DidInsertText(nsIDOMSelection *aSelection,
return DidInsert(aSelection, aResult);
}
-NS_IMETHODIMP
-nsTextEditRules::WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel)
-{
- if (!aSelection || !aCancel) { return NS_ERROR_NULL_POINTER; }
- // initialize out param
- *aCancel = PR_FALSE;
- return WillInsert(aSelection, aCancel);
-}
-
-// XXX: this code is all experimental, and has no effect on the content model yet
-// the point here is to collapse adjacent BR's into P's
-NS_IMETHODIMP
-nsTextEditRules::DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult)
-{
- nsresult result = aResult; // if aResult is an error, we return it.
- if (!aSelection) { return NS_ERROR_NULL_POINTER; }
- PRBool isCollapsed;
- aSelection->IsCollapsed(&isCollapsed);
- NS_ASSERTION(PR_TRUE==isCollapsed, "selection not collapsed after insert break.");
- // if the insert break resulted in consecutive BR tags,
- // collapse the two BR tags into a single P
- if (NS_SUCCEEDED(result))
- {
- nsCOMPtr enumerator;
- enumerator = do_QueryInterface(aSelection,&result);
- if (enumerator)
- {
- enumerator->First();
- nsISupports *currentItem;
- result = enumerator->CurrentItem(¤tItem);
- if ((NS_SUCCEEDED(result)) && currentItem)
- {
- result = NS_ERROR_UNEXPECTED;
- nsCOMPtr range( do_QueryInterface(currentItem) );
- if (range)
- {
- nsIAtom *brTag = NS_NewAtom("BR");
- nsCOMPtr startNode;
- result = range->GetStartParent(getter_AddRefs(startNode));
- if ((NS_SUCCEEDED(result)) && startNode)
- {
- PRInt32 offset;
- range->GetStartOffset(&offset);
- nsCOMPtrstartNodeChildren;
- result = startNode->GetChildNodes(getter_AddRefs(startNodeChildren));
- if ((NS_SUCCEEDED(result)) && startNodeChildren)
- {
- nsCOMPtr selectedNode;
- result = startNodeChildren->Item(offset, getter_AddRefs(selectedNode));
- if ((NS_SUCCEEDED(result)) && selectedNode)
- {
- nsCOMPtr prevNode;
- result = selectedNode->GetPreviousSibling(getter_AddRefs(prevNode));
- if ((NS_SUCCEEDED(result)) && prevNode)
- {
- if (PR_TRUE==NodeIsType(prevNode, brTag))
- { // the previous node is a BR, check it's siblings
- nsCOMPtr leftNode;
- result = prevNode->GetPreviousSibling(getter_AddRefs(leftNode));
- if ((NS_SUCCEEDED(result)) && leftNode)
- {
- if (PR_TRUE==NodeIsType(leftNode, brTag))
- { // left sibling is also a BR, collapse
- printf("1\n");
- }
- else
- {
- if (PR_TRUE==NodeIsType(selectedNode, brTag))
- { // right sibling is also a BR, collapse
- printf("2\n");
- }
- }
- }
- }
- }
- // now check the next node from selectedNode
- nsCOMPtr nextNode;
- result = selectedNode->GetNextSibling(getter_AddRefs(nextNode));
- if ((NS_SUCCEEDED(result)) && nextNode)
- {
- if (PR_TRUE==NodeIsType(nextNode, brTag))
- { // the previous node is a BR, check it's siblings
- nsCOMPtr rightNode;
- result = nextNode->GetNextSibling(getter_AddRefs(rightNode));
- if ((NS_SUCCEEDED(result)) && rightNode)
- {
- if (PR_TRUE==NodeIsType(rightNode, brTag))
- { // right sibling is also a BR, collapse
- printf("3\n");
- }
- else
- {
- if (PR_TRUE==NodeIsType(selectedNode, brTag))
- { // left sibling is also a BR, collapse
- printf("4\n");
- }
- }
- }
- }
- }
- }
- }
- }
- NS_RELEASE(brTag);
- }
- }
- }
- }
- return result;
-}
-
-NS_IMETHODIMP
-nsTextEditRules::GetInsertBreakTag(nsIAtom **aTag)
-{
- if (!aTag) { return NS_ERROR_NULL_POINTER; }
- *aTag = NS_NewAtom("BR");
- return NS_OK;
-}
-
-
NS_IMETHODIMP
nsTextEditRules::WillDeleteSelection(nsIDOMSelection *aSelection, PRBool *aCancel)
{
diff --git a/mozilla/editor/libeditor/text/nsTextEditRules.h b/mozilla/editor/libeditor/text/nsTextEditRules.h
index 6d32e09d221..8aecebc37c4 100644
--- a/mozilla/editor/libeditor/text/nsTextEditRules.h
+++ b/mozilla/editor/libeditor/text/nsTextEditRules.h
@@ -23,7 +23,7 @@
#include "nsCOMPtr.h"
#include "nsIDOMNode.h"
-class nsTextEditor;
+class nsEditor;
class PlaceholderTxn;
/** Object that encapsulates HTML text-specific editing rules.
@@ -44,11 +44,10 @@ public:
nsTextEditRules();
virtual ~nsTextEditRules();
- NS_IMETHOD Init(nsTextEditor *aEditor);
+ NS_IMETHOD Init(nsEditor *aEditor);
NS_IMETHOD WillInsertBreak(nsIDOMSelection *aSelection, PRBool *aCancel);
NS_IMETHOD DidInsertBreak(nsIDOMSelection *aSelection, nsresult aResult);
- NS_IMETHOD GetInsertBreakTag(nsIAtom **aTag);
NS_IMETHOD WillInsertText(nsIDOMSelection *aSelection,
const nsString& aInputString,
@@ -71,7 +70,11 @@ public:
protected:
- nsTextEditor *mEditor; // note that we do not refcount the editor
+ // helper functions
+ static PRBool NodeIsType(nsIDOMNode *aNode, nsIAtom *aTag);
+ static PRBool IsEditable(nsIDOMNode *aNode);
+
+ nsEditor *mEditor; // note that we do not refcount the editor
nsCOMPtr mBogusNode; // magic node acts as placeholder in empty doc
};