textrendering/textformatting/undo/EditorCommands.h
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/undo/EditorCommands.h	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,463 @@
+/*
+* 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 EDITORCOMMANDS_H_
+#define EDITORCOMMANDS_H_
+
+#include "unified_editor.h"
+#include "UniqueInstance.h"
+#include "UndoSystem.h"
+#include "EditorPlainTextCommands.h"
+
+// all the combinable commands:
+class CEditorCommandInsertTextAndFormat;
+class CEditorCommandDeleteText;
+class CEditorCommandDeleteCharFormat;
+class CEditorCommandDeleteParFormat;
+
+/**
+ * Pointers to the repositories used by the undo system.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+struct TRepositories
+	{
+	CUniqueInstanceRepository<TTmCharFormat>*	iChar;
+	CUniqueInstanceRepository<RTmParFormat>*	iPar;
+	CUniqueInstanceRepository<TDes>*			iDes;
+	};
+
+//
+// command prototypes
+//
+/**
+ * Base class for command prototypes. These prototypes are used to generate
+ * inverses. They do not need any copying to be sent into the undo system,
+ * executed, then recycled. Some also store a pointer to the last generated
+ * inverse so that they can add to it if two similar commands come along
+ * together.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class CEditorCommandProto : public CEditorCommand
+	{
+	const TRepositories& iReps;
+public:
+	CEditorCommandProto(const TRepositories& aReps)
+		: iReps(aReps) {}
+	const TRepositories& Repositories() const { return iReps; }
+	};
+
+/**
+ * Prototype command for creating a style.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandCreateStyleProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&	iTarget;
+	const RTmStyle*	iStyle;
+
+public:
+	CEditorCommandCreateStyleProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(const RTmStyle&);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for setting the attributes of a style.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandChangeStyleProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&		iTarget;
+	const RTmStyle*	iStyle;
+
+public:
+	CEditorCommandChangeStyleProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(const RTmStyle&);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for applying a style to a run of text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandSetStyleProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&			iTarget;
+	TInt					iPos;
+	TInt					iLength;
+	const TDesC*			iName;
+
+public:
+	CEditorCommandSetStyleProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos, TInt aLength,
+		const TDesC& aName);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for deleting a style.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDeleteStyleProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&				iTarget;
+	const TDesC*			iName;
+
+public:
+	CEditorCommandDeleteStyleProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(const TDesC& aName);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for setting the character format of a run of text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandSetCharFormatProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&				iTarget;
+	TInt						iPos;
+	TInt						iLength;
+	const TTmCharFormatLayer*	iFormat;
+
+public:
+	CEditorCommandSetCharFormatProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos,
+		TInt aLength,
+		const TTmCharFormatLayer& aFormat);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for setting the paragraph format of a run of text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandSetParFormatProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&					iTarget;
+	TInt						iPos;
+	TInt						iLength;
+	const RTmParFormatLayer*	iFormat;
+
+public:
+	CEditorCommandSetParFormatProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos,
+		TInt aLength,
+		const RTmParFormatLayer& aFormat);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for inserting text with specified character and paragraph
+ * format.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandInsertProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&						iTarget;
+	TInt								iPos;
+	const TDesC*						iText;
+	const TTmCharFormatLayer*			iCharFormat;
+	const RTmParFormatLayer*			iParFormat;
+	const TDesC*						iStyle;
+
+public:
+	CEditorCommandInsertProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos,
+		const TDesC& aText,
+		const TDesC* aStyle,
+		const TTmCharFormatLayer* aCharFormat,
+		const RTmParFormatLayer* aParFormat);
+
+	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(CEditorCommandDeleteProto) : public CEditorCommandProto
+	{
+	enum { KMaxCombinableReinsertCharacters = 20 };
+
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+	TInt		iLength;
+	// For adding inverse to last command
+	mutable TBuf<KMaxCombinableReinsertCharacters>	iDeletedText;
+
+public:
+	CEditorCommandDeleteProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), 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;
+	};
+
+/**
+ * Prototype command for setting the base format.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandSetBaseFormatProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&			iTarget;
+	const TTmCharFormat*	iChar;
+	const RTmParFormat*		iPar;
+
+public:
+	CEditorCommandSetBaseFormatProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(const TTmCharFormat* aCharFormat, const RTmParFormat* aParFormat);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for deleting specific character formatting.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDeleteCharFormatProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+	TInt		iLength;
+
+public:
+	CEditorCommandDeleteCharFormatProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos, TInt aLength);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for deleting specific paragraph formatting.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDeleteParFormatProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+	TInt		iLength;
+
+public:
+	CEditorCommandDeleteParFormatProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos, TInt aLength);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for deleting a picture.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDeletePictureProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&	iTarget;
+	TInt		iPos;
+
+public:
+	CEditorCommandDeletePictureProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos);
+
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for inserting a picture.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandInsertPictureProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&			iTarget;
+	TInt					iPos;
+	const TPictureHeader*	iPicture;
+
+public:
+	CEditorCommandInsertPictureProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(TInt aPos, const TPictureHeader& picture);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for renaming a style.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandRenameStyleProto) : public CEditorCommandProto
+	{
+	MUnifiedEditor&		iTarget;
+	const TDesC*	iOldName;
+	const TDesC*	iNewName;
+
+public:
+	CEditorCommandRenameStyleProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	void Set(const TDesC& aOldName, const TDesC& aNewName);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Prototype command for pasting text.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandPasteProto) : public CEditorCommandProto
+	{
+	TEditorPasteProtoImpl iImpl;
+
+public:
+	CEditorCommandPasteProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iImpl(aTarget) {}
+	void Set(const CStreamStore& aStore,
+		const CStreamDictionary& aStreamDictionary,
+		TInt aPos);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+/**
+ * Owner of a picture which will eventually pass on ownership.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class MPictureOwner
+	{
+public:
+	/**
+	 * Forgets the delegate that has been made next in line for
+	 * the picture.
+	 */
+	virtual void ForgetDelegate() = 0;
+	};
+
+class CEditorCommandInsertPicture;
+
+/**
+ * Prototype command for deleting a picture from the text without
+ * returning ownership.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+NONSHARABLE_CLASS(CEditorCommandDestroyPictureProto) : public CEditorCommandProto,
+	private MPictureOwner
+	{
+	MUnifiedEditor&								iTarget;
+	TInt									iPos;
+	/**
+	 * Will own picture after us.
+	 */
+	mutable CEditorCommandInsertPicture*	iPictureOwnerDelegate;
+
+	void ForgetDelegate();
+public:
+	CEditorCommandDestroyPictureProto(const TRepositories& aReps, MUnifiedEditor& aTarget)
+		: CEditorCommandProto(aReps), iTarget(aTarget) {}
+	~CEditorCommandDestroyPictureProto();
+	void Set(TInt aPos);
+
+	UndoSystem::CCommand* CreateInverseL() const;
+	TInt ExecuteL() const;
+	};
+
+namespace UndoSystem
+	{
+	/**
+	 * Finds the position of the first picture in the text. Returns
+	 * 'KNotFound' if there are none. This will not return any
+	 * picture characters that do not have attatched pictures.
+	 *
+	 * @internalComponent
+	 * @since App-frameworks6.1
+	 */
+	TInt FindPicture(const MUnifiedEditor& aTarget, TInt aPos, TInt aLength);
+	}
+
+#endif	// EDITORCOMMANDS_H_