textinput/peninputhwrfscn/src/peninputhwrfscnlayout.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputhwrfscn/src/peninputhwrfscnlayout.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,716 @@
+/*
+* 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 INCLUDES
+#include <bautils.h>
+#include <coemain.h>
+
+//FEP Includes
+#include <AknFepGlobalEnums.h>
+#include <aknfeppeninputenums.h>
+#include <peninputlayoutchoicelist.h>
+
+//USER INCLUDES
+#include "peninputhwrfscncandidatepanel.h"
+#include "peninputhwrfscncontrolbar.h"
+#include "peninputhwrfscndatastore.h"
+#include "peninputhwrfscnstatemanager.h"
+#include "peninputhwrfscnwritingbox.h"
+#include "peninputhwrfscnevent.h"
+#include "peninputhwrfscnlayout.h"
+
+//CONST DEFINATION
+_LIT( KFSHWRRssFile, "\\resource\\peninputhwrfscreencn.rsc" );
+const TUint8 KTempBufSize = 8;
+const TUint8 KIntLen = sizeof( TInt )/2; 
+const TUint8 KIntSize = sizeof( TInt );
+
+// ============================ MEMBER FUNCTIONS ===============================
+  
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::NewL()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputHwrfscnLayout* CPeninputHwrfscnLayout::NewL( 
+    MLayoutOwner* aLayoutOwner, const TAny* aInitData )
+    {
+    CPeninputHwrfscnLayout* self = new( ELeave ) 
+        CPeninputHwrfscnLayout( aLayoutOwner );
+    CleanupStack::PushL( self );
+    self->ConstructL( aInitData );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CPeninputHwrfscnLayout()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputHwrfscnLayout::CPeninputHwrfscnLayout( MLayoutOwner* aLayoutOwner )
+    :CPenInputFullScreenLayoutBase( aLayoutOwner )
+    {  
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::~CPeninputHwrfscnLayout()
+// .
+// -----------------------------------------------------------------------------
+//
+CPeninputHwrfscnLayout::~CPeninputHwrfscnLayout()
+    {
+    CCoeEnv::Static()->DeleteResourceFile( iResId );
+    
+    delete iDataStore;
+    delete iStateMgr;
+    delete iFsHwrBox;
+    delete iCandidatePanel;
+    delete iControlBar;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::ConstructL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::ConstructL( const TAny* aInitData )
+    {
+    BaseConstructL();    
+    //load resource
+    TFileName resFileName( KFSHWRRssFile );
+    CCoeEnv* coeEnv = CCoeEnv::Static();
+    BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resFileName );
+    iResId = coeEnv->AddResourceFileL( resFileName );
+    
+    //initialze the data store
+    TPeninputLayoutData* layoutData = (TPeninputLayoutData*)aInitData;    
+
+    iDataStore = CPeninputHwrfscnDataStore::NewL( (*layoutData).iPtiEngine);
+    
+    //create state manager   
+    CreateStateManagerL(); 
+    
+    //create the transparent window
+    CreateHwrWindowL();
+    
+    //create the candidate panel
+    CreateCandidatePanelL();
+    
+    //create the control panel
+    CreateControlBarL();
+    
+    //set screen layout extent
+    SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::OnDeActivate()
+// .
+// -----------------------------------------------------------------------------
+//        
+void CPeninputHwrfscnLayout::OnDeActivate()
+	{
+	//CFepUiLayout::OnDeActivate();	
+	CPenInputFullScreenLayoutBase::OnDeActivate();
+	iFsHwrBox->CancelCharWriting();
+	TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) );	
+	}
+	
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CreateControlBarL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::CreateControlBarL()
+	{
+	iControlBar = CPeninputHwrfscnControlBar::NewL( this );
+	iControlBar->AddEventObserver( this );
+	}
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CreateCandidatePanelL()
+// .
+// -----------------------------------------------------------------------------
+//	
+void CPeninputHwrfscnLayout::CreateCandidatePanelL()
+	{
+	iCandidatePanel = CPeninputHwrfscnCandidatePanel::NewL( this );
+	iCandidatePanel->AddEventObserver( this );
+	}
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CreateHwrWindowL()
+// .
+// -----------------------------------------------------------------------------
+//	
+void CPeninputHwrfscnLayout::CreateHwrWindowL()
+	{	
+	iFsHwrBox = CPeninputHwrfscnWritingBox::NewL( this );
+	iFsHwrBox->AddEventObserver( this );
+	}
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CreateStateManagerL()
+// .
+// -----------------------------------------------------------------------------
+//	
+void CPeninputHwrfscnLayout::CreateStateManagerL()
+    {
+    iStateMgr = CPeninputHwrfscnStateManager::NewL( this );
+    }
+    	
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleCommand()
+//  handle the command from Fep
+// -----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnLayout::HandleCommand( TInt aCmd, TUint8* aData )
+    {
+	if( CFepUiLayout::HandleCommand( aCmd, aData ) == KErrNone )
+	    {
+	    return KErrNone;
+	    }
+	
+	TInt ret = KErrUnknown;   
+	switch( aCmd )
+        {
+        case ECmdPenInputEditorNumericKeyMap:
+            {
+            iDataStore->SetNumberMode( *( TAknEditorNumericKeymap* )aData );
+            
+            ret = KErrNone;
+            }
+            break;
+            
+        case ECmdPenInputPermittedRange:
+            {
+            TInt ranges = *( TInt* )aData;
+            iDataStore->SetPermittedRanges( ranges );
+            
+            ret = KErrNone;
+            }
+            break;
+        
+        case ECmdPenInputLanguage:
+            {
+            TInt language = *( TInt* )aData;
+            TRAP_IGNORE( iDataStore->SetLanguageL( language ) );
+            
+            ret = KErrNone;
+            }
+            break;
+        
+        case ECmdPenInputRange:
+            {
+            TInt range = *( TInt* )aData;
+            iDataStore->SetPrimaryRange( range );
+            
+            TBuf<KIntLen> buf;
+            buf.Append( reinterpret_cast<TText*>( aData ), KIntLen );
+            
+            SignalOwner( ESignalRange, buf );   
+            
+            ret = KErrNone;
+            }
+            break;
+
+        case ECmdPenInputPermittedCase:
+            {
+            TInt cs = *( TInt* )aData;
+            iDataStore->SetPermittedCases( cs );
+            
+            ret = KErrNone;
+            }
+            break;
+            
+        case ECmdPenInputCase:
+            {
+            TInt cs = *( TInt* )aData;
+            iDataStore->SetCase( cs );                
+            
+            ret = KErrNone;
+            }
+            break;
+   
+        case ECmdPenInputEditorCustomNumericKeyMap:
+            {
+            TInt len = *( TInt* )( aData - KIntSize );
+            TPtrC16 keymapRes( ( TUint16* )aData, len / 2 );
+            TRAP_IGNORE( iDataStore->SetNumberModeL( keymapRes ) );
+            
+            ret = KErrNone;
+            }
+            break;
+            
+        case ECmdPenInputWindowOpen:
+            {
+            LayoutOwner()->Hide( EFalse );
+            TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) );
+            RootControl()->UpdateValidRegion(NULL, EFalse);
+            TPixelsTwipsAndRotation size; 
+            CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(size);
+            TSize wndSize(size.iPixelSize.iWidth,size.iPixelSize.iHeight);
+            iDataStore->SetInputAreaSize(wndSize);
+            iDataStore->SetScreenSize(wndSize);
+            ret = KErrNone;
+            }
+            break;
+            
+        case ECmdPenInputWindowClose:
+            {
+            // clear stroke on the screen when close FS-HWR before writing time out 
+            //iFsHwrBox->CancelCharWriting();
+            TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) ); 
+            LayoutOwner()->Hide( ETrue );           
+            
+            ret = KErrNone;
+            }
+            break;
+        
+        case ECmdPenInputEnableSettingBtn:    
+            {
+            iControlBar->SetEnableSettingBtn(*aData);
+            ret = KErrNone;
+            }
+            break;
+    
+        default:
+            break;
+        }
+          
+    return ret;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::SizeChanged()
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CPeninputHwrfscnLayout::SizeChanged( const TAny* /*pData*/ )
+    {
+    //Handle size change event
+
+	// To clear the stroke on the screen when rotate device
+    //iFsHwrBox->CancelCharWriting();
+    SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) );
+    iFsHwrBox->SizeChanged();
+    iCandidatePanel->SizeChanged();
+    iControlBar->SizeChanged();
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleControlEvent()
+// .
+// -----------------------------------------------------------------------------
+//	
+void CPeninputHwrfscnLayout::HandleControlEvent( TInt aEventType, 
+    CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+    {
+    switch( aEventType )
+        {
+        case EHwrEventKeyBack:
+        case EHwrEventBtnMoreFunction:
+        case EHwrEventSetRangeChinese:
+        case EHwrEventSetRangeEnglish:
+        case EHwrEventSetRangeNumber:
+        case EHwrEventRangeClick:
+        case EEventButtonDown:
+        case EHwrEventClose:
+        case EHwrEventTouchInputOption:
+        case EEventChoiceSelected:            
+            {           
+            TRAP_IGNORE( HandleControlBarEventL( aEventType, aCtrl, aEventData ) );            
+            }
+            break;
+            
+        case EHwrEventKeySpace:
+        case EHwrEventKeyEnter:
+//        case EHwrEventInputLangSwitch:
+        case EHwrEventVkbSwitch:
+        case EEventVirtualKeyUp:
+            {
+            TRAP_IGNORE( HandleFunctionListEventL( aEventType, aCtrl, aEventData ) );
+            }
+            break;
+            
+        case EHwrEventBeginWriting:
+        case EHwrEventEndStroke:
+        case EHwrEventEndWriting:
+        case EHwrEventCandidateSelected:
+        case EHwrEventPredictiveSelected:
+            {
+            TRAP_IGNORE( HandleHwrWndEventL( aEventType, aEventData ) );
+            }
+            break;
+            
+        case EHwrEventGetNextCandidatePage:
+            {
+            TRAP_IGNORE( HandleCandidateWndEventL( aEventType, aEventData ) );
+            }
+            break;  
+                      
+        default:
+        	break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleRawKeyEventL()
+// .
+// -----------------------------------------------------------------------------
+//    
+TBool CPeninputHwrfscnLayout::HandleRawKeyEventL( const TRawEvent& /*aKeyEvent*/ )
+    {
+    NotifyOutsideEventL( ECandidatePanel | ECtrlBar );
+    return EFalse;            
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleControlBarEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnLayout::HandleControlBarEventL( TInt aEventType,
+                                                     CFepUiBaseCtrl* /*aCtrl*/,
+                                                     const TDesC& aEventData )
+    {
+    switch( aEventType )
+        {
+        case EHwrEventKeyBack:
+            {
+            if ( !StrokeFilter() )
+                {
+                iFsHwrBox->CancelCharWriting();
+                }
+            else
+                {
+                TBuf<1> bufBck;
+                bufBck.Append( EKeyBackspace );
+                SubmitStringToFep( bufBck );    
+                }
+            NotifyOutsideEventL( ECandidatePanel );
+            }   
+            break;
+            	
+        case EHwrEventSetRangeChinese:
+            {
+            iDataStore->SetPrimaryRange( ERangeNative );
+            iDataStore->SaveRange( ERangeNative );
+            NotifyPrimaryRangeChanged( ERangeNative );
+            iControlBar->Draw();
+            }
+            break;
+            
+        case EHwrEventSetRangeEnglish:
+            {
+            iDataStore->SetPrimaryRange( ERangeEnglish );
+            iDataStore->SaveRange( ERangeEnglish );
+            NotifyPrimaryRangeChanged( ERangeEnglish );
+            iControlBar->Draw();
+            }
+            break;
+            
+        case EHwrEventSetRangeNumber:
+            {
+            iDataStore->SetPrimaryRange( ERangeNumber );
+            iDataStore->SaveRange( ERangeNumber );
+            NotifyPrimaryRangeChanged( ERangeNumber );
+            iControlBar->Draw();
+            }
+            break;
+            
+        case EHwrEventRangeClick:
+        case EHwrEventBtnMoreFunction:
+            {
+            iFsHwrBox->CancelCharWriting();
+            NotifyOutsideEventL( ECandidatePanel );
+            }
+            break;
+            
+        case EHwrEventTouchInputOption:
+            {
+            SignalOwner( ESignalLaunchOptionMenu );
+            }
+            break;
+                    
+        case EEventChoiceSelected:
+            {
+            CFepLayoutChoiceList::SEvent* event = 
+                ( CFepLayoutChoiceList::SEvent* )aEventData.Ptr();
+            if ( event->iIndex == -1 )
+                {
+                return;
+                }                
+            
+            TBool switchByMode = ETrue;
+            TInt  mode = event->iCommand;
+
+            TBuf<KTempBufSize> buf;
+            buf.Append( reinterpret_cast<TText*>( &switchByMode ), 
+                sizeof( TBool )/sizeof( TText ) );
+            buf.Append( reinterpret_cast<TText*>( &mode ),
+                sizeof( TInt )/sizeof( TText ) );
+            SignalOwner( ESignalLayoutUIChanged, buf );
+            }
+            break;
+            
+        case EHwrEventClose:
+            {
+            SignalOwner(ESignalLayoutClosed);
+            }
+            break;
+            
+        default:
+        	break;            
+        }                
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleFunctionListEventL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::HandleFunctionListEventL( TInt aEventType,
+                                                       CFepUiBaseCtrl* /*aCtrl*/,
+                                                       const TDesC& aEventData )
+    {
+    switch( aEventType )
+        {
+        case EHwrEventKeyEnter:
+            {
+            TBuf<1> bufEnter;
+            bufEnter.Append( EKeyEnter );
+            SubmitStringToFep( bufEnter );
+            }
+            break;
+            	
+        case EHwrEventKeySpace:
+            {
+            if ( !iDataStore->IsNumberOnly() )
+                {
+                TBuf<1> bufSpace;
+                bufSpace.Append( EKeySpace );
+                SubmitStringToFep( bufSpace );
+                }
+            }
+            break;
+            
+        case EEventVirtualKeyUp:
+            {
+            TBuf<KTempBufSize> buf;
+            TVirtualKeyEventData* event = ( TVirtualKeyEventData* ) aEventData.Ptr();
+            buf.Append( event->iKeyData );
+            //the special char: smilefont char and cryfont char
+            if( iDataStore->IsSpecialDisplayChars( buf ) )
+                {
+                HBufC* convertedBuf = iDataStore->ConvertDisplayChars( buf );
+                buf = *convertedBuf;
+                delete convertedBuf;
+                }
+            SubmitStringToFep( buf );
+            }
+            break;
+        }
+        
+    }                                                     
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleHwrWndEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnLayout::HandleHwrWndEventL( TInt aEventType,
+    const TDesC& aEventData )
+    {   
+    if( aEventType == EHwrEventBeginWriting )
+        {
+        NotifyOutsideEventL( ECandidatePanel | ECtrlBar );
+        }
+
+    iStateMgr->HandleEventL( aEventType, aEventData );
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::HandleCandidateWndEventL()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::HandleCandidateWndEventL( TInt /*aEventType*/,
+    const TDesC& /*aEventData*/ )
+    {
+    iDataStore->GetNextPredictivePageL();
+    }
+                                                           
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::DataStore()
+// .
+// -----------------------------------------------------------------------------
+//	
+CPeninputHwrfscnDataStore& CPeninputHwrfscnLayout::DataStore()
+    {
+    return *iDataStore;
+    }
+ 
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::OnAppEditorTextComing()
+// .
+// -----------------------------------------------------------------------------
+//	    
+TInt CPeninputHwrfscnLayout::OnAppEditorTextComing( 
+    const TFepInputContextFieldData& aData )
+    {
+    iCandidatePanel->HandleCommand( EHwrEventCursorPosChanged,
+        ( TUint8* )&aData.iRect );
+    return KErrNone;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::PreHandleEvent()
+// .
+// -----------------------------------------------------------------------------
+//	
+void CPeninputHwrfscnLayout::PreHandleEvent( TEventType /*aType*/, 
+    const TRawEvent& /*aEvent*/ )
+    {
+ 
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::BeforeSendingEventsToBackground()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::BeforeSendingEventsToBackground()
+    {
+    TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) );
+    }
+        
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::PenInputUiType()
+// .
+// -----------------------------------------------------------------------------
+//	
+TInt CPeninputHwrfscnLayout::PenInputType()
+	{
+	return EPluginInputModeFSc;
+	}
+	
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::NotifyOutsideEventL()
+// .
+// -----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnLayout::NotifyOutsideEventL( TInt aPanel )
+    {
+    if( aPanel & ECandidatePanel && aPanel & ECtrlBar )
+        {
+        iCandidatePanel->HandleCommand( EHwrEventPointerOutsideWnd, NULL );		
+    	iControlBar->HandleCommand( EHwrEventPointerOutsideWnd, NULL );
+    	iStateMgr->HandleEventL( EHwrEventPointerOutsideWnd, KNullDesC );
+        }
+    else if( aPanel & ECandidatePanel )
+        {
+        iCandidatePanel->HandleCommand( EHwrEventPointerOutsideWnd, NULL );	
+        iStateMgr->HandleEventL( EHwrEventPointerOutsideWnd, KNullDesC );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::NotifyPrimaryRangeChanged()
+// .
+// -----------------------------------------------------------------------------
+//    
+void CPeninputHwrfscnLayout::NotifyPrimaryRangeChanged( TInt aPrimaryRange )    
+    {
+    TBuf<KIntLen> buf;
+    buf.Append( ( TUint16* )( &aPrimaryRange ), KIntLen );
+    SignalOwner( ESignalRange, buf );
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::Replace()
+// Delete the previous charcode and submit the new one
+// -----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnLayout::Replace( const TDesC& aOldCharCode, 
+    const TDesC& aNewCharCode )
+    {
+    // user tries to correct the previous selection
+    // Delete the previous character and append the new one
+    HBufC* newCharBuf = HBufC::New( aNewCharCode.Length() + KIntLen );
+    if( newCharBuf )
+        {
+        TInt len = aOldCharCode.Length();
+        newCharBuf->Des().Append( ( TUint16* )&len, KIntLen );
+        newCharBuf->Des().Append( aNewCharCode );
+        SignalOwner( ESignalReplaceText, *newCharBuf );
+        
+        delete newCharBuf;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::SubmitStringToFep()
+// Submit the char code.
+// -----------------------------------------------------------------------------
+//
+void CPeninputHwrfscnLayout::SubmitStringToFep( const TDesC& aCharCode )
+    {
+    SignalOwner( ESignalKeyEvent, aCharCode );	        	
+    }
+     
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::OnResourceChange()
+// Submit the char code.
+// -----------------------------------------------------------------------------
+//   
+TInt CPeninputHwrfscnLayout::OnResourceChange(TInt aType)
+	{
+	CFepUiLayout::OnResourceChange(aType);
+	if( aType == KAknsMessageSkinChange )
+		{
+		// Do other things when skin change
+		iControlBar->HandleSkinChanged();			
+		}
+	return KErrNone;
+	}
+// -----------------------------------------------------------------------------
+// CPeninputHwrfscnLayout::CandidatePanel()
+// .
+// -----------------------------------------------------------------------------
+//    
+CPeninputHwrfscnCandidatePanel& CPeninputHwrfscnLayout::CandidatePanel()
+	{
+	return *iCandidatePanel;
+	}
+
+void CPeninputHwrfscnLayout::ClearScreen()
+    {
+    if (iFsHwrBox)
+        {
+        iFsHwrBox->CancelCharWriting();
+        TRAP_IGNORE(NotifyOutsideEventL( ECandidatePanel ));
+        }
+    }
+
+CPeninputHwrfscnWritingBox& CPeninputHwrfscnLayout::HwrfscnWritingBox()
+    {
+    return *iFsHwrBox;
+    }
+//End of file