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