--- /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 <frmtlay.h>
+#include <frmtview.h>
+#include <tagma.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <tagmaLayoutAndSource.h>
+#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);
+ }
+
+