diff -r 000000000000 -r 1fb32624e06b textrendering/textformatting/undo/EditorPlainTextUndo.cpp --- /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(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); + } +