textinput/peninputfingerhwrar/src/peninputfingerhwrarlayout.cpp
branchRCL_3
changeset 44 ecbabf52600f
child 56 8152b1f1763a
equal deleted inserted replaced
43:ebd48d2de13c 44:ecbabf52600f
       
     1 /*
       
     2 * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation for finger hwr UiLayout
       
    15 *
       
    16 */
       
    17 
       
    18 //SYSTEM INCLUDES
       
    19 #include <bautils.h>
       
    20 #include <coemain.h>
       
    21 #include <CommonEngineDomainCRKeys.h>
       
    22 //FEP Includes
       
    23 #include <AknFepGlobalEnums.h>
       
    24 #include <aknfeppeninputenums.h>
       
    25 #include <peninputlayoutchoicelist.h>
       
    26 #include <settingsinternalcrkeys.h>
       
    27 #include <centralrepository.h>
       
    28 #include <peninputlayoutvkb.h>
       
    29 #include <peninputcmdparam.h>
       
    30 #include <peninputdropdownlist.h>
       
    31 #include <peninputlayoutmultilineicf.h>
       
    32 
       
    33 //USER INCLUDES
       
    34 #include "peninputfingerhwrardatastore.h"
       
    35 #include "peninputfingerhwrarstatemanager.h"
       
    36 #include "peninputfingerhwrarevent.h"
       
    37 #include "peninputfingerhwrarlayout.h"
       
    38 #include "peninputfingerhwrarcontrolid.h"
       
    39 
       
    40 #include "peninputfingerhwrarwnd.h"
       
    41 #include "peninputfingerhwrarwnd.rsg"
       
    42 
       
    43 //CONST DEFINATION
       
    44 _LIT( KFSHWRRssFile, "\\resource\\peninputfingerhwrarwnd.rsc" );
       
    45 
       
    46 const TUint8 KTempBufSize = 8;
       
    47 const TUint8 KIntLen = sizeof(TInt)/2;
       
    48 const TUint8 KIntSize = sizeof(TInt);
       
    49 
       
    50 const TInt16 KEmotionKeyMark = 0xFFFE;
       
    51 
       
    52 // ============================ MEMBER FUNCTIONS =============================
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // Symbian Constructor
       
    56 // ---------------------------------------------------------------------------
       
    57 //
       
    58 CPeninputFingerHwrArLayout* CPeninputFingerHwrArLayout::NewL( 
       
    59     MLayoutOwner* aLayoutOwner, const TAny* aInitData )
       
    60     {
       
    61     CPeninputFingerHwrArLayout* self = new( ELeave ) CPeninputFingerHwrArLayout( 
       
    62             aLayoutOwner );
       
    63     
       
    64     CleanupStack::PushL( self );
       
    65     self->ConstructL( aInitData );
       
    66     CleanupStack::Pop( self ); //self
       
    67     return self;
       
    68     }
       
    69 
       
    70 // ---------------------------------------------------------------------------
       
    71 // Symbian second-phase constructor
       
    72 // ---------------------------------------------------------------------------
       
    73 //   
       
    74 void CPeninputFingerHwrArLayout::ConstructL( const TAny* aInitData )
       
    75     {
       
    76     BaseConstructL();
       
    77     //load resource
       
    78     TFileName resFileName( KFSHWRRssFile );
       
    79     CCoeEnv* coeEnv = CCoeEnv::Static();
       
    80     BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resFileName );
       
    81     iResId = coeEnv->AddResourceFileL( resFileName );
       
    82 
       
    83     //initialze the data store
       
    84     TPeninputLayoutData* layoutData = ( TPeninputLayoutData* )aInitData;
       
    85 
       
    86     iDataStore = CPeninputFingerHwrArDataStore::NewL( (*layoutData).iPtiEngine, this );
       
    87 
       
    88     //create the repository for gereral settings
       
    89     iRepositorySetting = CRepository::NewL( KCRUidPersonalizationSettings );
       
    90     //create the repository watcher for general settings
       
    91     iGSRepositoryWatcher = CAknFepRepositoryWatcher::NewL( 
       
    92             KCRUidPersonalizationSettings, 
       
    93             TCallBack( HandleGSRepositoryCallBack, this ), 
       
    94             iRepositorySetting );
       
    95 
       
    96     //create state manager   
       
    97     CreateStateManagerL();
       
    98     
       
    99 	//create the arabic window control
       
   100     CreateHwrWindowL();
       
   101 	
       
   102 	//retrieve the settings
       
   103     LoadAndPublishDefaultL();
       
   104 
       
   105     //set screen layout extent
       
   106     SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
       
   107     }
       
   108 	
       
   109 // ---------------------------------------------------------------------------
       
   110 // handle the command from Fep.
       
   111 // ---------------------------------------------------------------------------
       
   112 //
       
   113 TInt CPeninputFingerHwrArLayout::HandleCommand( const TInt aCmd, TUint8* aData )
       
   114     {
       
   115     TInt ret = KErrUnknown;
       
   116     TRAPD(err, ret = HandleCommandL( aCmd, aData ) );
       
   117     if ( err )
       
   118         {
       
   119         return KErrUnknown;
       
   120         }
       
   121     else
       
   122         {
       
   123         return ret;
       
   124         }
       
   125     }
       
   126 
       
   127 // ---------------------------------------------------------------------------
       
   128 // handle the command from Fep.
       
   129 // ---------------------------------------------------------------------------
       
   130 //
       
   131 TInt CPeninputFingerHwrArLayout::HandleCommandL( const TInt aCmd, TUint8* aData )
       
   132     {
       
   133     if ( CFepUiLayout::HandleCommand( aCmd, aData ) == KErrNone )
       
   134         {
       
   135         return KErrNone;
       
   136         }
       
   137 
       
   138     TInt ret = KErrNone;
       
   139     switch ( aCmd )
       
   140         {
       
   141         case ECmdPenInputEditorNumericKeyMap:
       
   142             {
       
   143             iDataStore->SetNumberMode( *(TAknEditorNumericKeymap*)aData );
       
   144             OnNumMappingChangedL();
       
   145             }
       
   146             break;
       
   147         case ECmdPenInputEditorCustomNumericKeyMap:
       
   148             {
       
   149             TInt len = *( TInt* )( aData - KIntSize );
       
   150             TPtrC16 keymapRes( (TUint16*)aData, len / 2 );
       
   151             iDataStore->SetCustomNumberModeL( keymapRes );
       
   152             }
       
   153             break;
       
   154         case ECmdPenInputPermittedRange:
       
   155             {
       
   156             TInt ranges = *(TInt*)aData;
       
   157             iDataStore->SetPermittedRanges( ranges );
       
   158             }
       
   159             break;
       
   160         case ECmdPenInputLanguage:
       
   161             {
       
   162             TInt language = *( TInt* )aData;
       
   163             iDataStore->SetLanguageL( language );
       
   164             if(iHwrWnd)
       
   165                 {
       
   166                 iHwrWnd->SetIcfLanguage(language);
       
   167                 }
       
   168             }
       
   169             break;
       
   170         case ECmdPenInputPermittedCase:
       
   171             {
       
   172             TInt cs = *( TInt* )aData;
       
   173             iDataStore->SetPermittedCases( cs );
       
   174             }
       
   175             break;
       
   176         case ECmdPenInputCase:
       
   177             {
       
   178             TInt cs = *( TInt* )aData;
       
   179             iDataStore->SetCase( cs );
       
   180             }
       
   181             break;
       
   182         case ECmdPenInputWindowOpen:
       
   183             {
       
   184             LayoutOwner()->Hide( EFalse );
       
   185             RootControl()->UpdateValidRegion( NULL, EFalse );
       
   186             
       
   187 			// tell the engine the hwr writing area
       
   188             TRect hwrRect = iHwrWnd->WritingBoxRect();
       
   189             TSize hwrSize = hwrRect.Size();
       
   190             iDataStore->SetInputAreaSize(hwrSize);
       
   191             iDataStore->SetScreenSize(hwrSize);
       
   192 			
       
   193 			// tell the HWR window to handle the window open command
       
   194             iHwrWnd->HandleWindowOpenCommandL();
       
   195 			
       
   196 			// switch to standby state
       
   197             ChangeCurStateToStandby();
       
   198             }
       
   199             break;
       
   200         case ECmdPenInputWindowClose:
       
   201             {
       
   202             LayoutOwner()->Hide( ETrue );
       
   203             }
       
   204             break;
       
   205         case ECmdPenInputSetTextAlignment:
       
   206             {
       
   207             iHwrWnd->SetTextAlignmentL( *aData, ELangArabic );           
       
   208             }
       
   209             break;
       
   210         case ECmdPenInputSetPromptText:
       
   211             {
       
   212             iHwrWnd->SetPromptTextL( aData );
       
   213             }
       
   214             break;
       
   215         case ECmdPenInputDimArrowKeys:
       
   216             {
       
   217             TBool IsDimArrowKeys = *aData;
       
   218             iHwrWnd->DimArrowKeys( IsDimArrowKeys );
       
   219             }
       
   220             break;
       
   221         case ECmdPenInputCharacterPreview:
       
   222             {
       
   223             iHwrWnd->ShowBubble(*aData);    
       
   224             }
       
   225             break;
       
   226         case ECmdPenInputEnableSettingBtn:    
       
   227             {
       
   228             TBool isEnableSetting = *aData;
       
   229             iHwrWnd->SetEnableSettingBtn(isEnableSetting);
       
   230             }
       
   231             break;
       
   232         case ECmdPeninputArabicNumModeChanged:
       
   233             {
       
   234             TBool isArabicNativeNum = *aData;
       
   235             iHwrWnd->SetNativeNumMode(isArabicNativeNum);
       
   236             }
       
   237             break;
       
   238         default:
       
   239 		    ret = KErrUnknown;
       
   240             break;
       
   241         }
       
   242 
       
   243     return ret;
       
   244     }
       
   245 
       
   246 // ---------------------------------------------------------------------------
       
   247 // handle size changing event.
       
   248 // ---------------------------------------------------------------------------
       
   249 //
       
   250 TInt CPeninputFingerHwrArLayout::SizeChanged( const TAny* /*pData*/ )
       
   251     {
       
   252     //Handle size change event
       
   253     SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
       
   254    
       
   255 	TRAP_IGNORE(iHwrWnd->SizeChangedL());
       
   256 
       
   257     return KErrNone;
       
   258     }
       
   259 
       
   260 // ---------------------------------------------------------------------------
       
   261 // Handle editor text coming.
       
   262 // ---------------------------------------------------------------------------
       
   263 //
       
   264 TInt CPeninputFingerHwrArLayout::OnAppEditorTextComing( 
       
   265     const TFepInputContextFieldData& aData )
       
   266     {
       
   267     if ( iHwrWnd )
       
   268         {
       
   269         TRAPD( err, iHwrWnd->SetEditorTextL( aData ) );
       
   270 		if(err != KErrNone)
       
   271 		    {
       
   272 			return err;
       
   273 			}
       
   274 		//
       
   275 	    // implement the feature: the candiates will be filtered according to the char after the cursor
       
   276 	    //
       
   277 		
       
   278 		//
       
   279 		// As the icf will not insert the text coming from FEP Editor into iRichView 
       
   280 		// when EFepICFDataDirectionMFNE was set,  
       
   281 		// so if we are going to call iContextField->ExtractText(), it could cause a panic of 
       
   282 		// out of range.
       
   283 		// no idea why icf behaves like this.
       
   284 		// this is just a temporary solution to avoid this panic happened.
       
   285 		// The best solution is to get the cusor postion which should be provide by ICF control 
       
   286 		// but ICF does not offer such API
       
   287 		if(aData.iFlag & EFepICFDataDirectionMFNE )
       
   288 			{
       
   289 			iIsEditorMFNE = ETrue;
       
   290 			return KErrNone;
       
   291 			}
       
   292 		
       
   293         iIsEditorMFNE = EFalse;		
       
   294 		iDataStore->SetFirstCandidateType(ECandDefaultFirst);
       
   295 //		if(iDataStore->PrimaryRange() == ERangeEnglish)
       
   296 //		    {
       
   297 //		    return KErrNone;
       
   298 //		    }
       
   299 		TUint16 charBeforeCursor = 0;
       
   300 		
       
   301         if(iHwrWnd->GetCharBeforeCursor(aData.iCurSel.LowerPos()-1, charBeforeCursor))
       
   302 		    {
       
   303 			TFirstCandidateType candtype = ECandDefaultFirst;
       
   304 			if(iDataStore->IsLatinNumber(charBeforeCursor)) // latin number
       
   305 				{
       
   306 				candtype = ECandLatinNumFirst;
       
   307 				}
       
   308 			else if(iDataStore->IsLatinChar(charBeforeCursor)) // uppercase & lowcase latin character
       
   309 				{
       
   310 				candtype = ECandLatinCharFirst;
       
   311 				}
       
   312 			else if(iDataStore->IsArabicNumber(charBeforeCursor)) // arabic-indic numbers
       
   313 				{
       
   314 				candtype = ECandArabicIndicNumFirst;
       
   315 				}
       
   316 				
       
   317 			iDataStore->SetFirstCandidateType(candtype);	
       
   318 			}
       
   319         
       
   320         return KErrNone;
       
   321         }
       
   322 
       
   323     return KErrNone;
       
   324     }
       
   325 
       
   326 // ---------------------------------------------------------------------------
       
   327 // Handle application info change.
       
   328 // ---------------------------------------------------------------------------
       
   329 //
       
   330 void CPeninputFingerHwrArLayout::HandleAppInfoChange( const TDesC& aInfo,
       
   331     TPeninputAppInfo aType )
       
   332     {
       
   333     if ( aType == EAppIndicatorMsg )
       
   334         {
       
   335         TRAP_IGNORE( iHwrWnd->SetBubbleTextL( aInfo ) );
       
   336         }
       
   337     }
       
   338 
       
   339 // ---------------------------------------------------------------------------
       
   340 // Called by owner when the system resource changed event.
       
   341 // ---------------------------------------------------------------------------
       
   342 //
       
   343 TInt CPeninputFingerHwrArLayout::OnResourceChange( TInt aType )
       
   344     {
       
   345     CFepUiLayout::OnResourceChange( aType );
       
   346     if ( aType == KAknsMessageSkinChange )
       
   347         {
       
   348         //Do other things when skin change
       
   349         TInt newValue = GetPenTrailColor();
       
   350 	    SetBoxPenColor(newValue);        
       
   351         }
       
   352     return KErrNone;
       
   353     }
       
   354 
       
   355 // ---------------------------------------------------------------------------
       
   356 // get the peninput ui type.
       
   357 // ---------------------------------------------------------------------------
       
   358 //
       
   359 TInt CPeninputFingerHwrArLayout::PenInputType()
       
   360     {
       
   361     return EPluginInputModeFingerHwr;
       
   362     }
       
   363 
       
   364 // ---------------------------------------------------------------------------
       
   365 // Called by owner when the layout is going to be hidden.
       
   366 // ---------------------------------------------------------------------------
       
   367 //
       
   368 void CPeninputFingerHwrArLayout::OnDeActivate()
       
   369     {
       
   370     ChangeCurStateToStandby();
       
   371     
       
   372     CFepUiLayout::OnDeActivate();
       
   373     }
       
   374 
       
   375 // ---------------------------------------------------------------------------
       
   376 // handle control event.
       
   377 // ---------------------------------------------------------------------------
       
   378 //
       
   379 void CPeninputFingerHwrArLayout::HandleControlEvent( TInt aEventType,
       
   380     CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
       
   381     {
       
   382     TRAP_IGNORE( HandleControlEventL( aEventType, aCtrl, aEventData ) );
       
   383     }
       
   384 
       
   385 // ---------------------------------------------------------------------------
       
   386 // handle control event.
       
   387 // ---------------------------------------------------------------------------
       
   388 //
       
   389 void CPeninputFingerHwrArLayout::HandleControlEventL( TInt aEventType,
       
   390     CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
       
   391     {
       
   392     
       
   393     switch ( aEventType )
       
   394         {
       
   395         case EEventButtonDown:
       
   396             {
       
   397             OnCtrlButtonDownL( aEventType, aCtrl, aEventData );
       
   398             }
       
   399             break;
       
   400         case EEventButtonUp:
       
   401             {
       
   402             OnCtrlButtonUpL( aEventType, aCtrl, aEventData );
       
   403             }
       
   404             break;
       
   405 		case EEventHwrCharacterTimerOut:
       
   406             {
       
   407             OnHwrCharacterFinishedL();
       
   408             }
       
   409             break;
       
   410         case EEventHwrStrokeStarted:
       
   411             {
       
   412             OnHwrStrokeStartedL();
       
   413             }
       
   414             break;
       
   415         case EEventHwrStrokeFinished:
       
   416             {
       
   417             OnHwrStrokeFinishedL();
       
   418             }
       
   419             break;
       
   420         case EHwrEventKeyBack:
       
   421             {
       
   422             OnBackspaceClickedL();
       
   423             }
       
   424             break;
       
   425         case EHwrEventNavKeyClicked:
       
   426             {
       
   427             OnRepButtonClickedL( aCtrl, aEventData );
       
   428             }
       
   429             break;
       
   430         case EEventVirtualKeyDown:
       
   431             {
       
   432             OnVirtualKeyDownL( aCtrl, aEventData );
       
   433             }
       
   434             break;
       
   435         case EEventVirtualKeyUp:
       
   436             {
       
   437             OnVirtualKeyUpL( aCtrl, aEventData );
       
   438             }
       
   439             break;
       
   440         case EHwrEventCandidateSelected:
       
   441             {
       
   442             OnCandidateSelectedL( aCtrl, aEventData );
       
   443             }
       
   444             break;
       
   445         case EEventIcfPointerUpEvent:
       
   446             {
       
   447             OnIcfClicked();
       
   448             }
       
   449             break;
       
   450             
       
   451         case EHwrEventOutsideEvent:
       
   452             {
       
   453             ChangeCurStateToStandby();
       
   454             }
       
   455             break;
       
   456             
       
   457         default:
       
   458             break;
       
   459         }
       
   460     }
       
   461 
       
   462 // ---------------------------------------------------------------------------
       
   463 // Get the data stroe object.
       
   464 // ---------------------------------------------------------------------------
       
   465 //
       
   466 CPeninputFingerHwrArDataStore& CPeninputFingerHwrArLayout::DataStore()
       
   467     {
       
   468     return *iDataStore;
       
   469     }
       
   470 
       
   471 // ---------------------------------------------------------------------------
       
   472 // Delete the previous charcode and submit the new one
       
   473 // ---------------------------------------------------------------------------
       
   474 //
       
   475 void CPeninputFingerHwrArLayout::Replace( const TDesC& aOldCharCode,
       
   476     const TDesC& aNewCharCode, const TBool aIsPart)
       
   477     {
       
   478 	// user tries to correct the previous selection
       
   479     // Delete the previous character and append the new one
       
   480     HBufC* newCharBuf = HBufC::New( aNewCharCode.Length() + KIntLen );
       
   481     if ( newCharBuf )
       
   482         {
       
   483         TInt len = aOldCharCode.Length();
       
   484         if(len == 0 )
       
   485             {
       
   486             delete newCharBuf;
       
   487             return;
       
   488             }
       
   489             
       
   490         newCharBuf->Des().Append( ( TUint16* )&len, KIntLen );
       
   491         newCharBuf->Des().Append( aNewCharCode );
       
   492         if ( aIsPart )
       
   493             {
       
   494             SignalOwner( ESignalReplacePartText, *newCharBuf );
       
   495             }
       
   496         else
       
   497             {
       
   498             SignalOwner( ESignalReplaceText, *newCharBuf );
       
   499             }
       
   500         delete newCharBuf;
       
   501         }
       
   502     }
       
   503 
       
   504 // ---------------------------------------------------------------------------
       
   505 // Submit string to layout owner.
       
   506 // ---------------------------------------------------------------------------
       
   507 //
       
   508 void CPeninputFingerHwrArLayout::SubmitStringToFep( const TDesC& aCharCode )
       
   509     {
       
   510     SignalOwner( ESignalKeyEvent, aCharCode );
       
   511     }
       
   512 
       
   513 // ---------------------------------------------------------------------------
       
   514 // Submit char to layout owner.
       
   515 // ---------------------------------------------------------------------------
       
   516 //
       
   517 void CPeninputFingerHwrArLayout::SubmitCharToFep( const TInt aCharCode )
       
   518     {
       
   519     TBuf<1> buf;
       
   520     buf.Append( aCharCode );
       
   521     SignalOwner( ESignalKeyEvent, buf );
       
   522     }
       
   523 
       
   524 // ---------------------------------------------------------------------------
       
   525 // repository callback for settings.
       
   526 // ---------------------------------------------------------------------------
       
   527 //
       
   528 TInt CPeninputFingerHwrArLayout::HandleGSRepositoryCallBack( TAny* aPtr )
       
   529     {
       
   530     CPeninputFingerHwrArLayout *self = static_cast<CPeninputFingerHwrArLayout*>( aPtr );
       
   531 
       
   532     CAknFepRepositoryWatcher* watcher = self->iGSRepositoryWatcher;
       
   533     if ( watcher )
       
   534         {
       
   535         TInt newValue = self->GetNewValue( watcher, watcher->ChangedKey() );
       
   536 
       
   537         switch ( watcher->ChangedKey() )
       
   538             {
       
   539             case KSettingsWritingSpeed:
       
   540                 {
       
   541                 self->SetWritingSpeed( newValue );
       
   542                 }
       
   543                 break;
       
   544             case KSettingsPenColor:
       
   545                 {
       
   546                 self->SetBoxPenColor( newValue );
       
   547                 }
       
   548                 break;
       
   549             case KSettingsPenInputGuideLine:
       
   550                 {
       
   551                 self->SetGuideLineOn(newValue);
       
   552                 }
       
   553                 break;
       
   554             default:
       
   555                 break;
       
   556             }
       
   557         }
       
   558     return KErrNone;
       
   559     }
       
   560 
       
   561 // ---------------------------------------------------------------------------
       
   562 // load default settings.
       
   563 // ---------------------------------------------------------------------------
       
   564 //
       
   565 void CPeninputFingerHwrArLayout::LoadAndPublishDefaultL()
       
   566     {
       
   567     if(!iRepositorySetting)
       
   568         {
       
   569         return;
       
   570         }
       
   571 
       
   572     TInt newValue;
       
   573 
       
   574     iRepositorySetting->Get( KSettingsWritingSpeed, newValue );
       
   575     SetWritingSpeed( newValue );
       
   576     
       
   577 	iRepositorySetting->Get(KSettingsPenInputGuideLine,newValue);
       
   578 	SetGuideLineOn(newValue);
       
   579 	
       
   580     iRepositorySetting->Get( KSettingsPenWidth, newValue );
       
   581     SetBoxPenSize( TSize( newValue, newValue ) );
       
   582 
       
   583     newValue = GetPenTrailColor();
       
   584     SetBoxPenColor( newValue );
       
   585 
       
   586     iRepositorySetting->Get( KSettingsPenInputLang, newValue );
       
   587     iDataStore->SetLanguageL( newValue );
       
   588 
       
   589     iHwrWnd->SetNativeNumMode(iDataStore->IsNativeNumMode());
       
   590     }
       
   591 
       
   592 // ---------------------------------------------------------------------------
       
   593 // 
       
   594 // ---------------------------------------------------------------------------
       
   595 //
       
   596 void CPeninputFingerHwrArLayout::SyncHwrStrokeEndMark( const TPoint&  aEndMark )
       
   597     {
       
   598     iHwrWnd->SetStrokeEndMark( aEndMark );
       
   599     }
       
   600    
       
   601 
       
   602 // private
       
   603 
       
   604 // ---------------------------------------------------------------------------
       
   605 // c++ constructor
       
   606 // ---------------------------------------------------------------------------
       
   607 //
       
   608 CPeninputFingerHwrArLayout::CPeninputFingerHwrArLayout( MLayoutOwner* aLayoutOwner ) 
       
   609     : CFepUiLayout( aLayoutOwner ), iLastOverlapIdx(KInvalidIndex)
       
   610     {
       
   611     }
       
   612 
       
   613 // ---------------------------------------------------------------------------
       
   614 // c++ destructor
       
   615 // ---------------------------------------------------------------------------
       
   616 //
       
   617 CPeninputFingerHwrArLayout::~CPeninputFingerHwrArLayout()
       
   618     {
       
   619     CCoeEnv::Static()->DeleteResourceFile( iResId );
       
   620 
       
   621     delete iDataStore;
       
   622 	delete iStateMgr;
       
   623     delete iGSRepositoryWatcher;
       
   624     delete iRepositorySetting;
       
   625     }
       
   626 
       
   627 // ---------------------------------------------------------------------------
       
   628 // Create the hwr box window.
       
   629 // ---------------------------------------------------------------------------
       
   630 // 
       
   631 void CPeninputFingerHwrArLayout::CreateHwrWindowL()
       
   632     {
       
   633     iHwrWnd = CPeninputFingerHwrArWnd::NewL( this, EHwrCtrlIdHwrWindow, EFalse );
       
   634 
       
   635     iHwrWnd->SetResourceId( R_FINGERHWR_WINDOW );
       
   636     iHwrWnd->ConstructFromResourceL();
       
   637     
       
   638     iHwrWnd->SetStrokeEndMark( iDataStore->StrokeEndMark() );
       
   639 
       
   640     AddControlL( iHwrWnd, EFalse );
       
   641     }
       
   642 
       
   643 // ---------------------------------------------------------------------------
       
   644 // Create the state manager.
       
   645 // ---------------------------------------------------------------------------
       
   646 // 
       
   647 void CPeninputFingerHwrArLayout::CreateStateManagerL()
       
   648     {
       
   649     iStateMgr = CPeninputFingerHwrArStateManager::NewL( this );
       
   650     }
       
   651 
       
   652 // ---------------------------------------------------------------------------
       
   653 // handler of button down event.
       
   654 // ---------------------------------------------------------------------------
       
   655 // 
       
   656 void CPeninputFingerHwrArLayout::OnCtrlButtonDownL( TInt /*aEventType*/,
       
   657     CFepUiBaseCtrl* /*aCtrl*/, const TDesC& /*aEventData*/ )
       
   658     {
       
   659 
       
   660     }
       
   661 
       
   662 // ---------------------------------------------------------------------------
       
   663 // handler of button up event.
       
   664 // ---------------------------------------------------------------------------
       
   665 // 
       
   666 void CPeninputFingerHwrArLayout::OnCtrlButtonUpL( TInt /*aEventType*/,
       
   667     CFepUiBaseCtrl* aCtrl, const TDesC& /*aEventData*/ )
       
   668     {
       
   669     if ( !aCtrl )
       
   670         {
       
   671         return;
       
   672         }
       
   673 
       
   674     switch ( aCtrl->ControlId() )
       
   675         {
       
   676         case EHwrCtrlIdClose:
       
   677             {
       
   678             // Go to standby before closing layout   
       
   679             ChangeCurStateToStandby();
       
   680             SignalOwner( ESignalLayoutClosed );
       
   681             }
       
   682             break;
       
   683         case EHwrCtrlIdLanguageOption:
       
   684             {
       
   685             SignalOwner( ESignalLaunchOptionMenu );
       
   686             OnDeActivate();
       
   687             }
       
   688             break;
       
   689         case EHwrCtrlIdSymbolButton:
       
   690             {
       
   691             // Go to standby before opening symbol table
       
   692 			ChangeCurStateToStandby();
       
   693 			iHwrWnd->OpenSymbolTable();
       
   694             }
       
   695             break;
       
   696         case EHwrCtrlId3Page1Btn:
       
   697             {
       
   698             iHwrWnd->ShowSymbolPage( 1, EPagePosPageNo );
       
   699             }
       
   700             break;
       
   701         case EHwrCtrlId3Page2Btn:
       
   702             {
       
   703             iHwrWnd->ShowSymbolPage( 2, EPagePosPageNo );
       
   704             }
       
   705             break;
       
   706         case EHwrCtrlId3Page3Btn:
       
   707             {
       
   708             iHwrWnd->ShowSymbolPage( 0, EPagePosPageNo );
       
   709             }
       
   710             break;
       
   711         case EHwrCtrlId2Page1Btn:
       
   712             {
       
   713             iHwrWnd->ShowSymbolPage( 1, EPagePosPageNo );
       
   714             }
       
   715             break;    
       
   716         case EHwrCtrlId2Page2Btn:
       
   717             {
       
   718             iHwrWnd->ShowSymbolPage( 0, EPagePosPageNo );
       
   719             }
       
   720             break;    
       
   721 		case EHwrCtrlIdBtnEnter:
       
   722 		    {
       
   723 			TBuf<1> bufEnter;
       
   724             bufEnter.Append( EKeyEnter );
       
   725             SubmitStringToFep( bufEnter );
       
   726             // close the symbol table
       
   727             iHwrWnd->CloseSymbolTable();
       
   728 			}
       
   729             break;
       
   730         case EHwrCtrlIdBtnSpace:
       
   731             {
       
   732 			TBuf<1> bufSpace;
       
   733 			bufSpace.Append( EKeySpace );
       
   734 			SubmitStringToFep( bufSpace );
       
   735 			// close the symbol table
       
   736 			iHwrWnd->CloseSymbolTable();
       
   737             break;    
       
   738 			}		
       
   739         default:
       
   740             break;
       
   741         }
       
   742 
       
   743     }
       
   744 
       
   745 // ---------------------------------------------------------------------------
       
   746 // handler of rep-button clicked event.
       
   747 // ---------------------------------------------------------------------------
       
   748 // 
       
   749 void CPeninputFingerHwrArLayout::OnRepButtonClickedL( CFepUiBaseCtrl* aCtrl,
       
   750     const TDesC& aData )
       
   751     {
       
   752     if ( !aCtrl )
       
   753         {
       
   754         return;
       
   755         }
       
   756 
       
   757     switch ( aCtrl->ControlId() )
       
   758         {
       
   759         case EHwrCtrlIdArrowRight:
       
   760         case EHwrCtrlIdArrowLeft:
       
   761             {
       
   762             SignalOwner( ESignalKeyEvent, aData );
       
   763             }
       
   764             break;
       
   765         default:
       
   766             break;
       
   767         }
       
   768     }
       
   769 
       
   770 // ---------------------------------------------------------------------------
       
   771 // handler of BACKSPACE button clicked event.
       
   772 // ---------------------------------------------------------------------------
       
   773 // 
       
   774 void CPeninputFingerHwrArLayout::OnBackspaceClickedL()
       
   775     {
       
   776 	iHwrWnd->CancelWriting();
       
   777     if (iHwrWnd->IsCandidateShowup())
       
   778         {
       
   779         // goto standby and clear screen
       
   780         if(IsAllowedToSubmitDefaultCandiate())
       
   781             {
       
   782             SignalOwner( ESignalDeleteLastInput, KNullDesC );
       
   783             }
       
   784 		ChangeCurStateToStandby();
       
   785         }
       
   786     else
       
   787         {
       
   788         SubmitCharToFep( EKeyBackspace );
       
   789         iStateMgr->HandleEventL( EHwrEventKeyBack, KNullDesC );
       
   790 		if(iIsStrokeOfDrawingCharacerStarted)
       
   791 		    {
       
   792 			ChangeCurStateToStandby();
       
   793 			}
       
   794         }
       
   795     }
       
   796 
       
   797 // ---------------------------------------------------------------------------
       
   798 // handler of virtual key down event.
       
   799 // ---------------------------------------------------------------------------
       
   800 //
       
   801 void CPeninputFingerHwrArLayout::OnVirtualKeyDownL( CFepUiBaseCtrl* /*aCtrl*/,
       
   802     const TDesC& /*aData*/ )
       
   803     {
       
   804 
       
   805     }
       
   806 
       
   807 // ---------------------------------------------------------------------------
       
   808 // handler of virtual key up event.
       
   809 // ---------------------------------------------------------------------------
       
   810 //  
       
   811 void CPeninputFingerHwrArLayout::OnVirtualKeyUpL( CFepUiBaseCtrl* /*aCtrl*/,
       
   812     const TDesC& aData )
       
   813     {
       
   814     const TVirtualKeyEventData* vkdata = NULL;
       
   815     const TKeyEvent *keydata = NULL;
       
   816     vkdata = reinterpret_cast<const TVirtualKeyEventData*>( aData.Ptr() );
       
   817     keydata = reinterpret_cast<const TKeyEvent*>( aData.Ptr() );
       
   818 
       
   819     if ( vkdata->iKeyEvent.iScanCode == KEmotionKeyMark )
       
   820         {
       
   821         TBuf<KTempBufSize> buf;
       
   822         buf.Append( vkdata->iKeyData );
       
   823         SubmitStringToFep( buf );
       
   824         }
       
   825     else
       
   826         {
       
   827         TBuf<1> bufBck;
       
   828         TInt convertedCode;
       
   829         TBool converted = EFalse;
       
   830         converted = RevertSymbolDirection(keydata->iScanCode,convertedCode);
       
   831         bufBck.Append(convertedCode);
       
   832 //        bufBck.Append(keydata->iScanCode);
       
   833         if(converted)
       
   834             {
       
   835             SignalOwner(ESignalArabicSCTChar,bufBck);
       
   836             }
       
   837         else
       
   838             {
       
   839             SignalOwner( ESignalKeyEvent, bufBck );
       
   840             }
       
   841         }
       
   842         
       
   843     // close the symbol table
       
   844     iHwrWnd->CloseSymbolTable();
       
   845     }
       
   846 
       
   847 // ---------------------------------------------------------------------------
       
   848 // handler of candidate list event.
       
   849 // ---------------------------------------------------------------------------
       
   850 // 
       
   851 void CPeninputFingerHwrArLayout::OnCandidateSelectedL( CFepUiBaseCtrl* aCtrl,
       
   852     const TDesC& aData )
       
   853     {
       
   854     if ( !aCtrl )
       
   855         {
       
   856         return;
       
   857         }
       
   858     
       
   859     iStateMgr->HandleEventL( EHwrEventCandidateSelected, aData );
       
   860     
       
   861     ChangeCurStateToStandby();
       
   862     }
       
   863 
       
   864 
       
   865 // ---------------------------------------------------------------------------
       
   866 // clicked event handler of icf.
       
   867 // ---------------------------------------------------------------------------
       
   868 // 
       
   869 void CPeninputFingerHwrArLayout::OnIcfClicked()
       
   870     {
       
   871     // Go to standby
       
   872 	ChangeCurStateToStandby();
       
   873 	}
       
   874 
       
   875 // ---------------------------------------------------------------------------
       
   876 // handler of StrokeStarted event.
       
   877 // ---------------------------------------------------------------------------
       
   878 //                                              
       
   879 void CPeninputFingerHwrArLayout::OnHwrStrokeStartedL()
       
   880     {
       
   881 	iHwrWnd->HideIndicator();
       
   882 	
       
   883 	// The default candidate cell is not highlight
       
   884 	iDataStore->SetHighlight(EFalse); 
       
   885     
       
   886     // close the candidate list if it's currently showing up	
       
   887 	if(iHwrWnd->IsCandidateShowup())
       
   888 	    {
       
   889 		iHwrWnd->CloseCandidateList();
       
   890 		}
       
   891     
       
   892 	// remember the start writing position.
       
   893 	iIsStrokeOfDrawingCharacerStarted = ETrue;
       
   894 	
       
   895     iStateMgr->HandleEventL( EEventHwrStrokeStarted, KNullDesC );
       
   896     }
       
   897 
       
   898 void CPeninputFingerHwrArLayout::CallBackL()
       
   899     {
       
   900     iHwrWnd->HideIndicator();
       
   901         
       
   902     // The default candidate cell is not highlight
       
   903     iDataStore->SetHighlight(EFalse); 
       
   904     
       
   905     // close the candidate list if it's currently showing up    
       
   906     if(iHwrWnd->IsCandidateShowup())
       
   907         {
       
   908         iHwrWnd->CloseCandidateList();
       
   909         }
       
   910     
       
   911     // remember the start writing position.
       
   912     iIsStrokeOfDrawingCharacerStarted = ETrue;
       
   913     
       
   914     iStateMgr->HandleEventL( EEventHwrStrokeStarted, KNullDesC );
       
   915     }
       
   916 
       
   917 // ---------------------------------------------------------------------------
       
   918 // handler of StrokeFinished event.
       
   919 // ---------------------------------------------------------------------------
       
   920 // 
       
   921 void CPeninputFingerHwrArLayout::OnHwrStrokeFinishedL()
       
   922     {
       
   923     RArray<TPoint> points = iHwrWnd->StrokeList();
       
   924     TPtrC ptr;
       
   925     ptr.Set(reinterpret_cast<TText*>(&points), sizeof(&points));
       
   926     iStateMgr->HandleEventL( EEventHwrStrokeFinished, ptr );
       
   927     }
       
   928 
       
   929 // ---------------------------------------------------------------------------
       
   930 // handler of CharacterFinished event.
       
   931 // ---------------------------------------------------------------------------
       
   932 // 
       
   933 void CPeninputFingerHwrArLayout::OnHwrCharacterFinishedL()
       
   934     {
       
   935     iIsStrokeOfDrawingCharacerStarted = EFalse;
       
   936 	
       
   937     RArray<TPoint> points = iHwrWnd->StrokeList();
       
   938     TPtrC ptr;
       
   939     ptr.Set( reinterpret_cast<TText*>( &points ), sizeof(&points) );
       
   940     iStateMgr->HandleEventL( EEventHwrCharacterTimerOut, ptr );
       
   941     
       
   942 	iHwrWnd->OpenCandidateList();
       
   943 	}
       
   944 
       
   945 // ---------------------------------------------------------------------------
       
   946 // get value from repository.
       
   947 // ---------------------------------------------------------------------------
       
   948 // 	
       
   949 TBool CPeninputFingerHwrArLayout::IsAllowedToSubmitDefaultCandiate()	
       
   950     {
       
   951 	return (!iIsEditorMFNE);
       
   952 	}
       
   953 	
       
   954 // ---------------------------------------------------------------------------
       
   955 // get value from repository.
       
   956 // ---------------------------------------------------------------------------
       
   957 // 
       
   958 TInt CPeninputFingerHwrArLayout::GetNewValue( 
       
   959         CAknFepRepositoryWatcher* aWatcher, const TInt aId )
       
   960     {
       
   961     TInt newValue = -1;
       
   962 
       
   963     if ( aWatcher == iGSRepositoryWatcher )
       
   964         {
       
   965         iRepositorySetting->Get( aId, newValue );
       
   966         }
       
   967 
       
   968     return newValue;
       
   969     }
       
   970 
       
   971 // ---------------------------------------------------------------------------
       
   972 // get hwr trail color from repository.
       
   973 // ---------------------------------------------------------------------------
       
   974 // 
       
   975 TInt CPeninputFingerHwrArLayout::GetPenTrailColor()
       
   976     {
       
   977     TInt newValue = 0;
       
   978     iRepositorySetting->Get( KSettingsPenColor, newValue );
       
   979 
       
   980     if ( !AknPenInputTrailColorUtils::CheckColorInColorTable( newValue ) )
       
   981         {
       
   982         return AknPenInputTrailColorUtils::GetTrailColorByTheme();
       
   983         }
       
   984     return newValue;
       
   985     }
       
   986 
       
   987 // ---------------------------------------------------------------------------
       
   988 // set hwr writing speed.
       
   989 // ---------------------------------------------------------------------------
       
   990 // 
       
   991 void CPeninputFingerHwrArLayout::SetWritingSpeed( const TInt aWritingSpeed )
       
   992     {
       
   993     TTimeIntervalMicroSeconds32 speed;
       
   994     switch ( aWritingSpeed )
       
   995         {
       
   996         case EWritingSpeedVeryFast:
       
   997             {
       
   998             speed = EHwrWritingSpeedVeryFast;
       
   999             }
       
  1000             break;
       
  1001         case EWritingSpeedFast:
       
  1002             {
       
  1003             speed = EHwrWritingSpeedFast;
       
  1004             }
       
  1005             break;
       
  1006         case EWritingSpeedNormal:
       
  1007             {
       
  1008             speed = EHwrWritingSpeedNormal;
       
  1009             }
       
  1010             break;
       
  1011         case EWritingSpeedSlow:
       
  1012             {
       
  1013             speed = EHwrWritingSpeedSlow;
       
  1014             }
       
  1015             break;
       
  1016         case EWritingSpeedVerySlow:
       
  1017             {
       
  1018             speed = EHwrWritingSpeedVerySlow;
       
  1019             }
       
  1020             break;
       
  1021         default:
       
  1022             {
       
  1023             speed = EHwrWritingSpeedNormal;
       
  1024             }
       
  1025             break;
       
  1026         }
       
  1027 
       
  1028     iHwrWnd->SetBoxWritingSpeed( speed );
       
  1029     }
       
  1030 
       
  1031 // ---------------------------------------------------------------------------
       
  1032 // set hwr writing pen width.
       
  1033 // ---------------------------------------------------------------------------
       
  1034 // 
       
  1035 void CPeninputFingerHwrArLayout::SetBoxPenSize( const TSize aPenSize )
       
  1036     {
       
  1037     iHwrWnd->SetBoxPenSize( aPenSize );
       
  1038     }
       
  1039 
       
  1040 // ---------------------------------------------------------------------------
       
  1041 // set hwr writing pen color.
       
  1042 // ---------------------------------------------------------------------------
       
  1043 //  
       
  1044 void CPeninputFingerHwrArLayout::SetBoxPenColor( const TInt aPenColor )
       
  1045     {
       
  1046     iHwrWnd->SetBoxPenColor( aPenColor );
       
  1047     }
       
  1048 
       
  1049 // ---------------------------------------------------------------------------
       
  1050 // set hwr writing pen color.
       
  1051 // ---------------------------------------------------------------------------
       
  1052 //  
       
  1053 void CPeninputFingerHwrArLayout::SetGuideLineOn(TBool aGuideLineOn)
       
  1054     {
       
  1055     iHwrWnd->SetGuideLineOn( aGuideLineOn );
       
  1056     }
       
  1057 
       
  1058 // ---------------------------------------------------------------------------
       
  1059 // change current state manager to standby state.
       
  1060 // ---------------------------------------------------------------------------
       
  1061 // 
       
  1062 void CPeninputFingerHwrArLayout::ChangeCurStateToStandby()
       
  1063     {
       
  1064 	iIsStrokeOfDrawingCharacerStarted = EFalse;
       
  1065 	iHwrWnd->CancelWriting();
       
  1066 	
       
  1067 	// close the candidate list if it's currently showing up	
       
  1068 	if(iHwrWnd->IsCandidateShowup())
       
  1069 	    {
       
  1070 		iHwrWnd->CloseCandidateList();
       
  1071 		}
       
  1072 	
       
  1073 	// close the symbol table
       
  1074     if(iHwrWnd->IsSymbolTableShowingUp())
       
  1075 		{
       
  1076 		iHwrWnd->CloseSymbolTable();
       
  1077 		}
       
  1078     
       
  1079     // set the state to be standby	
       
  1080     iStateMgr->SetState( CPeninputFingerHwrArStateManagerBase::EStateStandBy );
       
  1081     }
       
  1082 // ---------------------------------------------------------------------------
       
  1083 // handler of NumMapping changed event.
       
  1084 // ---------------------------------------------------------------------------
       
  1085 //
       
  1086 void CPeninputFingerHwrArLayout::OnNumMappingChangedL()
       
  1087     {
       
  1088     HBufC* mapping = iDataStore->KeyMappingStringL();
       
  1089 
       
  1090     iHwrWnd->SetNumericMapping( *mapping );
       
  1091 
       
  1092     delete mapping;
       
  1093     }
       
  1094 // ---------------------------------------------------------------------------
       
  1095 // revert special characters direction before sending to editor.
       
  1096 // ---------------------------------------------------------------------------
       
  1097 // 
       
  1098 TBool CPeninputFingerHwrArLayout::RevertSymbolDirection(TInt aInChar, TInt & aOutChar)
       
  1099     {
       
  1100     TBool converted = ETrue;
       
  1101     switch(aInChar)
       
  1102         {
       
  1103         case 0x0028:
       
  1104             {
       
  1105             aOutChar = 0x0029;//convert ( to ).
       
  1106             }
       
  1107             break;
       
  1108         case 0x0029:
       
  1109             {
       
  1110             aOutChar = 0x0028;//convert ) to (.
       
  1111             }
       
  1112             break;
       
  1113         case 0x005B:
       
  1114             {
       
  1115             aOutChar = 0x005D;//convert [ to ].
       
  1116             }
       
  1117             break;
       
  1118         case 0x005D:
       
  1119             {
       
  1120             aOutChar = 0x005B;//convert ] to [.
       
  1121             }
       
  1122             break;
       
  1123         case 0x003C:
       
  1124             {
       
  1125             aOutChar = 0x003E;//convert < to >.
       
  1126             }
       
  1127             break;
       
  1128         case 0x003E:
       
  1129             {
       
  1130             aOutChar = 0x003C;//convert > to <.
       
  1131             }
       
  1132             break;
       
  1133         case 0x007B:
       
  1134             {
       
  1135             aOutChar = 0x007D;//convert { to }.
       
  1136             }
       
  1137             break;
       
  1138         case 0x007D:
       
  1139             {
       
  1140             aOutChar = 0x007B;//convert } to {.
       
  1141             }
       
  1142             break;
       
  1143         default:
       
  1144             aOutChar = aInChar;
       
  1145             converted = EFalse;
       
  1146             break;
       
  1147         }
       
  1148     return converted;
       
  1149     }
       
  1150 
       
  1151 //End of file