diff -r eb1f2e154e89 -r f5a1e66df979 textinput/peninputfingerhwrar/src/peninputfingerhwrarengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarengine.cpp Fri Feb 19 23:09:27 2010 +0200 @@ -0,0 +1,484 @@ +/* +* Copyright (c) 2005-2008 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 of HWR engine +* +*/ + + +//FEP INCLUDES +#include +#include +#include +#include +#include "PtiDefs.h" + +//USER INCLUDES +#include "peninputfingerhwrarengine.h" +#include "peninputfingerhwrardatastore.h" + +// CONSTANT DEFINITION HEADER +#include "peninputfingerhwrarstoreconstants.h" + +// --------------------------------------------------------------------------- +// Symbian constructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrArEngine* CPeninputFingerHwrArEngine::NewL( CPtiEngine* aPtiEngine, + CPeninputFingerHwrArDataStore* aOwner ) + { + CPeninputFingerHwrArEngine* self = new ( ELeave ) CPeninputFingerHwrArEngine(); + + CleanupStack::PushL( self ); + self->ConstructL( aPtiEngine, aOwner ); + CleanupStack::Pop( self );//self + + return self; + } + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrArEngine::~CPeninputFingerHwrArEngine() + { + RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType); + + if( iOwnPtiEngine ) + { + delete iPtiEngine; + } + delete iCustomKeymap; + + delete iIdle; + + iNeedPermittedRanges.Close(); + } + +// --------------------------------------------------------------------------- +// Do recoginize by engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::DoRecognizeL( const RArray& aTraceData, + RPointerArray& aCandidates ) + { + if ( !iRecognizer) + { + DoIdleConstructL(); + } + + TPoint ctrlStrokeEndMark = iOwner->StrokeEndMarkFromControl(); + + if ( ctrlStrokeEndMark != iRecognizer->StrokeEndMark() ) + { + ConvertStrokeEndMark( CONST_CAST( RArray&, aTraceData ), + iOwner->StrokeEndMarkFromControl(), + iRecognizer->StrokeEndMark() ); + iOwner->SetStrokeEndMark(); // make control's stroke end mark info same to engine + } + + aCandidates.ResetAndDestroy(); + + TInt primaryCount = iRecognizer->Recognize( aTraceData, aCandidates ); + + // filter recognized candidate, set start position for all ranges + TPtrC ptr( KSeparator ); + + + // remove uncessary primary candidate + TInt totallyCount = aCandidates.Count(); + } + + + +// --------------------------------------------------------------------------- +// Set primary and auxiliary ranges for hwr engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetRanges( const RArray& aPermittedRanges ) + { + TRAP_IGNORE( SetRangesL( aPermittedRanges ) ); + } + +// --------------------------------------------------------------------------- +// Set primary and auxiliary ranges for hwr engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetRangesL( const RArray& aPermittedRanges ) + { + ASSERT( aPermittedRanges.Count() > 0 ); + + if ( !iRecognizer ) + { + iNeedPermittedRanges.Reset(); + + for ( TInt i = 0; i < aPermittedRanges.Count(); i++ ) + { + iNeedPermittedRanges.Append( aPermittedRanges[i] ); + } + + iNeedSetRange = ETrue; + return; + } + else + { + iPremaryRange = aPermittedRanges[0]; + iRangeCount = aPermittedRanges.Count(); + + SetCandidatesMaxCount( KCandidateCount ); + + + TRecognitionRange range; + SetRecognitionRange( aPermittedRanges[0], range ); + + + + iRecognizer->SetRange( range ); + SetCase( iCase ); + } + } + + +// --------------------------------------------------------------------------------------------- +// Set case +// --------------------------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetCase( const TInt aCase ) + { + iCase = aCase; + + if ( !iRecognizer ) + { + iNeedSetCase = ETrue; + } + else + { + // set letter to lower first when LowerCase + // set letter to upper first when UpperCase and TextCase + if ( aCase == ECaseLower ) + { + iRecognizer->SetFirstLetterOrder( ELowerFirst ); + } + else + { + iRecognizer->SetFirstLetterOrder( EUpperFirst ); + } + } + } + +// --------------------------------------------------------------------------------------------- +// Set number mode for hwr engine +// --------------------------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetNumberMode( const TAknEditorNumericKeymap& aNumberMode ) + { + iNumberMode = aNumberMode; + + if ( !iRecognizer ) + { + iNeedSetNumberMode = ETrue; + } + else + { + iRecognizer->SetNumberMode( aNumberMode ); + if( aNumberMode != EKeymapFromResource ) + { + ResetCustomKeyMap(); + } + } + } + +// --------------------------------------------------------------------------------------------- +// Get stroke end mark from hwr engine +// --------------------------------------------------------------------------------------------- +// +TPoint CPeninputFingerHwrArEngine::StrokeEndMark() const + { + if ( iRecognizer ) + { + return iRecognizer->StrokeEndMark(); + } + else + { + return TPoint( KDefaultStrokeEndMarkX, KDefaultStrokeEndMarkY ); + } + } + +// --------------------------------------------------------------------------------------------- +// Set primary candidate num for hwr engine +// --------------------------------------------------------------------------------------------- +// +TInt CPeninputFingerHwrArEngine::SetPrimaryCandidateNum( const TInt aNum ) + { + if ( iRecognizer ) + { + return iRecognizer->SetCandidateNum( aNum ); + } + else + { + return KErrGeneral; + } + } + +// --------------------------------------------------------------------------------------------- +// Set total candidate num that should be shown +// --------------------------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetCandidatesMaxCount( const TInt aCount ) + { + iTotalCandidateNum = aCount; + } + +// --------------------------------------------------------------------------------------------- +// Set language +// --------------------------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetLanguageL( const TInt aLanguage ) + { + if ( ( iLanguage == aLanguage ) || + ( aLanguage != ELangArabic ) ) + { + return; + } + + iLanguage = aLanguage; + + + iRecognizer = NULL; + + if( !iIdle->IsActive() ) + { + iIdle->Start( TCallBack( BackgroundTaskL, this ) ); + } + } + +// --------------------------------------------------------------------------- +// Set recognition range for hwr engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetCustomKeymapL( const TDesC& aKeyMap ) + { + ResetCustomKeyMap(); + + iCustomKeymap = HBufC::NewL( aKeyMap.Length() + KNumberString().Length() ); + iCustomKeymap->Des().Copy( KNumberString() ); + iCustomKeymap->Des().Append( aKeyMap ); + } + +// --------------------------------------------------------------------------- +// Set recognition range for hwr engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::ResetCustomKeyMap() + { + delete iCustomKeymap; + iCustomKeymap = NULL; + } + +// --------------------------------------------------------------------------------------------- +// CPeninputFingerHwrArEngine::BackgroundConstructL +// Do background construct. +// --------------------------------------------------------------------------------------------- +// +TBool CPeninputFingerHwrArEngine::BackgroundTaskL( TAny* aPtr ) + { + CPeninputFingerHwrArEngine* self = static_cast( aPtr ); + self->DoIdleConstructL(); + return EFalse; + } + +// --------------------------------------------------------------------------- +// Set hand writing area size +// --------------------------------------------------------------------------- +// +TInt CPeninputFingerHwrArEngine::SetInputAreaSize(TSize& aSize) + { + return iRecognizer ? iRecognizer->SetInputAreaSize(aSize) : KErrNotFound; + } + +// --------------------------------------------------------------------------- +// Set hand writing screen size +// --------------------------------------------------------------------------- +// +TInt CPeninputFingerHwrArEngine::SetScreenSize(TSize& aSize) + { + return iRecognizer ? iRecognizer->SetScreenSize(aSize) : KErrNotFound; + } + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CPeninputFingerHwrArEngine::CPeninputFingerHwrArEngine() + { + iNeedSetNumberMode = EFalse; + iNeedSetCase = EFalse; + iNeedSetRange = EFalse; + iRecognizer = NULL; + iOwnPtiEngine = EFalse; + } + +// --------------------------------------------------------------------------- +// Second phase constructor +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::ConstructL( CPtiEngine* aPtiEngine, + CPeninputFingerHwrArDataStore* aOwner ) + { + if( !aPtiEngine ) + { + iPtiEngine = CPtiEngine::NewL( ETrue ); + iOwnPtiEngine = ETrue; + } + else + { + iPtiEngine = aPtiEngine; + } + + iIdle = CIdle::NewL( CActive::EPriorityIdle ); + iOwner = aOwner; + } + +// --------------------------------------------------------------------------- +// Set recognition range for hwr engine +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetRecognitionRange( const TInt aRange, + TRecognitionRange& aRecognitionRange ) + { + aRecognitionRange.iLanguage = TLanguage( iLanguage ); + + switch ( aRange ) + { + case ERangeNative: + { + aRecognitionRange.iSubRange = EPtiRangeNative; + } + break; + case ERangeEnglish: + { + aRecognitionRange.iLanguage = ELangEnglish; + aRecognitionRange.iSubRange = EPtiRangeLatin; + } + break; + case ERangeNumber: + { + aRecognitionRange.iSubRange = EPtiRangeNumber; + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------------------------- +// CPeninputFingerHwrArEngine::DoIdleConstructL +// Do background construct. +// --------------------------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::DoIdleConstructL() + { + if ( iRecognizer ) + { + return; + } + + iRecognizer = iPtiEngine->GetHwrRecognizerL( TLanguage( iLanguage ) ); + + iOwner->SetStrokeEndMark(); + SetPrimaryCandidateNum( KPremaryCandidateCount ); + + if ( iNeedSetRange ) + { + SetRanges( iNeedPermittedRanges ); + iNeedPermittedRanges.Reset(); + iNeedSetRange = EFalse; + } + + if ( iNeedSetCase ) + { + SetCase( iCase ); + iNeedSetCase = EFalse; + } + + if ( iNeedSetNumberMode ) + { + SetNumberMode( TAknEditorNumericKeymap( iNumberMode ) ); + iNeedSetNumberMode = EFalse; + } + } + +// --------------------------------------------------------------------------- +// Convert stroke end mark +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::ConvertStrokeEndMark( RArray& aTraceData, + TPoint aPnt1, TPoint aPnt2 ) + { + TInt count = aTraceData.Count(); + + for ( TInt i = 0; i < count; i++ ) + { + if ( aTraceData[i] == aPnt1 ) + { + aTraceData.Remove( i ); + aTraceData.Insert( aPnt2, i ); + } + } + } + +// --------------------------------------------------------------------------- +// Reset Keyboard type to original type +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::ResetKeyboardType() + { + RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType); + } + + +// --------------------------------------------------------------------------- +// Set Keyboard type to Qwerty +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::SetKeyboardToQwerty() + { + RProperty::Set(KCRUidAvkon, KAknKeyBoardLayout, EPtiKeyboardQwerty4x12); + } + +// --------------------------------------------------------------------------- +// Get Keyboard type +// --------------------------------------------------------------------------- +// +void CPeninputFingerHwrArEngine::GetKeyboardType() + { + RProperty::Get(KCRUidAvkon, KAknKeyBoardLayout, iKeyboardType); + } + +void CPeninputFingerHwrArEngine::GetTopGuideLinePos(TInt& aPos) + { + if(iRecognizer) + { + iRecognizer->GetTopGuideLinePos(aPos); + } + } + +void CPeninputFingerHwrArEngine::GetBottomGuideLinePos(TInt& aPos) + { + if(iRecognizer) + { + iRecognizer->GetBottomGuideLinePos(aPos); + } + } + +//End Of File