textinput/peninputvkbcn/src/peninputvkblayout.cpp
changeset 0 eb1f2e154e89
child 9 e6a39382bb9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputvkbcn/src/peninputvkblayout.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1230 @@
+/*
+* Copyright (c) 2002-2005 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 the vkb layout
+*
+*/
+ 
+
+// system includes
+#include <aknfeppeninputenums.h>    //command from fep or IME to plugin
+#include <AknFepGlobalEnums.h> //define EPluginInputModeHwr
+#include <peninputcmd.h>            // use global signal
+#include <peninputlayoutchoicelist.h>
+#include <peninputlayoutbutton.h>
+#include <peninputdragbutton.h>
+#include <coemain.h>
+#include <PtiEngine.h>
+#include <PtiUserDicEntry.h>
+#include <peninputpluginutils.h>
+#include <bautils.h>
+#include <peninputmultimodebutton.h>    // add by jiawenjuan
+#include <peninputlayoutmultilineicf.h>
+#include <peninputlayoutbubblectrl.h>
+#include <s32mem.h>
+
+// user includes
+#include "peninputvkblayout.h"  
+#include "peninputvkbevent.h"         // use event
+#include "peninputvkb.hrh"            // control ID and range defination
+#include "peninputvkbwindow.h"        // use vkb window, which derived from base window
+#include "peninputvkbuistate.h"       // use ui state
+#include "peninputvkbuistatemgr.h"    // use ui state mgr
+#include "peninputvkbdatamgr.h"       // use data mgr
+#include "peninputvkbclientarea.h"
+
+// constant definition
+_LIT(KResourceFile, "z:\\resource\\peninputvkbcn.rsc");
+
+const TInt KIntSizeToInt16 = 2;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayoutImp::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayoutImp* CAknFepVkbLayoutImp::NewL( TAny* /*aInitParams*/ )
+    {
+    CAknFepVkbLayoutImp* self = new(ELeave) CAknFepVkbLayoutImp();
+    CleanupStack::PushL(self);
+    self->ConstructL( EFalse ); 
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+CAknFepVkbLayoutImp* CAknFepVkbLayoutImp::NewFsqL( TAny* /*aInitParams*/ )
+    {
+    CAknFepVkbLayoutImp* self = new ( ELeave ) CAknFepVkbLayoutImp();
+    CleanupStack::PushL( self );
+    self->ConstructL( ETrue ); 
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayoutImp::~CAknFepVkbLayoutImp
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayoutImp::~CAknFepVkbLayoutImp()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayoutImp::CAknFepVkbLayoutImp
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayoutImp::CAknFepVkbLayoutImp()
+    {
+    // See ConstructL() for initialisation completion.
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayoutImp::ConstructL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayoutImp::ConstructL(TBool aIsFsq)
+    {
+    iIsFsq = aIsFsq;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayoutImp::CreateFepUiLayoutL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CFepUiLayout* CAknFepVkbLayoutImp::CreateFepUiLayoutL(MLayoutOwner* aLayoutOwner,const TAny* aData)
+    {
+    CAknFepVkbLayout* uiLayout = CAknFepVkbLayout::NewL( aLayoutOwner, aData, iIsFsq );
+
+    return uiLayout;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayout* CAknFepVkbLayout::NewL(MLayoutOwner* aLayoutOwner, 
+                                         const TAny* aInitData, TBool aIsFsq )
+    {
+    CAknFepVkbLayout* self = new (ELeave) CAknFepVkbLayout(aLayoutOwner);
+
+    CleanupStack::PushL(self);
+    self->ConstructL(aInitData, aIsFsq);
+    CleanupStack::Pop();
+
+    return self;  
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::CAknFepVkbLayout
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayout::CAknFepVkbLayout(MLayoutOwner* aLayoutOwner)
+    : CFepUiLayout(aLayoutOwner), iNeedDealFocusGained(ETrue)    
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::ConstructL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::ConstructL(const TAny* aInitData, TBool aIsFsq)
+    {
+    iLayoutType = aIsFsq ? EPluginInputModeFSQ : EPluginInputModeVkb;
+    BaseConstructL();
+
+    CCoeEnv* coeEnv = CCoeEnv::Static();
+    TPixelsTwipsAndRotation ptSize;     
+
+    TFileName resFileName( KResourceFile );
+    BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resFileName );
+
+    coeEnv->ScreenDevice()->GetDefaultScreenSizeAndRotation(ptSize);
+    iResId = coeEnv->AddResourceFileL( resFileName );
+    TPeninputLayoutData* layoutData = (TPeninputLayoutData*)aInitData;
+    iPtiEngine = (*layoutData).iPtiEngine;
+
+    //create date manager
+    iDataMgr = CAknFepVkbDataMgr::NewL(this, iPtiEngine);
+
+    // Store screen mode, and get new window position
+    iDataMgr->SetScreenMode(ptSize);
+
+    //Create ui state manager
+    iUiStateMgr = CAknFepVkbUiStateMgr::NewL(this);
+
+    //create vkb window
+    iVkbWindow = CAknFepVkbWindow::NewL(this, 
+                                        EAknFepVkbCtrlIdVkbWindow, 
+                                        iDataMgr,
+                                        iUiStateMgr);
+    iVkbWindow->Hide(ETrue);
+    AddControlL(iVkbWindow);
+    
+    //config layout self using the whole screen
+    //set proper size
+    SetScreenSize(ptSize.iPixelSize);
+
+    // When layout is initianized, we should make the entire window visible
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::~CAknFepVkbLayout
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbLayout::~CAknFepVkbLayout()
+    {
+    delete iDataMgr;
+    CCoeEnv::Static()->DeleteResourceFile(iResId);
+    delete iUiStateMgr;
+    }        
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleCommand
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::HandleCommand(TInt aCmd, TUint8* aData)
+    {
+    // Handle command from fep or IME to this layout
+    TUint* data = (TUint*) aData;
+    TBuf<KIntSizeToInt16> bufStyle;
+    TInt style;
+    TInt ret = KErrNone;
+                
+    switch ( aCmd )
+        {
+        case ECmdPenInputPermittedRange:
+            iDataMgr->SetPermittedRange(*data);
+            break;
+        case ECmdPenInputEditorNumericKeyMap:
+            iDataMgr->SetEditorNumericKeymap(*data);
+            break;
+        case ECmdPenInputCase:
+            DoCaseChange(*data);
+            break;
+        case ECmdPenInputPermittedCase:
+            iDataMgr->SetPermittedCase(*data);
+            break;
+        case ECmdPenInputLanguage:
+            {
+            ChangeInputLanguage(*data);
+            iVkbWindow->SetSwitchlistLanguage(*data);
+            }
+            break;
+        // When data query need to change position    
+        case ECmdPenInputSetWindowPos:
+            iDataMgr->SetDataQueryRect(*((TRect*)aData));
+            
+            style = EVkbPositionChangeDataQuery;
+            bufStyle = ( TUint16* )&style;
+            SendEventToVkbControl(EVkbEventPositionChanged, NULL, bufStyle);
+            break;
+        case ECmdPenInputWindowOpen:  
+            if ( *data == EPenInputOpenManually )
+                {
+                style = EVkbPositionChangeBrJustify;
+                bufStyle = ( TUint16* )&style;
+                SendEventToVkbControl(EVkbEventPositionChanged, NULL, bufStyle );  
+                }
+			iVkbWindow->Hide(EFalse);
+            LayoutOwner()->Hide(EFalse);                     
+            break;
+        case ECmdPenInputWindowClose:
+			iVkbWindow->Hide(ETrue);
+            LayoutOwner()->Hide(ETrue);            
+            break;
+        case ECmdPenInputRange:
+            SetCurrentRange(*data);
+            break;
+        case ECmdPenInputEditorCustomNumericKeyMap:
+            {
+            iDataMgr->SetData(EAknFepDataTypeUseDefinedResource, (TInt) aData);
+            }
+            break;
+        case ECmdPenInputEnableSettingBtn:
+            {
+            iVkbWindow->SetEnableSettingBtn(*data);
+            }
+            break;
+        case ECmdPenInputIsSecretText:
+            {
+            iVkbWindow->SetSwitchlistSecretFlag(*data);
+
+            iVkbWindow->SetTextIsSecret( *aData );
+            }
+            break;
+        case ECmdPenInputDimArrowKeys:
+            {
+            TBool IsDimArrowKeys = *aData;
+            iVkbWindow->DimArrowKeys( IsDimArrowKeys );
+            }
+            break;
+        case ECmdPenInputSetPromptText:
+            {
+            if( iLayoutType == EPluginInputModeFSQ )
+            TRAP_IGNORE(iVkbWindow->SetPromptTextL(aData));
+            }
+            break;
+        case ECmdPenInputCharacterPreview:
+            {
+            iVkbWindow->ShowBubble(*aData);    
+            }
+            break;
+        case ECmdPenInputSetTextAlignment:
+        	{
+		    TRAP_IGNORE(iVkbWindow->SetTextAlignmentL( *aData ));
+        	}
+        	break;        
+        case ECmdPenInputPopupTooltip:
+            {    
+            TRAP_IGNORE( HandleShowTooltipOnFSQCmdL( aData ) );
+            }
+            break;
+        case ECmdPenInputHideTooltip:
+            {
+            iVkbWindow->HideTooltipOnFSQ();
+            }
+            break;
+        case ECmdPenInputPopupCandidateList:
+            {
+            TRAP_IGNORE( HandleShowCandidateListOnFSQCmdL( aData ) );
+            }
+            break;
+        case ECmdPenInputHideCandidateList:
+            {
+            iVkbWindow->HideCandidateListOnFSQ();
+            }
+            break;
+        case ECmdPeninputITIStatus:
+            {
+            // Set the flag to indicate if FSQ with ITI feature is opened
+            iITIEnabled = *aData ;
+            }            
+            break;
+        default:
+            {
+            ret = CFepUiLayout::HandleCommand( aCmd, aData );
+            }
+            break;
+        }
+            
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::SizeChanged
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::SizeChanged(const TAny* /*pData*/)
+    {
+    // Handle size changed event
+    TPixelsTwipsAndRotation size; 
+    
+    CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(size);
+        
+    // Store screen mode, and get new window position
+    iDataMgr->SetScreenMode(size);
+    
+    iDataMgr->SetSizeChanging(ETrue);
+     // The following need to implement
+    iVkbWindow->SizeChanged(ETrue);
+    iDataMgr->SetSizeChanging(EFalse);
+
+    // When layout size is changed, we should make the entire window visible
+    TInt style = EVkbPositionChangeBrJustify;
+    TBuf<KIntSizeToInt16> bufStyle;
+    bufStyle = ( TUint16* )&style;
+    SendEventToVkbControl(EVkbEventPositionChanged, NULL, bufStyle);
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::OnAppEditorTextComing
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::OnAppEditorTextComing(const TFepInputContextFieldData& aData)
+    {
+    // Handle edit text coming
+    if (iVkbWindow)
+        {
+        TRAPD(err, iVkbWindow->SetEditorTextL(aData));
+        return err;
+        }
+        
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleControlEvent
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, 
+                                          const TDesC& aEventData)
+    {        
+    // Handle event from control
+    TInt* data = (TInt*)aEventData.Ptr();  
+    
+    //static TInt COUNT = 1; 
+    
+    //deal with the event from all controls in layout
+    switch (aEventType)
+        {
+        case EVkbEventWindowClose:
+            iVkbWindow->ClientArea()->HandleControlEvent( aEventType, aCtrl, aEventData );
+            SignalOwner(ESignalLayoutClosed);
+            break;
+        case EVkbEventTouchInputOption:
+        case EPeninputLayoutEventOption:
+            SignalOwner(ESignalLaunchOptionMenu);
+            break;
+        case EVkbEventInputLangSwitch:
+            SignalOwner(ESignalLaunchLanguageMenu);
+            break;
+        
+        //When drag end, store the data
+        case EEventDraggingEnd:
+            {
+            TInt x = 0;
+            TInt y = 0;
+            x = 0x0000FFFF & ( Position().iX + Rect().Width());
+            y = 0xFFFF0000 & ( (Position().iY + Rect().Height() ) << 16 );
+            if ( x|y )
+                {
+                iDataMgr->SetWindowPosition(x | y);
+                }
+            }
+            break;
+            
+        case EVkbEventPositionChanged:
+            SendEventToVkbControl(EVkbEventPositionChanged,NULL);
+            break;
+            
+        case EVkbEventHwr:
+            {
+            TRAP_IGNORE( iVkbWindow->UpdateICFTextL() );
+            iVkbWindow->PopupSwitchWindow();                       
+            }
+            break;
+        
+        case EVkbEventSetRange:
+            if ( *data == ERangeAccent )
+                {
+                iVkbWindow->PopupAccentWindow();
+                }
+            else
+                {
+                // When change range mannually, we should make the entire window visible
+                //iVkbWindow->Hide(ETrue);
+                SetCurrentRange(*data,ETrue,ETrue);
+                //iVkbWindow->Hide(EFalse);
+           
+                //singal server
+                TInt range = *data;
+                TBuf<4> buf;
+                buf.Append(reinterpret_cast<TText*>(&range), 4);
+                SignalOwner(ESignalRange, buf);                      
+                }
+            break;
+            
+        case EEventChoiceSelected:
+            {
+            CFepLayoutChoiceList::SEvent* event = (CFepLayoutChoiceList::SEvent*)aEventData.Ptr();
+            if( event->iIndex != -1 )
+                {
+                if (aCtrl->ControlId() == EAknFepVkbPopupWindow)
+                    {
+                TInt currentRange = iDataMgr->CurrentRange();
+                TInt currentAccent = iDataMgr->CurrentAccent();
+                if ( (currentRange == ERangeAccent) && ( currentAccent == event->iCommand ) )
+                    {
+                    return;
+                    }
+                else
+                    {
+                    iDataMgr->SetCurrentAccent(event->iCommand);
+                    // When change range mannually, we should make the entire window visible
+                    SetCurrentRange(ERangeAccent,EFalse, ETrue);
+
+                    TInt style = EVkbPositionChangeBrJustify;
+                    TBuf<KIntSizeToInt16> bufStyle;
+                    bufStyle = ( TUint16* )&style;
+                    SendEventToVkbControl(EVkbEventPositionChanged, NULL, bufStyle);
+                    
+                    //singal server
+                    TInt range = ERangeAccent;
+                    TBuf<4> buf;
+                    buf.Append(reinterpret_cast<TText*>(&range), 4);
+                    SignalOwner(ESignalRange, buf);                      
+                        }
+                    
+                    }
+                else if (aCtrl->ControlId() == EPeninutWindowCtrlIdSwitcherPopupWindow)
+                    {
+                    if (iLayoutType != event->iCommand)
+                        {
+                        TBool switchByMode = ETrue;
+                        TInt  mode = event->iCommand;
+
+                        TBuf<8> buf;
+                        buf.Append(reinterpret_cast<TText*>(&switchByMode), 
+                                   sizeof(TBool)/sizeof(TText));
+                        buf.Append(reinterpret_cast<TText*>(&mode), 
+                                   sizeof(TInt)/sizeof(TText));
+                        SignalOwner(ESignalLayoutUIChanged,buf);
+                        }
+                    }
+                else if ( aCtrl->ControlId() == EPentinputHwrCandidateList )
+                    {
+                    TRAP_IGNORE( iVkbWindow->HandleCandidateListSelectedOnFSQL( aCtrl, aEventData ) );
+                    }
+                }
+            else
+                {
+                iVkbWindow->ResetAccentButton();                
+                }
+            }
+
+            break; 
+        case EVkbEventCompFieldAnalysisReq:
+            //Send the data to engine to recognize
+            TRAP_IGNORE(iDataMgr->GetCandidatesL(aEventData,EFalse));
+            break;
+
+        case EVkbEventCompFieldSubmit:
+            {
+            SignalOwner(ESignalKeyEvent,aEventData);
+            iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandbycn()); 
+            ForceEditGainFocus(EInputContextFieldGetFocus);
+            
+            // predictive char is selected
+            TRAP_IGNORE(iDataMgr->GetCandidatesL(aEventData,ETrue));
+            
+            // create new word if needed
+            if ((iVkbWindow->NeedCreateWord()) && (aEventData.Length() > 0))
+            	{
+            	
+            	// only bind spell sequence in zhuyin or pinyin mode
+            	if ( iDataMgr->RequestData( EAknFepDataTypeIMLayout )  == EAknFepVkbImCnZhuyin
+                    || iDataMgr->RequestData( EAknFepDataTypeIMLayout )  == EAknFepVkbImCnPinyin )
+            	    {
+            	    TPtrC buf = iVkbWindow->GetCreatedWordSpell();
+            	    TPtiUserDictionaryEntry newUdbEntry(buf);
+                    iPtiEngine->AddUserDictionaryEntry(newUdbEntry);
+            	    }
+            	else 
+            	    {
+            	    TPtiUserDictionaryEntry newUdbEntry(aEventData);
+                    iPtiEngine->AddUserDictionaryEntry(newUdbEntry);
+            	    }
+                }
+            }
+            break;
+
+        case EVkbEventCandidateSelected:
+            if ( !iVkbWindow->CompositionFieldStringLength() )
+                {
+                //First send it to fep
+                TBuf<32> buf = aEventData;
+                buf.SetLength(buf.Length()-1);
+                SignalOwner(ESignalKeyEvent,buf);
+                
+                // predictive char is selected
+                TRAP_IGNORE(iDataMgr->GetCandidatesL(buf,ETrue));
+                ForceEditGainFocus(EInputContextFieldGetFocus);
+                }
+            else
+                {
+                // candidate char is selected
+                SendEventToVkbControl(EVkbEventCandidateSelected,aCtrl,aEventData);
+                }
+            break;
+       	case EVkbEventQueryCandidateExisted:
+       	    {
+            if (iDataMgr->Candidates().Count() >= KMaxPredictCandCnt)
+                {
+                iVkbWindow->ClientArea()->SetNextCandidateExistFlag(EFalse);
+                }
+            else
+                {
+                iVkbWindow->ClientArea()->SetNextCandidateExistFlag
+                    (iDataMgr->NextCandidateExist());
+                }          
+       	    }
+       	    break;
+       	case EVkbEventGetNextPageCandidate:
+       	    {
+            TRAP_IGNORE(iDataMgr->GetCandidatesL(KNullDesC, EFalse, ETrue));
+       	    }
+       	    break;
+       	case EVkbEventGetPreviousPageCandidate:
+       	    // actually, 'get previous page candidate' do nothing here
+       	    // the branch here just to avoid it is handled by 'default' branch
+            break;
+        case EVkbEventStandby2Composition:
+        case EVkbEventComposition2Standby:
+            SendEventToVkbControl(aEventType, aCtrl, aEventData);
+            break;
+            
+        case EVkbEventCompFieldDataFlush:
+            SendEventToVkbControl(aEventType,aCtrl,aEventData);
+            iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandbycn()); 
+            ForceEditGainFocus(EInputContextFieldGetFocus);         
+            break;
+            
+        case EVkbEventCompFieldNoChars:       
+            SendEventToVkbControl(EVkbEventComposition2Standby,NULL);            
+        case EVkbEventClearContent:
+            SendEventToVkbControl(aEventType,aCtrl,aEventData);
+            break;
+        
+        case EEventControlFocusGained:
+            HandleFocusGained(aCtrl,aEventData);
+            break;
+        
+        case EEventButtonUp:
+        	{
+        	// check current range
+		    TInt curRange = iDataMgr->CurrentRange();		    
+        	if( aCtrl->ControlId() == EAknFepVkbCtrlIdShiftBtn)
+	        	{
+	        	if( (curRange == ERangeNative) || (curRange == ERangeEnglish) ||
+	        	    (curRange == ERangeAccent))
+	        		{
+	        		CAknFepCtrlMultiModeButton* button = 
+					static_cast<CAknFepCtrlMultiModeButton*>( aCtrl );
+		        	TInt realCase = button->GetRealCaseByMode( button->CurrentMode() );	     	       		
+					HandleMergedBtnClicked( realCase );
+	        		}
+		       	else
+		       		{
+		       		iVkbWindow->LoopVkbLayout(EVkbBoth, ETrue);
+		       		TInt shiftStatus = iDataMgr->RequestData(EAknFepDataTypeShfitDown);
+				    iVkbWindow->ChangeMergedButtonStatus( shiftStatus, 0 );
+		       		}				
+	        	}
+
+        	}
+        	break;
+        case EEventButtonDown:            
+            //Set length when pen down on backspace button
+            iDataMgr->SetData(EAknFepDataTypeLengthWhenButtondownOnBack,
+                              iVkbWindow->CompositionFieldStringLength());
+            break;
+            
+        case EPeninputLayoutEventBack:
+        case EVkbEventKeyEnter:
+        case EVkbEventKeySpace:
+        case EEventVirtualKeyUp:
+        case EVkbEventLeftArrow:
+        case EVkbEventRightArrow:        
+        case EVkbEventUpArrow:
+        case EVkbEventDownArrow:
+             if ( ! iUiStateMgr->CurrentUiState()->HandleControlEvent(aEventType,aEventData) )
+                 {
+                 SendEventToVkbControl(aEventType,aCtrl,aEventData);
+                 }
+             break;
+             
+        //case EVkbEventCandidatesChanged:            // the event will be sent to control directly        
+        //case EEventControlFocusLost:                // the event will be sent to control directly 
+        //case EVkbEventCompFieldAnalysisResponse:    // the event will be sent to control directly 
+        //case EVkbEventCompFieldCursorChange:        // no action      
+        //    break;
+        case EEventIcfPointerUpEvent:
+            if(iDataMgr->RequestData( EAknFepDataTypeIMLayout ) != EAknFepVkbImNumber &&
+               iDataMgr->RequestData( EAknFepDataTypeIMLayout ) != EAknFepVkbImLatin)
+                {
+                // Clear trigger string when changing cursor position
+                iDataMgr->ClearTriggerString();
+                }
+            break;
+        case EEventSetAppCursorSelection:
+        	iUiStateMgr->CurrentUiState()->HandleControlEvent(aEventType,aEventData);
+        	break;
+        case EEventTooltipPointerUp:
+            {
+            // Signal to FEP to accept tooltip data 
+            SignalOwner( ESignalAcceptTooltip );            
+            }
+            break;
+        case EEventPointerDownOnInline:
+            {
+            // show candidate list when tap on active words
+            SignalOwner( ESignalShowCandidate );            
+            }
+            break;        
+        default:
+            break;    
+        }           
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleShiftBtnClicked
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleMergedBtnClicked( TInt aCase )
+	{
+	switch( aCase )
+		{
+		case ECaseLower:
+		    {
+		    iVkbWindow->LoopVkbLayout(EVkbCapslock, ETrue);
+		    }
+		    break;
+		case ECaseUpper:
+			{
+			iVkbWindow->LoopVkbLayout(EVkbShift, ETrue);
+			}
+			break;
+		case ECaseText:
+//		case ECaseInverseText:
+			{
+			// Current case is Text, equals shift button
+			iVkbWindow->LoopVkbLayout(EVkbBoth, ETrue);
+			}
+			break;	
+		default:
+			break;
+		}
+		
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleRawKeyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CAknFepVkbLayout::HandleRawKeyEventL(const TRawEvent& aKeyEvent)
+    { 
+    iVkbWindow->CloseAccentWindow();
+    return iUiStateMgr->CurrentUiState()->HandleKeyEventL(aKeyEvent);
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::SendEventToVkbControl
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::SendEventToVkbControl(TInt aEventType, CFepUiBaseCtrl* aCtrl, 
+                                             const TDesC& aEventData)
+    {
+    iVkbWindow->HandleControlEvent(aEventType,aCtrl,aEventData);
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::Sendkey
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::Sendkey(TInt aEventType,const TDesC& aEventData)
+    {
+    SignalOwner(aEventType,aEventData); 
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::RequestData
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::RequestData(TAknFepDataType aDataType)
+    {
+    return iDataMgr->RequestData(aDataType);
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::Reset
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::Reset()
+    {
+    iDataMgr->Reset();
+    
+    ForceEditGainFocus(EInputContextFieldGetFocus);
+    
+    SendEventToVkbControl(EVkbEventClearContent,iVkbWindow,KNullDesC16);
+    
+    SendEventToVkbControl(EVkbEventResetShiftCapslock,iVkbWindow,KNullDesC16);
+    
+    iNeedDealFocusGained = ETrue;
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::SetData
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::SetData(TAknFepDataType aDataType,TInt aData)
+    {
+    iDataMgr->SetData(aDataType,aData);
+    }
+                
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::SetData
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CAknFepVkbLayout::IsValidDestination(const TRect& aRect,
+                                           CDragBar* aDragBar,
+                                           TBool& aVInfo,TBool& aHInfo,
+                                           TBool aFlag)
+    {
+    // Validate move button destination 
+    if (!aDragBar)
+        {
+        return EFalse;
+        }
+    TRect rect = aRect;
+    
+    if( aFlag )
+        {//layout is moving
+        aHInfo = aVInfo = EFalse;
+        TRect dragbarRect(aRect.iTl, aDragBar->Rect().Size());
+        
+        if( dragbarRect.iTl.iX >=0 && dragbarRect.iBr.iX < ScreenSize().iWidth )
+            {
+            aHInfo = ETrue;
+            }
+            
+        if( dragbarRect.iTl.iY >=0 && dragbarRect.iBr.iY < ScreenSize().iHeight)
+            {
+            aVInfo = ETrue;
+            }
+        
+        return aHInfo && aVInfo;
+        }
+    else
+        {
+        if (aDragBar)
+            {
+            rect.SetSize(aDragBar->Rect().Size());
+            }
+        TBool tlInvalid = !Rect().Contains(rect.iTl);
+        TBool brInvalid = !Rect().Contains(rect.iBr);
+        
+        if (tlInvalid && !brInvalid)
+            {
+            if (rect.iTl.iX >= Rect().iTl.iX && rect.iTl.iX <= Rect().iBr.iX)
+                {
+                aHInfo = ETrue;
+                }
+            else if (rect.iTl.iY >= Rect().iTl.iY && rect.iTl.iY <= Rect().iBr.iY)
+                {
+                aVInfo = ETrue;
+                }
+            }
+        else if (!tlInvalid && brInvalid)
+            {
+            if (rect.iBr.iX >= Rect().iTl.iX && rect.iBr.iX <= Rect().iBr.iX)
+                {
+                aHInfo = ETrue;
+                }
+            else if (rect.iBr.iY >= Rect().iTl.iY && rect.iBr.iY <= Rect().iBr.iY)
+
+                {
+                aVInfo = ETrue;
+                }
+            }
+
+        return !(tlInvalid || brInvalid);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::ChangeInputLanguage
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::ChangeInputLanguage(TInt aLangID)
+    {
+    //1.Notify engine the language need to change
+    //const TDesC& showText = iDataMgr->SetInputLanguage(aLangID);
+    TInt switchDisplayLang = iDataMgr->SetInputLanguage(aLangID);
+    TBuf<10> showText;    
+    AknPenInputUtils::GetISOLanguageCode(TLanguage(switchDisplayLang), showText);
+    
+    SendEventToVkbControl(EVkbEventLanguageChanged,NULL,showText);     
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::SetCurrentRange
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::SetCurrentRange(TInt aRange, TBool aNeedSave, TBool aNotify)
+    {             
+    if ( aNeedSave  && ( iDataMgr->PermittedRange() & ERangeEnglish ) 
+         && ( (aRange & ERangeNative) || (aRange & ERangeEnglish) ) )
+        {
+        //save to CenRep
+        iDataMgr->WriteLastUsedRange(aRange);
+        }
+        
+    Reset();
+    
+	iDataMgr->SetCurrentRange(aRange);
+	iVkbWindow->ChangeImLayout(iDataMgr->IMLayout());
+    
+    //iVkbWindow->SizeChanged(ETrue);
+    if ( aRange == ERangeNative )
+        {
+        iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandbycn());    
+        }
+    else
+        {
+        iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandby());    
+        }
+    
+    if ( aNotify )
+        {
+        TInt style = EVkbPositionChangeBrJustify;
+        TBuf<KIntSizeToInt16> bufStyle;
+        bufStyle = ( TUint16* )&style;
+        
+        SendEventToVkbControl(EVkbEventPositionChanged, NULL, bufStyle);       
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleFocusGained
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleFocusGained(CFepUiBaseCtrl* aCtrl, const TDesC& aEventData)
+    {       
+    if ( !iNeedDealFocusGained || !iVkbWindow )
+        {
+        return;
+        }
+    
+    SendEventToVkbControl(EEventControlFocusGained,aCtrl,aEventData);
+   
+    // Change current state machine
+    if ( iDataMgr->CurrentRange() == ERangeNative )
+        {
+        if ( iVkbWindow->FocusedControlID() == EPeninputWindowCtrlIdMultiLineICF )
+            {
+            if ( iVkbWindow->CompositionFieldStringLength() )
+                {
+                iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandbycnWithChars()); 
+                }
+            else
+                {
+                iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateStandbycn());    
+                }
+            }
+        else if ( iVkbWindow->FocusedControlID() == EAknFepVkbCtrlIdCompositionField )
+           {
+           if ( iVkbWindow->CompositionFieldStringLength() )
+                {
+                iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateCompositionWithChars()); 
+                }
+             else
+                {
+                iUiStateMgr->SetCurrentUiState(iUiStateMgr->UiStateCompositionNoChars());    
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::ForceEditGainFocus
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::ForceEditGainFocus(TInt aWhichEdit)
+    {
+    TBuf<KIntSizeToInt16> data;
+    iNeedDealFocusGained = EFalse;//to avoid focus gain loop
+    data = (TUint16*) &aWhichEdit;
+    SendEventToVkbControl(EEventControlFocusGained,NULL,data);      
+    iNeedDealFocusGained = ETrue; //reset the flag
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::CompositionFieldStringLength
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::CompositionFieldStringLength()
+    {
+    return iVkbWindow->CompositionFieldStringLength();
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::GetCandidatesL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::GetCandidatesL(const TDesC& aInputString, 
+                                      const TBool aIsPredictive,
+                                      TBool aForNextPage)
+    {
+    return iDataMgr->GetCandidatesL(aInputString, aIsPredictive, aForNextPage);
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::ClearTriggerString
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::ClearTriggerString()
+    {
+    iDataMgr->ClearTriggerString();
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::DoCaseChange
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::DoCaseChange(TInt aCase)
+    {
+    TInt curCase = iDataMgr->Case();
+    
+    if ( curCase == aCase )
+        {
+        return;
+        }
+        
+    iDataMgr->SetCase(aCase);
+    
+    if ( ( iDataMgr->CurrentRange() == ERangeEnglish ) ||
+        ( iDataMgr->CurrentRange() == ERangeAccent ) )
+        {
+        switch (aCase)
+            {
+            case ECaseUpper: 
+                iDataMgr->SetShiftDown(EFalse);
+                iDataMgr->SetCapslockDown(ETrue);
+                break;
+            case ECaseLower: 
+                iDataMgr->SetShiftDown(EFalse);
+                iDataMgr->SetCapslockDown(EFalse);
+                break;
+            case ECaseText: 
+                iDataMgr->SetShiftDown(ETrue);
+                iDataMgr->SetCapslockDown(EFalse);
+                break;
+            case ECaseInverseText: 
+                iDataMgr->SetShiftDown(ETrue);
+                iDataMgr->SetCapslockDown(ETrue);
+                break;
+            default:  
+                return;             
+            }  
+         
+        iVkbWindow->LoopVkbLayout(EVkbNone, EFalse);
+        } 
+    else
+        {
+        iDataMgr->SetCase(ECaseInvalide);
+        }   
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::PenInputUiType
+// return current input UI type
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CAknFepVkbLayout::PenInputType()
+    {
+    return iLayoutType;
+    }
+
+void CAknFepVkbLayout::SetPositionFromOutside(const TPoint& aNewPos)
+    {
+    SetLayoutPos(aNewPos);
+    TInt x = 0x0000FFFF & aNewPos.iX;
+    TInt y = 0xFFFF0000 & ( aNewPos.iY << 16 );  
+    
+    return SetData( EAknFepDataTypeWindowPosition, x | y );
+    }
+        
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::Window
+// return window
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CAknFepVkbWindow* CAknFepVkbLayout::Window() const
+    {
+    return iVkbWindow;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbLayout::SemiTransparencyRequired
+// .
+// ---------------------------------------------------------------------------
+//
+TBool CAknFepVkbLayout::SemiTransparencyRequired()
+    {
+    return ETrue;
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepVkbLayout::HandleAppInfoChange
+// .
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleAppInfoChange(const TDesC& aInfo, 
+                                           TPeninputAppInfo aType)
+    {
+    if ( iVkbWindow )
+        {
+        CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*> 
+                                      (iVkbWindow->Control(EPeninputWindowCtrlIdMultiLineICF)) ;
+        
+        if ( icf && ( aType == EAppIndicatorMsg ) && (iLayoutType == EPluginInputModeFSQ) )
+            { 
+            if ( aInfo.Length() > 0 )
+                {
+                icf->ShowBubble(aInfo,icf->MsgBubbleCtrl()->Rect());
+                }
+            else
+                {
+                icf->HideBubble();
+                }
+            }            
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handle show tooltip command.
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleShowTooltipOnFSQCmdL( TUint8* aData )
+    {
+    if ( !iITIEnabled || iLayoutType != EPluginInputModeFSQ )
+		{
+		return;
+		}
+    
+    TPtr8 buf8( aData, sizeof(TInt32), sizeof(TInt32) );
+    RDesReadStream readStream;
+    readStream.Open( buf8 );
+    CleanupClosePushL( readStream );
+    TInt dataSize = readStream.ReadInt32L();
+    CleanupStack::PopAndDestroy( &readStream );
+    if ( dataSize > 0 )
+        {
+        TUint16* dataAddress = (TUint16*)( aData + sizeof(TInt32) );
+        HBufC* tooltipText = ReadTextInfoHBufCL( dataAddress, 
+                                                 ( dataSize + 1 )/ 2 );
+        if ( tooltipText )
+            {
+            CleanupStack::PushL( tooltipText );
+            iVkbWindow->ShowTooltipOnFSQL( *tooltipText );
+            CleanupStack::PopAndDestroy( tooltipText );
+            }        
+        }     
+    }
+
+// ---------------------------------------------------------------------------
+// Handle show candidate list command.
+// ---------------------------------------------------------------------------
+//
+void CAknFepVkbLayout::HandleShowCandidateListOnFSQCmdL( TUint8* aData )
+    {
+    if ( !iITIEnabled || iLayoutType != EPluginInputModeFSQ )
+        {
+        return;
+        }
+    
+    // Read candidate data from a block of memory staring from aData
+    // The format is activeIndex | count of candiates | 
+    // length 1 | text 1 | length 2 | text 2 |...
+    TPtr8 buf8( aData, sizeof( TInt32 )*2, sizeof( TInt32 )*2 );
+    RDesReadStream readStream;
+    readStream.Open( buf8 );
+    CleanupClosePushL( readStream );
+    // Get activeIndex
+    TInt activeIndex = readStream.ReadInt32L();
+    // Get count of candidates
+    TInt count = readStream.ReadInt32L();    
+    CleanupStack::PopAndDestroy( &readStream );
+    
+    CDesCArray* itemArray = NULL;
+    if ( count > 0 )
+        {        
+        TUint8* curPointer = aData + sizeof(TInt) * 2;
+        itemArray = new (ELeave) CDesCArrayFlat( count );
+        CleanupStack::PushL( itemArray );
+        for ( TInt i = 0; i < count; i++ )
+            {
+            // Get length
+            buf8.Set( curPointer, sizeof( TInt32 ), sizeof( TInt32 ) );
+            readStream.Open( buf8 );
+            CleanupClosePushL( readStream );
+            TInt32 textSize = 0;
+            textSize = readStream.ReadInt32L();            
+            CleanupStack::PopAndDestroy( &readStream );
+            if ( textSize > 0 )
+                {
+                // Get text
+                curPointer += sizeof( TInt32 );
+                HBufC* itemText = ReadTextInfoHBufCL
+                                      ( (TUint16*)curPointer, 
+                                        ( textSize + 1 )/ 2 );
+                if ( itemText )
+                    {
+                    CleanupStack::PushL( itemText );
+                    itemArray->AppendL( *itemText );                    
+                    CleanupStack::PopAndDestroy( itemText ); 
+                    }     
+                curPointer += textSize;
+                }
+            }
+        
+        iVkbWindow->ShowCandidateListOnFSQL( itemArray, activeIndex );
+        CleanupStack::PopAndDestroy( itemArray );
+        }  
+    }
+
+// ---------------------------------------------------------------------------
+// Handle show candidate list command.
+// ---------------------------------------------------------------------------
+//
+HBufC* CAknFepVkbLayout::ReadTextInfoHBufCL( const TUint16* aStartPtr, 
+                                                      TInt aLength )
+    {
+    HBufC* itemText = NULL;
+    if ( aLength > 0 )
+        {
+        itemText = HBufC::NewLC( aLength );
+        TPtr itemTextPtr = itemText->Des();
+        itemTextPtr.Copy( aStartPtr, aLength ); 
+        CleanupStack::Pop( itemText ); 
+        }    
+    return itemText;
+    }
+// End Of File