textrendering/textformatting/undo/EditorPlainTextCommands.h
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/undo/EditorPlainTextCommands.h	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,242 @@
+/*
+* Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#ifndef EDITORPLAINTEXTCOMMANDS_H_
+#define EDITORPLAINTEXTCOMMANDS_H_
+
+#include "unified_editor.h"
+#include "UniqueInstance.h"
+#include "UndoSystem.h"
+
+namespace LocalInFile
+{
+/**
+@internalComponent
+*/
+const TInt KMaxCharsInSingleCommand = 20;
+const TInt KUndoDllUid = 0x1000902D;
+}
+
+using namespace LocalInFile;
+
+namespace UndoSystem
+{
+/**
+ * Takes two commands and returns one, which when executed will
+ * achieve the result of executing first aRight, then aLeft.
+ * Either argument may be null, indicating no effect of execution.
+ * In the event of a leave, aRight will be destroyed, however
+ * aLeft must be protected by the calling function.
+ * Ownership of aLeft is passed into the function if it exits
+ * cleanly, and ownership of the return value is passed back
+ * to the calling function.
+ */
+CCommand* CoalesceL(CCommand* aLeft, CCommand* aRight);
+}
+
+// all the combinable commands:
+class CEditorCommandInsertTextAndFormat;
+class CEditorCommandDeleteText;
+class CEditorCommandInsertPlainText;
+class CEditorCommandDeletePlainText;
+class CEditorCommandDeleteCharFormat;
+class CEditorCommandDeleteParFormat;
+
+/**
+ * Editor command is the base class for all the MUnifiedEditor commands.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommand) : public UndoSystem::CSingleCommand
+	{
+public:
+	TUid FamilyUid() const;
+
+	// downcast to combinable internal commands
+	virtual CEditorCommandInsertTextAndFormat*
+		CastToCEditorCommandInsertTextAndFormat();
+	virtual CEditorCommandDeleteText*
+		CastToCEditorCommandDeleteText();
+	virtual CEditorCommandInsertPlainText*
+		CastToCEditorCommandInsertPlainText();
+	virtual CEditorCommandDeletePlainText*
+		CastToCEditorCommandDeletePlainText();
+	virtual CEditorCommandDeleteCharFormat*
+		CastToCEditorCommandDeleteCharFormat();
+	virtual CEditorCommandDeleteParFormat*
+		CastToCEditorCommandDeleteParFormat();
+	};
+
+//
+// command prototypes
+//
+
+/**
+ * Prototype command for inserting text with specified character and paragraph
+ * format.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandInsertPlainTextProto) : public CEditorCommand
+	{
+	MUnifiedEditor&							iTarget;
+	TInt								iPos;
+	const TDesC*						iText;
+
+public:
+	CEditorCommandInsertPlainTextProto(MUnifiedEditor& aTarget)
+		: iTarget(aTarget) {}
+	void Set(TInt aPos, const TDesC& aText);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+
+	TBool PrepareToAddInverseToLastL(UndoSystem::CSingleCommand& aLastCommand) const;
+	void AddInverseToLast(UndoSystem::CSingleCommand& aLastCommand) const;
+	};
+
+/**
+ * Prototype command for deleting text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDeletePlainTextProto) : public CEditorCommand
+	{
+	enum { KMaxCombinableReinsertCharacters = 20 };
+
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+	TInt		iLength;
+	// For adding inverse to last command
+	mutable TBuf<KMaxCombinableReinsertCharacters>	iDeletedText;
+
+public:
+	CEditorCommandDeletePlainTextProto(MUnifiedEditor& aTarget)
+		: iTarget(aTarget) {}
+	void Set(TInt aPos, TInt aLength);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+
+	TBool PrepareToAddInverseToLastL(UndoSystem::CSingleCommand& aLastCommand) const;
+	void AddInverseToLast(UndoSystem::CSingleCommand& aLastCommand) const;
+	};
+
+/**
+ * Implementation of plain text insertion for use by plain & rich text
+ * insertion commands.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class TEditorInsertPlainTextImpl
+	{
+	MUnifiedEditor&						iTarget;
+	TInt							iPos;
+	TBuf<KMaxCharsInSingleCommand>	iText;
+public:
+	TEditorInsertPlainTextImpl(MUnifiedEditor& aTarget, TInt aPos, const TDesC& aText)
+		: iTarget(aTarget), iPos(aPos), iText(aText) {}
+	MUnifiedEditor& Target() const	{ return iTarget; }
+	const TDesC& Text() const	{ return iText; }
+	TInt Pos() const			{ return iPos; }
+	TInt ExecuteL(const TDesC* aStyle, const TTmCharFormatLayer* aChar,
+		const RTmParFormatLayer* aPar) const;
+	TInt ExecuteL() const;
+	TInt CanAdd(TInt aPos, const TDesC& aText, MUnifiedEditor& aTarget) const;
+	void Add(TInt aPos, const TDesC& aText);
+	};
+
+/**
+ * Implementation of plain text deletion for use by plain & rich text
+ * deletion commands.
+ * Used only in the implementation of command objects.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class TEditorDeletePlainTextImpl
+	{
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+	TInt		iLength;
+
+public:
+	TEditorDeletePlainTextImpl(MUnifiedEditor& aTarget, TInt aPos,
+		TInt aLength) : iTarget(aTarget), iPos(aPos), iLength(aLength) {}
+	MUnifiedEditor& Target() const	{ return iTarget; }
+	TInt Pos() const			{ return iPos; }
+	TInt Length() const			{ return iLength; }
+	TInt ExecuteL() const;
+	TBool CanAdd(TInt aPos, TInt aLength, MUnifiedEditor& aTarget) const;
+	void Add(TInt aLength);
+	};
+
+/**
+ * Implementation class for pasting text
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class TEditorPasteProtoImpl
+	{
+	MUnifiedEditor&					iTarget;
+	const CStreamStore*			iStore;
+	const CStreamDictionary*	iStreamDictionary;
+	TInt						iPos;
+public:
+	TEditorPasteProtoImpl(MUnifiedEditor& aTarget) : iTarget(aTarget) {}
+	void Set(const CStreamStore&, const CStreamDictionary&, TInt aPos);
+	TInt						Pos() const					{ return iPos; }
+	const CStreamStore&			Store() const				{ return *iStore; }
+	const CStreamDictionary&	StreamDictionary() const	{ return *iStreamDictionary; }
+	MUnifiedEditor&					Target() const				{ return iTarget; }
+
+	void						OpenPlainTextStreamLC(RStoreReadStream& aStream) const;
+	// returns length of text in plain text stream. Leaves with KErrNotSupported
+	// if there is no such stream.
+	TInt						LengthL() const;
+	TInt						ExecuteL() const;
+	};
+
+/**
+ * Prototype command for pasting plain text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandPastePlainTextProto) : public CEditorCommand
+	{
+	TEditorPasteProtoImpl iImpl;
+
+public:
+	CEditorCommandPastePlainTextProto(MUnifiedEditor& aTarget)
+		: iImpl(aTarget) {}
+	void Set(const CStreamStore& aStore,
+		const CStreamDictionary& aStreamDictionary,
+		TInt aPos);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+
+#endif	// EDITORPLAINTEXTCOMMANDS_H_