textinput/peninputfingerhwrar/src/peninputfingerhwrarengine.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 of HWR engine
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 //FEP INCLUDES
       
    20 #include <AknFepGlobalEnums.h>
       
    21 #include <aknfeppeninputenums.h>
       
    22 #include <PtiHwrRecognizer.h>
       
    23 #include <e32property.h>
       
    24 #include "PtiDefs.h"
       
    25 
       
    26 //USER INCLUDES
       
    27 #include "peninputfingerhwrarengine.h"
       
    28 #include "peninputfingerhwrardatastore.h"
       
    29 
       
    30 // CONSTANT DEFINITION HEADER
       
    31 #include "peninputfingerhwrarstoreconstants.h"
       
    32 
       
    33 // ---------------------------------------------------------------------------
       
    34 // Symbian constructor
       
    35 // ---------------------------------------------------------------------------
       
    36 //
       
    37 CPeninputFingerHwrArEngine* CPeninputFingerHwrArEngine::NewL( CPtiEngine* aPtiEngine, 
       
    38     CPeninputFingerHwrArDataStore* aOwner )
       
    39     {
       
    40     CPeninputFingerHwrArEngine* self = new ( ELeave ) CPeninputFingerHwrArEngine();
       
    41     
       
    42     CleanupStack::PushL( self );
       
    43     self->ConstructL( aPtiEngine, aOwner );
       
    44     CleanupStack::Pop( self );//self
       
    45 
       
    46     return self;
       
    47     }
       
    48 
       
    49 // ---------------------------------------------------------------------------
       
    50 // destructor
       
    51 // ---------------------------------------------------------------------------
       
    52 //
       
    53 CPeninputFingerHwrArEngine::~CPeninputFingerHwrArEngine()
       
    54     {
       
    55     RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType);
       
    56     
       
    57     if( iOwnPtiEngine )
       
    58         {
       
    59         delete iPtiEngine;
       
    60         }
       
    61     delete iCustomKeymap;
       
    62     
       
    63     delete iIdle;
       
    64     
       
    65     iNeedPermittedRanges.Close();
       
    66     }
       
    67 
       
    68 // ---------------------------------------------------------------------------
       
    69 // Do recoginize by engine
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 void CPeninputFingerHwrArEngine::DoRecognizeL( const RArray<TPoint>& aTraceData, 
       
    73     RPointerArray<HBufC>& aCandidates )
       
    74     {
       
    75     if ( !iRecognizer)
       
    76         {
       
    77         DoIdleConstructL();
       
    78         }
       
    79         
       
    80     TPoint ctrlStrokeEndMark = iOwner->StrokeEndMarkFromControl();
       
    81         
       
    82     if ( ctrlStrokeEndMark != iRecognizer->StrokeEndMark() )
       
    83         {
       
    84         ConvertStrokeEndMark( CONST_CAST( RArray<TPoint>&, aTraceData ), 
       
    85             iOwner->StrokeEndMarkFromControl(), 
       
    86             iRecognizer->StrokeEndMark() );
       
    87         iOwner->SetStrokeEndMark(); // make control's stroke end mark info same to engine
       
    88         }
       
    89     
       
    90     aCandidates.ResetAndDestroy();
       
    91 
       
    92     TInt primaryCount = iRecognizer->Recognize( aTraceData, aCandidates ); 
       
    93 
       
    94     // filter recognized candidate, set start position for all ranges    
       
    95     TPtrC ptr( KSeparator );
       
    96     
       
    97        
       
    98     // remove uncessary primary candidate
       
    99     TInt totallyCount = aCandidates.Count();
       
   100     }
       
   101     
       
   102 
       
   103  
       
   104 // ---------------------------------------------------------------------------
       
   105 // Set primary and auxiliary ranges for hwr engine
       
   106 // ---------------------------------------------------------------------------
       
   107 //
       
   108 void CPeninputFingerHwrArEngine::SetRanges( const RArray<TInt>& aPermittedRanges )
       
   109     {
       
   110     TRAP_IGNORE( SetRangesL( aPermittedRanges ) );
       
   111     }
       
   112     
       
   113 // ---------------------------------------------------------------------------
       
   114 // Set primary and auxiliary ranges for hwr engine
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 void CPeninputFingerHwrArEngine::SetRangesL( const RArray<TInt>& aPermittedRanges )
       
   118     {
       
   119    	ASSERT( aPermittedRanges.Count() > 0 );
       
   120 
       
   121     if ( !iRecognizer )
       
   122         {
       
   123     	iNeedPermittedRanges.Reset();
       
   124     	
       
   125     	for ( TInt i = 0; i < aPermittedRanges.Count(); i++ )
       
   126     	    {
       
   127             iNeedPermittedRanges.Append( aPermittedRanges[i] );
       
   128     	    }
       
   129     	
       
   130     	iNeedSetRange = ETrue;
       
   131     	return;    
       
   132         }
       
   133     else 
       
   134     	{
       
   135         iPremaryRange = aPermittedRanges[0];
       
   136         iRangeCount = aPermittedRanges.Count();
       
   137 
       
   138         SetCandidatesMaxCount( KCandidateCount );
       
   139 
       
   140 
       
   141         TRecognitionRange range;
       
   142         SetRecognitionRange( aPermittedRanges[0], range );
       
   143         
       
   144     
       
   145        
       
   146         iRecognizer->SetRange( range );
       
   147         SetCase( iCase );
       
   148     	}
       
   149     }
       
   150 
       
   151     
       
   152 // ---------------------------------------------------------------------------------------------
       
   153 // Set case
       
   154 // ---------------------------------------------------------------------------------------------
       
   155 //
       
   156 void CPeninputFingerHwrArEngine::SetCase( const TInt aCase )
       
   157     {
       
   158     iCase = aCase;
       
   159     
       
   160     if ( !iRecognizer )
       
   161         {
       
   162     	iNeedSetCase = ETrue;
       
   163         }
       
   164     else
       
   165         {
       
   166         // set letter to lower first when LowerCase
       
   167 	    // set letter to upper first when UpperCase and TextCase
       
   168         if ( aCase == ECaseLower )
       
   169             {
       
   170             iRecognizer->SetFirstLetterOrder( ELowerFirst );
       
   171             }
       
   172         else
       
   173             {
       
   174             iRecognizer->SetFirstLetterOrder( EUpperFirst );
       
   175             }
       
   176         }
       
   177     }
       
   178 
       
   179 // ---------------------------------------------------------------------------------------------
       
   180 // Set number mode for hwr engine
       
   181 // ---------------------------------------------------------------------------------------------
       
   182 //
       
   183 void CPeninputFingerHwrArEngine::SetNumberMode( const TAknEditorNumericKeymap& aNumberMode )
       
   184     {
       
   185     iNumberMode = aNumberMode;
       
   186     
       
   187     if ( !iRecognizer )
       
   188         {
       
   189         iNeedSetNumberMode = ETrue;
       
   190         }
       
   191     else
       
   192         {
       
   193         iRecognizer->SetNumberMode( aNumberMode );
       
   194         if( aNumberMode !=  EKeymapFromResource )
       
   195             {
       
   196             ResetCustomKeyMap();
       
   197             }
       
   198         }
       
   199     }
       
   200 
       
   201 // ---------------------------------------------------------------------------------------------
       
   202 // Get stroke end mark from hwr engine
       
   203 // ---------------------------------------------------------------------------------------------
       
   204 //
       
   205 TPoint CPeninputFingerHwrArEngine::StrokeEndMark() const
       
   206     {
       
   207     if ( iRecognizer )
       
   208         {
       
   209         return iRecognizer->StrokeEndMark();
       
   210         }
       
   211     else
       
   212         {
       
   213         return TPoint( KDefaultStrokeEndMarkX, KDefaultStrokeEndMarkY );
       
   214         }
       
   215     }
       
   216 
       
   217 // ---------------------------------------------------------------------------------------------
       
   218 // Set primary candidate num for hwr engine
       
   219 // ---------------------------------------------------------------------------------------------
       
   220 //
       
   221 TInt CPeninputFingerHwrArEngine::SetPrimaryCandidateNum( const TInt aNum )
       
   222     {
       
   223     if ( iRecognizer )
       
   224         {
       
   225         return iRecognizer->SetCandidateNum( aNum );
       
   226         }
       
   227     else
       
   228         {
       
   229         return KErrGeneral;
       
   230         }
       
   231     }
       
   232         
       
   233 // ---------------------------------------------------------------------------------------------
       
   234 // Set total candidate num that should be shown
       
   235 // ---------------------------------------------------------------------------------------------
       
   236 //
       
   237 void CPeninputFingerHwrArEngine::SetCandidatesMaxCount( const TInt aCount )
       
   238     {
       
   239     iTotalCandidateNum = aCount;
       
   240     }
       
   241     
       
   242 // ---------------------------------------------------------------------------------------------
       
   243 // Set language
       
   244 // ---------------------------------------------------------------------------------------------
       
   245 //
       
   246 void CPeninputFingerHwrArEngine::SetLanguageL( const TInt aLanguage )
       
   247     {
       
   248     if ( ( iLanguage == aLanguage ) ||
       
   249          ( aLanguage != ELangArabic ) )
       
   250         {
       
   251         return;
       
   252         }
       
   253         
       
   254     iLanguage = aLanguage;
       
   255         
       
   256 
       
   257 	iRecognizer = NULL;
       
   258 	
       
   259 	if( !iIdle->IsActive() )
       
   260 	    {
       
   261 	    iIdle->Start( TCallBack( BackgroundTaskL, this ) );
       
   262 	    }
       
   263     }
       
   264 
       
   265 // ---------------------------------------------------------------------------
       
   266 // Set recognition range for hwr engine
       
   267 // ---------------------------------------------------------------------------
       
   268 //
       
   269 void CPeninputFingerHwrArEngine::SetCustomKeymapL( const TDesC& aKeyMap )
       
   270     {
       
   271     ResetCustomKeyMap();
       
   272     
       
   273     iCustomKeymap = HBufC::NewL( aKeyMap.Length() + KNumberString().Length() );
       
   274     iCustomKeymap->Des().Copy( KNumberString() );
       
   275     iCustomKeymap->Des().Append( aKeyMap );
       
   276     }
       
   277 
       
   278 // ---------------------------------------------------------------------------
       
   279 // Set recognition range for hwr engine
       
   280 // ---------------------------------------------------------------------------
       
   281 //
       
   282 void CPeninputFingerHwrArEngine::ResetCustomKeyMap()
       
   283     {
       
   284     delete iCustomKeymap;
       
   285     iCustomKeymap = NULL;
       
   286     }
       
   287 
       
   288 // ---------------------------------------------------------------------------------------------
       
   289 // CPeninputFingerHwrArEngine::BackgroundConstructL
       
   290 // Do background construct.
       
   291 // ---------------------------------------------------------------------------------------------
       
   292 //
       
   293 TBool CPeninputFingerHwrArEngine::BackgroundTaskL( TAny* aPtr )
       
   294     {
       
   295     CPeninputFingerHwrArEngine* self = static_cast<CPeninputFingerHwrArEngine*>( aPtr );
       
   296     self->DoIdleConstructL();
       
   297     return EFalse;
       
   298     }
       
   299     
       
   300 // ---------------------------------------------------------------------------
       
   301 // Set hand writing area size
       
   302 // ---------------------------------------------------------------------------
       
   303 //
       
   304 TInt CPeninputFingerHwrArEngine::SetInputAreaSize(TSize& aSize)
       
   305     {
       
   306     return iRecognizer ? iRecognizer->SetInputAreaSize(aSize) : KErrNotFound;     
       
   307     }
       
   308 
       
   309 // ---------------------------------------------------------------------------
       
   310 // Set hand writing screen size
       
   311 // ---------------------------------------------------------------------------
       
   312 //
       
   313 TInt CPeninputFingerHwrArEngine::SetScreenSize(TSize& aSize)    
       
   314     {
       
   315     return iRecognizer ? iRecognizer->SetScreenSize(aSize) : KErrNotFound;
       
   316     }
       
   317 
       
   318 // ---------------------------------------------------------------------------
       
   319 // C++ constructor
       
   320 // ---------------------------------------------------------------------------
       
   321 //
       
   322 CPeninputFingerHwrArEngine::CPeninputFingerHwrArEngine()
       
   323     {
       
   324     iNeedSetNumberMode = EFalse;
       
   325     iNeedSetCase = EFalse;
       
   326     iNeedSetRange = EFalse;
       
   327     iRecognizer = NULL;    
       
   328     iOwnPtiEngine = EFalse;
       
   329     }
       
   330 
       
   331 // ---------------------------------------------------------------------------
       
   332 // Second phase constructor
       
   333 // ---------------------------------------------------------------------------
       
   334 //
       
   335 void CPeninputFingerHwrArEngine::ConstructL( CPtiEngine* aPtiEngine, 
       
   336     CPeninputFingerHwrArDataStore* aOwner )
       
   337     {
       
   338     if( !aPtiEngine )
       
   339         {
       
   340         iPtiEngine = CPtiEngine::NewL( ETrue );
       
   341         iOwnPtiEngine = ETrue;
       
   342         }
       
   343     else
       
   344     	{
       
   345     	iPtiEngine = aPtiEngine;
       
   346     	}
       
   347 
       
   348     iIdle = CIdle::NewL( CActive::EPriorityIdle );
       
   349     iOwner = aOwner;
       
   350     }
       
   351 
       
   352 // ---------------------------------------------------------------------------
       
   353 // Set recognition range for hwr engine
       
   354 // ---------------------------------------------------------------------------
       
   355 //
       
   356 void CPeninputFingerHwrArEngine::SetRecognitionRange( const TInt aRange, 
       
   357     TRecognitionRange& aRecognitionRange )
       
   358     {
       
   359     aRecognitionRange.iLanguage = TLanguage( iLanguage );
       
   360 
       
   361     switch ( aRange )
       
   362         {
       
   363         case ERangeNative:
       
   364 			{
       
   365 			aRecognitionRange.iSubRange = EPtiRangeNative;
       
   366 			}
       
   367             break;
       
   368         case ERangeEnglish:
       
   369             {
       
   370             aRecognitionRange.iLanguage = ELangEnglish;
       
   371             aRecognitionRange.iSubRange = EPtiRangeLatin;  
       
   372             }
       
   373             break;
       
   374         case ERangeNumber:
       
   375             {
       
   376             aRecognitionRange.iSubRange = EPtiRangeNumber;
       
   377             }
       
   378             break;
       
   379         default:
       
   380             break;
       
   381         }
       
   382     }
       
   383     
       
   384 // ---------------------------------------------------------------------------------------------
       
   385 // CPeninputFingerHwrArEngine::DoIdleConstructL
       
   386 // Do background construct.
       
   387 // ---------------------------------------------------------------------------------------------
       
   388 //
       
   389 void CPeninputFingerHwrArEngine::DoIdleConstructL()
       
   390     {
       
   391     if ( iRecognizer )
       
   392         {
       
   393         return;
       
   394         }
       
   395 
       
   396 	iRecognizer = iPtiEngine->GetHwrRecognizerL( TLanguage( iLanguage ) );
       
   397     
       
   398 	iOwner->SetStrokeEndMark();
       
   399 	SetPrimaryCandidateNum( KPremaryCandidateCount );
       
   400 	
       
   401     if ( iNeedSetRange )
       
   402         {
       
   403         SetRanges( iNeedPermittedRanges );
       
   404         iNeedPermittedRanges.Reset();
       
   405         iNeedSetRange = EFalse;        
       
   406         }
       
   407     
       
   408     if ( iNeedSetCase )
       
   409         {
       
   410     	SetCase( iCase );
       
   411     	iNeedSetCase = EFalse;
       
   412         }
       
   413     
       
   414     if ( iNeedSetNumberMode )
       
   415         {
       
   416     	SetNumberMode( TAknEditorNumericKeymap( iNumberMode ) );
       
   417     	iNeedSetNumberMode = EFalse;
       
   418         }
       
   419     }
       
   420 
       
   421 // ---------------------------------------------------------------------------
       
   422 // Convert stroke end mark
       
   423 // ---------------------------------------------------------------------------
       
   424 //
       
   425 void CPeninputFingerHwrArEngine::ConvertStrokeEndMark( RArray<TPoint>& aTraceData, 
       
   426     TPoint aPnt1, TPoint aPnt2 )
       
   427     {
       
   428     TInt count = aTraceData.Count();
       
   429 
       
   430     for ( TInt i = 0; i < count; i++ )
       
   431         {
       
   432     	if ( aTraceData[i] == aPnt1 )
       
   433     	    {
       
   434     		aTraceData.Remove( i );
       
   435     		aTraceData.Insert( aPnt2, i );
       
   436     	    }
       
   437         }
       
   438     }    
       
   439     
       
   440 // ---------------------------------------------------------------------------
       
   441 // Reset Keyboard type to original type
       
   442 // ---------------------------------------------------------------------------
       
   443 //
       
   444 void CPeninputFingerHwrArEngine::ResetKeyboardType()
       
   445     {
       
   446     RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType);
       
   447     }        
       
   448      
       
   449      
       
   450 // ---------------------------------------------------------------------------
       
   451 // Set Keyboard type to Qwerty
       
   452 // ---------------------------------------------------------------------------
       
   453 //
       
   454 void CPeninputFingerHwrArEngine::SetKeyboardToQwerty()
       
   455     {
       
   456     RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, EPtiKeyboardQwerty4x12);
       
   457     }        
       
   458 
       
   459 // ---------------------------------------------------------------------------
       
   460 // Get Keyboard type
       
   461 // ---------------------------------------------------------------------------
       
   462 //
       
   463 void CPeninputFingerHwrArEngine::GetKeyboardType()
       
   464     {
       
   465     RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType);
       
   466     }        
       
   467 
       
   468 void CPeninputFingerHwrArEngine::GetTopGuideLinePos(TInt& aPos)
       
   469     {
       
   470     if(iRecognizer)
       
   471         {
       
   472         iRecognizer->GetTopGuideLinePos(aPos);
       
   473         }
       
   474     }
       
   475 
       
   476 void CPeninputFingerHwrArEngine::GetBottomGuideLinePos(TInt& aPos)
       
   477     {
       
   478     if(iRecognizer)
       
   479         {
       
   480         iRecognizer->GetBottomGuideLinePos(aPos);
       
   481         }
       
   482     }
       
   483    
       
   484 //End Of File