--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputfingerhwr/src/peninputfingerhwrlayout.cpp Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,1278 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation for finger hwr UiLayout
+*
+*/
+
+
+//SYSTEM INCLUDES
+#include <bautils.h>
+#include <coemain.h>
+
+//FEP Includes
+#include <AknFepGlobalEnums.h>
+#include <aknfeppeninputenums.h>
+#include <peninputlayoutchoicelist.h>
+#include <settingsinternalcrkeys.h>
+#include <centralrepository.h>
+#include <peninputlayoutvkb.h>
+#include <AknFepGlobalEnums.h>
+#include <peninputcmdparam.h>
+#include <peninputdropdownlist.h>
+#include <peninputlayoutmultilineicf.h>
+
+//USER INCLUDES
+#include "peninputfingerhwrdatastore.h"
+#include "peninputfingerhwrstatemanager.h"
+#include "peninputfingerhwrevent.h"
+#include "peninputfingerhwrlayout.h"
+#include "peninputfingerhwrcontrolid.h"
+
+#include "peninputfingerhwrwnd.h"
+#include "peninputfingerhwrcn.rsg"
+
+//CONST DEFINATION
+_LIT( KFSHWRRssFile, "\\resource\\peninputfingerhwrcn.rsc" );
+
+const TUint8 KTempBufSize = 8;
+const TUint8 KIntLen = sizeof(TInt)/2;
+const TUint8 KIntSize = sizeof(TInt);
+
+const TInt16 KEmotionKeyMark = 0xFFFE;
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Symbian Constructor
+// ---------------------------------------------------------------------------
+//
+CPeninputFingerHwrLayout* CPeninputFingerHwrLayout::NewL(
+ MLayoutOwner* aLayoutOwner, const TAny* aInitData )
+ {
+ CPeninputFingerHwrLayout* self = new( ELeave ) CPeninputFingerHwrLayout(
+ aLayoutOwner );
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aInitData );
+ CleanupStack::Pop( self ); //self
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// handle the command from Fep.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::HandleCommand( const TInt aCmd, TUint8* aData )
+ {
+ TInt ret = KErrUnknown;
+ TRAPD(err, ret = HandleCommandL( aCmd, aData ) );
+ if ( err )
+ {
+ return KErrUnknown;
+ }
+ else
+ {
+ return ret;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// handle the command from Fep.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::HandleCommandL( const TInt aCmd, TUint8* aData )
+ {
+ if ( CFepUiLayout::HandleCommand( aCmd, aData ) == KErrNone )
+ {
+ return KErrNone;
+ }
+
+ TInt ret = KErrUnknown;
+ switch ( aCmd )
+ {
+ case ECmdPenInputEditorNumericKeyMap:
+ {
+ iDataStore->SetNumberMode( *(TAknEditorNumericKeymap*)aData );
+ OnNumMappingChangedL();
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputEditorCustomNumericKeyMap:
+ {
+ TInt len = *( TInt* )( aData - KIntSize );
+ TPtrC16 keymapRes( (TUint16*)aData, len / 2 );
+ iDataStore->SetCustomNumberModeL( keymapRes );
+ OnNumMappingChangedL();
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputPermittedRange:
+ {
+ TInt ranges = *(TInt*)aData;
+ iDataStore->SetPermittedRanges( ranges );
+ iHwrWnd->SetPermittedRanges( ranges );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputLanguage:
+ {
+ TInt language = *( TInt* )aData;
+ iDataStore->SetLanguageL( language );
+ iHwrWnd->SetInputLanguage( language );
+
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputRange:
+ {
+ TInt range = *( TInt* )aData;
+ iDataStore->SetPrimaryRange( range );
+ range = iDataStore->CurrentRange();
+ iHwrWnd->TryToChangeCharRange( range );
+
+ TBuf<KIntLen> buf;
+ buf.Append( reinterpret_cast<TText*>( aData ), KIntLen );
+
+ SignalOwner( ESignalRange, buf );
+
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputPermittedCase:
+ {
+ TInt cs = *( TInt* )aData;
+ iDataStore->SetPermittedCases( cs );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputCase:
+ {
+ TInt cs = *( TInt* )aData;
+ iDataStore->SetCase( cs );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputWindowOpen:
+ {
+ if( !iIsOpenFingerHWR )
+ {
+ iDataStore->GetKeyboardType();
+ iDataStore->SetKeyboardToQwerty();
+ }
+
+ LayoutOwner()->Hide( EFalse );
+ RootControl()->UpdateValidRegion( NULL, EFalse );
+
+ TRect hwrRect = iHwrWnd->WritingBoxRect();
+ TSize hwrSize = hwrRect.Size();
+ iDataStore->SetInputAreaSize(hwrSize);
+ iDataStore->SetScreenSize(hwrSize);
+ ChangeCurStateManagerToStandby();
+
+ iIsOpenFingerHWR = ETrue;
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputWindowClose:
+ {
+ iIsOpenFingerHWR = EFalse;
+
+ iDataStore->ResetKeyboardType();
+ LayoutOwner()->Hide( ETrue );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputSetTextAlignment:
+ {
+ iHwrWnd->SetTextAlignmentL( *aData, ELangPrcChinese );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputSetPromptText:
+ {
+ iHwrWnd->SetPromptTextL( aData );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputDimArrowKeys:
+ {
+ TBool IsDimArrowKeys = *aData;
+ iHwrWnd->DimArrowKeys( IsDimArrowKeys );
+ ret = KErrNone;
+ }
+ break;
+ case ECmdPenInputCharacterPreview:
+ {
+ iHwrWnd->ShowBubble(*aData);
+ }
+ break;
+ case ECmdPenInputEnableSettingBtn:
+ {
+ TBool isEnableSetting = *aData;
+ iHwrWnd->SetEnableSettingBtn(isEnableSetting);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// handle size changing event.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::SizeChanged( const TAny* /*pData*/ )
+ {
+ //Handle size change event
+ SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
+
+ TRAP_IGNORE( iHwrWnd->SizeChangedL( EFalse ) );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Handle editor text coming.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::OnAppEditorTextComing(
+ const TFepInputContextFieldData& aData )
+ {
+ if ( iHwrWnd )
+ {
+ TRAPD( err, iHwrWnd->SetEditorTextL( aData ) );
+ return err;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Handle application info change.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::HandleAppInfoChange( const TDesC& aInfo,
+ TPeninputAppInfo aType )
+ {
+ if ( aType == EAppIndicatorMsg )
+ {
+ TRAP_IGNORE( iHwrWnd->SetBubbleTextL( aInfo ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Called by owner when the system resource changed event.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::OnResourceChange( TInt aType )
+ {
+ CFepUiLayout::OnResourceChange( aType );
+ if ( aType == KAknsMessageSkinChange )
+ {
+ //Do other things when skin change
+ TInt newValue = GetPenTrailColor();
+ SetBoxPenColor(newValue);
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// get the peninput ui type.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::PenInputType()
+ {
+ return EPluginInputModeFingerHwr;
+ }
+
+// ---------------------------------------------------------------------------
+// Called by owner when the layout is going to be hidden.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnDeActivate()
+ {
+ iIsOpenFingerHWR = EFalse;
+ iDataStore->ResetKeyboardType();
+
+ //cancel writing
+ iHwrWnd->CancelWriting();
+
+ // Bring the expandable dropdown list back to right level
+ iHwrWnd->PredictiveList()->BringToBack();
+
+ //cancel range selector
+ if ( iHwrWnd->RangeDropListVisible() )
+ {
+ iHwrWnd->CancelRangeDropList();
+ }
+
+ if(iHwrWnd->CurrentCharRange() != EFingerHwrSymbolRange)
+ {
+ iHwrWnd->UpdateLayout( ETrue );
+ }
+
+ CFepUiLayout::OnDeActivate();
+ }
+
+// ---------------------------------------------------------------------------
+// handle control event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::HandleControlEvent( TInt aEventType,
+ CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+ {
+ TRAP_IGNORE( HandleControlEventL( aEventType, aCtrl, aEventData ) );
+ }
+
+// ---------------------------------------------------------------------------
+// handle control event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::HandleControlEventL( TInt aEventType,
+ CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+ {
+ switch ( aEventType )
+ {
+ case EEventButtonDown:
+ {
+ OnCtrlButtonDownL( aEventType, aCtrl, aEventData );
+ }
+ break;
+ case EEventButtonUp:
+ {
+ OnCtrlButtonUpL( aEventType, aCtrl, aEventData );
+ }
+ break;
+ case EEventChoiceSelected:
+ {
+ OnImeSelected( aEventType, aCtrl, aEventData );
+ }
+ break;
+
+ case EEventHwrCharacterTimerOut:
+ {
+ OnHwrCharacterFinishedL();
+ }
+ break;
+ case EEventHwrStrokeStarted:
+ {
+ OnHwrStrokeStartedL();
+ }
+ break;
+ case EEventHwrStrokeFinished:
+ {
+ OnHwrStrokeFinishedL();
+ }
+ break;
+ case EHwrEventKeyBack:
+ {
+ OnBackspaceClickedL();
+ }
+ break;
+ case EHwrEventNavKeyClicked:
+ {
+ OnRepButtonClickedL( aCtrl, aEventData );
+ }
+ break;
+ case EEventVirtualKeyDown:
+ {
+ OnVirtualKeyDownL( aCtrl, aEventData );
+ }
+ break;
+ case EEventVirtualKeyUp:
+ {
+ OnVirtualKeyUpL( aCtrl, aEventData );
+ }
+ break;
+ case EHwrEventCandidateSelected:
+ {
+ OnCandidateSelectedL( aCtrl, aEventData );
+ }
+ break;
+ case EHwrEventPredictiveSelected:
+ {
+ OnPredictSelectedL( aCtrl, aEventData );
+ }
+ break;
+ case EHwrEventGetNextCandidatePage:
+ {
+ OnCandidateWndEventL();
+ }
+ break;
+ case EEventIcfPointerUpEvent:
+ {
+ OnIcfClicked();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Get the data stroe object.
+// ---------------------------------------------------------------------------
+//
+CPeninputFingerHwrDataStore& CPeninputFingerHwrLayout::DataStore()
+ {
+ return *iDataStore;
+ }
+
+// ---------------------------------------------------------------------------
+// Delete the previous charcode and submit the new one
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::Replace( const TDesC& aOldCharCode,
+ const TDesC& aNewCharCode, const TBool aIsPart )
+ {
+ // user tries to correct the previous selection
+ // Delete the previous character and append the new one
+ HBufC* newCharBuf = HBufC::New( aNewCharCode.Length() + KIntLen );
+ if ( newCharBuf )
+ {
+ TInt len = aOldCharCode.Length();
+ if(len == 0 )
+ {
+ delete newCharBuf;
+ return;
+ }
+
+ newCharBuf->Des().Append( ( TUint16* )&len, KIntLen );
+ newCharBuf->Des().Append( aNewCharCode );
+ if ( aIsPart )
+ {
+ SignalOwner( ESignalReplacePartText, *newCharBuf );
+ }
+ else
+ {
+ SignalOwner( ESignalReplaceText, *newCharBuf );
+ }
+ delete newCharBuf;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Submit string to layout owner.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SubmitStringToFep( const TDesC& aCharCode )
+ {
+ SignalOwner( ESignalKeyEvent, aCharCode );
+ }
+
+// ---------------------------------------------------------------------------
+// Submit char to layout owner.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SubmitCharToFep( const TInt aCharCode )
+ {
+ TBuf<1> buf;
+ buf.Append( aCharCode );
+ SignalOwner( ESignalKeyEvent, buf );
+ }
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+// ---------------------------------------------------------------------------
+// Submit start position to layout owner.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SubmitStartPosToFep( TBool aSetPosFlag )
+ {
+ TBuf<4> buf;
+ TInt length = sizeof(TBool)/sizeof(TText);
+ buf.Append( reinterpret_cast<TText*>( &aSetPosFlag ), length );
+ SignalOwner( ESignalCharacterStart, buf );
+ }
+#endif
+
+// ---------------------------------------------------------------------------
+// repository callback for settings.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::HandleGSRepositoryCallBack( TAny* aPtr )
+ {
+ CPeninputFingerHwrLayout *self = static_cast<CPeninputFingerHwrLayout*>( aPtr );
+
+ CAknFepRepositoryWatcher* watcher = self->iGSRepositoryWatcher;
+ if ( watcher )
+ {
+ TInt newValue = self->GetNewValue( watcher, watcher->ChangedKey() );
+
+ switch ( watcher->ChangedKey() )
+ {
+ case KSettingsWritingSpeed:
+ {
+ self->SetWritingSpeed( newValue );
+ }
+ break;
+ case KSettingsPenWidth:
+ {
+ self->SetBoxPenSize( TSize( newValue, newValue ) );
+ }
+ break;
+ case KSettingsPenColor:
+ {
+ self->SetBoxPenColor( newValue );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// load default settings.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::LoadAndPublishDefaultL()
+ {
+ if(!iRepositorySetting)
+ {
+ return;
+ }
+
+ TInt newValue;
+
+ iRepositorySetting->Get( KSettingsWritingSpeed, newValue );
+ SetWritingSpeed( newValue );
+
+ iRepositorySetting->Get( KSettingsPenWidth, newValue );
+ SetBoxPenSize( TSize( newValue, newValue ) );
+
+ newValue = GetPenTrailColor();
+ SetBoxPenColor( newValue );
+
+ iRepositorySetting->Get( KSettingsPenInputLang, newValue );
+ iDataStore->SetLanguageL( newValue );
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SyncHwrStrokeEndMark( const TPoint& aEndMark )
+ {
+ iHwrWnd->SetStrokeEndMark( aEndMark );
+ }
+
+#ifndef RD_INTELLIGENT_TEXT_INPUT
+// ---------------------------------------------------------------------------
+// hide or show fixed english symbol list.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::HideTwoRowEngSymbolList( const TBool aIsHide )
+ {
+ iHwrWnd->HideTwoRowEngSymbolList( aIsHide );
+ }
+#endif // RD_INTELLIGENT_TEXT_INPUT
+
+// private
+
+// ---------------------------------------------------------------------------
+// c++ constructor
+// ---------------------------------------------------------------------------
+//
+CPeninputFingerHwrLayout::CPeninputFingerHwrLayout( MLayoutOwner* aLayoutOwner )
+ : CFepUiLayout( aLayoutOwner ), iLastOverlapIdx(KInvalidIndex)
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// c++ destructor
+// ---------------------------------------------------------------------------
+//
+CPeninputFingerHwrLayout::~CPeninputFingerHwrLayout()
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iResId );
+
+ delete iDataStore;
+ iStateMgrArray.ResetAndDestroy();
+ iStateMgrArray.Close();
+
+ delete iGSRepositoryWatcher;
+ delete iRepositorySetting;
+ }
+
+// ---------------------------------------------------------------------------
+// Symbian second-phase constructor
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::ConstructL( const TAny* aInitData )
+ {
+ BaseConstructL();
+ //load resource
+ TFileName resFileName( KFSHWRRssFile );
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+ BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resFileName );
+ iResId = coeEnv->AddResourceFileL( resFileName );
+
+ //initialze the data store
+ TPeninputLayoutData* layoutData = ( TPeninputLayoutData* )aInitData;
+
+ iDataStore = CPeninputFingerHwrDataStore::NewL( (*layoutData).iPtiEngine, this );
+
+ //create the repository for gereral settings
+ iRepositorySetting = CRepository::NewL( KCRUidPersonalizationSettings );
+
+ //create the repository watcher for general settings
+ iGSRepositoryWatcher = CAknFepRepositoryWatcher::NewL(
+ KCRUidPersonalizationSettings,
+ TCallBack( HandleGSRepositoryCallBack, this ),
+ iRepositorySetting );
+
+ //create state manager
+ CreateStateManagerL();
+
+ CreateHwrWindowL();
+
+ LoadAndPublishDefaultL();
+ //set screen layout extent
+ SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
+ }
+
+// ---------------------------------------------------------------------------
+// Create the hwr box window.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::CreateHwrWindowL()
+ {
+ iHwrWnd = CPeninputFingerHwrWnd::NewL( this, EHwrCtrlIdHwrWindow, EFalse );
+
+ iHwrWnd->SetResourceId( R_FINGERHWR_WINDOW );
+ iHwrWnd->ConstructFromResourceL();
+
+ iHwrWnd->SetStrokeEndMark( iDataStore->StrokeEndMark() );
+
+ AddControlL( iHwrWnd, EFalse );
+ }
+
+// ---------------------------------------------------------------------------
+// Create the state manager.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::CreateStateManagerL()
+ {
+ iStateMgrArray.AppendL( CPeninputFingerHwrStateManagerCn::NewL( this ) );
+ iStateMgrArray.AppendL( CPeninputFingerHwrStateManagerEn::NewL( this ) );
+ iStateMgrArray.AppendL( CPeninputFingerHwrStateManagerNum::NewL( this ) );
+ }
+
+// ---------------------------------------------------------------------------
+// handler of button down event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnCtrlButtonDownL( TInt /*aEventType*/,
+ CFepUiBaseCtrl* /*aCtrl*/, const TDesC& /*aEventData*/ )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// handler of button up event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnCtrlButtonUpL( TInt /*aEventType*/,
+ CFepUiBaseCtrl* aCtrl, const TDesC& /*aEventData*/ )
+ {
+ if ( !aCtrl )
+ {
+ return;
+ }
+
+ switch ( aCtrl->ControlId() )
+ {
+ case EHwrCtrlIdClose:
+ {
+ // Go to standby when button up before character timeout
+ if ( iDataStore->StartCharacter())
+ {
+ iDataStore->SetStartCharacter(EFalse);
+ iHwrWnd->CancelWriting();
+ ChangeCurStateManagerToStandby();
+ iHwrWnd->UpdateLayout( ETrue );
+ }
+
+ SignalOwner( ESignalLayoutClosed );
+ }
+ break;
+ case EHwrCtrlIdLanguageOption:
+ {
+ SignalOwner( ESignalLaunchOptionMenu );
+ }
+ break;
+ case EHwrCtrlIdVkbSwitcher:
+ {
+ iHwrWnd->PopupImeSwitcher();
+ }
+ break;
+ case EHwrCtrlIdChineseMiButton:
+ case EHwrCtrlIdEnglishMiButton:
+ case EHwrCtrlIdNumberMiButton:
+ {
+ // Go to standby when button up before character timeout
+ if ( iDataStore->StartCharacter())
+ {
+ iDataStore->SetStartCharacter(EFalse);
+ iHwrWnd->CancelWriting();
+ ChangeCurStateManagerToStandby();
+ iHwrWnd->UpdateLayout( ETrue );
+ }
+
+ iHwrWnd->ShowRangeDropList( EPopDirAuto );
+ }
+ break;
+ case EHwrCtrlIdChineseButton:
+ {
+ if ( iDataStore->CurrentRange() != EFingerHwrNativeRange )
+ {
+ iDataStore->SetPrimaryRange( ERangeNative );
+ iDataStore->SaveRange( ERangeNative );
+
+ ChangeCurStateManagerToStandby();
+ NotifyPrimaryRangeChanged( ERangeNative );
+ }
+
+ iHwrWnd->TryToChangeCharRange( EFingerHwrNativeRange );
+ }
+ break;
+ case EHwrCtrlIdEnglishButton:
+ {
+ if ( iDataStore->CurrentRange() != EFingerHwrEnglishRange )
+ {
+ iDataStore->SetPrimaryRange( ERangeEnglish );
+ iDataStore->SaveRange( ERangeEnglish );
+
+ ChangeCurStateManagerToStandby();
+ NotifyPrimaryRangeChanged( ERangeEnglish );
+ }
+
+ iHwrWnd->TryToChangeCharRange( EFingerHwrEnglishRange );
+ }
+ break;
+ case EHwrCtrlIdSymbolButton:
+ {
+ // Go to standby when button up before character timeout
+ if ( iDataStore->StartCharacter())
+ {
+ iDataStore->SetStartCharacter(EFalse);
+ iHwrWnd->CancelWriting();
+ ChangeCurStateManagerToStandby();
+ iHwrWnd->UpdateLayout( ETrue );
+ }
+
+ if ( iHwrWnd->CurrentCharRange() == EFingerHwrSymbolRange )
+ {
+ RestoreRange();
+ }
+ else
+ {
+ ChangeCurStateManagerToStandby();
+ iHwrWnd->TryToChangeCharRange( EFingerHwrSymbolRange );
+ }
+ }
+ break;
+ case EHwrCtrlIdNumberButton:
+ {
+ if ( iDataStore->CurrentRange() != EFingerHwrNumberRange )
+ {
+ iDataStore->SetPrimaryRange( ERangeNumber );
+ iDataStore->SaveRange( ERangeNumber );
+
+ ChangeCurStateManagerToStandby();
+ NotifyPrimaryRangeChanged( ERangeNumber );
+ }
+ iHwrWnd->TryToChangeCharRange( EFingerHwrNumberRange );
+ }
+ break;
+ case EHwrCtrlIdSctPage0Btn:
+ {
+ iHwrWnd->ShowSctPage( 1, EPagePosPageNo );
+ }
+ break;
+ case EHwrCtrlIdSctPage1Btn:
+ {
+ iHwrWnd->ShowSctPage( 2, EPagePosPageNo );
+ }
+ break;
+ case EHwrCtrlIdSctPage2Btn:
+ {
+ iHwrWnd->ShowSctPage( 0, EPagePosPageNo );
+ }
+ break;
+ default:
+ break;
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// handler of rep-button clicked event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnRepButtonClickedL( CFepUiBaseCtrl* aCtrl,
+ const TDesC& aData )
+ {
+ if ( !aCtrl )
+ {
+ return;
+ }
+
+ switch ( aCtrl->ControlId() )
+ {
+ case EHwrCtrlIdArrowRight:
+ case EHwrCtrlIdArrowLeft:
+ {
+ SignalOwner( ESignalKeyEvent, aData );
+ }
+ break;
+ case EHwrCtrlIdArrowDown:
+ {
+ iHwrWnd->Icf()->HandleArrowBtnEventL( CFepLayoutMultiLineIcf::EArrowDown );
+ }
+ break;
+ case EHwrCtrlIdArrowUp:
+ {
+ iHwrWnd->Icf()->HandleArrowBtnEventL( CFepLayoutMultiLineIcf::EArrowUp );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// handler of BACKSPACE button clicked event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnBackspaceClickedL()
+ {
+ if ( iDataStore->StartCharacter() ) // before character timer out
+ {
+ // goto standby and clear screen
+ iDataStore->SetStartCharacter(EFalse);
+ iHwrWnd->CancelWriting();
+ }
+ else
+ {
+ SubmitCharToFep( EKeyBackspace );
+ }
+
+ CurStateManager()->HandleEventL( EHwrEventKeyBack, KNullDesC );
+ iLastOverlapIdx = iDataStore->RemoveDuplicateCand(iDataStore->Candidate(),
+ const_cast<RPointerArray<HBufC>&>(iDataStore->Predictive()),
+ 0,
+ 0);
+
+
+ // not update layou when SCT button is latched
+ if ( ( iDataStore->CurrentRange() == EFingerHwrNativeRange ||
+ iDataStore->CurrentRange() == EFingerHwrEnglishRange ) &&
+ iHwrWnd->CurrentCharRange() != EFingerHwrSymbolRange )
+ {
+ iHwrWnd->UpdateLayout( CurStateManager()->IsStandbyState() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// handler of virtual key down event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnVirtualKeyDownL( CFepUiBaseCtrl* /*aCtrl*/,
+ const TDesC& /*aData*/ )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// handler of virtual key up event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnVirtualKeyUpL( CFepUiBaseCtrl* /*aCtrl*/,
+ const TDesC& aData )
+ {
+ const TVirtualKeyEventData* vkdata = NULL;
+ const TKeyEvent *keydata = NULL;
+ vkdata = reinterpret_cast<const TVirtualKeyEventData*>( aData.Ptr() );
+ keydata = reinterpret_cast<const TKeyEvent*>( aData.Ptr() );
+
+ if ( vkdata->iKeyEvent.iScanCode == KEmotionKeyMark )
+ {
+ TBuf<KTempBufSize> buf;
+ buf.Append( vkdata->iKeyData );
+ SubmitStringToFep( buf );
+ }
+ else
+ {
+ TBuf<1> bufBck;
+ bufBck.Append( keydata->iScanCode );
+ SignalOwner( ESignalKeyEvent, bufBck );
+ }
+ //restore range before sct popup
+ RestoreRange();
+ }
+
+// ---------------------------------------------------------------------------
+// handler of candidate list event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnCandidateSelectedL( CFepUiBaseCtrl* aCtrl,
+ const TDesC& aData )
+ {
+ if ( !aCtrl )
+ {
+ return;
+ }
+
+ CurStateManager()->HandleEventL( EHwrEventCandidateSelected, aData );
+
+ iLastOverlapIdx = iDataStore->RemoveDuplicateCand(iDataStore->Candidate(),
+ const_cast<RPointerArray<HBufC>&>(iDataStore->Predictive()),
+ 0,
+ 0);
+
+
+ iHwrWnd->UpdateLayout( EFalse );
+ }
+
+// ---------------------------------------------------------------------------
+// handler of predictive list event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnPredictSelectedL( CFepUiBaseCtrl* aCtrl,
+ const TDesC& aData )
+ {
+ if ( !aCtrl )
+ {
+ return;
+ }
+
+ CurStateManager()->HandleEventL( EHwrEventPredictiveSelected, aData );
+ iLastOverlapIdx = iDataStore->RemoveDuplicateCand(iDataStore->Candidate(),
+ const_cast<RPointerArray<HBufC>&>(iDataStore->Predictive()),
+ 0,
+ 0);
+
+ iHwrWnd->UpdateLayout( EFalse );
+ }
+
+// ---------------------------------------------------------------------------
+// clicked event handler of icf.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnIcfClicked()
+ {
+ if ( iHwrWnd->CurrentCharRange() == EFingerHwrSymbolRange )
+ {
+ // cancel sct and restore last range.
+ RestoreRange();
+ }
+ else
+ {
+ // Go to standby
+ ChangeCurStateManagerToStandby();
+ iHwrWnd->UpdateLayout( ETrue );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// handler of ime selector event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnImeSelected( TInt /*aEventType*/,
+ CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+ {
+ if ( !aCtrl )
+ {
+ return;
+ }
+
+ CFepLayoutChoiceList::SEvent* event= NULL;
+ event = (CFepLayoutChoiceList::SEvent*)aEventData.Ptr();
+ if ( !event || event->iIndex == -1 )
+ {
+ return;
+ }
+
+ TBool switchByMode = ETrue;
+ TInt mode = event->iCommand;
+
+ TBuf<KTempBufSize> buf;
+ TInt length = sizeof(TBool)/sizeof(TText);
+ buf.Append( reinterpret_cast<TText*>( &switchByMode ), length );
+
+ length = sizeof(TInt)/sizeof(TText);
+ buf.Append( reinterpret_cast<TText*>( &mode ), length );
+ SignalOwner( ESignalLayoutUIChanged, buf );
+ }
+
+// ---------------------------------------------------------------------------
+// handler of StrokeStarted event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnHwrStrokeStartedL()
+ {
+ if(!iDataStore->StartCharacter())
+ {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ // set first stroke flag for Auto Complete
+ iDataStore->SetFirstStroke(ETrue);
+
+ // The default candidate cell is not highlight
+ iDataStore->SetHighlight(EFalse);
+#else
+ if(iDataStore->PrimaryRange() == ERangeEnglish)
+ {
+ iDataStore->SetFixEnglishSymbolL();
+ }
+ // Hide the fix English Symbol list
+ iHwrWnd->HideTwoRowEngSymbolList(ETrue);
+
+ // The default candidate cell is not highlight
+ iDataStore->SetHighlight(EFalse);
+#endif
+ }
+
+ // remember the start writing position.
+ iDataStore->SetStartCharacter(ETrue);
+ iHwrWnd->CancelAllPopList();
+ CurStateManager()->HandleEventL( EEventHwrStrokeStarted, KNullDesC );
+ }
+
+// ---------------------------------------------------------------------------
+// handler of StrokeFinished event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnHwrStrokeFinishedL()
+ {
+ RArray<TPoint> points = iHwrWnd->StrokeList();
+ TPtrC ptr;
+ ptr.Set(reinterpret_cast<TText*>(&points), sizeof(&points));
+ CurStateManager()->HandleEventL( EEventHwrStrokeFinished, ptr );
+
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+ iDataStore->SetFirstStroke(EFalse);
+#endif
+
+ iHwrWnd->UpdateLayout(EFalse);
+ }
+
+// ---------------------------------------------------------------------------
+// handler of CharacterFinished event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnHwrCharacterFinishedL()
+ {
+ iDataStore->SetStartCharacter( EFalse );
+
+ RArray<TPoint> points = iHwrWnd->StrokeList();
+ TPtrC ptr;
+ ptr.Set( reinterpret_cast<TText*>( &points ), sizeof(&points) );
+ CurStateManager()->HandleEventL( EEventHwrCharacterTimerOut, ptr );
+
+ // When recognize Enter or Backspace, it will go to standby
+ iHwrWnd->UpdateLayout( CurStateManager()->IsStandbyState(), EFalse, EFalse );
+ }
+
+// ---------------------------------------------------------------------------
+// handler of NumMapping changed event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnNumMappingChangedL()
+ {
+ HBufC* mapping = iDataStore->KeyMappingStringL();
+
+ iHwrWnd->SetNumericMapping( *mapping );
+
+ delete mapping;
+ }
+
+// ---------------------------------------------------------------------------
+// Handler of the candidate list event.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::OnCandidateWndEventL()
+ {
+ TInt candscnt = iDataStore->PredictiveCount();
+
+ iDataStore->GetNextPredictivePageL();
+
+ iLastOverlapIdx = iDataStore->RemoveDuplicateCand(iDataStore->Candidate(),
+ const_cast<RPointerArray<HBufC>&>(iDataStore->Predictive()),
+ iLastOverlapIdx + 1,
+ candscnt);
+
+ if ( iDataStore->PredictiveCount() < KMaxPredictiveCount )
+ {
+ RPointerArray<HBufC> predicts = iDataStore->Predictive();
+ iHwrWnd->PredictiveList()->AddCandidatesL( predicts,
+ CFepCtrlDropdownList::EListExpandable );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Notify the layout owner the primary has changed.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::NotifyPrimaryRangeChanged( TInt aPrimaryRange )
+ {
+ TBuf<KIntLen> buf;
+ buf.Append( ( TUint16* )( &aPrimaryRange ), KIntLen );
+ SignalOwner( ESignalRange, buf );
+ }
+
+// ---------------------------------------------------------------------------
+// get value from repository.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::GetNewValue(
+ CAknFepRepositoryWatcher* aWatcher, const TInt aId )
+ {
+ TInt newValue = -1;
+
+ if ( aWatcher == iGSRepositoryWatcher )
+ {
+ iRepositorySetting->Get( aId, newValue );
+ }
+
+ return newValue;
+ }
+
+// ---------------------------------------------------------------------------
+// get hwr trail color from repository.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputFingerHwrLayout::GetPenTrailColor()
+ {
+ TInt newValue = 0;
+ iRepositorySetting->Get( KSettingsPenColor, newValue );
+
+ if ( !AknPenInputTrailColorUtils::CheckColorInColorTable( newValue ) )
+ {
+ return AknPenInputTrailColorUtils::GetTrailColorByTheme();
+ }
+ return newValue;
+ }
+
+// ---------------------------------------------------------------------------
+// set hwr writing speed.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SetWritingSpeed( const TInt aWritingSpeed )
+ {
+ TTimeIntervalMicroSeconds32 speed;
+ switch ( aWritingSpeed )
+ {
+ case EWritingSpeedVeryFast:
+ {
+ speed = EHwrWritingSpeedVeryFast;
+ }
+ break;
+ case EWritingSpeedFast:
+ {
+ speed = EHwrWritingSpeedFast;
+ }
+ break;
+ case EWritingSpeedNormal:
+ {
+ speed = EHwrWritingSpeedNormal;
+ }
+ break;
+ case EWritingSpeedSlow:
+ {
+ speed = EHwrWritingSpeedSlow;
+ }
+ break;
+ case EWritingSpeedVerySlow:
+ {
+ speed = EHwrWritingSpeedVerySlow;
+ }
+ break;
+ default:
+ {
+ speed = EHwrWritingSpeedNormal;
+ }
+ break;
+ }
+
+ iHwrWnd->SetBoxWritingSpeed( speed );
+ }
+
+// ---------------------------------------------------------------------------
+// set hwr writing pen width.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SetBoxPenSize( const TSize aPenSize )
+ {
+ iHwrWnd->SetBoxPenSize( aPenSize );
+ }
+
+// ---------------------------------------------------------------------------
+// set hwr writing pen color.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::SetBoxPenColor( const TInt aPenColor )
+ {
+ iHwrWnd->SetBoxPenColor( aPenColor );
+ }
+// ---------------------------------------------------------------------------
+// restore the range before sct popup.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::RestoreRange()
+ {
+ TInt rangeFlag = iHwrWnd->RestoreNonSctLayout();
+ iDataStore->SetPrimaryRange( rangeFlag );
+ iDataStore->SaveRange( rangeFlag );
+ ChangeCurStateManagerToStandby();
+ NotifyPrimaryRangeChanged( rangeFlag );
+ }
+
+// ---------------------------------------------------------------------------
+// get current state manager.
+// ---------------------------------------------------------------------------
+//
+CPeninputFingerHwrStateManagerBase* CPeninputFingerHwrLayout::CurStateManager()
+ {
+ TInt index = iDataStore->CurrentRange();
+ if ( index < 0 || index >= iStateMgrArray.Count() )
+ {
+ return NULL;
+ }
+ else
+ {
+ return iStateMgrArray[index];
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// change current state manager to standby state.
+// ---------------------------------------------------------------------------
+//
+void CPeninputFingerHwrLayout::ChangeCurStateManagerToStandby()
+ {
+ CPeninputFingerHwrStateManagerBase* stateMgr = CurStateManager();
+ if ( stateMgr )
+ {
+ stateMgr->SetState( CPeninputFingerHwrStateManagerBase::EStateStandBy );
+ }
+ }
+
+//End of file