textinput/peninputhwrfscn/src/peninputhwrfscndatastore.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputhwrfscn/src/peninputhwrfscndatastore.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1093 @@
+/*
+* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation for chinese peninput full screen hwr
+*
+*/
+
+//SYSTEM INCLUDE
+#include <centralrepository.h>
+#include <settingsinternalcrkeys.h>
+
+//FEP INCLUDE
+#include <aknfeppeninputenums.h>
+#include <AknFepGlobalEnums.h>
+#include <AknFepInternalCRKeys.h>
+
+//USER INCLUDE
+#include "peninputhwrfscndatastore.h"
+#include "peninputhwrtriggerstr.h"
+#include "peninputhwrengine.h"
+
+//CONSTANT DEFINATION HEADER
+#include "peninputhwrfscnstoreconstants.h"
+#include <peninputhwrfscreencn.rsg>
+#include "peninputpluginutils.h"
+
+// ----------------------------------------------------------------------------
+// Symbian constructor
+// ----------------------------------------------------------------------------
+//
+CPeninputHwrfscnDataStore* CPeninputHwrfscnDataStore::NewL( 
+    CPtiEngine* aPtiEngine )
+    {
+    CPeninputHwrfscnDataStore* self = new ( ELeave ) 
+        CPeninputHwrfscnDataStore();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aPtiEngine );
+    CleanupStack::Pop( self );//self
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// C++ constructor
+// ----------------------------------------------------------------------------
+//
+CPeninputHwrfscnDataStore::CPeninputHwrfscnDataStore()
+    {
+    iLanguage = ELangNone;
+    iCurrentNumberMode = EAknEditorStandardNumberModeKeymap;
+    }
+
+// ----------------------------------------------------------------------------
+// destructor
+// ----------------------------------------------------------------------------
+//
+CPeninputHwrfscnDataStore::~CPeninputHwrfscnDataStore()
+    {
+    iSubscriberList.Close();
+    
+    iCandidates.ResetAndDestroy();
+    iCandidates.Close();
+
+    iPredictives.ResetAndDestroy();
+    iPredictives.Close();
+    
+    iRangeStartPos.Close();
+    
+    iPermittedRanges.Close();
+
+    iKeyMappingIdList.Close();
+    
+    iKeyMappingStringList.ResetAndDestroy();
+    iKeyMappingStringList.Close();
+  
+    delete iGSRepositoryWatcher;
+
+    delete iRepositoryFep;
+    delete iRepositorySetting;
+
+    delete iTriggerStr;
+    
+    delete iHwrEngine;
+    
+    delete iUserDefinedResource;
+    }
+
+// ----------------------------------------------------------------------------
+// Second phase constructor
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::ConstructL( CPtiEngine* aPtiEngine )
+    {
+    //create the repository for fep settings    
+    iRepositoryFep = CRepository::NewL( KCRUidAknFep );
+
+    //create the repository for gereral settings
+    iRepositorySetting = CRepository::NewL( KCRUidPersonalizationSettings );
+
+    //create the repository watcher for general settings
+    iGSRepositoryWatcher = CAknFepRepositoryWatcher::NewL( 
+        KCRUidPersonalizationSettings, 
+        TCallBack( HandleGSRepositoryCallBack, this ),
+        iRepositorySetting );
+    
+    //create the trigger string
+    iTriggerStr = new ( ELeave ) CAknFepHwrTriggerStr();
+    
+    //create the hwr engine
+    iHwrEngine = CAknFepHwrEngine::NewL( aPtiEngine, this );
+    
+    //initialize the key mapping list
+    InitKeyMappingListL();
+    }
+
+// ----------------------------------------------------------------------------
+// Initialize the key mapping list
+// ----------------------------------------------------------------------------
+//   
+void CPeninputHwrfscnDataStore::InitKeyMappingListL()
+    {
+     //read the key maping string from resource
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, 
+        R_AKN_FEP_HWR_KEY_MAPPING_STRING_LIST ); 
+    
+    const TInt count = reader.ReadInt16();
+   
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iKeyMappingIdList.Append( reader.ReadInt16() );
+        TPtrC ptr = reader.ReadTPtrC();
+        iKeyMappingStringList.Append( ptr.Alloc() );
+        }
+    iCurrentNumberMode = EAknEditorStandardNumberModeKeymap;
+    CleanupStack::PopAndDestroy();
+    }
+    
+// ----------------------------------------------------------------------------
+// Is candidate in Chinese range
+// ----------------------------------------------------------------------------
+//
+TBool CPeninputHwrfscnDataStore::IsChinese( TInt aCandidateIndex ) const
+    {
+    TUint16 candidate =  ( *iCandidates[aCandidateIndex] )[0];
+    if( candidate >= 0x4E00 && candidate <= 0x9FA5 )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// Is candidate in Chinese range
+// ----------------------------------------------------------------------------
+//
+TBool CPeninputHwrfscnDataStore::IsValid( TInt aCandidateIndex ) const
+    {
+    return ( *iCandidates[aCandidateIndex] ).Length() > 0;
+    }
+
+// ----------------------------------------------------------------------------
+// Is the language which has the homephonic effect.
+// ----------------------------------------------------------------------------
+//
+TBool CPeninputHwrfscnDataStore::IsHomephonicLanguage()
+	{
+	if ( iLanguage == ELangPrcChinese || iLanguage == ELangTaiwanChinese )
+	    {
+	    return ETrue;
+	    }
+	
+	return EFalse;   	
+	}
+	
+// ----------------------------------------------------------------------------
+// Do recoginize by engine
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::DoRecognizeL( const RArray<TPoint>& aTraceData )
+    {
+    iHwrEngine->DoRecognizeL( aTraceData, iCandidates );
+    SetCandidatesL();
+    }
+
+// ----------------------------------------------------------------------------
+// Do predictive using trigger string
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::DoPredictiveL()
+    {
+    // clear the predictives
+    iPredictives.ResetAndDestroy();
+    
+    //if the Primary range is chinese
+    TInt primaryRange = iPermittedRanges[0];
+    
+    if( primaryRange == ERangeNative )
+    	{
+        GetPredictivesOfPriRangeAsChineseL();		
+        }
+    //if the Primary range is english
+    else if( primaryRange == ERangeEnglish )
+        {
+        GetPredictivesOfPriRangeAsEnglishL();
+        }
+    //if the Primary range is number        
+    else if( primaryRange == ERangeNumber )
+        {
+        GetPredictivesOfPriRangeAsNumberL();
+        }                  
+    }
+
+// ----------------------------------------------------------------------------
+// Get predictives of primary range as chinese
+// ----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnDataStore::GetPredictivesOfPriRangeAsChineseL()
+    {
+    TPtrC string = TriggerStr()->GetString();
+    
+    iHwrEngine->DoPredictiveL( string, iPredictives );
+    if( PredictiveCount() == 0 )
+    	{
+    	TriggerStr()->SetLast();
+    	iHwrEngine->DoPredictiveL( TriggerStr()->GetString(), iPredictives );            	
+    	}
+    
+    SetPredictives();
+    }
+
+// ----------------------------------------------------------------------------
+// Get predictives of primary range as Number
+// ----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnDataStore::GetPredictivesOfPriRangeAsNumberL()
+    {
+    if( iPermittedRanges.Count() == 1 )
+        {
+        if( iCurrentNumberMode != EAknEditorPlainNumberModeKeymap )
+            {
+            HBufC* keyMappingBuf = KeyMappingStringL();
+            CleanupStack::PushL( keyMappingBuf );
+            TInt strLen = keyMappingBuf->Length();
+            if( strLen > KNumberCount )
+                {  
+                const TUint16* keyMapingPtr = keyMappingBuf->Ptr();
+                //keyMappingBuf always contains 0~9 number symbol
+                //move the pointer to 11th char, right after 0~9 numbers, 
+                //because we just need symbol not number
+                keyMapingPtr += KNumberCount;
+                
+                TInt length = strLen - KNumberCount;
+                for( TInt i = 0; i < length; i++ )
+                    {
+	                TBuf<1> charBuf;
+                    charBuf.Append( ( keyMapingPtr + i ), 1 );
+                
+                    iPredictives.AppendL( charBuf.AllocL() );
+                    }
+                
+                SetPredictives();
+                }
+            CleanupStack::PopAndDestroy( keyMappingBuf );
+            }
+        }
+    else
+        {
+        TInt symCount = sizeof( NumberPredictSymCode )/sizeof( TUint16 ); 	
+        
+        for( TInt i = 0; i < symCount; i++ )
+            {
+	        TBuf<1> charBuf;
+            charBuf.Append( NumberPredictSymCode[i] );
+
+            iPredictives.AppendL( charBuf.AllocL() );
+            }    
+                    
+        SetPredictives();
+        }    
+    } 
+
+// ----------------------------------------------------------------------------
+// Get predictives of primary range as English
+// ----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnDataStore::GetPredictivesOfPriRangeAsEnglishL()
+    {
+    TInt symCount = sizeof( EnglishPredictSymCode )/sizeof( TUint16 );
+    
+    for( TInt i = 0; i < symCount; i++ )
+        {
+	    TBuf<1> charBuf;
+        charBuf.Append( EnglishPredictSymCode[i] );
+
+        iPredictives.AppendL( charBuf.AllocL() );
+        }
+    
+    if( iPredictives.Count() > 0 )
+    	{
+	    SetPredictives();    
+    	}
+    } 
+                
+// ----------------------------------------------------------------------------
+// Do homophonic using trigger string
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::DoHomophonicL( const TDesC& aString )
+    {
+    iHwrEngine->DoHomophonicL( aString, iCandidates );
+    SetHomephonicCandidatesL();
+    }
+    
+    
+// ----------------------------------------------------------------------------
+// Get the predictive count
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::PredictiveCount() const
+    {
+    return iPredictives.Count();
+    }
+
+// ----------------------------------------------------------------------------
+// Add property subscriber
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::AddSubscriber( 
+    MPeninputHwrfscnPropertySubscriber* aSubscriber )
+    {
+    if ( aSubscriber )
+        {
+        const TInt index = iSubscriberList.Find( aSubscriber );
+      
+        if ( index == KErrNotFound )
+            {
+            iSubscriberList.Append( aSubscriber );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Get the trigger string
+// ----------------------------------------------------------------------------
+//
+CAknFepHwrTriggerStr* CPeninputHwrfscnDataStore::TriggerStr() const
+    {
+    return iTriggerStr;
+    }
+
+// ----------------------------------------------------------------------------
+// Set permitted ranges
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetPermittedRanges( TInt aPermittedRanges )
+    {
+    iPermittedRanges.Reset();
+    
+    //order can not be changed
+    if ( aPermittedRanges & ERangeNative )
+        {
+        iPermittedRanges.Append( ERangeNative );
+        }
+    if ( aPermittedRanges & ERangeEnglish )
+        {
+        iPermittedRanges.Append( ERangeEnglish );
+        }
+    if ( aPermittedRanges & ERangeNumber )
+        {
+        iPermittedRanges.Append( ERangeNumber );
+        }
+    if ( aPermittedRanges & ERangeSymbol )
+        {
+        iPermittedRanges.Append( ERangeSymbol );
+        }
+    
+    iIntRange = aPermittedRanges;
+    
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyPermittedRange );
+    
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyRange );
+    // set primary and auxiliary ranges for hwr engine
+    iHwrEngine->SetRanges( iPermittedRanges );
+    }
+
+// ----------------------------------------------------------------------------
+// Get the permitted ranges
+// ----------------------------------------------------------------------------
+//
+const RArray<TInt>& CPeninputHwrfscnDataStore::PermittedRanges() const
+    {
+    return iPermittedRanges;
+    }
+    
+// ----------------------------------------------------------------------------
+// Set permitted cases
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetPermittedCases( TInt aPermittedCases )
+    {
+    iPermittedCases = aPermittedCases;
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyPermittedCases );
+    }
+
+// ----------------------------------------------------------------------------
+// Set Primary range
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetPrimaryRange( TInt aPrimaryRange )
+    {
+    const TInt oldIndex = iPermittedRanges.Find( aPrimaryRange );
+
+    if ( oldIndex > 0 )
+        {
+        iPermittedRanges.Sort();
+        const TInt index = iPermittedRanges.Find( aPrimaryRange );
+        
+        iPermittedRanges.Remove( index );
+        iPermittedRanges.Insert( aPrimaryRange, 0 );
+
+        NotifySubscriber( 
+            MPeninputHwrfscnPropertySubscriber::
+            EPeninputHwrfscnPropertyRange );
+        
+        // set primary and auxiliary ranges for hwr engine
+        iHwrEngine->SetRanges( iPermittedRanges );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// get Primary range
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::PrimaryRange()
+	{
+	if( iPermittedRanges.Count() > 0 )
+		{
+	    return iPermittedRanges[0];			
+		}
+	return -1;
+	}
+	
+// ----------------------------------------------------------------------------
+// get Primary range
+// ----------------------------------------------------------------------------
+//	
+TBool CPeninputHwrfscnDataStore::IsChinesePrimaryRange()
+    {
+    return ( iPermittedRanges[0] == ERangeNative );
+    }
+    
+// ----------------------------------------------------------------------------
+// Set case
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetCase( TInt aCase )
+    {
+    iCase = aCase;
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyCase );
+    iHwrEngine->SetCase( iCase );
+    }
+
+// ----------------------------------------------------------------------------
+// Judge if a language is Chinese
+// ----------------------------------------------------------------------------
+//
+TBool CPeninputHwrfscnDataStore::LanguageIsChinese( TInt aLanguage )
+    {
+	if ( ( aLanguage == ELangPrcChinese ) ||
+	    ( aLanguage == ELangHongKongChinese ) ||
+	    ( aLanguage == ELangTaiwanChinese ) )
+	    {
+		return ETrue;
+	    }
+	
+	return EFalse;    
+    }
+   
+// ----------------------------------------------------------------------------
+// Set real engine language
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetEngineLanguageL( TInt aLanguage )
+    {
+    SetLanguageShowText( aLanguage );       
+    iHwrEngine->SetLanguageL( aLanguage );
+    iHwrEngine->SetPrimaryCandidateNum( KCandidateCount );
+    }
+
+// ----------------------------------------------------------------------------
+// Set language show text
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetLanguageShowText( TInt aLanguage )
+	{
+    AknPenInputUtils::GetISOLanguageCode( TLanguage( aLanguage ), 
+        iLanguageShowText );
+    }
+    
+// ----------------------------------------------------------------------------
+// Set stroke end mark
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetStrokeEndMark()
+    {
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyStrokeEndMark );
+    }
+
+// ----------------------------------------------------------------------------
+// get stroke end mark from hwr engine
+// ----------------------------------------------------------------------------
+//
+TPoint CPeninputHwrfscnDataStore::StrokeEndMark()
+    {
+    return iHwrEngine->StrokeEndMark();
+    }
+    
+// ----------------------------------------------------------------------------
+// stroke end mark from control
+// ----------------------------------------------------------------------------
+//
+TPoint CPeninputHwrfscnDataStore::StrokeEndMarkFromControl()
+    {
+	return TPoint( KDefaultStrokeEndMarkX, KDefaultStrokeEndMarkY );
+    }
+
+// ----------------------------------------------------------------------------
+// Set language
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetLanguageL( TInt aLanguage )
+    {
+    if( iLanguage == aLanguage )
+        {
+        return;
+        }
+        
+    if ( !LanguageIsChinese( aLanguage ) && ( aLanguage != ELangEnglish ) )
+        {
+        return;
+        }
+        
+    if ( aLanguage == ELangEnglish )
+        {
+        TLanguage displayLang = User::Language();
+        
+        // set real language to a Chinese
+        if ( !LanguageIsChinese( iLanguage ) )
+            {
+            // original language is not Chinese
+            if ( LanguageIsChinese( displayLang ) )
+                {
+            	iLanguage = displayLang;
+                }
+            else
+                {
+                iLanguage = ELangPrcChinese;	
+                }
+                
+            SetEngineLanguageL( iLanguage );
+            }   
+        }
+    else
+        {
+        // aLanguage is Chinese
+        if ( iLanguage != aLanguage )
+            {
+        	iLanguage = aLanguage;
+            
+            SetEngineLanguageL( iLanguage );
+            }
+        }
+
+    // make sure whole window is visible
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyLanguageChanged );
+    }
+
+// ----------------------------------------------------------------------------
+// Get language
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::CurLanguage()
+    {
+    return iLanguage;
+    }
+    
+// ----------------------------------------------------------------------------
+// Set writting speed
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetWritingSpeed( TInt aWritingSpeed )
+    {
+    iWritingSpeed = aWritingSpeed;
+    
+    TTimeIntervalMicroSeconds32 speed;
+    switch ( iWritingSpeed )
+        {
+        case EWritingSpeedVeryFast: 
+            speed = EHwrWritingSpeedVeryFast;
+            break;
+        
+        case EWritingSpeedFast: 
+            speed = EHwrWritingSpeedFast;
+            break;
+        
+        case EWritingSpeedNormal: 
+            speed = EHwrWritingSpeedNormal;
+            break;
+        
+        case EWritingSpeedSlow: 
+            speed = EHwrWritingSpeedSlow;
+            break;
+        
+        case EWritingSpeedVerySlow: 
+            speed = EHwrWritingSpeedVerySlow;
+            break;
+        
+        default:
+            speed = EHwrWritingSpeedNormal;
+            break;
+        }
+
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyWriteSpeed );
+    }
+
+// ----------------------------------------------------------------------------
+// get writting speed
+// ----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds32 CPeninputHwrfscnDataStore::WritingSpeed()
+	{
+    TTimeIntervalMicroSeconds32 speed;
+    switch ( iWritingSpeed )
+        {
+        case EWritingSpeedVeryFast: 
+            speed = EHwrWritingSpeedVeryFast;
+            break;
+       
+        case EWritingSpeedFast: 
+            speed = EHwrWritingSpeedFast;
+            break;
+        
+        case EWritingSpeedNormal: 
+            speed = EHwrWritingSpeedNormal;
+            break;
+        
+        case EWritingSpeedSlow: 
+            speed = EHwrWritingSpeedSlow;
+            break;
+        
+        case EWritingSpeedVerySlow: 
+            speed = EHwrWritingSpeedVerySlow;
+            break;
+        
+        default:
+            speed = EHwrWritingSpeedNormal;
+            break;
+        }	    
+	return speed;	
+	}
+	
+// ----------------------------------------------------------------------------
+// Set trail drawing pen size
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetBoxPenSize( const TSize& aSize )
+    {
+    iPenSize = aSize;
+
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyPenSize );        
+    }
+
+// ----------------------------------------------------------------------------
+// Set trail drawing pen size
+// ----------------------------------------------------------------------------
+//
+TSize CPeninputHwrfscnDataStore::PenSize()
+	{
+	return iPenSize;	
+	}
+	
+// ----------------------------------------------------------------------------
+// Set trail drawing pen color
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetBoxPenColor( const TRgb& aCol )
+    {
+    iPenColor = aCol;
+
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyPenColor );        
+    }
+
+// ----------------------------------------------------------------------------
+// get trail drawing pen color
+// ----------------------------------------------------------------------------
+//
+
+TRgb& CPeninputHwrfscnDataStore::PenColor()
+	{
+	return iPenColor;	
+	}
+
+// ----------------------------------------------------------------------------
+// Set the candidate list
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetCandidatesL()
+    {        
+     //those special chars: backspace and enter char need sent to
+     //app directly, not need to display candidate window
+    
+    if( !IsDirectlySentCandidate( *iCandidates[0] ) )
+        {
+        NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+            EPeninputHwrfscnPropertyCandidates );
+        iTriggerStr->Set( *iCandidates[0] );
+        DoPredictiveL();	
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Set homephonic candidate list
+// ----------------------------------------------------------------------------
+//
+
+void CPeninputHwrfscnDataStore::SetHomephonicCandidatesL()
+    {
+    if ( iCandidates.Count() > 0 )
+        {
+        NotifySubscriber( MPeninputHwrfscnPropertySubscriber
+                        ::EPeninputHwrfscnPropertyHomephonicCandidates ); 
+        TriggerStr()->Set( *iCandidates[0] );
+        DoPredictiveL();                 
+        }
+    }
+// ----------------------------------------------------------------------------
+// Set the predictive list
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetPredictives()
+    {
+    if( PredictiveCount() > 0 )
+        {
+        NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+            EPeninputHwrfscnPropertyPredictives );
+        }
+    }
+    
+// ----------------------------------------------------------------------------
+// Add new predictives to list
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::AddPredictives()
+    {
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyAddPredictives );
+    }
+    
+// ----------------------------------------------------------------------------
+// Get the candidate
+// ----------------------------------------------------------------------------
+//    
+const RPointerArray<HBufC>& CPeninputHwrfscnDataStore::Candidate() 
+    {
+    return iCandidates;
+    }
+    
+// ----------------------------------------------------------------------------
+// Get the predictive
+// ----------------------------------------------------------------------------
+//
+const RPointerArray<HBufC>& CPeninputHwrfscnDataStore::Predictive()
+    {
+    return iPredictives;
+    }
+    
+// ----------------------------------------------------------------------------
+// Notify subscriber
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::NotifySubscriber( 
+    const MPeninputHwrfscnPropertySubscriber::
+    TPeninputHwrfscnProperty aPropertyName )
+    {
+    for ( TInt i = 0; i < iSubscriberList.Count(); i++ )
+        {
+        TRAP_IGNORE( iSubscriberList[i]->PropertyChangedL( aPropertyName ) );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Callback method to notify repository change
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::HandleGSRepositoryCallBack( TAny* aPtr )
+    {
+    CPeninputHwrfscnDataStore *self = 
+        static_cast<CPeninputHwrfscnDataStore*>( aPtr );
+    
+    CAknFepRepositoryWatcher* watcher = self->iGSRepositoryWatcher;
+    if ( watcher )
+        {
+        TInt newValue = self->GetNewValue( watcher, watcher->ChangedKey() );
+        
+        switch ( watcher->ChangedKey() )
+            {
+            case KSettingsWritingSpeed:
+                self->SetWritingSpeed( newValue );
+                break;
+            case KSettingsPenWidth:
+                self->SetBoxPenSize( TSize( newValue,newValue ) );
+                break;
+            case KSettingsPenColor:
+                self->SetBoxPenColor( newValue );
+                break;
+            default:
+                break;
+            }
+        }
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// Set number mode for hwr engine
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetNumberMode( 
+    const TAknEditorNumericKeymap aNumberMode )
+    {
+    iCurrentNumberMode = aNumberMode;
+    NotifySubscriber( MPeninputHwrfscnPropertySubscriber::
+        EPeninputHwrfscnPropertyNumberMode );
+
+    iHwrEngine->SetNumberMode( aNumberMode );
+    iHwrEngine->SetRanges( iPermittedRanges );       
+    }
+
+// ----------------------------------------------------------------------------
+// Set number mode for hwr engine
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SetNumberModeL( const TDesC& aCustomMode )
+    {
+    iHwrEngine->SetCustomKeymapL( aCustomMode );
+    
+    delete iUserDefinedResource;
+    iUserDefinedResource = NULL;
+    iUserDefinedResource = HBufC::NewL( aCustomMode.Length() );
+    iUserDefinedResource->Des().Append( aCustomMode );
+    }
+
+// ----------------------------------------------------------------------------
+// Get pen trail color
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::GetPenTrailColor()
+    {
+    TInt newValue = 0; 
+    iRepositorySetting->Get( KSettingsPenColor, newValue );
+    
+    if (!AknPenInputTrailColorUtils::CheckColorInColorTable(newValue))
+        {
+        return AknPenInputTrailColorUtils::GetTrailColorByTheme();
+        }
+    return newValue;
+    }
+// ----------------------------------------------------------------------------
+// LoadAndPublishDefault
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::LoadAndPublishDefaultL()
+    {
+    if ( iRepositorySetting )
+        {
+        TInt newValue;
+
+        iRepositorySetting->Get( KSettingsWritingSpeed, newValue );
+        SetWritingSpeed( newValue );
+        
+        iRepositorySetting->Get( KSettingsPenWidth, newValue );
+        TInt width = newValue;
+        TInt height = newValue;
+        SetBoxPenSize( TSize( width,height ) );
+
+        newValue = GetPenTrailColor();        
+        SetBoxPenColor( newValue );
+        
+        iRepositorySetting->Get( KSettingsPenInputLang, newValue );
+        SetLanguageL( newValue );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// save range to repository if english or chinese
+// ----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::SaveRange( TInt aRange )
+    {
+    if ( iRepositoryFep && ( aRange == ERangeNative || aRange == ERangeEnglish ) )
+        {
+        iRepositoryFep->Set( KAknFepLastUsedRange, aRange );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Get rep value
+// ----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnDataStore::GetNewValue( 
+    CAknFepRepositoryWatcher* aWatcher, TInt aId )
+    {
+    TInt newValue = -1;
+    
+    if ( aWatcher == iGSRepositoryWatcher )
+        {
+        iRepositorySetting->Get( aId, newValue );
+        }
+        
+    return newValue;
+    }
+
+// ------------------------------------------------------------------
+// Get next predictive candidate page
+// -------------------------------------------------------------------
+//
+void CPeninputHwrfscnDataStore::GetNextPredictivePageL()
+    {
+    iHwrEngine->DoPredictiveL( KNullDesC, iPredictives, ETrue );
+ 
+    TInt predictCount = PredictiveCount();
+    if ( predictCount> 0 && predictCount < KMaxPredictiveCount )
+        {
+        AddPredictives();
+        }
+    }
+    
+// --------------------------------------------------------------------
+// IsNumberOnly()
+// -------------------------------------------------------------------
+//  
+TBool CPeninputHwrfscnDataStore::IsNumberOnly()
+    {
+    return ( ( iPermittedRanges.Count()==1 ) && 
+        ( iPermittedRanges[0]==ERangeNumber ) );
+    }
+    
+// --------------------------------------------------------------------
+// Get number keymapping string
+// --------------------------------------------------------------------
+//   
+HBufC* CPeninputHwrfscnDataStore::KeyMappingStringL() const
+    {
+    TLocale locale;
+    TBuf<KMaxNumericString> rs = KNumberString();
+    const TInt index = iKeyMappingIdList.Find( iCurrentNumberMode );
+    
+    if ( iCurrentNumberMode == EKeymapFromResource )
+        {
+        rs.Append( *iUserDefinedResource );
+        }
+    
+    else if ( index != KErrNotFound )
+        {
+        HBufC* buf = iKeyMappingStringList[index];
+        
+        rs.Append( *buf );
+        
+        if ( ( iCurrentNumberMode == 
+            EAknEditorCalculatorNumberModeKeymap ) ||
+            ( iCurrentNumberMode == EAknEditorConverterNumberModeKeymap ) )
+            {
+            rs.Append( locale.DecimalSeparator() ); 
+            }       
+        }
+        
+    return rs.AllocL();          
+    }
+
+// ------------------------------------------------------------------------
+// CPeninputHwrfscnDataStore::IsSpecialDisplayChars
+// ------------------------------------------------------------------------
+//       
+TBool CPeninputHwrfscnDataStore::IsSpecialDisplayChars( const TDesC& aChar )
+    {
+    
+    if( aChar.Compare( KGestureEnter ) == 0 
+       || aChar.Compare( KDisplayBackspace ) == 0
+       || aChar.Compare( KGestureSpace )== 0
+       || aChar.Compare( KSmileFontCode ) == 0
+       || aChar.Compare( KCryFontCode ) == 0 ) 
+        {
+        return ETrue;
+        }
+            
+    return EFalse;
+    }
+    
+// ------------------------------------------------------------------------
+// CPeninputHwrfscnDataStore::ConvertDisplayChars
+// ------------------------------------------------------------------------
+//   
+HBufC* CPeninputHwrfscnDataStore::ConvertDisplayChars( const TDesC& aChar )    
+    {
+    HBufC* convertedCan = NULL;
+    TBuf<KSpecialConvertedCharCount> str;
+    if( aChar.Compare( KGestureEnter ) == 0 )
+        {
+        str.Append( EKeyEnter );
+        } 
+    else if( aChar.Compare( KDisplayBackspace ) == 0 )
+        {
+        str.Append( EKeyBackspace );
+        }
+    else if( aChar.Compare( KGestureSpace )== 0 )
+        {
+        str.Append( EKeySpace );
+        }
+    else if( aChar.Compare( KSmileFontCode ) == 0 )
+        {
+        str.Append( KColon );
+        str.Append( KHyphen );
+        str.Append( KRightParenthesis );
+        }
+    else if( aChar.Compare( KCryFontCode ) == 0 )
+        {
+        str.Append( KColon );
+        str.Append( KHyphen );
+        str.Append( KLeftParenthesis );
+        }
+                 
+    if( str.Length() > 0 )
+    	{
+    	convertedCan = str.Alloc();	
+    	}
+    	
+    return convertedCan;
+    }
+
+// ----------------------------------------------------------------------------
+// Get language show text
+// ----------------------------------------------------------------------------
+//
+const TDesC& CPeninputHwrfscnDataStore::LanguageShowText()
+    {
+    return iLanguageShowText;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnDataStore::IsDirectlySentCandidate
+// -----------------------------------------------------------------------------
+//  
+TBool CPeninputHwrfscnDataStore::IsDirectlySentCandidate( const TDesC& aChar )
+    {
+    
+    if( aChar.Compare( KGestureEnter ) == 0 
+      || aChar.Compare( KDisplayBackspace ) == 0 )
+       {
+       return ETrue;
+       }
+           
+    return EFalse;
+    }
+TInt CPeninputHwrfscnDataStore::SetInputAreaSize(TSize& aSize)
+    {
+    return iHwrEngine->SetInputAreaSize(aSize);    
+    }      
+TInt CPeninputHwrfscnDataStore::SetScreenSize(TSize& aSize)
+    {
+    return iHwrEngine->SetScreenSize(aSize);    
+    }      
+// End Of File