textinput/peninputfingerhwrar/src/peninputfingerhwrarstatemanager.cpp
branchRCL_3
changeset 21 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarstatemanager.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,572 @@
+/*
+* Copyright (c) 2009 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 arabic peninput finger hwr
+*
+*/
+
+#include <peninputcmd.h>
+
+#include "peninputfingerhwrarlayout.h"
+#include "peninputfingerhwrarwnd.h"
+#include "peninputfingerhwrarstatemanager.h"
+#include "peninputfingerhwrardatastore.h"
+#include "peninputfingerhwrarevent.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrArStateHandlerBase class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateHandlerBase::CPeninputFingerHwrArStateHandlerBase()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateHandlerBase::CPeninputFingerHwrArStateHandlerBase( 
+CPeninputFingerHwrArStateManagerBase& aStateManager )
+    :iStateManager( aStateManager ),
+    iDataStore( aStateManager.HwrLayout().DataStore() )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateHandlerBase::~CPeninputFingerHwrArStateHandlerBase()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateHandlerBase::~CPeninputFingerHwrArStateHandlerBase()
+    {
+    
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrStateManager class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateManager::CPeninputFingerHwrStateManager()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateManagerBase::CPeninputFingerHwrArStateManagerBase( 
+    CPeninputFingerHwrArLayout* aLayout )
+    :iLayout(aLayout)
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateManager::~CPeninputFingerHwrStateManager()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateManagerBase::~CPeninputFingerHwrArStateManagerBase()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateManager::CosntructL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateManagerBase::BaseConstructL()
+    {
+
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManagerBase::SetState()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputFingerHwrArStateManagerBase::SetState( TInt /*aState*/ )
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManagerBase::IsStandbyState()
+// .
+// -----------------------------------------------------------------------------
+//
+TBool CPeninputFingerHwrArStateManagerBase::IsStandbyState()
+    {
+    if(iCurrentState == 0)
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManagerBase::HandleEventL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputFingerHwrArStateManagerBase::HandleEventL( const TInt /*aEventType*/,
+    const TDesC& /*aEventData*/)
+    {
+
+    }
+
+CPeninputFingerHwrArLayout& CPeninputFingerHwrArStateManagerBase::HwrLayout()
+    {
+    return *iLayout;
+    }
+
+ 
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrStateManager class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::NewL()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateManager* CPeninputFingerHwrArStateManager::NewL( 
+    CPeninputFingerHwrArLayout* aLayout )
+    {
+    CPeninputFingerHwrArStateManager* self = new( ELeave ) 
+        CPeninputFingerHwrArStateManager( aLayout );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::CPeninputFingerHwrStateManager()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateManager::CPeninputFingerHwrArStateManager( 
+    CPeninputFingerHwrArLayout* aLayout )
+    :CPeninputFingerHwrArStateManagerBase( aLayout )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::~CPeninputFingerHwrStateManager()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputFingerHwrArStateManager::~CPeninputFingerHwrArStateManager()
+    {
+	for( int i = 0; i < EPeninputFingerHwrArStateCount; ++i )
+		{
+		delete iStateHandlers[i];
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::CosntructL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateManager::ConstructL()
+    {
+    BaseConstructL();
+    
+    TInt i = 0;
+    
+    iStates[i] = EPeninputFingerHwrArStateStandby;
+    iStateHandlers[i] = CPeninputFingerHwrArStateStandby::NewL( *this );
+
+	iStates[++i] = EPeninputFingerHwrArStateWriting;
+    iStateHandlers[i] = CPeninputFingerHwrArStateWriting::NewL( *this );
+    
+	iStates[++i] = EPeninputFingerHwrArStateCandidateSelecting;
+    iStateHandlers[i] = 
+        CPeninputFingerHwrArStateCandidateSelecting::NewL( *this );
+	  
+    iCurrentStateHandler = iStateHandlers[0];
+    iCurrentState = EPeninputFingerHwrArStateStandby;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::SetState()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputFingerHwrArStateManager::SetState( TInt aState )
+    {
+    if( iCurrentState == aState )        
+        {
+        return;    
+        }
+        
+    CPeninputFingerHwrArStateHandlerBase* newStateHandler = Find( (TPeninputFingerHwrArState)aState );
+    if( newStateHandler )
+        {
+        iCurrentState = (TPeninputFingerHwrArState)aState;
+        iCurrentStateHandler->OnExit();
+        iCurrentStateHandler = newStateHandler;
+        iCurrentStateHandler->OnEntry();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::Find()
+// .
+// -----------------------------------------------------------------------------
+//  
+CPeninputFingerHwrArStateHandlerBase* CPeninputFingerHwrArStateManager::Find( 
+    TPeninputFingerHwrArState aState )
+    {
+    for( TInt i = 0; i < EPeninputFingerHwrArStateCount; i++ )
+        {
+        if( iStates[i] == aState )
+            {
+            return iStateHandlers[i];
+            }
+        }
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateManager::HandleEventL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputFingerHwrArStateManager::HandleEventL( const TInt aEventType, 
+    const TDesC& aEventData )
+    {
+    iCurrentStateHandler->HandleEventL( aEventType, aEventData );
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrStateHandlerStandby class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerStandby::CPeninputFingerHwrStateHandlerStandby()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateStandby::CPeninputFingerHwrArStateStandby( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+	:CPeninputFingerHwrArStateHandlerBase( aStateManager )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerStandby::NewL()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateStandby* CPeninputFingerHwrArStateStandby::NewL( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+    {
+    CPeninputFingerHwrArStateStandby* self = new( ELeave ) 
+        CPeninputFingerHwrArStateStandby( aStateManager );
+    
+    return self;
+                                                                                
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerStandby::HandleEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateStandby::HandleEventL( const TInt aEventType, 
+    const TDesC& /*aEventData*/ )
+    {
+    switch( aEventType )
+        {
+        case EEventHwrStrokeStarted:
+            {
+            iStateManager.SetState( 
+                CPeninputFingerHwrArStateManager::EPeninputFingerHwrArStateWriting );
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerStandby::OnEntry()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateStandby::OnEntry()
+    {
+//    iDataStore.TriggerStr()->DeleteAll();
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerStandby::OnExit()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateStandby::OnExit()
+    {
+
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrStateHandlerWriting class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::CPeninputFingerHwrStateHandlerWriting()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateWriting::CPeninputFingerHwrArStateWriting( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+	:CPeninputFingerHwrArStateHandlerBase( aStateManager )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::NewL()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateWriting* CPeninputFingerHwrArStateWriting::NewL( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+    {
+    CPeninputFingerHwrArStateWriting* self = new( ELeave ) 
+        CPeninputFingerHwrArStateWriting( aStateManager );
+    
+    return self;
+                                                                                
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::HandleEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateWriting::HandleEventL( const TInt aEventType, 
+    const TDesC& aEventData )
+    {
+    switch( aEventType )
+        {
+        case EEventHwrStrokeFinished:
+            {
+            OnEndStrokeL(aEventData);
+            }
+            break;
+        case EEventHwrCharacterTimerOut:
+            {
+            OnEndWritingL( aEventData );
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::OnEndStrokeL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateWriting::OnEndStrokeL( const TDesC& aEventData )
+	{
+	const RArray<TPoint>* aTraceData = ( RArray<TPoint>* )aEventData.Ptr();
+    iDataStore.DoRecognizeL( *aTraceData );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::OnEndWriting()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateWriting::OnEndWritingL( const TDesC& /*aEventData*/ )
+	{
+    // record the default cell highlight flag.
+    iDataStore.SetHighlight(ETrue);
+    // This is a workarround to clear the recognizer.
+    RArray<TPoint> stroke_array;
+    stroke_array.Reset(); 
+    // Call recognize with a empty array of stroke is the condition
+    // to clear the context>
+    iDataStore.DoRecognizeL(stroke_array );      
+    
+    RPointerArray<HBufC> candidates = iDataStore.Candidate();
+    if ( candidates.Count() > 0 )
+        {
+		if(iStateManager.HwrLayout().IsAllowedToSubmitDefaultCandiate())
+		    {
+			iStateManager.HwrLayout().SubmitStringToFep( *candidates[0]);
+			}
+        iStateManager.SetState( CPeninputFingerHwrArStateManager::
+                EPeninputFingerHwrArStateCandidateSelecting );  
+        
+        } 
+	}
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::OnEntry()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateWriting::OnEntry()
+    {
+     
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateWriting::OnExit()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateWriting::OnExit()
+    {
+    
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+//                     CPeninputFingerHwrStateHandlerCandidateSelecting class
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateCandidateSelecting::
+//                              CPeninputFingerHwrArStateCandidateSelecting()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateCandidateSelecting::
+    CPeninputFingerHwrArStateCandidateSelecting( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+	:CPeninputFingerHwrArStateHandlerBase( aStateManager )
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateCandidateSelecting::NewL()
+// .
+// -----------------------------------------------------------------------------
+// 
+CPeninputFingerHwrArStateCandidateSelecting* 
+    CPeninputFingerHwrArStateCandidateSelecting::NewL( 
+	CPeninputFingerHwrArStateManager& aStateManager )
+    {
+    CPeninputFingerHwrArStateCandidateSelecting* self = new( ELeave ) 
+        CPeninputFingerHwrArStateCandidateSelecting( aStateManager );
+    
+    return self;                                                                                
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrArStateCandidateSelecting::HandleEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateCandidateSelecting::HandleEventL( const TInt aEventType, 
+    const TDesC& aEventData )
+    {
+    switch( aEventType )
+        {
+        case EHwrEventCandidateSelected:
+            {
+            OnSelectedCandidatesL( aEventData );
+            }
+            break;
+        case EHwrEventKeyBack:
+            {
+            OnClickBackSpaceL();
+            }
+            break;
+        case EEventHwrStrokeStarted:
+            {
+            iStateManager.SetState( CPeninputFingerHwrArStateManager::
+                EPeninputFingerHwrArStateWriting );
+            }
+            break;                     
+        default:
+            break;
+        }
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerCandidateSelecting::OnSelectedCandidatesL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputFingerHwrArStateCandidateSelecting::OnSelectedCandidatesL( 
+    const TDesC& aEventData )
+    {
+    //get the candidate index
+    const TInt cellNo = aEventData[aEventData.Length()-1];
+    if (!iDataStore.IsValidCandidate( cellNo ))
+        {
+        iStateManager.SetState( CPeninputFingerHwrArStateManager::
+                        EPeninputFingerHwrArStateStandby );
+        return;
+        }    
+    
+    TPtrC ptr;
+    ptr.Set( ( aEventData.Left( aEventData.Length() - 1 ) ) );
+	if(!iStateManager.HwrLayout().IsAllowedToSubmitDefaultCandiate())
+		{
+		iStateManager.HwrLayout().SubmitStringToFep( ptr);
+		}
+	else
+        {
+		RPointerArray<HBufC> candidates = iDataStore.Candidate();
+		//the selected char is not same as default
+		//replace the default candidate
+		HBufC* defaultCandidate = candidates[0];
+		if( *defaultCandidate != ptr )
+			{
+			iStateManager.HwrLayout().Replace( *defaultCandidate, ptr, EFalse);         
+			}
+		}	
+    iDataStore.SetArabicSymbolL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerCandidateSelecting::OnClickBackSpaceL()
+// .
+// -----------------------------------------------------------------------------
+// 
+void CPeninputFingerHwrArStateCandidateSelecting::OnClickBackSpaceL()
+    {
+    iDataStore.SetHighlight(EFalse);                                                        
+    iDataStore.SetArabicSymbolL();
+    iStateManager.SetState( CPeninputFingerHwrArStateManager::
+            EPeninputFingerHwrArStateStandby );
+    }
+    
+    
+        
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerCandidateSelecting::OnEntry()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateCandidateSelecting::OnEntry()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputFingerHwrStateHandlerCandidateSelecting::OnExit()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputFingerHwrArStateCandidateSelecting::OnExit()
+    {
+    
+    }
+//End of file