diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/akncursormanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/akncursormanager.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,163 @@ +/* +* Copyright (c) 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 +#include +#include +#include +#include +#include +#include + +#include "akncursormanager.h" + +CAknCursorManager* CAknCursorManager::NewL(CAknEdwinState* aEdwinState) + { + CAknCursorManager* self = new (ELeave) CAknCursorManager(aEdwinState); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CAknCursorManager::~CAknCursorManager() + { + } + + +TTmDocPosSpec CAknCursorManager::DocPos() const + { + TTmDocPosSpec docPos = TTmDocPosSpec(); + if (TextView()) + { + TTmDocPos rawDocPos; + TextView()->GetCursorPos(rawDocPos); + docPos.iPos = rawDocPos.iPos; + TTmDocPosSpec::TType docPosType = rawDocPos.iLeadingEdge ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + docPos.iType = docPosType; + } + return docPos; + } + +void CAknCursorManager::SetDocPosL(const TTmDocPosSpec& aDocPos) + { + if (TextView()) + TextView()->SetDocPosL(aDocPos); + } + +TBool CAknCursorManager::IsRightToLeftParagraph(TTmDocPosSpec aPos) + { + TTmPosInfo2 posInfo; + TTmLineInfo lineInfo; + TextLayout()->TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo); + return lineInfo.iFlags & TTmLineInfo::EParRightToLeft; + } + +TBool CAknCursorManager::VisualCursorBetweenOpposingChunks() + { + TTmDocPosSpec pos = DocPos(); + CTmTextLayout::TTmChunkDescription leftChunk; + CTmTextLayout::TTmChunkDescription rightChunk; + TextLayout()->TagmaTextLayout().FindAdjacentChunks(pos, leftChunk, rightChunk); + + if (leftChunk.iRightToLeft != rightChunk.iRightToLeft) + return ETrue; + return EFalse; + } + + +void CAknCursorManager::ToggleVisualDocPosL() + { + TTmDocPosSpec pos = DocPos(); + pos.iType = (pos.iType == TTmDocPosSpec::ETrailing) ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + TextView()->SetDocPosL(pos); + } + + +void CAknCursorManager::ToggleLogicalDocPosL() + { + TTmDocPosSpec pos = DocPos(); + CTmTextLayout::TTmChunkDescription leftChunk; + CTmTextLayout::TTmChunkDescription rightChunk; + TextLayout()->TagmaTextLayout().FindAdjacentChunks(pos, leftChunk, rightChunk); + + TBool MoveToLeftChunk = EFalse; + TBool MoveToRightChunk = EFalse; + + if ((!leftChunk.iRightToLeft && pos.iPos == leftChunk.iEnd) || + (leftChunk.iRightToLeft && pos.iPos == leftChunk.iStart)) + MoveToRightChunk = ETrue; + + else if ((!rightChunk.iRightToLeft && pos.iPos == rightChunk.iStart) || + (rightChunk.iRightToLeft && pos.iPos == rightChunk.iEnd)) + MoveToLeftChunk = ETrue; + + TBool toggleLeadingTrailing = EFalse; + if (leftChunk.iRightToLeft == rightChunk.iRightToLeft) + toggleLeadingTrailing = ETrue; + + if (MoveToLeftChunk) + { + if (toggleLeadingTrailing) + pos.iType = (pos.iType == TTmDocPosSpec::ETrailing) ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + if (!leftChunk.iRightToLeft) // LTR + pos.iPos = leftChunk.iEnd; + else //RTL + pos.iPos = leftChunk.iStart; + } + else if (MoveToRightChunk) + { + if (toggleLeadingTrailing) + pos.iType = (pos.iType == TTmDocPosSpec::ETrailing) ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + if (!rightChunk.iRightToLeft) // LTR + pos.iPos = rightChunk.iStart; + else //RTL + pos.iPos = rightChunk.iEnd; + } + TextView()->SetDocPosL(pos); + } + + +CAknCursorManager::CAknCursorManager(CAknEdwinState* aEdwinState) : + iEdwinState(aEdwinState) + { + } + +void CAknCursorManager::ConstructL() + { + } + +CAknEdwinFormAccessor* CAknCursorManager::FormAccessor() const + { + return iEdwinState->FormAccessor(); + } + +CTextLayout* CAknCursorManager::TextLayout() const + { + CAknEdwinFormAccessor* formAccessor = FormAccessor(); + if (formAccessor) + return formAccessor->GetTextLayout(); + return NULL; + } + +CTextView* CAknCursorManager::TextView() const + { + CAknEdwinFormAccessor* formAccessor = FormAccessor(); + if (formAccessor) + return formAccessor->GetTextView(); + return NULL; + } +