--- /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
+