diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/FormCursorModifierUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/FormCursorModifierUtils.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,124 @@ +/* +* 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 +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#include "FromCursorModifierUtils.h" + +TFormCursorModifierUtils::~TFormCursorModifierUtils() + { + } + +TFormCursorModifierUtils::TFormCursorModifierUtils(CTextView& aTextView, CTextLayout& aTextLayout) : + iTextView(aTextView), + iTextLayout(aTextLayout) + { + } + +TTmDocPosSpec TFormCursorModifierUtils::DocPos() const + { + TTmDocPosSpec docPos = TTmDocPosSpec(); + TTmDocPos rawDocPos; + iTextView.GetCursorPos(rawDocPos); + docPos.iPos = rawDocPos.iPos; + TTmDocPosSpec::TType docPosType = rawDocPos.iLeadingEdge ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + docPos.iType = docPosType; + return docPos; + } + +void TFormCursorModifierUtils::SetDocPosL(const TTmDocPosSpec& aDocPos) + { + iTextView.SetDocPosL(aDocPos); + } + +TBool TFormCursorModifierUtils::IsRightToLeftParagraph(TTmDocPosSpec aPos) + { + TTmPosInfo2 posInfo; + TTmLineInfo lineInfo; + iTextLayout.TagmaTextLayout().FindDocPos(aPos, posInfo, lineInfo); + return lineInfo.iFlags & TTmLineInfo::EParRightToLeft; + } + +TBool TFormCursorModifierUtils::VisualCursorBetweenOpposingChunks() + { + TTmDocPosSpec pos = DocPos(); + CTmTextLayout::TTmChunkDescription leftChunk; + CTmTextLayout::TTmChunkDescription rightChunk; + iTextLayout.TagmaTextLayout().FindAdjacentChunks(pos, leftChunk, rightChunk); + + if (leftChunk.iRightToLeft != rightChunk.iRightToLeft) + return ETrue; + return EFalse; + } + + +void TFormCursorModifierUtils::ToggleVisualDocPosL() + { + TTmDocPosSpec pos = DocPos(); + pos.iType = (pos.iType == TTmDocPosSpec::ETrailing) ? TTmDocPosSpec::ELeading : TTmDocPosSpec::ETrailing; + SetDocPosL(pos); + } + + +void TFormCursorModifierUtils::ToggleLogicalDocPosL() + { + TTmDocPosSpec pos = DocPos(); + CTmTextLayout::TTmChunkDescription leftChunk; + CTmTextLayout::TTmChunkDescription rightChunk; + iTextLayout.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; + } + SetDocPosL(pos); + } + +