* Added some code to restore selection after RemoveTextProperty. * Made a tiny change to the way the editor holds onto the transaction manager, so client (like the ender text control) can turn undo on and off effectively * Fixed a bug in IsNodeInline that was causing GetBlockParent to return the wrong parent node (and who knows what other mischief) where atom compares were being done on strings of different case, for <B>, "b" vs. "B". The DOM method nsIDOMElement::GetTagName forced the returned tag name to upper case. I don't know how long that has been true, but I assume it's a fairly recent change (or something on our side related to it changed recently) or this method never would have worked. I also found a few cases of nsString::Equals that I changed to EqualsIgnoreCase * Made some general improvements to the interaction between editors and rules, so that the aCancel out param is always intialized, and all rules with Will... are matched with a Did... call. Added Will/DidSetTextProperty() and Will/DidRemoveTextProperty(). This helps enable plain text mode. Added a skeleton for max length support in text editor. * fixed some warnings. git-svn-id: svn://10.0.0.236/trunk@34183 18797224-902f-48f8-a5cc-f745e15eee43
299 lines
14 KiB
C++
299 lines
14 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#ifndef nsTextEditor_h__
|
|
#define nsTextEditor_h__
|
|
|
|
#include "nsITextEditor.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsIDOMEventListener.h"
|
|
#include "nsEditor.h"
|
|
#include "nsTextEditRules.h"
|
|
#include "TypeInState.h"
|
|
#include "nsString.h"
|
|
|
|
class nsIStyleContext;
|
|
class nsIDOMRange;
|
|
class nsIDOMNode;
|
|
|
|
/**
|
|
* The text editor implementation.<br>
|
|
* Use to edit text represented as a DOM tree.
|
|
* This class is used for editing both plain text and rich text (attributed text).
|
|
*/
|
|
class nsTextEditor : public nsEditor, public nsITextEditor
|
|
{
|
|
public:
|
|
// see nsITextEditor for documentation
|
|
|
|
//Interfaces for addref and release and queryinterface
|
|
//NOTE macro used is for classes that inherit from
|
|
// another class. Only the base class should use NS_DECL_ISUPPORTS
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
nsTextEditor();
|
|
virtual ~nsTextEditor();
|
|
|
|
//Initialization
|
|
NS_IMETHOD Init(nsIDOMDocument *aDoc, nsIPresShell *aPresShell);
|
|
|
|
NS_IMETHOD GetFlags(PRUint32 *aFlags);
|
|
NS_IMETHOD SetFlags(PRUint32 aFlags);
|
|
|
|
//============================================================================
|
|
// Methods that are duplicates of nsEditor -- exposed here for convenience
|
|
// Editing Operations
|
|
NS_IMETHOD SetTextProperty(nsIAtom *aProperty,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue);
|
|
NS_IMETHOD GetTextProperty(nsIAtom *aProperty,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue,
|
|
PRBool &aFirst, PRBool &aAny, PRBool &aAll);
|
|
NS_IMETHOD RemoveTextProperty(nsIAtom *aProperty, const nsString *aAttribute);
|
|
NS_IMETHOD DeleteSelection(nsIEditor::ECollapsedSelectionAction aAction);
|
|
NS_IMETHOD InsertText(const nsString& aStringToInsert);
|
|
NS_IMETHOD SetMaxTextLength(PRInt32 aMaxTextLength);
|
|
NS_IMETHOD InsertBreak();
|
|
NS_IMETHOD CopyAttributes(nsIDOMNode *aDestNode, nsIDOMNode *aSourceNode);
|
|
|
|
// Transaction control
|
|
NS_IMETHOD EnableUndo(PRBool aEnable);
|
|
NS_IMETHOD Undo(PRUint32 aCount);
|
|
NS_IMETHOD CanUndo(PRBool &aIsEnabled, PRBool &aCanUndo);
|
|
NS_IMETHOD Redo(PRUint32 aCount);
|
|
NS_IMETHOD CanRedo(PRBool &aIsEnabled, PRBool &aCanRedo);
|
|
NS_IMETHOD BeginTransaction();
|
|
NS_IMETHOD EndTransaction();
|
|
|
|
// Selection and navigation -- exposed here for convenience
|
|
NS_IMETHOD MoveSelectionUp(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD MoveSelectionDown(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD MoveSelectionNext(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD MoveSelectionPrevious(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD SelectNext(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD SelectPrevious(nsIAtom *aIncrement, PRBool aExtendSelection);
|
|
NS_IMETHOD SelectAll();
|
|
NS_IMETHOD ScrollUp(nsIAtom *aIncrement);
|
|
NS_IMETHOD ScrollDown(nsIAtom *aIncrement);
|
|
NS_IMETHOD ScrollIntoView(PRBool aScrollToBegin);
|
|
|
|
// file handling
|
|
NS_IMETHOD Save();
|
|
NS_IMETHOD SaveAs(PRBool aSavingCopy);
|
|
|
|
// cut, copy & paste
|
|
NS_IMETHOD Cut();
|
|
NS_IMETHOD Copy();
|
|
NS_IMETHOD Paste();
|
|
NS_IMETHOD PasteAsQuotation();
|
|
NS_IMETHOD InsertAsQuotation(const nsString& aQuotedText);
|
|
|
|
// Input/Output
|
|
NS_IMETHOD BeginComposition(void);
|
|
NS_IMETHOD SetCompositionString(const nsString& aCompositionString);
|
|
NS_IMETHOD EndComposition(void);
|
|
NS_IMETHOD OutputTextToString(nsString& aOutputString);
|
|
NS_IMETHOD OutputHTMLToString(nsString& aOutputString);
|
|
NS_IMETHOD OutputTextToStream(nsIOutputStream* aOutputStream, nsString* aCharsetOverride);
|
|
NS_IMETHOD OutputHTMLToStream(nsIOutputStream* aOutputStream, nsString* aCharsetOverride);
|
|
|
|
// Plain text wrapping control
|
|
NS_IMETHOD GetBodyWrapWidth(PRInt32 *aWrapColumn);
|
|
NS_IMETHOD SetBodyWrapWidth(PRInt32 aWrapColumn);
|
|
// End of methods implemented in nsEditor
|
|
//=============================================================
|
|
|
|
protected:
|
|
|
|
// file handling utils
|
|
|
|
NS_IMETHOD SaveDocument(PRBool saveAs, PRBool saveCopy);
|
|
|
|
// rules initialization
|
|
|
|
virtual void InitRules();
|
|
|
|
// Utility Methods
|
|
|
|
/** content-based query returns PR_TRUE if <aProperty aAttribute=aValue> effects aNode
|
|
* If <aProperty aAttribute=aValue> contains aNode,
|
|
* but <aProperty aAttribute=SomeOtherValue> also contains aNode and the second is
|
|
* more deeply nested than the first, then the first does not effect aNode.
|
|
*
|
|
* @param aNode The target of the query
|
|
* @param aProperty The property that we are querying for
|
|
* @param aAttribute The attribute of aProperty, example: color in <FONT color="blue">
|
|
* May be null.
|
|
* @param aValue The value of aAttribute, example: blue in <FONT color="blue">
|
|
* May be null. Ignored if aAttribute is null.
|
|
* @param aIsSet [OUT] PR_TRUE if <aProperty aAttribute=aValue> effects aNode.
|
|
* @param aStyleNode [OUT] set to the node representing <aProperty aAttribute=aValue>, if found.
|
|
* null if aIsSet is returned as PR_FALSE;
|
|
*/
|
|
virtual void IsTextPropertySetByContent(nsIDOMNode *aNode,
|
|
nsIAtom *aProperty,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue,
|
|
PRBool &aIsSet,
|
|
nsIDOMNode **aStyleNode) const;
|
|
|
|
/** style-based query returns PR_TRUE if (aProperty, aAttribute) is set in aSC.
|
|
* WARNING: not well tested yet since we don't do style-based queries anywhere.
|
|
*/
|
|
virtual void IsTextStyleSet(nsIStyleContext *aSC,
|
|
nsIAtom *aProperty,
|
|
const nsString *aAttributes,
|
|
PRBool &aIsSet) const;
|
|
|
|
/** Moves the content between (aNode, aStartOffset) and (aNode, aEndOffset)
|
|
* into aNewParentNode, splitting aNode as necessary to maintain the relative
|
|
* position of all leaf content.
|
|
* @param aNode The node whose content we're repositioning.
|
|
* aNode can be either a text node or a container node.
|
|
* @param aNewParentNode The node that will be the repositioned contents' parent.
|
|
* The caller is responsible for allocating aNewParentNode
|
|
* @param aStartOffset The start offset of the content of aNode
|
|
* @param aEndOffset The end offset of the content of aNode.
|
|
*/
|
|
NS_IMETHOD MoveContentOfNodeIntoNewParent(nsIDOMNode *aNode,
|
|
nsIDOMNode *aNewParentNode,
|
|
PRInt32 aStartOffset,
|
|
PRInt32 aEndOffset);
|
|
|
|
/** Moves the content between (aStartNode, aStartOffset) and (aEndNode, aEndOffset)
|
|
* into aNewParentNode, splitting aStartNode and aEndNode as necessary to maintain
|
|
* the relative position of all leaf content.
|
|
* The content between the two endpoints MUST be "contiguous" in the sense that
|
|
* it is all in the same block. Another way of saying this is all content nodes
|
|
* between aStartNode and aEndNode must be inline.
|
|
* @see IntermediateNodesAreInline
|
|
*
|
|
* @param aStartNode The left node, can be either a text node or a container node.
|
|
* @param aStartOffset The start offset in the content of aStartNode
|
|
* @param aEndNode The right node, can be either a text node or a container node.
|
|
* @param aEndOffset The end offset in the content of aEndNode.
|
|
* @param aGrandParentNode The common ancestor of aStartNode and aEndNode.
|
|
* aGrandParentNode will be the parent of aNewParentNode.
|
|
* @param aNewParentNode The node that will be the repositioned contents' parent.
|
|
* The caller is responsible for allocating aNewParentNode
|
|
*/
|
|
NS_IMETHOD MoveContiguousContentIntoNewParent(nsIDOMNode *aStartNode,
|
|
PRInt32 aStartOffset,
|
|
nsIDOMNode *aEndNode,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMNode *aGrandParentNode,
|
|
nsIDOMNode *aNewParentNode);
|
|
|
|
|
|
NS_IMETHOD SetTextPropertiesForNode(nsIDOMNode *aNode,
|
|
nsIDOMNode *aParent,
|
|
PRInt32 aStartOffset,
|
|
PRInt32 aEndOffset,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue);
|
|
|
|
NS_IMETHOD SetTextPropertiesForNodesWithSameParent(nsIDOMNode *aStartNode,
|
|
PRInt32 aStartOffset,
|
|
nsIDOMNode *aEndNode,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMNode *aParent,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue);
|
|
|
|
NS_IMETHOD SetTextPropertiesForNodeWithDifferentParents(nsIDOMRange *aRange,
|
|
nsIDOMNode *aStartNode,
|
|
PRInt32 aStartOffset,
|
|
nsIDOMNode *aEndNode,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMNode *aParent,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue);
|
|
|
|
NS_IMETHOD RemoveTextPropertiesForNode(nsIDOMNode *aNode,
|
|
nsIDOMNode *aParent,
|
|
PRInt32 aStartOffset,
|
|
PRInt32 aEndOffset,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute);
|
|
|
|
NS_IMETHOD RemoveTextPropertiesForNodesWithSameParent(nsIDOMNode *aStartNode,
|
|
PRInt32 aStartOffset,
|
|
nsIDOMNode *aEndNode,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMNode *aParent,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute);
|
|
|
|
NS_IMETHOD RemoveTextPropertiesForNodeWithDifferentParents(nsIDOMNode *aStartNode,
|
|
PRInt32 aStartOffset,
|
|
nsIDOMNode *aEndNode,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMNode *aParent,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute);
|
|
|
|
NS_IMETHOD SetTypeInStateForProperty(TypeInState &aTypeInState,
|
|
nsIAtom *aPropName,
|
|
const nsString *aAttribute,
|
|
const nsString *aValue);
|
|
|
|
void GetTextSelectionOffsetsForRange(nsIDOMSelection *aSelection,
|
|
nsIDOMNode **aParent,
|
|
PRInt32 &aStartOffset,
|
|
PRInt32 &aEndOffset);
|
|
|
|
void ResetTextSelectionForRange(nsIDOMNode *aParent,
|
|
PRInt32 aStartOffset,
|
|
PRInt32 aEndOffset,
|
|
nsIDOMSelection *aSelection);
|
|
|
|
|
|
TypeInState *GetTypeInState();
|
|
NS_IMETHOD OutputTextInternal(nsIOutputStream* aOutputStream, nsString* aOutputString, nsString* aCharsetOverride);
|
|
NS_IMETHOD OutputHTMLInternal(nsIOutputStream* aOutputStream, nsString* aOutputString, nsString* aCharsetOverride);
|
|
|
|
/** simple utility to handle any error with event listener allocation or registration */
|
|
void HandleEventListenerError();
|
|
|
|
// this overrides the base class implementation. It is not exported in nsITextEditor.
|
|
NS_IMETHOD DebugUnitTests(PRInt32 *outNumTests, PRInt32 *outNumTestsFailed);
|
|
|
|
// Data members
|
|
protected:
|
|
TypeInState *mTypeInState;
|
|
nsTextEditRules *mRules;
|
|
nsCOMPtr<nsIDOMEventListener> mKeyListenerP;
|
|
nsCOMPtr<nsIDOMEventListener> mMouseListenerP;
|
|
nsCOMPtr<nsIDOMEventListener> mTextListenerP;
|
|
nsCOMPtr<nsIDOMEventListener> mCompositionListenerP;
|
|
nsCOMPtr<nsIDOMEventListener> mDragListenerP;
|
|
nsCOMPtr<nsIDOMEventListener> mFocusListenerP;
|
|
PRBool mIsComposing;
|
|
PRInt32 mMaxTextLength;
|
|
|
|
// friends
|
|
friend class nsTextEditRules;
|
|
};
|
|
|
|
#endif //nsTextEditor_h__
|
|
|