textrendering/textformatting/undo/EditorPlainTextUndo.cpp
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/undo/EditorPlainTextUndo.cpp	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,222 @@
+/*
+* 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: 
+*
+*/
+
+
+#include "EditorPlainTextUndo.h"
+#include "EditorPlainTextCommands.h"
+#include "UndoSystemImpl.h"
+
+using namespace UndoSystem;
+
+//////////////////////////////////////
+//									//
+//	CEditorPlainTextCommandFactory  //
+//									//
+//////////////////////////////////////
+
+/**
+ * Command factory. Used for obtaining 'command' versions of API calls to MUnifiedEditor
+ * for the plain text functions.
+ *
+ * @internalComponent
+ * @since App-frameworks6.1
+ */
+class CEditorPlainTextCommandFactory : public CBase
+	{
+public:
+	static CEditorPlainTextCommandFactory* NewL(MUnifiedEditor& aTarget)
+		{
+		return new(ELeave) CEditorPlainTextCommandFactory(aTarget);
+		}
+
+	// these commands set up the prototypes and then pass them back
+	const CEditorCommandInsertPlainTextProto*
+		GetInsertProto(TInt aPos, const TDesC& aText)
+		{
+		iInsertProto.Set(aPos, aText);
+		return &iInsertProto;
+		}
+	const CEditorCommandDeletePlainTextProto*
+		GetDeleteProto(TInt aPos, TInt aLength)
+		{
+		iDeleteProto.Set(aPos, aLength);
+		return &iDeleteProto;
+		}
+	const CEditorCommandPastePlainTextProto*
+		GetPasteProto(const CStreamStore& aStore,
+			const CStreamDictionary& aDictionary, TInt aPos)
+		{
+		iPasteProto.Set(aStore, aDictionary, aPos);
+		return &iPasteProto;
+		}
+private:
+	CEditorPlainTextCommandFactory(MUnifiedEditor& aTarget) :
+		iTarget(aTarget),
+		iInsertProto(aTarget),
+		iDeleteProto(aTarget),
+		iPasteProto(aTarget) {}
+
+	MUnifiedEditor&							iTarget;
+	// like Design Pattern prototypes, but not quite, because rather than
+	// being clonable, they create inverses of themselves
+	CEditorCommandInsertPlainTextProto	iInsertProto;
+	CEditorCommandDeletePlainTextProto	iDeleteProto;
+	CEditorCommandPastePlainTextProto	iPasteProto;
+	};
+
+
+////////////////////////////////
+//							  //
+//	CEditorPlainTextWithUndo  //
+//							  //
+////////////////////////////////
+
+CEditorPlainTextWithUndo::CEditorPlainTextWithUndo()
+	{
+	}
+
+void CEditorPlainTextWithUndo::ConstructL(MUnifiedEditor& aEditorBasedOn,
+	UndoSystem::CCommandManager& aSharedUndoSystem)
+	{
+	iBaseEditor = &aEditorBasedOn;
+	iFactory = CEditorPlainTextCommandFactory::NewL(aEditorBasedOn);
+	iCommandManager = &aSharedUndoSystem;
+	iCommandManager->NewReference();
+	}
+
+CEditorPlainTextWithUndo::~CEditorPlainTextWithUndo()
+	{
+	if (iCommandManager)
+		iCommandManager->Release();
+	delete iFactory;
+	}
+
+EXPORT_C CEditorPlainTextWithUndo* CEditorPlainTextWithUndo::NewL(MUnifiedEditor& aEditor,
+	UndoSystem::CCommandManager* aSharedUndoSystem)
+	{
+	__ASSERT_ALWAYS(aSharedUndoSystem,
+		UndoSystem::Panic(UndoSystem::KEditorUndoNoCommandManager));
+	CEditorPlainTextWithUndo* r = new(ELeave) CEditorPlainTextWithUndo;
+	CleanupStack::PushL(r);
+	r->ConstructL(aEditor, *aSharedUndoSystem);
+	CleanupStack::Pop(r);
+	return r;
+	}
+
+MTmOptionalInterface* CEditorPlainTextWithUndo::Interface(TUint aId)
+	{
+	MTmOptionalInterface* baseInterface = iBaseEditor->Interface(aId);
+	return aId == KUidMUnifiedEditorClipboardSupport?
+		static_cast<MUnifiedEditor::MClipboardSupport*>(this)
+		: baseInterface;
+	}
+
+void CEditorPlainTextWithUndo::InsertTextL(TInt aPos, const TDesC& aText,
+	const TDesC*, const TTmCharFormatLayer*, const RTmParFormatLayer*)
+	{
+	ASSERT(iFactory);
+	const CSingleCommand* proto =
+		iFactory->GetInsertProto(aPos, aText);
+	ASSERT(proto);
+	iCommandManager->ExecuteL(*proto);
+	}
+
+void CEditorPlainTextWithUndo::DeleteTextL(TInt aPos, TInt aLength)
+	{
+	ASSERT(iFactory);
+	const CSingleCommand* proto =
+		iFactory->GetDeleteProto(aPos, aLength);
+	ASSERT(proto);
+	iCommandManager->ExecuteL(*proto);
+	}
+
+void CEditorPlainTextWithUndo::CopyToStoreL(CStreamStore& aStore,
+											CStreamDictionary& aDictionary,
+											TInt aPos,
+											TInt aLength) const
+	{
+	ASSERT(iBaseEditor);
+	MUnifiedEditor::MClipboardSupport* ci = iBaseEditor->ClipboardSupport();
+	ASSERT(ci);
+	ci->CopyToStoreL(aStore, aDictionary, aPos, aLength);
+	}
+
+void CEditorPlainTextWithUndo::PasteFromStoreL(const CStreamStore& aStore,
+											   const CStreamDictionary& aDictionary,
+											   TInt aPos)
+	{
+	ASSERT(iFactory);
+	const CSingleCommand* proto =
+		iFactory->GetPasteProto(aStore, aDictionary, aPos);
+	ASSERT(proto);
+	iCommandManager->ExecuteL(*proto);
+	}
+
+void CEditorPlainTextWithUndo::SetBaseFormatL(const TTmCharFormat& aC,
+													   const RTmParFormat& aP)
+	{
+	iBaseEditor->SetBaseFormatL(aC, aP);
+	}
+
+void CEditorPlainTextWithUndo::SetCharFormatL(TInt aPos, TInt aLen, const TTmCharFormatLayer& aC)
+	{
+	iBaseEditor->SetCharFormatL(aPos, aLen, aC);
+	}
+
+void CEditorPlainTextWithUndo::SetParFormatL(TInt aPos, TInt aLen, const RTmParFormatLayer& aP)
+	{
+	iBaseEditor->SetParFormatL(aPos, aLen, aP);
+	}
+
+void CEditorPlainTextWithUndo::DeleteCharFormatL(TInt aPos, TInt aLen)
+	{
+	iBaseEditor->DeleteCharFormatL(aPos, aLen);
+	}
+
+void CEditorPlainTextWithUndo::DeleteParFormatL(TInt aPos, TInt aLen)
+	{
+	iBaseEditor->DeleteParFormatL(aPos, aLen);
+	}
+
+TInt CEditorPlainTextWithUndo::DocumentLength() const
+	{
+	return iBaseEditor->DocumentLength();
+	}
+
+void CEditorPlainTextWithUndo::GetText(TInt aPos, TPtrC& aText) const
+	{
+	iBaseEditor->GetText(aPos, aText);
+	}
+
+void CEditorPlainTextWithUndo::GetBaseFormatL(TTmCharFormat& aChar,
+													   RTmParFormat& aPar) const
+	{
+	iBaseEditor->GetBaseFormatL(aChar, aPar);
+	}
+
+void CEditorPlainTextWithUndo::GetCharFormat(TInt aPos, TFormatLevel aLevel,
+	TTmCharFormatLayer& aFormat,TInt& aRunLength) const
+	{
+	iBaseEditor->GetCharFormat(aPos, aLevel, aFormat, aRunLength);
+	}
+
+void CEditorPlainTextWithUndo::GetParFormatL(TInt aPos, TFormatLevel aLevel,
+	RTmParFormatLayer& aFormat, TInt& aRunLength) const
+	{
+	iBaseEditor->GetParFormatL(aPos, aLevel, aFormat, aRunLength);
+	}
+