fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/aknfepuictrlpinyineep.cpp
changeset 0 eb1f2e154e89
child 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/aknfepuictrlpinyineep.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1620 @@
+/*
+* Copyright (c) 2008 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:           
+ *      Provides the CAknFepUICtrlPinyinEEP definition 
+ *
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include <eikenv.h>
+#include <eikappui.h>
+#include <AknsSkinInstance.h> 
+#include <AknsUtils.h> 
+#include <AknsDrawUtils.h> 
+#include <skinlayout.cdl.h>
+
+#include "aknlayoutscalable_avkon.cdl.h"
+#include "aknfepuictrlpinyineep.h"
+#include "aknfepuilayoutdatamgr.h"
+#include "aknfepchineseuidataconv.h"
+
+_LIT(KFullStop, "\x002E");
+
+_LIT( KToneMark1, "\x0020");
+_LIT( KToneMark2, "\x02CA");
+_LIT( KToneMark3, "\x02C7");
+_LIT( KToneMark4, "\x02CB");
+_LIT( KToneMark5, "\x02D9");
+_LIT( KLeftBracket, "\x0028");
+const TInt KControlNum = 1;
+const TInt KMaxCharNum = 200;
+const TInt KMaxDispNum = 200;
+
+// ---------------------------------------------------------
+// NewL function.
+// ---------------------------------------------------------
+//
+CAknFepUICtrlPinyinEEP* CAknFepUICtrlPinyinEEP::NewL( RWindow& aParent, CAknFepUiLayoutDataMgr* aLafDataMgr )
+    {
+    CAknFepUICtrlPinyinEEP* self=CAknFepUICtrlPinyinEEP::NewLC( aParent, aLafDataMgr );
+    CleanupStack::Pop(self); // self;
+    return self;
+    }
+
+// ---------------------------------------------------------
+// NewLC function.
+// ---------------------------------------------------------
+//
+CAknFepUICtrlPinyinEEP* CAknFepUICtrlPinyinEEP::NewLC( RWindow& aParent, CAknFepUiLayoutDataMgr* aLafDataMgr )
+    {
+    CAknFepUICtrlPinyinEEP* self = new(ELeave)CAknFepUICtrlPinyinEEP( aLafDataMgr );
+    CleanupStack::PushL( self );
+    self->ConstructL( aParent, aLafDataMgr);
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+CAknFepUICtrlPinyinEEP::~CAknFepUICtrlPinyinEEP()
+    {
+    if ( iEditableEntryPane )
+        {
+        delete iEditableEntryPane;
+        iEditableEntryPane = NULL;
+        }
+//    if ( iBgContext )
+//        {
+//        delete iBgContext;
+//        iBgContext = NULL;
+//        }
+    if ( iAbsoluteBuffer )
+        {
+        delete iAbsoluteBuffer;
+        iAbsoluteBuffer = NULL;
+        }
+    if ( iVisualBuffer )
+        {
+        delete iVisualBuffer;
+        iVisualBuffer = NULL;
+        }
+    iArray.ResetAndDestroy();
+    delete iKeystrokeArray;
+    delete iShowKeystrokeArray;
+    delete iPhraseArray;
+    delete iPhraseShowKeyStrokeArray;
+    delete iTempArray;
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl.
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::CountComponentControls() const
+    {
+    return KControlNum;
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl.
+// ---------------------------------------------------------
+//
+CCoeControl* CAknFepUICtrlPinyinEEP::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case EEditableEntryPane:
+            return iEditableEntryPane;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::Draw( const TRect& /*aRect*/) const
+    {
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SizeChanged()
+    {
+    LayoutContainedControls();
+    }
+
+// ---------------------------------------------------------
+// Set the text buffer and posit the cursor index.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetText( const TDesC& aDes, TInt aCursorIndex, TBool aMiniQwertyZhuyin )
+    {
+    iMiniQwertyZhuyin = aMiniQwertyZhuyin;
+    iAbsoluteUnderlineBeg = -1;
+    iAbsoluteUnderlineEnd = -1;
+    iAbsoluteHighlightBeg = -1;
+    iAbsoluteHighlightEnd = -1;
+    iArray.ResetAndDestroy();
+    TInt absoluteBufferLen = iAbsoluteBuffer->Length();
+    TInt desLen = aDes.Length();
+
+    if ( aCursorIndex > aDes.Length() )
+        {
+        aCursorIndex = aDes.Length();
+        }
+    else if ( aCursorIndex < 0 )
+        {
+        aCursorIndex = 0;
+        }
+
+    // cursor is at the end of buffer and add a character 
+    if ( aDes.Left( iAbsoluteBuffer->Length() ) == *iAbsoluteBuffer
+        && iAbsoluteCursorPos == iAbsoluteBuffer->Length() && aCursorIndex
+        == aDes.Length() )
+        {
+        Append( aDes.Right( aDes.Length() - iAbsoluteBuffer->Length() ) );
+        }
+    //    delete one character
+    else if ( iAbsoluteBuffer->Left( aCursorIndex ).Compare(aDes.Left(aCursorIndex)) == 0
+        && aCursorIndex < iAbsoluteCursorPos
+        && iAbsoluteBuffer->Compare( aDes ) != 0
+        && 0 == iAbsoluteBuffer->Right( absoluteBufferLen - iAbsoluteCursorPos ).Compare( 
+            aDes.Right( desLen - aCursorIndex)) )
+        {
+        Delete( iAbsoluteCursorPos - (iAbsoluteBuffer->Length()
+            - aDes.Length()), iAbsoluteBuffer->Length() - aDes.Length() );
+        }
+    else if ( iAbsoluteBuffer->Length() < aDes.Length()
+        && iAbsoluteBuffer->Left( iAbsoluteCursorPos )
+            == aDes.Left( iAbsoluteCursorPos )
+        && iAbsoluteBuffer->Right( iAbsoluteBuffer->Length()
+            - iAbsoluteCursorPos ) == aDes.Right( iAbsoluteBuffer->Length()
+            - iAbsoluteCursorPos ) && aCursorIndex - iAbsoluteCursorPos
+        == aDes.Length() - iAbsoluteBuffer->Length() )
+        {
+        TPtrC tmp = aDes.Mid( iAbsoluteCursorPos, aDes.Length()
+            - iAbsoluteBuffer->Length() );
+        Insert( iAbsoluteCursorPos, tmp );
+        }
+    else
+        {
+        SetText( aDes );
+        SetCursor( aCursorIndex );
+        }
+    }
+
+// ---------------------------------------------------------
+// Set the text buffer and posit the cursor index for zhuyin.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetTextForZhuyin( 
+    const TDesC& aDes, 
+    TInt aCursor, 
+    TInt aChineseCount, 
+    const TDesC& aJudgeSeed, 
+    TInt aKeystroke, 
+    TBool aInvalid,
+    TBool aMiniQwertyZhuyin)
+    {
+    iMiniQwertyZhuyin = aMiniQwertyZhuyin;
+    TInt actionType = EZhuyinNULL;
+    if ( aKeystroke == 0 && aJudgeSeed.Compare(iJudgeSeed) == 0)
+        {
+        actionType = EZhuyinMoveCursor;
+        }
+    else if ( aChineseCount == iChineseCount + 1 )
+        {
+        actionType = EZhuyinNULL;
+        }
+    else if ( aKeystroke == 0 && aJudgeSeed.Length() <= iJudgeSeed.Length() - 1)
+        {
+        actionType = EZhuyinDelete;
+        }
+    else
+        {
+        if ( aJudgeSeed.Length() == iJudgeSeed.Length())
+            {
+            if ( aJudgeSeed.Left(aKeystroke - 1).Compare(iJudgeSeed.Left(aKeystroke - 1)) == 0 
+                && aJudgeSeed.Mid(aKeystroke - 1,1).Compare(iJudgeSeed.Mid(aKeystroke - 1,1)) != 0 ) 
+                {
+                actionType = EZhuyinReplace;
+                }
+            else if ( aCursor == GetCursor() )
+                {
+                actionType = EZhuyinReplace;
+                }
+            else
+                {
+                actionType = EZhuyinMoveCursor;
+                }
+            }
+        else if ( aJudgeSeed.Length() == iJudgeSeed.Length() + 1)
+            {
+            actionType = EZhuyinInsert;
+            }
+        else if ( aJudgeSeed.Length() == iJudgeSeed.Length() - 1)
+            {
+            actionType = EZhuyinDelete;
+            }
+        else if ( KErrNotFound != iJudgeSeed.Find( aJudgeSeed ) )
+            {
+            actionType = EZhuyinDelete;
+            }
+        else
+            {
+            actionType = EZhuyinNULL;
+            }
+        }
+    iArray.ResetAndDestroy();
+    iJudgeSeed = aJudgeSeed;
+    iChineseCount = aChineseCount;
+    if ( iLastValid && aInvalid )
+        {
+        TInt newOffset = 0;
+        TPtrC ptr = iAbsoluteBuffer->Des();
+        for ( TInt i = 0; i < iOffset; i++ )
+            {
+            if ( ptr.Mid(i,1).Compare(KFullStop) == 0 )
+                {
+                continue;
+                }
+            newOffset++;
+            }
+        iOffset = newOffset;
+        }
+    else if ( !iLastValid && !aInvalid )
+        {
+        TInt newOffset = 0;
+        TInt i = 0;
+        TPtrC ptr = aDes;
+        for ( i = 0; i < iOffset && newOffset < ptr.Length(); )
+            {
+            if ( ptr.Mid(newOffset,1).Compare(KFullStop) != 0 )
+                {
+                i++;
+                }
+            newOffset++;
+            }
+        iOffset = newOffset;
+        }
+    iLastValid = !aInvalid;
+    switch ( actionType )
+        {
+        case EZhuyinInsert:
+            {
+            *iAbsoluteBuffer = aDes;
+            iAbsoluteCursorPos = aCursor;
+            this->CalculateVisualTextForInsert( 0, aDes );
+            this->iEditableEntryPane->SetText( *iVisualBuffer );
+            this->CalculateVisualIndex();
+            iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos
+                - iOffset );
+            }
+            break;
+        case EZhuyinReplace:
+            {
+            TRect panerect = iEditableEntryPane->Rect();
+            TAknTextLineLayout textPaneTextLayout = 
+                    CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+            const CFont* font = AknLayoutUtils::FontFromId(
+                textPaneTextLayout.iFont, 
+                NULL );
+            TInt lenToCursor = font->TextWidthInPixels( aDes.Mid( iOffset,
+                aCursor - iOffset ) );
+            if ( lenToCursor < panerect.Width() - panerect.Width()
+                *KLROffset/KDenominator * 2 )
+                {
+                *iAbsoluteBuffer = aDes;
+                iAbsoluteCursorPos = aCursor;
+                TInt stride = 0;
+                for (stride = 1;; stride ++ )
+                    {
+                    if ( iOffset + stride > aDes.Length() )
+                        {
+                        break;
+                        }
+                    TInt tmpFontLen = font->TextWidthInPixels( aDes.Mid(
+                        iOffset, stride ) );
+                    if ( tmpFontLen > panerect.Width() - panerect.Width()
+                        *KLROffset/KDenominator * 2 )
+                        {
+                        break;
+                        }
+                    }
+                *iVisualBuffer = aDes.Mid( iOffset, stride - 1 );
+                iEditableEntryPane->SetText( *iVisualBuffer );
+                iEditableEntryPane->SetCursorPosition( aCursor-iOffset );
+                }
+            else
+                {
+                SetText( aDes, aCursor );
+                }
+            CalculateVisualIndex();
+            break;
+            }
+        case EZhuyinDelete:
+            {
+            *iAbsoluteBuffer = aDes;
+            iAbsoluteCursorPos = aCursor;
+            this->CalculateVisualTextForDelete( 0, 0 );
+            this->iEditableEntryPane->SetText( *iVisualBuffer );
+            this->CalculateVisualIndex();
+            iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos
+                - iOffset );
+            }
+            break;
+        default:
+            SetText( aDes, aCursor );
+        }
+    }
+
+// ---------------------------------------------------------
+// Set the text buffer and maintain the current cursor position.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetText( const TDesC& aDes )
+    {
+    iAbsoluteCursorPos = 0;
+    iOffset = 0;
+    iAbsoluteBuffer->Des().Zero();
+    iVisualBuffer->Des().Zero();
+    *iAbsoluteBuffer = aDes;
+    CalculateVisualTextForMoveRight();
+    iEditableEntryPane->SetText( *iVisualBuffer );
+    CalculateVisualIndex();
+    }
+
+// ---------------------------------------------------------
+// Set the cursor position.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCursor( const TInt aIndex )
+    {
+    SetCursorForMoveRight( aIndex );
+    }
+
+// ---------------------------------------------------------
+// get the position index of cursor.The max cursor index must 
+// be larger than the length of text buffer by 1.
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetCursor()
+    {
+    return iAbsoluteCursorPos;
+    }
+
+// ---------------------------------------------------------
+// move cursor to the left by a 1 stride.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::MoveCursorLeft( TInt aStride  )
+    {
+    if ( iAbsoluteCursorPos - aStride < 0 )
+        {
+        return EFalse;
+        }
+    if ( iEditableEntryPane->MoveCursorLeft( aStride ) == 0 )
+        {
+        iAbsoluteCursorPos = iAbsoluteCursorPos - aStride;
+        }
+    else
+        {
+        iAbsoluteCursorPos = iAbsoluteCursorPos - aStride;
+        SetCursorForMoveLeft( iAbsoluteCursorPos );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// move cursor to the right by a 1 stride.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::MoveCursorRight( TInt aStride )
+    {
+    if ( iAbsoluteCursorPos + aStride > iAbsoluteBuffer->Length() )
+        {
+        return EFalse;
+        }
+    if ( iEditableEntryPane->MoveCursorRight( aStride ) == 0 )
+        {
+        iAbsoluteCursorPos = iAbsoluteCursorPos + aStride;
+        }
+    else
+        {
+        iAbsoluteCursorPos = iAbsoluteCursorPos + aStride;
+        SetCursorForMoveRight( iAbsoluteCursorPos );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// active the cursor,the cursor will be black and with a wink
+// this cursor state represent this control is focused.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::ActiveCursor()
+    {
+    iEditableEntryPane->ActiveCursor();
+    }
+
+// ---------------------------------------------------------
+// deactive the cursor, the cursor will be gray and no wink this cursor
+// state represent this control with no focus.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::DeactiveCursor()
+    {
+    iEditableEntryPane->DeactiveCursor();
+    }
+
+// ---------------------------------------------------------
+// enable the cursor,the cursor will be drawn.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::EnableCursor()
+    {
+    iEditableEntryPane->EnableCursor();
+    }
+
+// ---------------------------------------------------------
+// deactive the cursor, the cursor will not be drawn.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::DisableCursor()
+    {
+    iEditableEntryPane->DisableCursor();
+    }
+
+// ---------------------------------------------------------
+// set the beginning and ending index for the underline text.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetUnderline( TInt aBeg, TInt aEnd )
+    {
+    CAknFepUICtrlEEPControl::TSegment* tmp =
+        new CAknFepUICtrlEEPControl::TSegment ( aBeg, aEnd, CAknFepUICtrlEEPControl::EUnderline );
+    iArray.Append( tmp );
+
+    TInt visualUnderlineBeg = aBeg - iOffset;
+    TInt visualUnderlineEnd = aEnd - iOffset;
+
+    if (
+        visualUnderlineBeg < 0 &&
+        visualUnderlineEnd < 0
+        ||
+        visualUnderlineBeg> iVisualBuffer->Length() - 1 &&
+        visualUnderlineEnd> iVisualBuffer->Length() - 1
+    )
+        {
+        visualUnderlineBeg = -1;
+        visualUnderlineEnd = -1;
+        }
+    else
+        {
+        if ( visualUnderlineBeg < 0 )
+            {
+            visualUnderlineBeg = 0;
+            }
+        if ( visualUnderlineEnd> iVisualBuffer->Length() - 1 )
+            {
+            visualUnderlineEnd = iVisualBuffer->Length() - 1;
+            }
+        }
+    iEditableEntryPane->SetUnderline( visualUnderlineBeg, visualUnderlineEnd );
+
+    iAbsoluteUnderlineBeg = aBeg;
+    iAbsoluteUnderlineEnd = aEnd;
+    }
+
+// ---------------------------------------------------------
+// get the indexes for text with underline.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::GetUnderlineIndex( TInt& aBeg, TInt& aEnd )
+    {
+    aBeg = iAbsoluteUnderlineBeg;
+    aEnd = iAbsoluteUnderlineEnd;
+    }
+
+// ---------------------------------------------------------
+// set the indexes for the text with highlight
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetHighlight( TInt aBeg, TInt aEnd )
+    {
+    CAknFepUICtrlEEPControl::TSegment* tmp =
+        new CAknFepUICtrlEEPControl::TSegment ( aBeg, aEnd, CAknFepUICtrlEEPControl::EHighlight );
+    iArray.Append( tmp );
+
+    TInt visualHighlightBeg = aBeg - iOffset;
+    TInt visualHighlightEnd = aEnd - iOffset;
+
+    if (
+        visualHighlightBeg < 0 &&
+        visualHighlightEnd < 0
+        ||
+        visualHighlightBeg> iVisualBuffer->Length() - 1 &&
+        visualHighlightEnd> iVisualBuffer->Length() - 1
+    )
+        {
+        visualHighlightBeg = -1;
+        visualHighlightEnd = -1;
+        }
+    else
+        {
+        if ( visualHighlightBeg < 0 )
+            {
+            visualHighlightBeg = 0;
+            }
+        if ( visualHighlightEnd> iVisualBuffer->Length() - 1 )
+            {
+            visualHighlightEnd = iVisualBuffer->Length() - 1;
+            }
+        }
+    iEditableEntryPane->SetHighlight( visualHighlightBeg, visualHighlightEnd );
+
+    iAbsoluteHighlightBeg = aBeg;
+    iAbsoluteHighlightEnd = aEnd;
+    }
+
+// ---------------------------------------------------------
+// get the indexes for the text with highlight
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::GetHighlightIndex( TInt& aBeg, TInt& aEnd )
+    {
+    aBeg = iAbsoluteHighlightBeg;
+    aEnd = iAbsoluteHighlightEnd;
+    }
+
+// ---------------------------------------------------------
+// set keystroke index. 
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCursorIndexOfKeystroke( const TInt aStartIndex )
+    {
+    iIndex = aStartIndex;
+    }
+
+// ---------------------------------------------------------
+// get the keystroke index
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetCursorIndexOfKeystroke()
+    {
+    return iIndex;
+    }
+
+// ---------------------------------------------------------
+// whether this control will be actived.ETrue represent enable 
+// otherwise disable.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::Enable( TBool aEnable )
+    {
+    iEnabled = aEnable;
+    if ( aEnable == EFalse )
+        {
+        Reset();
+        DrawNow();
+        }
+    iEditableEntryPane->MakeVisible( aEnable );
+    MakeVisible( aEnable );
+    }
+	
+// ---------------------------------------------------------
+// return whether this control is enabled.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::IsEnabled() const
+    {
+    return iEnabled;
+    }
+
+// ---------------------------------------------------------
+// Get the info before cursor.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::GetText( TDes& aText )
+    {
+    aText = *iAbsoluteBuffer;
+    }
+
+// ---------------------------------------------------------
+// Get the info before cursor.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::GetDesBeforeCursor( TDes& aOut )
+    {
+    if ( iAbsoluteCursorPos == 0 )
+        {
+        return EFalse;
+        }
+    else
+        {
+        aOut = iAbsoluteBuffer->Mid( (iAbsoluteCursorPos - 1 ), 1 );
+        return ETrue;
+        }
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetToneMark( const TDesC& /*aToneMark*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetToneMarkValidity( TBool /*aValid*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetOverrideFontId( TInt /*aFontId*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetFlag( TInt /*aFlag*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::ClearFlag( TInt /*aFlag*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// From MAknFepUICtrlEditPane.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::IsFlagSet( TInt /*aFlag*/) const
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// Set the cursor index for moving to the left.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCursorForMoveLeft( const TInt aIndex )
+    {
+    iAbsoluteCursorPos = aIndex;
+    CalculateVisualTextForMoveLeft();
+    iEditableEntryPane->SetText( *iVisualBuffer );
+    iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos - iOffset );
+    CalculateVisualIndex();
+    }
+
+// ---------------------------------------------------------
+// Set the cursor index for moving to the right.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCursorForMoveRight( const TInt aIndex )
+    {
+    iAbsoluteCursorPos = aIndex;
+    CalculateVisualTextForMoveRight();
+    iEditableEntryPane->SetText( *iVisualBuffer );
+    iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos - iOffset );
+    CalculateVisualIndex();
+    }
+
+// ---------------------------------------------------------
+// Add some text at the end of buffer.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::Append( const TDesC& aDes )
+    {
+    if ( this->iAbsoluteCursorPos != this->iAbsoluteBuffer->Length() )
+        {
+        return EFalse;
+        }
+    else
+        {
+        if ( iAbsoluteBuffer->Length() + aDes.Length()
+            > iAbsoluteBuffer->Des().MaxLength() )
+            {
+            return EFalse;
+            }
+        iAbsoluteBuffer->Des().Append( aDes );
+        iAbsoluteCursorPos = iAbsoluteCursorPos + aDes.Length();
+        this->CalculateVisualTextForAppend( aDes );
+        this->iEditableEntryPane->SetText( *iVisualBuffer );
+        this->CalculateVisualIndex();
+        iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos - iOffset );
+        return ETrue;
+        }
+    }
+
+// ---------------------------------------------------------
+// delete the content begin with aBeg index, and with an aLen length.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::Delete( TInt aBeg, TInt aLen )
+    {
+    if ( aBeg < 0 || aLen < 0 || aBeg + aLen> iAbsoluteBuffer->Length() )
+        {
+        return EFalse;
+        }
+    else
+        {
+        iAbsoluteBuffer->Des().Delete( aBeg, aLen );
+        iAbsoluteCursorPos = aBeg;
+        this->CalculateVisualTextForDelete( aBeg, aLen );
+        this->iEditableEntryPane->SetText( *iVisualBuffer );
+        this->CalculateVisualIndex();
+        iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos - iOffset );
+        return ETrue;
+        }
+    }
+
+// ---------------------------------------------------------
+// Insert some text after aIndex character.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::Insert( TInt aIndex, const TDesC& aDes )
+    {
+    if ( iAbsoluteBuffer->Length() + aDes.Length() > iAbsoluteBuffer->Des().MaxLength() )
+        {
+        return EFalse;
+        }
+    iAbsoluteBuffer->Des().Insert( aIndex, aDes );
+    iAbsoluteCursorPos = iAbsoluteCursorPos + aDes.Length();
+    this->CalculateVisualTextForInsert( aIndex, aDes );
+    this->iEditableEntryPane->SetText( *iVisualBuffer );
+    this->CalculateVisualIndex();
+    iEditableEntryPane->SetCursorPosition( iAbsoluteCursorPos - iOffset );
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// Replace text from aBeg index to aBeg + aLen with aDes.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::Replace( TInt /*aBeg*/, TInt /*aLen*/,
+    const TDesC& /*aDes*/)
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// Reset private member viariable.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::Reset()
+    {
+    iIndex = 0;
+    iEnabled = EFalse;
+    iAbsoluteCursorPos = 0;
+    iOffset = 0;
+    iAbsoluteUnderlineBeg = -1;
+    iAbsoluteUnderlineEnd = -1;
+    iAbsoluteHighlightBeg = -1;
+    iAbsoluteHighlightEnd = -1;
+    iAbsoluteBuffer->Des().Zero();
+    iVisualBuffer->Des().Zero();
+    iEditableEntryPane->ResetAll();
+    iArray.ResetAndDestroy();
+    iJudgeSeed.Zero();
+    iLastValid = ETrue;
+    iChineseCount = 0;
+    }
+
+// ---------------------------------------------------------
+// Layout contained controls.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::LayoutContainedControls()
+    {
+    TRect outerRect;
+    TRect innerRect;
+    CalculateFrameRects( outerRect, innerRect );
+    TRect rect = Rect();
+    iEditableEntryPane->SetRect( rect );
+    }
+
+// ---------------------------------------------------------
+// layout the background frames.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::LayoutFrames()
+    {
+    TRect outerRect;
+    TRect innerRect;
+//    CalculateFrameRects( outerRect, innerRect );
+//    iBgContext->SetFrameRects( outerRect, innerRect );
+//    iBgContext->SetParentPos( PositionRelativeToScreen() );
+    }
+
+// ---------------------------------------------------------
+// layout its rectangles
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::LayoutRects()
+    {
+    TRect windowRect = 
+        CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EEEPWindowRect ));
+    TInt height = windowRect.Height();
+    TInt width = windowRect.Width();
+    windowRect.iTl.iY = 0;
+    windowRect.iTl.iX = 0;
+    windowRect.SetHeight( height );
+    windowRect.SetWidth( width );
+    iSize.SetSize( width, Rect().Height() );
+    }
+
+// ---------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------
+//
+CAknFepUICtrlPinyinEEP::CAknFepUICtrlPinyinEEP( CAknFepUiLayoutDataMgr* aLafDataMgr )
+    {
+    iIndex = 0;
+    iEnabled = EFalse;
+    iAbsoluteCursorPos = 0;
+    iAbsoluteUnderlineBeg = -1;
+    iAbsoluteUnderlineEnd = -1;
+    iAbsoluteHighlightBeg = -1;
+    iAbsoluteHighlightEnd = -1;
+    iOffset = 0;
+    iJudgeSeed.Zero();
+    iLastValid = ETrue;
+    iChineseCount = 0;
+    iChangeFlag = 0;
+    iAutoChangeFlag = 1;
+    iAllValidFlag = 1;
+    iInvalidKeystrokeIndex = 0;
+    iCandidateRefreshFlag = 0;
+    iDelimiterCount = 0;
+    iLafDataMgr = aLafDataMgr;
+    }
+
+// ---------------------------------------------------------
+// Two-phrase constructor.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::ConstructL( RWindow& aParent, CAknFepUiLayoutDataMgr* aLafDataMgr )
+    {
+    SetContainerWindowL( aParent );
+    iEditableEntryPane = CAknFepUICtrlEEPControl::NewL( Window(), aLafDataMgr );
+    iAbsoluteBuffer = HBufC::New( KMaxCharNum );
+    iVisualBuffer = HBufC::New( KMaxDispNum );
+    TRect outerRect = TRect();
+    TRect innerRect = TRect();
+    CalculateFrameRects( outerRect, innerRect );
+//    iBgContext = CAknsFrameBackgroundControlContext::NewL(
+//        KAknsIIDQsnFrPopupSub, outerRect, innerRect, ETrue );
+    iKeystrokeArray = new(ELeave)CDesCArrayFlat(1);
+    iShowKeystrokeArray = new(ELeave)CDesCArrayFlat(1);
+    iPhraseArray = new(ELeave)CDesCArrayFlat(1);
+    iPhraseShowKeyStrokeArray = new(ELeave)CDesCArrayFlat(1);
+    iTempArray = new(ELeave)CDesCArrayFlat(1);
+    iMiniQwertyZhuyin = EFalse;
+    iNeedClearDeliberateSelection = EFalse;
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for appending.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForAppend( const TDesC& aDes )
+    {
+    TRect panerect = iEditableEntryPane->Rect();
+    TAknTextLineLayout textPaneTextLayout = 
+            CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+    const CFont* font = AknLayoutUtils::FontFromId( textPaneTextLayout.iFont, 
+    NULL );
+
+    TInt lenToEnd = font->TextWidthInPixels( iAbsoluteBuffer->Right( iVisualBuffer->Length()
+        + aDes.Length() ) );
+    if ( lenToEnd <= panerect.Width() - panerect.Width()*KLROffset
+        /KDenominator * 2 )
+        {
+        *iVisualBuffer = iAbsoluteBuffer->Right( iVisualBuffer->Length()
+            + aDes.Length() );
+        }
+    else
+        {
+        this->CalculateVisualTextForMoveRight();
+        }
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for deleting.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForDelete( TInt /*aBeg*/,
+    TInt /*aLen*/)
+    {
+    TRect panerect = iEditableEntryPane->Rect();
+    TAknTextLineLayout textPaneTextLayout = 
+            CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+    const CFont* font = AknLayoutUtils::FontFromId( textPaneTextLayout.iFont, 
+    NULL );
+    iOffset = iOffset > iAbsoluteBuffer->Length()?iAbsoluteBuffer->Length():iOffset;
+    TInt lenToEnd = font->TextWidthInPixels( iAbsoluteBuffer->Right( iAbsoluteBuffer->Length()
+        - iOffset ) );
+    
+    TInt offsetLen = iAbsoluteCursorPos - iOffset;
+    if ( offsetLen < 0 )
+        {
+        offsetLen = 0;
+        }
+    TInt LenOffsetToCursor = font->TextWidthInPixels( iAbsoluteBuffer->Mid( 
+            iOffset, offsetLen ) );
+
+    if ( lenToEnd > 0 && iAbsoluteCursorPos >= iOffset && LenOffsetToCursor > panerect.Width()*KLROffset/KDenominator )
+        {
+        TInt stride = 0;
+        for (stride = 1;; stride ++ )
+            {
+            if ( iOffset + stride > iAbsoluteBuffer->Length() )
+                {
+                break;
+                }
+            TInt tmpFontLen = font->TextWidthInPixels( iAbsoluteBuffer->Mid(
+                iOffset, stride ) );
+            if ( tmpFontLen > panerect.Width() - panerect.Width()
+                *KLROffset/KDenominator * 2 )
+                {
+                break;
+                }
+            }
+        *iVisualBuffer = iAbsoluteBuffer->Mid( iOffset, stride - 1 );
+        }
+    else
+        {
+        this->CalculateVisualTextForMoveLeft();
+        }
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for inserting.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForInsert( TInt /*aIndex*/,
+    const TDesC& /*aDes*/)
+    {
+    TRect panerect = iEditableEntryPane->Rect();
+    TAknTextLineLayout textPaneTextLayout = 
+            CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+    const CFont* font = AknLayoutUtils::FontFromId( textPaneTextLayout.iFont, 
+    NULL );
+    
+    TInt offsetLen = iAbsoluteCursorPos - iOffset;
+    if ( offsetLen < 0 )
+        {
+        offsetLen = 0;
+        }
+
+    TInt lenToCursor = font->TextWidthInPixels( iAbsoluteBuffer->Mid(
+        iOffset, offsetLen ) );
+    if ( lenToCursor < panerect.Width()* KCursorResetStartOffset / KDenominator
+        || iAbsoluteCursorPos == iAbsoluteBuffer->Length()
+        && lenToCursor <= panerect.Width() - panerect.Width()*KLROffset/KDenominator * 2)
+        {
+        TInt stride = 0;
+        for (stride = 1;; stride ++ )
+            {
+            if ( iOffset + stride > iAbsoluteBuffer->Length() )
+                {
+                break;
+                }
+            TInt tmpFontLen = font->TextWidthInPixels( iAbsoluteBuffer->Mid(
+                iOffset, stride ) );
+            if ( tmpFontLen > panerect.Width() - panerect.Width()
+                *KLROffset/KDenominator * 2 )
+                {
+                break;
+                }
+            }
+        *iVisualBuffer = iAbsoluteBuffer->Mid( iOffset, stride - 1 );
+        }
+    else
+        {
+        this->CalculateVisualTextForMoveRight();
+        }
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for replacing.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForReplace( TInt /*aBeg*/,
+    TInt /*aLen*/, const TDesC& /*aDes*/)
+    {
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for moving to left.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForMoveLeft()
+    {
+    TRect panerect = iEditableEntryPane->Rect();
+    TAknTextLineLayout textPaneTextLayout = 
+            CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+    const CFont* font = AknLayoutUtils::FontFromId( textPaneTextLayout.iFont, 
+    NULL );
+    TInt absolutelength = font->TextWidthInPixels( *iAbsoluteBuffer );
+    TInt
+        cursorToBegLength =
+            font->TextWidthInPixels( iAbsoluteBuffer->Left( iAbsoluteCursorPos ) );
+    if ( iAbsoluteCursorPos > iAbsoluteBuffer->Length() + 1 )
+        {
+        iAbsoluteCursorPos = iAbsoluteBuffer->Length() + 1;
+        }
+    TInt lenPixelToVisualBeg = panerect.Width() * KCursorResetOffset
+        / KDenominator;
+    TInt stride = 0;
+    TInt visualBeg = 0;
+    TInt visualEnd = 0;
+    for (stride = 1;; stride ++ )
+        {
+        if ( 0 > iAbsoluteCursorPos - stride )
+            {
+            visualBeg = 0;
+            break;
+            }
+        TInt tmpFontLen = font->TextWidthInPixels( iAbsoluteBuffer->Mid(
+            iAbsoluteCursorPos - stride, stride ) );
+        if ( tmpFontLen > lenPixelToVisualBeg )
+            {
+            visualBeg = iAbsoluteCursorPos - stride + 1;
+            break;
+            }
+        }
+        
+    //Fix for bug ESXU-7U68JT, let adjustment of visualBeg before caculation of visualEnd. 
+    //For one, calculation always start before "(" for miniqwertyzhuyin
+    //For two, because characters(markers) might have different length in pixel, it's better recalculate visualEnd
+    // after changing visualBeg, therefore move changing visualBeg ahead of caculation take effect too.
+    if ( iMiniQwertyZhuyin && 
+        iAbsoluteBuffer->Length() > 0 && 
+        visualBeg >= iPhraseArray->Count() )
+        {
+        while ( visualBeg > 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KLeftBracket ) != 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark1 ) != 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark2 ) != 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark3 ) != 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark4 ) != 0 &&
+            iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark5 ) != 0 )
+            {
+            visualBeg--;
+            }
+        }
+
+    for (stride = 1;; stride ++ )
+        {
+        if ( visualBeg + stride > iAbsoluteBuffer->Length() )
+            {
+            visualEnd = visualBeg + stride - 1;
+            break;
+            }
+        TPtrC tempString = iAbsoluteBuffer->Mid(visualBeg, stride );
+        TInt tmpFontLen = font->TextWidthInPixels( tempString );
+        if ( tmpFontLen > panerect.Width() - panerect.Width() *KLROffset
+            /KDenominator * 2 )
+            {
+            visualEnd = visualBeg + stride - 1;
+            //visualEnd = visualBeg + stride;
+            break;
+            }
+        }
+    *iVisualBuffer = iAbsoluteBuffer->Mid( visualBeg, visualEnd - visualBeg );
+    this->iOffset = visualBeg;
+    }
+
+// ---------------------------------------------------------
+// Calculate visual text for moving to the right.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualTextForMoveRight()
+    {
+    TRect panerect = iEditableEntryPane->Rect();
+    TAknTextLineLayout textPaneTextLayout = 
+            CAknFepChineseUIDataConv::AnyToTextLine( iLafDataMgr->RequestData( EEEPTextLine ));
+    const CFont* font = AknLayoutUtils::FontFromId( textPaneTextLayout.iFont, 
+    NULL );
+    TInt absolutelength = font->TextWidthInPixels( *iAbsoluteBuffer );
+    TInt cursorToEndLength =
+        font->TextWidthInPixels( iAbsoluteBuffer->Mid( iAbsoluteCursorPos,
+            iAbsoluteBuffer->Length() - iAbsoluteCursorPos ) );
+    if ( iAbsoluteCursorPos > iAbsoluteBuffer->Length() + 1 )
+        {
+        iAbsoluteCursorPos = iAbsoluteBuffer->Length() + 1;
+        }
+    if ( absolutelength <= panerect.Width() - panerect.Width()*KLROffset
+        /KDenominator * 2 )
+        {
+        *iVisualBuffer = *iAbsoluteBuffer;
+        }
+    else if ( cursorToEndLength < panerect.Width() * KCursorResetOffset
+        / KDenominator )
+        {
+        TInt tmp70VisualEnd = iAbsoluteCursorPos;
+        TInt visualBeg = 0;
+        TInt visualEnd = 0;
+        TInt stride = 0;
+        visualEnd = iAbsoluteBuffer->Length();
+        for (stride = 1;; stride ++ )
+            {
+            TInt tmpFontLen = font->TextWidthInPixels( iAbsoluteBuffer->Mid(
+                tmp70VisualEnd - stride, stride ) );
+            if ( tmpFontLen > panerect.Width() * (KDenominator - 
+                KLROffset * 2 - KCursorResetOffset ) / KDenominator )
+                {
+                visualBeg = tmp70VisualEnd - stride + 1;
+                break;
+                }
+            }
+        if ( iMiniQwertyZhuyin &&
+            iAbsoluteBuffer->Length( ) > 0 &&
+            visualBeg >= iPhraseArray->Count() )
+            {
+            while ( iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KLeftBracket ) != 0 &&
+                iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark1 ) != 0 &&
+                iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark2 ) != 0 &&
+                iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark3 ) != 0 &&
+                iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark4 ) != 0 &&
+                iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark5 ) != 0 )
+                {
+                visualBeg++;
+                //                visualEnd++;
+                }
+            }
+        *iVisualBuffer = iAbsoluteBuffer->Right( visualEnd - visualBeg );
+        this->iOffset = visualBeg;
+        }
+    else
+        {
+        TInt absoluteOffset = font->TextWidthInPixels( 
+            iAbsoluteBuffer->Left( iAbsoluteCursorPos ) );
+        if ( absoluteOffset < panerect.Width() * 
+            KCursorResetStartOffset / KDenominator)
+            {
+            TInt stride = 0;
+            for (stride = 1;; stride ++ )
+                {
+                TInt tmpFontLen = font->TextWidthInPixels( 
+                    iAbsoluteBuffer->Left( stride ) );
+                if ( tmpFontLen > panerect.Width() - panerect.Width()
+                    *KLROffset /KDenominator * 2 )
+                    {
+                    *iVisualBuffer = iAbsoluteBuffer->Left( stride - 1 );
+                    this->iOffset = 0;
+                    break;
+                    }
+                }
+            }
+        else
+            {
+            TInt lenPixelToVisualEnd = panerect.Width() * KCursorResetOffset
+                / KDenominator;
+            TInt stride = 0;
+            TInt visualBeg = 0;
+            TInt visualEnd = 0;
+            for (stride = 1;; stride ++ )
+                {
+                if ( iAbsoluteBuffer->Length() < iAbsoluteCursorPos + stride )
+                    {
+                    visualEnd = iAbsoluteBuffer->Length();
+                    break;
+                    }
+                TInt tmpFontLen = font->TextWidthInPixels( 
+                    iAbsoluteBuffer->Mid( iAbsoluteCursorPos, stride ) );
+                if ( tmpFontLen > lenPixelToVisualEnd )
+                    {
+                    visualEnd = iAbsoluteCursorPos + stride - 1;
+                    break;
+                    }
+                }
+            for (stride = 1;; stride ++ )
+                {
+                TInt tmpFontLen = font->TextWidthInPixels( 
+                    iAbsoluteBuffer->Mid( visualEnd - stride, stride ) );
+                if ( tmpFontLen > panerect.Width() - panerect.Width()
+                    *KLROffset /KDenominator * 2 )
+                    {
+                    visualBeg = visualEnd - stride + 1;
+                    break;
+                    }
+                }
+            if ( iMiniQwertyZhuyin && 
+                iAbsoluteBuffer->Length( ) > 0 &&
+                visualBeg >= iPhraseArray->Count() )
+                {
+                while ( iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KLeftBracket ) != 0 &&
+                    iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark1 ) != 0 &&
+                    iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark2 ) != 0 &&
+                    iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark3 ) != 0 &&
+                    iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark4 ) != 0 &&
+                    iAbsoluteBuffer->Mid( visualBeg, 1 ).Compare( KToneMark5 ) != 0 )
+                    {
+                    visualBeg++;
+                    //                    visualEnd++;
+                    }
+                }
+            *iVisualBuffer = iAbsoluteBuffer->Mid( visualBeg, visualEnd
+                - visualBeg );
+            this->iOffset = visualBeg;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// Calculate the underline indexes and highlight indexes according to the
+// absolute value.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateVisualIndex()
+    {
+    for (TInt i = 0; i < iArray.Count(); i++ )
+        {
+        TInt left = iArray[i]->iBegin - iOffset;
+        TInt right = iArray[i]->iEnd - iOffset;
+        if (
+            left < 0 &&
+            right < 0
+            ||
+            left> iVisualBuffer->Length() - 1 &&
+            right> iVisualBuffer->Length() - 1
+           )
+            {
+            left = -1;
+            right = -1;
+            }
+        else
+            {
+            if ( left < 0 )
+                {
+                left = 0;
+                }
+            if ( right> iVisualBuffer->Length() - 1 )
+                {
+                right = iVisualBuffer->Length() - 1;
+                }
+            }
+        if ( iArray[i]->iStyle == CAknFepUICtrlEEPControl::EHighlight )
+            {
+            iEditableEntryPane->SetHighlight( left, right );
+            }
+        else if ( iArray[i]->iStyle == CAknFepUICtrlEEPControl::EUnderline )
+            {
+            iEditableEntryPane->SetUnderline( left, right );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// layout the background frames.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::CalculateFrameRects( TRect& aOuterRect,
+    TRect& aInnerRect ) const
+    {
+    TRect windowRect = CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EPopupRectEEP ));
+    TAknLayoutRect eepFirstHorizLineLayoutRect = CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( EEEPFirstHorizLine ));
+    TRect eepFirstHorizLineRect = eepFirstHorizLineLayoutRect.Rect();
+    TInt rectHeight = eepFirstHorizLineRect.iBr.iY - windowRect.iTl.iY + 2;
+    TInt rectWidth = windowRect.Width( );
+    windowRect.iTl.iX = 0;
+    windowRect.iTl.iY = 0;
+    windowRect.SetHeight( rectHeight );
+    windowRect.SetWidth( rectWidth );
+
+    TAknLayoutRect topLeft;
+    topLeft.LayoutRect( windowRect,
+        SkinLayout::Submenu_skin_placing_Line_2() );
+
+    TAknLayoutRect bottomRight;
+    bottomRight.LayoutRect( windowRect,
+        SkinLayout::Submenu_skin_placing_Line_5() );
+
+    aOuterRect = TRect( topLeft.Rect().iTl, bottomRight.Rect().iBr );
+    aInnerRect = TRect( topLeft.Rect().iBr, bottomRight.Rect().iTl );
+    }
+
+// ---------------------------------------------------------
+// Return kestroke array.
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlPinyinEEP::KeystrokeArray()
+    {
+    return iKeystrokeArray;
+    }
+
+// ---------------------------------------------------------
+// Return kescode array.
+// ---------------------------------------------------------
+//
+RArray<TInt>* CAknFepUICtrlPinyinEEP::KeycodeArray()
+    {
+    return &iKeycodeArray;
+    }
+
+// ---------------------------------------------------------
+// Return kescode array.
+// ---------------------------------------------------------
+//
+RArray<TInt>* CAknFepUICtrlPinyinEEP::PhraseKeycodeArray()
+    {
+    return &iPhraseKeycodeArray;
+    }
+
+// ---------------------------------------------------------
+// Return show kestroke array.
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlPinyinEEP::ShowKeystrokeArray()
+    {
+    return iShowKeystrokeArray;
+    }
+
+// ---------------------------------------------------------
+// Return choose chinese charater array.
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlPinyinEEP::PhraseArray()
+    {
+    return iPhraseArray;
+    }
+
+// ---------------------------------------------------------
+// Return choose chinese charater show keystroke array.
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlPinyinEEP::PhraseShowKeyStrokeArray()
+    {
+    return iPhraseShowKeyStrokeArray;
+    }
+// ---------------------------------------------------------
+// Return temp array.
+// ---------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlPinyinEEP::TempArray()
+    {
+    return iTempArray;
+    }
+
+// ---------------------------------------------------------
+// Reset private member viariable array.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::ResetAllArray()
+    {
+    iKeystrokeArray->Reset();
+    iKeystrokeArray->Compress();
+    iKeycodeArray.Reset();
+    iShowKeystrokeArray->Reset();
+    iShowKeystrokeArray->Compress();
+    iPhraseArray->Reset();
+    iPhraseArray->Compress();
+    iPhraseKeycodeArray.Reset();
+    iPhraseShowKeyStrokeArray->Reset();
+    iPhraseShowKeyStrokeArray->Compress();
+    iTempArray->Reset();
+    iTempArray->Compress();
+    iAllValidFlag = 1;
+    iInvalidKeystrokeIndex = 0;
+    iCandidateRefreshFlag = 0;
+    iDelimiterCount = 0;
+    }
+
+// ---------------------------------------------------------
+// change state flag.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetChangeState( TBool aState )
+    {
+    iChangeFlag = aState;
+    }
+
+// ---------------------------------------------------------
+// check change state flag.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::IsChangeState()
+    {
+    return iChangeFlag;
+    }
+
+// ---------------------------------------------------------
+// Set auto change state flag.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetAutoChangeStateFlag( TBool aState )
+    {
+    iAutoChangeFlag = aState;
+    }
+
+// ---------------------------------------------------------
+// Set auto change state flag.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::GetAutoChangeStateFlag()
+
+    {
+    return iAutoChangeFlag;
+    }
+
+// ---------------------------------------------------------
+// Set all the keystroke valid flag.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetAllValidFlag( TBool aState )
+    {
+    iAllValidFlag = aState;
+    }
+
+// ---------------------------------------------------------
+// Set all the keystroke valid flag.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::GetAllValidFlag()
+    {
+    return iAllValidFlag;
+    }
+
+// ---------------------------------------------------------
+// Set is Phrase creation.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetPhraseCreationFlag( TBool aState )
+    {
+    iPhraseCreation = aState;
+    }
+
+// ---------------------------------------------------------
+// Is Phrase creation.
+// ---------------------------------------------------------
+//
+TBool CAknFepUICtrlPinyinEEP::GetPhraseCreationFlag()
+    {
+    return iPhraseCreation;
+    }
+
+// ---------------------------------------------------------
+// Set the keystroke invalid index.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetInvalidIndex( TInt aInvalidIndex )
+    {
+    iInvalidKeystrokeIndex = aInvalidIndex;
+    }
+
+// ---------------------------------------------------------
+// Get all the invalid keystroke index.
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetInvalidIndex()
+    {
+    return iInvalidKeystrokeIndex;
+    }
+
+// ---------------------------------------------------------
+// Set Phrase Candidate state need refresh UI flag.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCandidateRefreshFlag( TBool aState )
+    {
+    iCandidateRefreshFlag = aState;
+    }
+
+// ---------------------------------------------------------
+// Get Phrase Candidate state need refresh UI flag.
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetCandidateRefreshFlag()
+    {
+    return iCandidateRefreshFlag;
+    }
+
+// ---------------------------------------------------------
+// Set the delimiter count of keystroke.
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetDelimiterCount( TInt aCount )
+    {
+    iDelimiterCount = aCount;
+    }
+
+// ---------------------------------------------------------
+// Get the delimiter count of keystroke.
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetDelimiterCount()
+    {
+    return iDelimiterCount;
+    }
+
+// ---------------------------------------------------------
+// Get current cba resource id. 
+// ---------------------------------------------------------
+//
+TInt CAknFepUICtrlPinyinEEP::GetCurrentCBAResID()
+    {
+    return iCurrentCBAResId;
+    }
+
+// ---------------------------------------------------------
+// Set current cba resource id. 
+// ---------------------------------------------------------
+//
+void CAknFepUICtrlPinyinEEP::SetCurrentCBAResID( TInt aResourceId )
+    {
+    iCurrentCBAResId = aResourceId;
+    }
+
+void CAknFepUICtrlPinyinEEP::SetEffictiveLength( TInt aLength )
+    {
+    iEffictiveLength = aLength;
+    }
+
+TInt CAknFepUICtrlPinyinEEP::GetEffictiveLength()
+    {
+    return iEffictiveLength;
+    }
+
+void CAknFepUICtrlPinyinEEP::AddEffictiveLength()
+    {
+    iEffictiveLength++;
+    }
+
+void CAknFepUICtrlPinyinEEP::DecEffictiveLength()
+    {
+    iEffictiveLength--;
+    }
+
+void CAknFepUICtrlPinyinEEP::SetNeedClearDeliberateSelection( TBool aNeedClearDeliberateSelection )
+    {
+    iNeedClearDeliberateSelection = aNeedClearDeliberateSelection;
+    }
+
+TBool CAknFepUICtrlPinyinEEP::NeedClearDeliberateSelection()
+    {
+    return iNeedClearDeliberateSelection;
+    }
+
+// End of file
+