textinput/peninputgenericvkb/src/peninputgenericvkbwindow.cpp
branchRCL_3
changeset 21 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputgenericvkb/src/peninputgenericvkbwindow.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,3005 @@
+/*
+* 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 vkb window class
+*
+*/
+
+
+// System includes
+
+
+#include <peninputvkbwindow.rsg>
+#include <peninputvkbwindowconfiginfo_01.rsg>
+#include <aknfeppeninputenums.h>
+#include <peninputinputcontextfield.h>
+#include <peninputpluginutils.h>
+#include <peninputcommonlayoutext.h>
+#include <peninputvkbctrllayout.h>
+#include <peninputvkbctrlext.h>
+#include <peninputeventbutton.h>
+#include <peninputdragbutton.h>
+#include <peninputrepeatbutton.h>
+#include <peninputmultimodebutton.h>
+#include <peninputrangebar.h>
+#include <peninputdataconverter.h>
+#include <peninputdataprovider.h>
+#include <peninputclientlayoutinfo.h>
+#include <peninputlayoutchoicelist.h>
+#include <peninputlongpressbutton.h>
+#include <bautils.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <peninputlayoutbubblectrl.h>
+#include <peninputscrollablelist.h>
+
+#include <e32keys.h>
+#include <AknIconUtils.h>
+#include <AknLayoutDef.h>
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknsUtils.h>
+#include <AknFepGlobalEnums.h>
+#include <peninputlayoutinputmodechoice.h>
+#include <peninputlayoutmultilineicf.h>
+#include <s32mem.h>
+// User includes
+#include "peninputgenericvkb.hrh"
+#include "peninputgenericvkbwindow.h"
+#include "peninputgenericvkbenum.h"
+#include "peninputrangebarinfo.h"
+#include "peninputgenericvkblafdatamgr.h"
+#include "peninputgenericvkblangmeritpair.h"
+#include "peninputgenericvkblayout.h"
+
+// Constants
+const TInt KPeninputVkbWndInvalidIndex = -1;
+const TInt KInvalidImg = -1 ;
+const TInt KKeyCodeSize = 1;
+
+const TInt KTooltipLeftMargin = 10;
+const TInt KTooltipTopMargin = 0;
+const TInt KTooltipRightMargin = 10;
+const TInt KTooltipBottomMargin = 0;
+
+_LIT( KVkbWindowResourceFile, 
+      "z:\\resource\\plugins\\peninputvkbwindow.RSC" );
+_LIT( KConfigurationResourceFile, 
+      "z:\\resource\\plugins\\peninputvkbwindowconfiginfo_" );
+_LIT( KResourceFileExtName, ".RSC" );
+
+_LIT(KEmptyString, "");
+
+// ======== MEMBER FUNCTIONS ========
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::CPeninputGenericVkbWindow
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+CPeninputGenericVkbWindow::CPeninputGenericVkbWindow( 
+    CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext, 
+    MPeninputUiStateMgr* aUiStateMgr )
+    : CPeninputLayoutWindowExt( aUiLayout, aLayoutContext ),
+      iUiStateMgr(aUiStateMgr),
+      iPopupInited(EFalse),
+      iPopupSet(EFalse),
+      iLafMgr(NULL),
+      iFirstConstruct(ETrue),
+      iIndiWithText( EFalse ),
+      iUSRscFileExist( EFalse )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::NewL
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+// 
+CPeninputGenericVkbWindow* CPeninputGenericVkbWindow::NewL( 
+    CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext, 
+    MPeninputUiStateMgr* aUiStateMgr )
+    {
+    CPeninputGenericVkbWindow* self = 
+        new ( ELeave ) CPeninputGenericVkbWindow( aUiLayout, aLayoutContext, aUiStateMgr );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::~CPeninputGenericVkbWindow
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+CPeninputGenericVkbWindow::~CPeninputGenericVkbWindow()
+    {
+    delete iIdle;
+    iUnits.Close();
+    
+    delete iLafMgr;
+    iLafMgr = NULL;
+    delete iBmpRotator;
+    iAccentCmdList.Close();
+    }
+void CPeninputGenericVkbWindow::ConstructL()
+    {
+    iHandleRangeShortPress = ETrue;
+    iBmpRotator = CPeninputSyncBitmapRotator::NewL();
+    iLafMgr = CPeninputGenericVkbLafMgr::NewL();
+    iLafMgr->SetInputModeL(TPluginInputMode (iLayoutContext->LayoutType()));
+    CPeninputLayoutWindowExt::ConstructL();
+
+    // Save whether American rsc file exist or not
+    TBuf<KMaxFileLength>  usUSRscFileName; 
+    usUSRscFileName= KConfigurationResourceFile();
+    usUSRscFileName.AppendNum( ELangAmerican );
+    usUSRscFileName.Append( KResourceFileExtName );
+
+    RFs fileSession;
+    User::LeaveIfError( fileSession.Connect() );
+    CleanupClosePushL( fileSession );
+    if ( BaflUtils::FileExists( fileSession , usUSRscFileName ))
+    	{
+        iUSRscFileExist = ETrue;
+    	}
+    CleanupStack::PopAndDestroy( 1 );
+    // For addition of ITI features, add a candidate list in vkb window   
+    CreateCandidateListL();    
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::HandleControlEvent
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HandleControlEvent( TInt aEventType,
+                                                    CFepUiBaseCtrl* aCtrl, 
+                                                    const TDesC& aEventData )
+    {
+    // Call this function in base class
+    CPeninputLayoutWindowExt::HandleControlEvent( aEventType, aCtrl, 
+                                                  aEventData );
+    
+    TInt* data = ( TInt* ) aEventData.Ptr(); 
+    
+    switch ( aEventType )
+        {
+        case EPeninputLayoutEventMultiRange:
+            {
+            if ( aCtrl->ControlId() == EPeninutWindowCtrlIdMultiRangeBtn )
+                {
+                if ( iHandleRangeShortPress )
+                    {
+                    HandleRangeButtonShortPress();
+                    }
+                }
+                iHandleRangeShortPress = ETrue;
+            }
+            break;
+        case EPeninputLayoutEventMultiRangeLongPress:
+            {
+            if ( aCtrl->ControlId() == EPeninutWindowCtrlIdMultiRangeBtn )
+                {
+                // Before pop up list, cancel down event, and set range button un-highlight.
+                TRAP_IGNORE( aCtrl->CancelPointerDownL());
+                static_cast<CAknFepCtrlCommonButton*>(aCtrl)->SetHighlight( EFalse );
+                PopupChoiceList();                
+                }
+            }
+            break;
+        case EPeninputLayoutVkbEventResetShift: 
+            {
+            HandleShiftAndCapslockBtnClicked();
+            }
+            break;  
+        case EPenInputLayoutEventClosePopup:
+        	{
+            if ( iPopupWnd && !iPopupWnd->Hiden() )
+                {
+                iPopupWnd->CloseWindow();
+                if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
+                    {
+                    ResetAccentButton();
+                    }
+                iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+                }
+        	}
+            break;
+        case EEventChoiceSelected:
+            {
+            CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdMultiRangeBtn );
+            
+            if ( btn )
+                {
+                iHandleRangeShortPress = EFalse;
+                TRAP_IGNORE( btn->HandlePointerUpEventL( btn->Rect().iBr ) );
+                iHandleRangeShortPress = ETrue;
+                }
+            CFepLayoutChoiceList::SEvent* event = 
+                ( CFepLayoutChoiceList::SEvent* ) aEventData.Ptr();
+
+            if ( event->iIndex != KPeninputVkbWndInvalidIndex )
+                {
+                if (aCtrl->ControlId() == EPeninutWindowCtrlIdAccentPopupWindow)
+                    {
+                    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+                        {
+                        TRAP_IGNORE( HandleRangeListSelectedL( aCtrl, aEventData ));
+                        }
+                    else
+                        {
+                        TInt currentRange = CPeninputDataConverter::AnyToInt(
+                                          iLayoutContext->RequestData(EPeninputDataTypeCurrentRange));
+                        TInt currentAccent = CPeninputDataConverter::AnyToInt(
+                                          iLayoutContext->RequestData(EPeninputDataTypeCurrentAccent));
+                    
+                        if ((currentRange == ERangeAccent) && (currentAccent == event->iIndex))
+                            {
+                            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+                            return;
+                            }
+    
+                        iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &(event->iIndex));
+                                             
+                        // Active range, update rangebar and vkb layout
+                        //ChangeRange( ERangeAccent, EPeninputVkbLayoutAccented1 + 2 * event->iIndex);
+                        (currentRange == ERangeAccent) ? ChangeRange(ERangeAccent, 
+                                           EPeninputVkbLayoutAccented1 + 2 * event->iIndex, EFalse) :
+                                                         ChangeRange(ERangeAccent, 
+                                           EPeninputVkbLayoutAccented1 + 2 * event->iIndex, ETrue);
+                        }
+                    }
+                else if (aCtrl->ControlId() == EPeninutWindowCtrlIdSwitcherPopupWindow)
+                    {
+                    if (iLayoutContext->LayoutType() != 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));
+                        UiLayout()->SignalOwner(ESignalLayoutUIChanged,buf);
+                        }
+                    }
+                else if ( aCtrl->ControlId() == EPentinputHwrCandidateList )
+                    {
+                    TRAP_IGNORE( HandleCandidateListSelectedL( aCtrl, aEventData ) );
+                    }
+                }
+            else
+                {
+                if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
+                    {
+                    ResetAccentButton();
+                    }
+                }
+            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+            }
+            break;
+        case EPeninputLayoutEventToHwr:
+            {
+            TRAP_IGNORE( UpdateICFTextL() );
+            TRAP_IGNORE(PopupSwitchWindowL());
+            }
+            break; 
+        case EEventVirtualKeyLatched:
+            {
+            HandleVirtualKeyLatchedEvent(aEventType, aCtrl, aEventData);
+            }
+            break;
+        case EEventVirtualKeyUnLatched:
+            {
+            HBufC* newCharBuf = HBufC::New( 2*iNewDeadKeyBuf.Length() );
+            if( newCharBuf )
+                {
+                CPeninputGenericVkbLayout* layout 
+                        = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
+                if( layout->IsEnableITIOnFSQ() )
+                    {
+                    // If ITI is open, double same keys should be send for one dead key,
+                    // core will handle them as one key.
+                    newCharBuf->Des().Append( iNewDeadKeyBuf );
+                    }
+                newCharBuf->Des().Append( iNewDeadKeyBuf );
+                }
+            
+            // Submit DeadKey
+            UiLayout()->SignalOwner(ESignalKeyEvent, *newCharBuf);
+            delete newCharBuf;
+             
+            TBool deadKeyChange = EFalse;
+            iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+            iNewDeadKeyBuf = KNullDesC;
+            }
+            break;
+        case EPeninputLayoutEventBack:
+            {
+            TInt latchedFlag = CPeninputDataConverter::AnyToInt
+                               (iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
+            // If one DeadKey is latched, only unlatch the DeadKey and reset the iNewDeadKeyBuf
+            // Don't delete the visible charater in ICF
+            if(latchedFlag)
+                {
+                UnLatchDeadKey(iNewDeadKeyBuf);
+
+                TBool deadKeyChange = EFalse;
+                iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+                iNewDeadKeyBuf = KNullDesC;
+                }
+            }
+            break;
+        case EPeninputLayoutEventEnter:
+        case EPeninputLayoutEventSpace:
+            {
+            TInt latchedFlag = CPeninputDataConverter::AnyToInt
+                               (iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
+            if(latchedFlag)
+                {
+                HBufC* newCharBuf = HBufC::New( aEventData.Length() + 2*iNewDeadKeyBuf.Length() );
+                if( newCharBuf )
+                    {
+                    CPeninputGenericVkbLayout* layout 
+                             = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
+                    if( layout->IsEnableITIOnFSQ() )
+                        {
+                        // If ITI is open, double same keys should be send for one dead key,
+                        // core will handle them as one key.                    
+                        newCharBuf->Des().Append( iNewDeadKeyBuf );
+                        }
+                    newCharBuf->Des().Append( iNewDeadKeyBuf );
+                    newCharBuf->Des().Append( aEventData );
+                    }
+                
+                UnLatchDeadKey(iNewDeadKeyBuf);
+
+                TBool deadKeyChange = EFalse;
+                iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+                
+                // Submit DeadKey + Space or Enter at the same time
+                
+                if( newCharBuf != NULL )
+                    {
+                    UiLayout()->SignalOwner(ESignalKeyEvent,*newCharBuf);
+                    }
+                iNewDeadKeyBuf = KNullDesC;
+                delete newCharBuf;
+                }
+            }
+            break;
+            
+/*        case EPeninputLayoutEventLeftArrow:
+            SimulateRawEvent(EStdKeyLeftArrow,TRawEvent::EKeyDown);
+            SimulateRawEvent(EStdKeyLeftArrow,TRawEvent::EKeyUp);
+            break;
+
+        case EPeninputLayoutEventRightArrow:
+            SimulateRawEvent(EStdKeyRightArrow,TRawEvent::EKeyDown);
+            SimulateRawEvent(EStdKeyRightArrow,TRawEvent::EKeyUp);
+            break;*/
+            
+        default:
+            break;
+        }
+    }
+    
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::SimulateRawEvent
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::SimulateRawEvent(TInt aScanCode, TRawEvent::TType aType)
+    {
+    TRawEvent event; 
+    event.Set(aType,aScanCode);
+    
+    TPtrC eventPtr(reinterpret_cast<const TUint16*>(&event),sizeof(event)/sizeof(TUint16));
+
+    UiLayout()->SignalOwner(ESignalSimulateEvent,eventPtr);
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetWindowConfigResId
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+TInt CPeninputGenericVkbWindow::GetWindowConfigResId()
+    {
+    return R_PENINPUT_LAYOUT_CONFIG_INFO;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetWindowResId
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+TInt CPeninputGenericVkbWindow::GetWindowResId()
+    {
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        return R_PENINPUT_LAYOUT_FSQ_WINDOW_INFO;
+        }
+    return R_PENINPUT_LAYOUT_VKB_WINDOW_INFO;        
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetNumKeymappingResId
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+TInt CPeninputGenericVkbWindow::GetNumKeymappingResId()
+    {
+    return R_PENINPUT_LAYOUT_KEY_MAPPING_STRING_LIST;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetWindowConfigResFileName
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+const TDesC& CPeninputGenericVkbWindow::GetWindowConfigResFileName( 
+    TInt aLangID )
+    {
+    if ( aLangID <= 0 ) 
+        {
+        return KNullDesC;
+        }
+        
+     if ( aLangID == ELangFrench )
+        {
+
+        TBuf<KMaxFileLength>  canadianfrenchresfilename; 
+        canadianfrenchresfilename= KConfigurationResourceFile();
+        canadianfrenchresfilename.AppendNum( ELangCanadianFrench );
+        canadianfrenchresfilename.Append( KResourceFileExtName );
+
+        RFile file;
+        TInt rs = file.Open( CCoeEnv::Static()->FsSession(),canadianfrenchresfilename, EFileRead );
+        if ( rs == KErrNone )
+            {
+            file.Close();
+            aLangID = ELangCanadianFrench;   
+            }
+        }
+     // If US Rsc file exist, use it instead of English rsc file
+     if(( aLangID == ELangEnglish ) && ( iUSRscFileExist ))
+    	 {
+         aLangID = ELangAmerican; 
+    	 }
+    iResourceFilename.Zero();
+    // Generate resource file name according to language id
+    iResourceFilename = KConfigurationResourceFile();
+    
+    if ( aLangID < 10 )
+        {
+        iResourceFilename.AppendNum( 0 );
+        iResourceFilename.AppendNum( aLangID );
+        }
+    else
+        {
+        iResourceFilename.AppendNum( aLangID );
+        }
+    iResourceFilename.Append( KResourceFileExtName );
+    
+    return iResourceFilename;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetWindowResFileName
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+const TDesC& CPeninputGenericVkbWindow::GetWindowResFileName()
+    {
+    return KVkbWindowResourceFile();
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::CreateAllControls
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::CreateAllControlsL()
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                                   (Control(EPeninputWindowCtrlIdMultiLineICF));
+    iBubbleSize = AknLayoutScalable_Apps::popup_char_count_window().LayoutLine();
+    iBubbleTextLayout = AknLayoutScalable_Apps::popup_char_count_window_t1(0).LayoutLine();
+    
+    icf->MsgBubbleCtrl()->SetTextFormat(iBubbleTextLayout);
+    icf->MsgBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
+    //Change the ID when ID into release
+    icf->MsgBubbleCtrl()->SetBitmapParam(NULL,
+    									  NULL,
+    									  KAknsIIDQsnFrInputPreviewSideL,
+    									  KAknsIIDQsnFrInputPreviewMiddle,
+    									  KAknsIIDQsnFrInputPreviewSideR);  
+    icf->MsgBubbleCtrl()->SetTextL( KEmptyString );
+    icf->InfoBubbleCtrl()->SetTextFormat(iBubbleTextLayout);
+    icf->InfoBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
+    icf->InfoBubbleCtrl()->SetBitmapParam(NULL,
+    									  NULL,
+    									  KAknsIIDQsnFrInputPreviewSideL,
+    									  KAknsIIDQsnFrInputPreviewMiddle,
+    									  KAknsIIDQsnFrInputPreviewSideR);
+    if (iLayoutContext->LayoutType() == EPluginInputModeFSQ)
+        {
+        icf->SetMsgBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
+        icf->SetInfoBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
+        }
+        
+    if ( !( iLayoutContext->LayoutType() == EPluginInputModeFSQ ))
+        {
+        // Range bar
+        AddRangeBarL();
+        }
+
+    // Vkb control
+    iVkbCtrl = CPeninputVkbCtrlExt::NewL( TRect(), UiLayout(), 
+        EPeninutWindowCtrlIdVkbCtrl, NULL  );
+    iVkbCtrl->SetResourceId( R_PENINPUT_LAYOUT_VKB_KEYBOARD );
+    iVkbCtrl->ConstructFromResourceL();
+    iVkbCtrl->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 );
+    iVkbLayout->SetVkbKeyboard( iVkbCtrl );
+    if (iLayoutContext->LayoutType() != EPluginInputModeFSQ)
+        {
+        iVkbCtrl->SetIrregularKeyBoard(ETrue);
+        iVkbLayout->SetIrregularResourceId(R_AKN_FEP_VKB_IRREGULAR_BITMAP);
+        iVkbLayout->ConstructFromIrregularResourceL();
+        }
+    else
+        {
+        iVkbCtrl->SetIrregularKeyBoard(EFalse);
+        iVkbLayout->SetNonIrregularResourceId(R_AKN_FEP_VKB_NONIRREGULAR_BITMAP);
+        iVkbLayout->ConstructFromNonIrregularResourceL();        
+        }
+
+    // Add bubble support
+    iVkbCtrl->ShowBubble(ETrue);    
+    iVkbCtrl->SetGowithPointerDown(ETrue);
+    iVkbCtrl->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview);  //Change the ID when ID into release
+    
+    //set key to be 9 piece graphics
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        iVkbCtrl->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal );
+        iVkbCtrl->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed );
+        iVkbCtrl->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive );
+        }
+    
+    AddControlL( iVkbCtrl );
+    iVkbCtrl->AddEventObserver( UiLayout() );
+    
+    AddButtonL( EPeninutWindowCtrlIdEnterBtn, 
+                EPeninputLayoutEventEnter, 
+                R_PENINPUT_LAYOUT_VKB_ENTER, 
+                EKeyEnter );
+       
+    // Shift and capslock merged button
+
+  	CAknFepCtrlMultiModeButton* button = 
+  		CAknFepCtrlMultiModeButton::NewLC( UiLayout(), 
+  										   EPeninutWindowCtrlIdShiftBtn );
+    if ( button )
+	    {
+	    // Read resource
+	    TResourceReader reader;
+	    
+	    CCoeEnv::Static()->CreateResourceReaderLC( reader,
+	    	 			   R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK );  
+	    button->SetResourceId( R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK );      
+	    button->ConstructFromResourceL();  
+	    // Pop and destroy reader
+	    CleanupStack::PopAndDestroy( 1 );
+	    
+	    // Add into the control pool                                                   
+	    AddControlL( button );
+	    
+	    button->AddEventObserver( UiLayout() );
+	    }
+    CleanupStack::Pop( button );  
+    // Space button          
+    CAknFepCtrlEventButton* spaceButton = static_cast<CAknFepCtrlEventButton*>
+                                                   (Control(EPeninutWindowCtrlIdSpaceBtn));
+    // Create 3-pieces color icon for space button
+	CPenInput3PiecesColorIcons* colorIcons = 
+				CPenInput3PiecesColorIcons::NewL( R_AKN_FEP_VKB_SPACE_ICON1,
+												  R_AKN_FEP_VKB_SPACE_ICON2,
+												  R_AKN_FEP_VKB_SPACE_ICON3 );
+	spaceButton->Set3PiecesColorIcons( colorIcons );
+
+	//set background of space button to be 9 piece graphics
+	if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+	    {
+	    spaceButton->SetImageFrameId( KAknsIIDQsnFrKeypadButtonFrNormal, 
+	                                  KAknsIIDQsnFrKeypadButtonFrPressed,
+	                                  KAknsIIDQsnFrKeypadButtonFrInactive );
+	    }
+	
+	if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+	    {
+        // Switch to hwr button  
+        AddButtonL( EPeninutWindowCtrlIdMultiRangeBtn, 
+                    EPeninputLayoutEventMultiRange, 
+                    R_PENINPUT_LAYOUT_FSQ_MULTIRANGE );
+	    }
+	else
+	    {
+	    // Switch to hwr button  
+	    AddButtonL( EPeninutWindowCtrlIdSwitchToHwrBtn, 
+                    EPeninputLayoutEventToHwr, 
+                    R_PENINPUT_LAYOUT_VKB_HWR );
+	    }
+                  
+    // Add popup window
+    AddPopupWindowL();
+  
+    }
+    
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::ChangeUnitSize
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+const TRect CPeninputGenericVkbWindow::ChangeUnitSize()
+    {
+    return TRect();
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::ChangeClientSize
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ChangeClientSize()
+    {
+    if ( !iPopupWnd->Hiden() )
+        {
+        iPopupWnd->CloseWindow();
+        if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
+            {
+            ResetAccentButton();
+            }
+        iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+        }
+        
+    PopupWindowSizeChange();
+            
+    TInt clientLayoutId = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) );
+    CPeninputClientLayoutInfo* clientLayout = 
+        ConfigInfo()->FindClientLayoutInfo( clientLayoutId );
+        
+    if ( clientLayout )
+        {
+        ReorganizeControls( clientLayout->LayoutID(), EFalse );
+        } 
+
+    UpdateArea( iVkbCtrl->Rect(), EFalse );
+    }
+void CPeninputGenericVkbWindow::SetVkbLayoutSize()
+    {
+    TRect outrect,innerrect;   
+    iLafMgr->GetPreviewWndRect(outrect,innerrect);
+    iVkbCtrl->SetTextFormat(iLafMgr->PreviewWndText());  //Read laf 
+    iVkbCtrl->SetBubbleSize(TSize(outrect.Width(),outrect.Height()));  // Read laf
+    iVkbCtrl->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX,
+                           innerrect.iTl.iY - outrect.iTl.iY,
+                           outrect.iBr.iX - innerrect.iBr.iX,
+                           outrect.iBr.iY - innerrect.iBr.iY);
+    
+    TInt vkbLayoutid = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeVkbLayout ) );
+    CPeninputVkbLayoutInfo* vkbLayout = 
+        ConfigInfo()->FindVkbLayoutInfo( vkbLayoutid );
+
+    // Calculate current vkblayout according current layout
+    if ( vkbLayout )
+        {
+        const TInt columns = vkbLayout->Columns();
+        const TInt rows = vkbLayout->Rows();
+        TRect keyRect;
+        TRect charRect;
+        
+        //iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(rows,columns));
+        
+ 
+        for (TInt exter = 0; exter < rows; exter ++)
+            {
+            for (TInt inter = 0; inter < columns; inter ++ )
+                {
+                iLafMgr->GetKeyRect(inter,exter, keyRect, charRect);
+                vkbLayout->SetKeyInfo(exter,inter,keyRect,charRect,iLafMgr->KeyTextFont());
+                }
+            }
+     
+        if ( iVkbCtrl->IsIrregularKeyBoard() )
+            {
+            TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
+            TSize size = iVkbCtrl->IrregularKeyBitmap(EKeyLeftDown,
+                                                      EKeyStateNormal)->SizeInPixels();
+            if ( curSize != size )
+                {
+                for ( TInt i = 0; i <= EKeyRightUp; i++ )
+                    {
+                    for ( TInt j = 0; j <= EKeyStateDimmedMask; j++ )
+                        {
+                        AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap(
+                            (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), 
+                             curSize, EAspectRatioNotPreserved ); 
+                            
+                        AknIconUtils::SetSize( iVkbCtrl->IrregularKeyBitmap(
+                            (TVirtualKeyIrregularKeyType)i,(TVirtualKeyIrregularKeyState)j), 
+                             curSize, EAspectRatioNotPreserved );
+                        }
+                    }
+                }
+            }
+        else
+        	{
+        	TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
+        	TSize size = iVkbCtrl->NonIrregularKeyBitmap(EKeyBmpNormal)->SizeInPixels();
+        	if( curSize != size )	
+        		{
+                for ( TInt i = 0; i <= EKeyBmpLastType; i++ )
+                    {
+                    if( iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i) )
+                    	{
+                        AknIconUtils::SetSize( 
+                                           iVkbCtrl->NonIrregularKeyBitmap((TVirtualKeyBmpType)i), 
+                                           curSize, EAspectRatioNotPreserved );
+                    	}
+                    }
+        		}
+        	}
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::ReorganizeControls
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ReorganizeControls( TInt aClientLayoutId,
+                                                    TBool aNeedReset )
+    {
+    CPeninputClientLayoutInfo* clientLayout = 
+        ConfigInfo()->FindClientLayoutInfo( aClientLayoutId ); 
+    RPointerArray<CPeninputControlInfo>& controlList = 
+        clientLayout->ControlInfoList();
+  
+    const TInt keyColumns = clientLayout->Columns();
+    const TInt keyRows = clientLayout->Rows();
+    
+    if( iLastUsedTotalColumns == keyColumns &&
+    	iLastUsedTotalRows == keyRows )
+		{
+		return;
+		}    
+
+    iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(keyRows,keyColumns));
+    
+    iLastUsedTotalColumns = keyColumns;
+    iLastUsedTotalRows = keyRows;
+    
+    TRect winRect( Rect().iTl, iLafMgr->EntirePaneRect().Size());
+        
+    SetWindowRect(winRect);  
+    //ReorgnizeTitleBar();
+    ReorgnizeICFAndButtons();
+    
+    const TInt count = controlList.Count();
+    TInt controlID = 0;
+    CFepUiBaseCtrl* ctrl = NULL;
+    TRect rect;
+    TRect inRect;
+    TRect exRect;
+
+    TPoint winPoint = Rect().iTl;
+    TPoint LafPoint = iLafMgr->EntirePaneRect().iTl;
+    
+    TInt x = winPoint.iX - LafPoint.iX;
+    TInt y = winPoint.iY - LafPoint.iY;
+
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        x = 0;
+        y = 0;
+        }
+    for ( TInt i = 0; i < count; i++ )
+        {
+        controlID = controlList[i]->ControlID();
+        ctrl = Control( controlID );
+
+        if ( ctrl )
+            { 
+            AddNotOwnedControl( ctrl );
+            if ( ( ctrl->ControlType() | ECtrlButton ) == ECtrlButton )
+                {
+                
+                iLafMgr->GetButtonRect(TPeninputCommonCtrlID(ctrl->ControlId()),exRect ,inRect);
+                
+                exRect.Move(x, y);
+                inRect.Move(x, y);
+                if( controlID ==  EPeninutWindowCtrlIdShiftBtn)
+	                {
+					( static_cast<CAknFepCtrlMultiModeButton*> (ctrl) )->
+						SizeChanged( exRect, inRect, ETrue );		            	                	
+	                }
+	            else
+		            {
+		            if (TPeninputCommonCtrlID(ctrl->ControlId()) == EPeninutWindowCtrlIdSpaceBtn)
+		            	{
+		            	// config 3 pieces icon info       
+		            	TRect iconsFrameRect, middleIconRect;
+		            	iLafMgr->GetSpaceButtonExLayoutInfo( iconsFrameRect, middleIconRect );
+		            	iconsFrameRect.Move( x, y );
+		               	middleIconRect.Move( x, y );
+			            inRect = iconsFrameRect;
+			            
+						( static_cast<CAknFepCtrlCommonButton*> (ctrl) )->SetDraw3PieceFrameInfo(
+														  TDraw3PiecesFrame(KAknsIIDQgnIndiInputSpaceL,
+    													  KAknsIIDQgnIndiInputSpaceMiddle,
+    													  KAknsIIDQgnIndiInputSpaceR,
+    													  middleIconRect));			            
+		            	}
+	                ( static_cast<CAknFepCtrlCommonButton*> (ctrl) )->SizeChanged( exRect, 
+                                                                                 inRect, 
+                                                                                 ETrue );
+		            }
+                }
+            else if ( ctrl->ControlId() == EPeninutWindowCtrlIdVkbCtrl )
+                {
+				iVkbCtrl->SetFont( iLafMgr->KeyTextFont() );
+				iVkbCtrl->SetTextLineLayout( iLafMgr->KeyTextLayout() );
+			    iVkbCtrl->SetTextFormat( iLafMgr->PreviewWndText() );  //Read laf 
+				if (aNeedReset)
+			        {
+			        iVkbCtrl->Reset();
+			        }
+    
+                rect = iLafMgr->KeypadRect();
+                
+                rect.Move(x, y);
+
+                ( static_cast<CPeninputVkbCtrlExt*> (ctrl) )->SizeChanged(rect);
+                }
+                
+            else if ( ctrl->ControlId() == EPeninutWindowCtrlIdRangeBar )
+                {
+                TRAP_IGNORE(SetRangeBarSizeL(x, y));
+                }
+            }
+        }
+
+    // Addition for ITI features, read LAF data for candidate list
+    const TPeninputCandidateListLayoutData& candidateListLAF =    
+                                        iLafMgr->CandidateListLayoutData();
+    iCandidateList->SizeChanged( candidateListLAF.iSelectionItemSize, 
+                                 candidateListLAF.iSelectionHorMargin,
+                                 candidateListLAF.iSelectionVerMargin,
+                                 candidateListLAF.iSelectionNaviSize,
+                                 candidateListLAF.iSelectionNaviInnerSize );    
+    iCandidateList->SetPageInfoTextLineLayout
+                                ( candidateListLAF.iSelectionPageTextLine );
+    
+    
+    const CFont* itemFont = candidateListLAF.iFont;    
+    TRgb textColor = CandidateListTextColor();
+    if ( itemFont )
+        {
+        // Set font defined in LAF
+        iCandidateList->SetTextProperty( itemFont, textColor );
+        }
+    else
+        {
+        // If font in LAF is NULL, set ICF text font to candidate list
+        iCandidateList->SetTextProperty( iLafMgr->ICFTextFont(), textColor );
+        }
+    
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                   (Control(EPeninputWindowCtrlIdMultiLineICF));
+    if ( icf )
+        {
+        // read LAF data for tooltip box
+        const TPeninputTooltipBoxLayoutData& tooltipBoxLAF 
+                                          = iLafMgr->TooltipBoxLayoutData();
+        icf->TooltipBubbleCtrl()->SetTextFormat( tooltipBoxLAF.iTooltipTextLayout );
+        icf->TooltipBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG55 );
+        icf->TooltipBubbleCtrl()->SetBitmapParam(NULL,
+									  NULL,
+									  KAknsIIDQsnFrInputPreviewSideL,
+									  KAknsIIDQsnFrInputPreviewMiddle,
+									  KAknsIIDQsnFrInputPreviewSideR);
+        icf->TooltipBubbleCtrl()->SetFrameDiff( KTooltipLeftMargin, 
+        		                                KTooltipTopMargin,
+        		                                KTooltipRightMargin,
+        		                                KTooltipBottomMargin );
+        // read color from skin for autocompletion part
+        icf->SetAutoCompleteTextColor( AutoCompletionPartColor() );               
+        }       
+    }
+
+void CPeninputGenericVkbWindow::SetRangeBarSizeL(TInt x, TInt y)
+	{
+	TRect exRect; 
+    exRect = iLafMgr->RangbarRect();
+    exRect.Move(x, y);
+    // Get range bar display cell rects
+	TRect rect, innerRect;
+	RArray<TRect> displayCellRects, dispalyCellInnerRects;
+	CleanupClosePushL( displayCellRects );
+	CleanupClosePushL( dispalyCellInnerRects );
+    for( TInt i = 0; i < iLafMgr->RangbarCellCount(); i++ )
+    	{
+    	iLafMgr->RangbarCellAt( i, rect, innerRect );
+		rect.Move(x, y);
+		displayCellRects.AppendL( rect );
+		innerRect.Move(x, y);
+		dispalyCellInnerRects.AppendL( innerRect );               	
+    	}
+	iRangeBar->SetDispalyCellRectsL( displayCellRects, dispalyCellInnerRects );
+	CleanupStack::PopAndDestroy(2);
+    iRangeBar->SizeChanged( exRect );
+	}
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::SetControlsFont
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::SetControlsFont()
+    {
+/*    
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>(Control(EPeninputWindowCtrlIdMultiLineICF));
+    
+    const CFont* icfFont = iLafMgr->ICFTextFont();
+    
+    // set icf margin
+    TPeninputICFConfig icfConfig;
+    iLafMgr->GetICFConfig( icfConfig );
+    icf->SetTextMargin( icfConfig.iLeftMargin,
+    					icfConfig.iRightMargin,
+    					icfConfig.iTopMargin,
+    					0 );    			
+    
+    TRAP_IGNORE(icf->SizeChangedL( 
+          		icf->Rect(), 
+				icfConfig.iTextLineHeight,
+				icfFont->FontMaxHeight(),
+				icfFont));
+*/    
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::AddPopupWindowL
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::AddPopupWindowL()
+    {
+    iPopupWnd = CPeninputCommonChoiceList::NewL( UiLayout(), 
+        			EPeninutWindowCtrlIdAccentPopupWindow,
+        			KAknsIIDQsnFrList,
+        			KAknsIIDQsnFrPopupSub );
+    
+        
+   
+    iPopupWnd->AddEventObserver( UiLayout() );
+    
+    AddControlL( iPopupWnd );
+    iIdle = CIdle::NewL(CActive::EPriorityIdle );
+    iIdle ->Start(TCallBack(BackgroundTaskL,this));
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::PopupChoiceList
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::PopupChoiceList()
+    {
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        TRAP_IGNORE( PopupRangeListL());
+        }
+    else
+        {
+        CFepUiBaseCtrl* accentBtn = Control( EPeninutWindowCtrlIdAccentedBtn );
+        
+        if ( accentBtn )
+            {
+            if(!iPopupInited)
+                TRAP_IGNORE(DoIdleConstructL());
+            iPopupWnd->Display( accentBtn->Rect() );
+            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup );
+            }
+        }
+    }
+// ---------------------------------------------------------------------------
+// Show range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::PopupRangeListL()
+    {
+    if ( !iPopupInited )
+        {
+        TRAP_IGNORE( DoIdleConstructL() );
+        }
+    
+
+    iPopupWnd->ClearItemsL();
+    RArray<CFepLayoutChoiceList::SItem> items;
+    PrepareRangeListItems( items );
+    TInt count = items.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iPopupWnd->AddItemL( items[i] );
+        }
+    items.Close();
+
+    if ( iPopupWnd->ItemsCount() < 1 ) 
+        {
+        return;
+        }
+    
+    if ( iPopupWnd->ItemsCount() < 2 )
+        {
+        const CFepLayoutChoiceList::SItem* item = iPopupWnd->ItemByIndex( 0 );
+        CFepLayoutChoiceList::SEvent event;
+        event.iIndex = 0;
+        event.iCommand = item->iCommand;
+        TPtrC ptr;
+        ptr.Set(reinterpret_cast<TText*>(&event), sizeof(event));
+        HandleRangeListSelectedL( iPopupWnd, ptr );
+        return;
+        }
+    
+    CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdMultiRangeBtn );    
+    iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() );    
+    iPopupWnd->SetCurrentFocusedIndex( - 1 ); //no active item
+    iPopupWnd->Display( btn->Rect() );
+    iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup );    
+    }
+
+// ---------------------------------------------------------------------------
+// Handle range list event
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HandleRangeListSelectedL( CFepUiBaseCtrl* /*aCtrl*/, 
+                                                       const TDesC& aData )
+    {
+    CFepLayoutChoiceList::SEvent* event = 
+        (CFepLayoutChoiceList::SEvent*)aData.Ptr();
+    
+    TInt index = -1;
+    TInt range = ERangeInvalid;
+
+    if ( event->iCommand == EPeninputVkbLayoutNativeChar )
+        {
+        range = ERangeNative;
+        }
+
+    else if ( event->iCommand == EPeninputVkbLayoutNativeNumber )
+        {
+        range = ERangeNativeNumber;
+        }
+    
+    else if ( event->iCommand == EPeninputVkbLayoutLatinChar )
+        {
+        range = ERangeEnglish;
+        }
+    
+    else if ( event->iCommand == EPeninputVkbLayoutLatinNumber )
+        {
+        range = ERangeNumber;
+        }
+    
+    else if ( event->iCommand == EPeninputVkbLayoutSymbol )
+        {
+        range = ERangeSymbol;
+        }
+
+    else if ( event->iCommand == EPeninputVkbLayoutAccented1 )
+        {
+        index = 0;
+        range = ERangeAccent;
+        }
+    
+    else if ( event->iCommand == EPeninputVkbLayoutAccented2 )
+        {
+        index = 1;
+        range = ERangeAccent;
+        }
+    
+    else if ( event->iCommand == EPeninputVkbLayoutAccented3 )
+        {
+        index = 2;
+        range = ERangeAccent;
+        }
+        
+    TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
+    TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent );
+
+    if ( currentRange == range )
+        {
+        if ( range != ERangeAccent || currentAccent == index )
+            {
+            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+            return;
+            }
+        }
+
+    iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &index );
+
+    if ( range != ERangeAccent )
+        {
+        ChangeRange( range );
+        }
+    else
+        {
+        ChangeRange( ERangeAccent, 
+                EPeninputVkbLayoutAccented1 + 2 * index, ETrue );
+        }
+    UpdateRangeCtrlsL();
+    }
+
+// ---------------------------------------------------------------------------
+// Update state of range button
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::UpdateRangeCtrlsL()
+    {
+    CAknFepCtrlCommonButton* rangeBtn = 
+        static_cast<CAknFepCtrlCommonButton*>( 
+                Control(EPeninutWindowCtrlIdMultiRangeBtn));
+    if ( !rangeBtn )
+        {
+        return;
+        }
+    
+    RArray<CFepLayoutChoiceList::SItem> items;
+    PrepareRangeListItems( items );
+    TInt count = items.Count();
+    items.Close();
+    
+    TInt languageId = IntContext( EPeninputDataTypeInputLanguage );
+    TInt range = IntContext( EPeninputDataTypeCurrentRange );
+
+    TInt resId = -1;
+    TInt aplhaRangeResId = -1;
+    TInt numberRangeResId = -1;
+    GetRangeIconResource( languageId, aplhaRangeResId, numberRangeResId );
+    
+    if ( range == ERangeEnglish || range == ERangeNative ) 
+        {
+        resId = aplhaRangeResId;
+        }
+    else
+        {
+        resId = numberRangeResId; 
+        }
+        
+    if( rangeBtn->ResourceId() != resId )
+    	{
+		rangeBtn->SetResourceId( resId );
+		rangeBtn->ConstructFromResourceL(); 
+    	}
+
+    rangeBtn->SetDimmed( count < 1 );    
+    }
+
+// ---------------------------------------------------------------------------
+// Get resource ids of range button icon
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::GetRangeIconResource( TInt aLangId, 
+                                                      TInt& aAlphaRange, 
+                                                      TInt& aOtherRange  )
+    {   
+    switch ( aLangId )
+        {
+        case ELangRussian:    //Cyrillic
+        case ELangBulgarian:
+        case ELangUkrainian:
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_CYRILLIC_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_CYRILLIC_NUMERIC;
+            }
+            break;
+        case ELangGreek:       //Greek
+        case ELangCyprusGreek:
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_GREEK_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_GREEK_NUMERIC;
+            }
+            break;        
+        case ELangHebrew:     //Hebrew
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_HEBREW_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_HEBREW_NUMERIC;
+            }
+            break;  
+        case ELangArabic:     //Arabic
+        case ELangFarsi:      //Farsi
+        case ELangUrdu:       //Urdu
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_ARABIC_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_ARABIC_NUMERIC;
+            }
+            break;
+        case ELangThai:       //Thai
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_THAI_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_THAI_NUMERIC;
+            }
+            break;
+        default:              //others       
+            {
+            aAlphaRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_LATIN_ALPHA;
+            aOtherRange = R_PENINPUT_LAYOUT_VKB_RANGECTRL_LATIN_NUMERIC;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Prepare range list items
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::PrepareRangeListItems( 
+                     RArray<CFepLayoutChoiceList::SItem>& aRangeItems )
+    {
+    aRangeItems.Reset();
+    TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
+    TInt permittedRange = IntContext( EPeninputDataTypePermittedRange );
+    TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent );
+    TInt currentLanguage = IntContext( EPeninputDataTypeInputLanguage );
+    
+    CPeninputRangeBarInfo* rbinfo= ConfigInfo()->RangeBarInfo();
+    CPeninputRangeInfo* rgninfo = NULL;
+   
+    //add accent items
+    if ( permittedRange & ERangeAccent )
+        {
+        rgninfo = rbinfo->FindRange( ERangeAccent );
+        if ( rgninfo )
+            {
+            for ( TInt i = 0; i < iAccentCmdList.Count(); i++ )
+                {
+                if( currentRange != ERangeAccent || currentAccent != i )
+                    {
+                    aRangeItems.Append( iAccentCmdList[i] );
+                    }
+                }
+            }
+        }
+    
+    //add range items  
+    CFepLayoutChoiceList::SItem item;
+    
+    if ( permittedRange & ERangeNative )
+        {
+        rgninfo = rbinfo->FindRange( ERangeNative );
+        if ( rgninfo && currentRange != ERangeNative )
+            {
+            item.iCommand = EPeninputVkbLayoutNativeChar;
+            item.iText.Copy( iRangeLabels.iLabelNativeChar );
+            aRangeItems.Append( item );
+            }
+        }
+    
+    if (( permittedRange & ERangeNativeNumber ) && ( currentRange != ERangeNumber ) 
+    && (( ELangArabic == currentLanguage ) || ( ELangFarsi == currentLanguage ) 
+    || ( ELangUrdu == currentLanguage )))
+        {
+        rgninfo = rbinfo->FindRange( ERangeNativeNumber );
+        if ( rgninfo && currentRange != ERangeNativeNumber )
+            {
+            item.iCommand = EPeninputVkbLayoutNativeNumber;
+            item.iText.Copy( iRangeLabels.iLabelNativeNumber );
+            aRangeItems.Append( item );
+            }
+        }
+    else if(( permittedRange & ERangeNumber ) && ( currentRange != ERangeNumber ) 
+    		&& !(( ELangThai == currentLanguage ) && ( currentRange == ERangeNativeNumber )))
+       {
+       rgninfo = rbinfo->FindRange( ERangeNumber );
+       if ( rgninfo && currentRange != ERangeNumber )
+           {
+           item.iCommand = EPeninputVkbLayoutLatinNumber;
+           item.iText.Copy( iRangeLabels.iLabelLatinNumber );
+    	   aRangeItems.Append( item );
+    	   }
+        }
+    else
+      	{        
+            // Do nothing
+       }    
+   
+    if ( permittedRange & ERangeEnglish )
+        {
+        rgninfo = rbinfo->FindRange( ERangeEnglish );
+        if ( rgninfo && currentRange != ERangeEnglish )
+            {
+            item.iCommand = EPeninputVkbLayoutLatinChar;
+            item.iText.Copy( iRangeLabels.iLabelLatinChar );
+            aRangeItems.Append( item );
+            }
+        }
+    
+    }
+
+// ---------------------------------------------------------------------------
+// Load range labels for range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ConstructRangeLabelListL( TInt /*aLangId*/ )
+    {
+    iRangeLabels.iLabelNativeChar.Zero();
+    iRangeLabels.iLabelNativeNumber.Zero();
+    iRangeLabels.iLabelLatinChar.Zero();
+    iRangeLabels.iLabelLatinNumber.Zero();
+    iRangeLabels.iLabelSymbol.Zero();
+    iRangeLabels.iLabelAccent.Zero();
+    
+    TInt resid = R_PENINPUT_LAYOUT_VKB_RANGES;
+    
+    TResourceReader reader;   
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, resid );
+    TPtrC ptr1 = reader.ReadTPtrC();
+    TPtrC ptr2 = reader.ReadTPtrC();
+    TPtrC ptr3 = reader.ReadTPtrC();
+    TPtrC ptr4 = reader.ReadTPtrC();
+    TPtrC ptr5 = reader.ReadTPtrC();
+    TPtrC ptr6 = reader.ReadTPtrC();
+    
+    iRangeLabels.iLabelNativeChar.Copy( ptr1 );
+    iRangeLabels.iLabelNativeNumber.Copy( ptr2 );
+    iRangeLabels.iLabelLatinChar.Copy( ptr3 );
+    iRangeLabels.iLabelLatinNumber.Copy( ptr4 );
+    iRangeLabels.iLabelSymbol.Copy( ptr5 );
+    iRangeLabels.iLabelAccent.Copy( ptr6 );
+    
+    CleanupStack::PopAndDestroy( 1 ); //reader        
+    }
+
+// ---------------------------------------------------------------------------
+// Utils to get context value 
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputGenericVkbWindow::IntContext( TPeninputDataType aDataIndex )
+    {
+    return CPeninputDataConverter::AnyToInt( 
+                           iLayoutContext->RequestData( aDataIndex ));
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::ResetAccentButton
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ResetAccentButton()
+    {
+    TInt curRange = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) );
+        
+    if ( iRangeBar )
+        {
+        iRangeBar->ActiveRange( curRange );
+        }        
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::PopupWindowSizeChange
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::PopupWindowSizeChange()
+    {
+    if (CPeninputDataConverter::AnyToInt(
+        iLayoutContext->RequestData(EAkninputDataTypeSizeChanging)) || (!iPopupSet))
+    	{
+    	// if size changing, or popup window's property has not been set yet
+        TAknWindowLineLayout appWnd = AknLayoutScalable_Avkon::application_window(0).LayoutLine();
+        iAppWndRect = appWnd.Rect();
+    	
+        TAknWindowLineLayout mainPane = AknLayoutScalable_Avkon::main_pane(4).LayoutLine();
+        TAknLayoutRect mainPaneRect;
+        mainPaneRect.LayoutRect(iAppWndRect, mainPane);
+        
+        TAknWindowLineLayout choiceWnd = 
+                         AknLayoutScalable_Avkon::popup_choice_list_window(1).LayoutLine();
+        TAknLayoutRect choiceRect;
+        choiceRect.LayoutRect(mainPaneRect.Rect(), choiceWnd);
+        
+        iPopupItemRect = TRect(0, 0, choiceRect.Rect().Width(), 
+                         AknLayoutScalable_Avkon::list_single_choice_list_pane(0).LayoutLine().iH);
+        
+        iChoiceTextLayout = 
+                         AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1).LayoutLine();
+    	}
+    	
+    const CFont* font = AknLayoutUtils::FontFromId(iChoiceTextLayout.iFont, NULL);
+    iPopupWnd->SetFont(font);
+    iPopupWnd->SetItemRect(iPopupItemRect, iPopupItemRect);
+
+    TInt leftMargin = iChoiceTextLayout.il;
+    
+    iPopupWnd->SetMarginAndBaseline(leftMargin, font->HeightInPixels());
+    
+    iPopupWnd->SetFontColor(AKN_LAF_COLOR_STATIC(iChoiceTextLayout.iC));
+
+    AknIconUtils::SetSize(iPopupWndBgImg, TSize(iPopupItemRect.Width(), 
+                          iPopupItemRect.Height()*3), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(iPopupWndFocusImg, TSize(iPopupItemRect.Width(), 
+                          iPopupItemRect.Height()* 3), EAspectRatioNotPreserved);
+    
+    iPopupSet = ETrue;
+    }
+
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::GetPopupWndInfoFromRes
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::GetPopupWndInfoFromResL( TResourceReader aRes,
+                                                        const TRect& aRect )
+    {
+    TPtrC bmpFileName = aRes.ReadTPtrC();        
+    TInt32 imgMajorSkinId = aRes.ReadInt32();
+
+    TAknsItemID id;
+    
+    MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
+
+    TInt popWinBmpId = aRes.ReadInt16();
+    TInt popWinBmpMaskId = aRes.ReadInt16();
+    TInt popWinBmpSkinId = aRes.ReadInt16();
+    
+    id.Set( TInt( imgMajorSkinId ), popWinBmpSkinId );
+    
+    if ( popWinBmpId != KInvalidImg )
+    	{
+        AknsUtils::CreateIconL( skininstance,
+                                id,
+                                iPopupWndBgImg,
+                                bmpFileName,
+                                popWinBmpId );
+            
+    	AknIconUtils::SetSize( iPopupWndBgImg, TSize( aRect.Width(), 
+            aRect.Height() * 3 ), EAspectRatioNotPreserved );
+        iPopupWnd->SetBackgroundBitmapL( iPopupWndBgImg );
+    	}
+    	
+    TInt focusBmpId = aRes.ReadInt16();
+    TInt focusBmpMaskId = aRes.ReadInt16();
+    TInt focusBmpSkinId = aRes.ReadInt16();
+
+    id.Set( TInt( imgMajorSkinId ), focusBmpSkinId );
+    
+    if ( focusBmpId != KInvalidImg )
+    	{
+        AknsUtils::CreateIconL( skininstance,
+                                id,
+                                iPopupWndFocusImg,
+                                bmpFileName,
+                                focusBmpId );
+
+    	AknIconUtils::SetSize( iPopupWndFocusImg, TSize( aRect.Width(), 
+            aRect.Height() * 3 ), EAspectRatioNotPreserved );
+        iPopupWnd->SetFocusBmp( iPopupWndFocusImg );
+    	}
+    }
+      
+// --------------------------------------------------------------------------
+// CAknFepVkbClientArea::AddRangeBarL
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::AddRangeBarL()
+    {
+    // Range bar
+    iRangeBar = CAknFepCtrlRangeBar::NewL( UiLayout(),
+        EPeninutWindowCtrlIdRangeBar, 
+        CAknFepCtrlRangeBar::EBtnGroupHorizontal );
+
+    // Set event id    
+    iRangeBar->SetEventIdForRange( EPeninputLayoutEventRange );
+    iRangeBar->SetEventIdForCase( EPeninputLayoutEventRangeLoop );
+
+    AddControlL( iRangeBar );
+    iRangeBar->AddEventObserver(UiLayout());    
+    }
+    
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::AddButtonL
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+CAknFepCtrlEventButton* CPeninputGenericVkbWindow::AddButtonL( 
+    const TInt aControlId, const TInt aEventId, const TInt aResId, 
+    const TInt aUnicode, const TBool aIsRepeat )
+    {
+    CAknFepCtrlEventButton* button = NULL;
+    
+    if ( aIsRepeat )
+        {
+        button = CAknFepCtrlRepeatButton::NewL( UiLayout(), aControlId, 
+            aEventId, aUnicode );
+        }
+    else
+        {
+        if ( aControlId == EPeninutWindowCtrlIdMultiRangeBtn )
+            {
+            button = CAknFepCtrlLongPressButton::NewL( UiLayout(), aControlId, 
+                aEventId, aUnicode,
+                KAknsIIDQsnFrFunctionButtonNormal,
+                KAknsIIDQsnFrFunctionButtonPressed,
+                KAknsIIDQsnFrFunctionButtonInactive );                
+            }
+        else
+            {
+            button = CAknFepCtrlEventButton::NewL( UiLayout(), aControlId, 
+                aEventId, aUnicode,
+                KAknsIIDQsnFrFunctionButtonNormal,
+                KAknsIIDQsnFrFunctionButtonPressed,
+                KAknsIIDQsnFrFunctionButtonInactive );        
+            }
+        }
+        
+    CleanupStack::PushL( button );  
+    if ( button )
+        {
+        // Read resource
+        TResourceReader reader;
+        
+        CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId );  
+        button->SetResourceId( aResId );      
+        button->ConstructFromResourceL();  
+        // Pop and destroy reader
+        CleanupStack::PopAndDestroy( 1 );
+        
+        // Add into the control pool                                                   
+        AddControlL( button );
+        button->AddEventObserver(UiLayout());
+        
+        }
+    CleanupStack::Pop( button );  
+    	  
+    return button;
+    }
+
+// --------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::DoCaseChange
+// (other items were commented in a header)
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::DoCaseChange( TInt aNewCase )
+    {
+    TInt curCase = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCase ) );            
+    
+    if ( aNewCase == curCase )
+        {
+        return;
+        }
+        
+    TInt curRange = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); 
+                               
+    if ((( curRange == ERangeAccent ) || ( ( curRange == ERangeEnglish ) 
+            || ( ( curRange == ERangeNative ) && ( ConfigInfo()->CaseSensitive()) ) ) ) )
+        {
+        // Set shift and caplock button
+        TInt shfit;  
+        TInt capslock;  
+        
+        CPeninputDataConverter::ShiftCapslockByCase( aNewCase, 
+            shfit, capslock );
+
+        iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shfit );
+        //ChangeButtonStatus( shfit, EPeninutWindowCtrlIdShiftBtn );          
+        iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock );        
+        //ChangeButtonStatus( capslock, EPeninutWindowCtrlIdCapslockBtn );
+        iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase ); 
+        ChangeMergedButtonStatus( shfit, capslock );
+        
+        TInt vkblayout = ConfigInfo()->ShiftCapsSingleVkbLayoutByCase
+            ( curRange, aNewCase );
+
+        if ( curRange == ERangeAccent ) 
+           {
+           TInt curAccentIndex = CPeninputDataConverter::AnyToInt
+               ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) );
+                 vkblayout = vkblayout + curAccentIndex * 2;
+           }
+        
+        ChangeVkbLayout( vkblayout );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::BackgroundConstructL
+// Do background construct.
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputGenericVkbWindow::BackgroundTaskL(TAny* aPtr)
+    {
+    CPeninputGenericVkbWindow* self = static_cast<CPeninputGenericVkbWindow*>(aPtr);
+    self->DoIdleConstructL();
+    return EFalse; // only run once
+    }
+
+
+void CPeninputGenericVkbWindow::DoIdleConstructL()
+    {   
+    if(iPopupInited)
+        return;
+    
+
+    // Read resource
+    TResourceReader reader;
+    
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, 
+        R_PENINPUT_LAYOUT_VKB_POPUP_WINDOW ); 
+        
+    GetPopupWndInfoFromResL(reader, iPopupItemRect);    
+       
+    // Pop and destroy reader
+    CleanupStack::PopAndDestroy( 1 );
+
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::ConstructFromResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ConstructFromResourceL()
+    {     	        
+    CPeninputLayoutWindowExt::ConstructFromResourceL();
+    if( iVkbLayout && !iFirstConstruct )
+    	{
+    	if( iVkbCtrl->IsIrregularKeyBoard() )    	
+    		iVkbLayout->ConstructFromIrregularResourceL();
+    	else
+    		iVkbLayout->ConstructFromNonIrregularResourceL();
+    	
+    	//SetVkbLayoutSize();
+    	
+    	if( IsRtoLLanguage( iLanguage ) )
+    		{
+			//Mirror backspace graphic
+			HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );    			
+    		}
+    	}
+    	
+    iFirstConstruct = EFalse;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::SetSwitchlistLanguage
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void  CPeninputGenericVkbWindow::SetSwitchlistLanguage(TInt aLang)
+    {
+    ASSERT( IsValidLanguage( aLang ) );
+    //Check language input direction change
+    TBool isLangDirectionChange = EFalse;
+    if( IsValidLanguage( iLanguage ) )
+    	isLangDirectionChange =  IsRtoLLanguage( aLang ) ^ IsRtoLLanguage( iLanguage );    
+    else
+    	isLangDirectionChange = IsRtoLLanguage( aLang );
+    
+    if( aLang ==ELangHebrew || 
+	    aLang == ELangGreek ||
+		aLang == ELangHindi ||
+		aLang == ELangMarathi ) 
+		{
+		iLafMgr->SetLafOption( (TPeninputVkbLafOption)
+							   ( iLafMgr->OptionType() &(~EOption3CellRange) ) );	
+		}
+	else
+		{
+		iLafMgr->SetLafOption( (TPeninputVkbLafOption)
+				   ( iLafMgr->OptionType() | EOption3CellRange) );	
+		}
+			
+	if( isLangDirectionChange )
+		{
+		//Mirror backspace graphic
+		HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
+		}
+			
+	iLanguage = aLang;	
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::SetSwitchlistSecretFlag
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void  CPeninputGenericVkbWindow::SetSwitchlistSecretFlag(TBool aSecret)
+    {
+    CPeninputLayoutInputmodelChoice* choiceList = 
+        static_cast<CPeninputLayoutInputmodelChoice*>( 
+            Control(EPeninutWindowCtrlIdSwitcherPopupWindow ));
+        
+    if ( choiceList )
+        {
+        choiceList->SetSecretEditor( aSecret );
+        }
+	//disable or enable arrow keys of FSQ in secret editor.    	
+    }
+    
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::DimArrowKeys
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::DimArrowKeys( TBool aDimArrow )
+    {
+    if(iLayoutContext->LayoutType() == EPluginInputModeFSQ 
+       && iArrowLeftButton && iArrowRightButton)
+        {
+        iArrowLeftButton->SetDimmed( aDimArrow );
+        iArrowRightButton->SetDimmed( aDimArrow );
+        }	    	
+    }
+
+void CPeninputGenericVkbWindow::DimEnterKey( TBool aDimmed )
+    {
+	CAknFepCtrlEventButton* enterBtn = static_cast<CAknFepCtrlEventButton*>
+	                              ( Control(EPeninutWindowCtrlIdEnterBtn) );	
+    if(iLayoutContext->LayoutType() == EPluginInputModeFSQ 
+       && enterBtn )
+        {
+        enterBtn->SetDimmed( aDimmed );        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepVkbWindow::PopupAccentWindow
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::PopupSwitchWindowL()
+    {
+    CFepUiBaseCtrl* accentBtn = Control(EPeninutWindowCtrlIdSwitchToHwrBtn);
+
+    if ( accentBtn )
+        {
+        if (!iPopupInited)
+            {
+        	  DoIdleConstructL();
+            }
+        TRect rect = accentBtn->Rect();   
+		static_cast<CPeninputLayoutInputmodelChoice*>
+		    	(Control(EPeninutWindowCtrlIdSwitcherPopupWindow))->PopUpSwitchListL( accentBtn->Rect() );
+        }         
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::SetDeadKey
+// (Set DeadKey)
+// ---------------------------------------------------------------------------
+//     
+void CPeninputGenericVkbWindow::SetDeadKey()
+    {
+    // Get VKB list
+    RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
+    vkbListInfo = iVkbLayout->VkbLayoutInfoList();
+    TInt vkbListNum = vkbListInfo.Count();
+    
+    CPeninputVkbKeyInfo* pVKBKeyInfo;
+    CVirtualKey* pKey;
+    TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
+    for(TInt i = 0; i < vkbListNum; i++)
+        {
+        for(TInt j = 0; j < count; j++)
+            {
+            if(vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar ||
+               vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift)
+                {
+                pVKBKeyInfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
+                if(pVKBKeyInfo)
+                    {
+                    // Set the DeadKey as a latch button
+                    pKey = pVKBKeyInfo->Key();
+                    pKey->SetLatchKey(ETrue);
+                    }
+                }
+            }
+        }
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::UnLatchDeadKey
+// (Unlatch the DeadKey)
+// ---------------------------------------------------------------------------
+//     
+void CPeninputGenericVkbWindow::UnLatchDeadKey( const TDesC& abuf )
+    {
+    RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
+    vkbListInfo = iVkbLayout->VkbLayoutInfoList();
+    TInt vkbListNum = vkbListInfo.Count();
+    
+    CPeninputVkbKeyInfo* pVKBKeyInfo;
+    CVirtualKey* pKey;
+    TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
+    for(TInt i = 0; i < vkbListNum; i++)
+        {
+        for(TInt j = 0; j < count; j++)
+            {
+            // Only NativeChar and NativeCharShift layout contain DeadKey
+            if(vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar ||
+               vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift)
+                {
+                // Find the DeadKey in NativeChar or NativeCharShift layout
+                pVKBKeyInfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
+                if(pVKBKeyInfo)
+                    {
+                    pKey = pVKBKeyInfo->Key();
+                    if(pKey->Latched())
+                        {
+                        if(abuf == KNullDesC)
+                            {
+                            // When focus change, the latched key will be released
+                            TBool deadKeyChange = EFalse;
+                            iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+                            pKey->SetLatched(EFalse);
+                            TRect rect = pKey->Rect();
+                            rect.Move( iVkbCtrl->Rect().iTl );
+                            UpdateArea( rect, EFalse ); 
+                            return;
+                            }
+                        if(abuf[0] == KSupportLanguages[j].iDeadKey)
+                            {
+                            // When another DeadKey is clicked, the old one will be released
+                            pKey->SetLatched(EFalse);
+                            TRect rect = pKey->Rect();
+                            rect.Move( iVkbCtrl->Rect().iTl );
+                            UpdateArea( rect, EFalse ); 
+                            return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::HandleAccentCharEvent
+// (Unlatch the DeadKey)
+// ---------------------------------------------------------------------------
+//     
+TBool CPeninputGenericVkbWindow::HandleAccentCharEvent( TInt /*aEventType*/, 
+                                                    const TDesC& aEventData, 
+                                                    const TDesC& aDeadKey, 
+                                                    HBufC* anewCharBuf )
+    {
+    // Get the unicode of virtual key char
+    TBuf<16> buf;
+    TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
+    buf.Append(event->iCode);
+    TBool rs = EFalse;
+    
+    // Caculate the accent char number
+    TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair);
+    TInt i = 0; 
+    if(aDeadKey.Compare( KNullDesC ) != 0) // One DeadKey is latched
+        {
+        for(i = 0; i < count; i++)
+            {
+            if((aDeadKey[0] == KSupportLanguages[i].iDeadKey) && 
+               (buf[0] == KSupportLanguages[i].iChar))
+                {
+                if(anewCharBuf)
+                    {                    
+                    anewCharBuf->Des().Append(KSupportLanguages[i].iAccentedChar);
+                    rs = ETrue;
+                    }
+                break;
+                }
+            }
+        }
+    return rs;
+    }
+    
+ 
+// ---------------------------------------------------------------------------
+// CPeninputGenericVkbWindow::HandleVirtualKeyLatchedEvent
+// (Handle virtual key latched event).
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HandleVirtualKeyLatchedEvent(TInt /*aEventType*/, 
+                                                         CFepUiBaseCtrl* /*aCtrl*/, 
+                                                         const TDesC& aEventData )
+    {
+    TBuf<16> deadKey(KNullDesC);
+    TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
+    deadKey.Append(event->iCode);
+
+    TInt latchedFlag = CPeninputDataConverter::AnyToInt(
+                       iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
+    if(latchedFlag)
+        {
+        // Update the new and old DeadKey buffer
+        iOldDeadKeyBuf = iNewDeadKeyBuf;
+        iNewDeadKeyBuf = deadKey;
+
+        HBufC* newCharBuf = HBufC::New( 2*iOldDeadKeyBuf.Length() );
+        if( newCharBuf )
+            {
+            CPeninputGenericVkbLayout* layout 
+                    = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
+            if( layout->IsEnableITIOnFSQ() )
+                {
+                // If ITI is open, double same keys should be send for one dead key,
+                // core will handle them as one key.
+                newCharBuf->Des().Append( iOldDeadKeyBuf );
+                }
+            newCharBuf->Des().Append( iOldDeadKeyBuf );
+            }
+        
+        // Submit old DeadKey
+        UiLayout()->SignalOwner(ESignalKeyEvent, *newCharBuf);
+        delete newCharBuf;                     
+     
+        // Unlatch the previous DeadKey
+        UnLatchDeadKey(iOldDeadKeyBuf);
+        
+
+        }
+    else
+        {
+        iNewDeadKeyBuf = deadKey;
+        
+        // Set DeadKey state to latched
+        TBool deadKeyChange = ETrue;
+        iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayout::HandleVirtualKeyUpEvent
+// (Handle virtual key up event).
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputGenericVkbWindow::HandleVirtualKeyUpEvent(TInt aEventType, 
+                                                    CFepUiBaseCtrl* /*aCtrl*/, 
+                                                    const TDesC& aEventData )
+    {
+    // Get DeadKey state
+    TInt latchedFlag = CPeninputDataConverter::AnyToInt(
+                       iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
+    if(latchedFlag)
+        {
+        TBool ret = EFalse;
+        
+        TRAP_IGNORE(ret = HandleDeadKeyL(aEventType,aEventData))
+        
+        if(ret)
+        	{
+        	return ETrue;	
+        	}
+        else
+            {
+            // When the DeadKey can not combine with current character,
+            // Sumit current DeadKey
+            UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf );
+            }
+        }
+        
+    iNewDeadKeyBuf = KNullDesC;
+    return EFalse;
+    } 
+ 
+ TBool CPeninputGenericVkbWindow::HandleDeadKeyL(TInt aEventType, 
+                                                 const TDesC& aEventData )
+ 	{
+    // Set DeadKey to unlatched state
+    TBool deadKeyChange = EFalse;
+    iLayoutContext->SetData(EAkninputDataTypeLatchedSet, &deadKeyChange);
+    UnLatchDeadKey(iNewDeadKeyBuf);
+
+    CPeninputGenericVkbLayout* layout 
+                      = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );
+ 	if ( layout->IsEnableITIOnFSQ() )
+ 		{
+ 	    TBuf<KKeyCodeSize> buf;
+ 	    TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
+ 	    buf.Append(event->iCode);
+
+		HBufC* newCharBuf = HBufC::New( iNewDeadKeyBuf.Length() + buf.Length() );
+		if( newCharBuf )
+			{
+			newCharBuf->Des().Append( iNewDeadKeyBuf );
+			newCharBuf->Des().Append( buf );
+			}
+ 	    
+        // Submit DeadKey + Key at the same time
+        UiLayout()->SignalOwner(ESignalKeyEvent,*newCharBuf);
+		
+        delete newCharBuf;
+ 		
+ 		return ETrue;
+ 		}
+ 	
+    // Get the accent char
+    HBufC* newCharBuf = HBufC::NewL(1);
+    if(HandleAccentCharEvent(aEventType, 
+                             aEventData, 
+                             iNewDeadKeyBuf, 
+                             newCharBuf))
+        {
+        // Send ths accent key to FEP
+        UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf);
+        iNewDeadKeyBuf = KNullDesC;
+        delete newCharBuf;
+        return ETrue;
+        }
+    delete newCharBuf;
+    
+    return EFalse; 		
+ 	}
+ 
+void CPeninputGenericVkbWindow::SetLafLayOut(TInt aRows, TInt aColumns)
+    {
+    iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(aRows,aColumns));
+    }
+
+    
+void CPeninputGenericVkbWindow::AddCustomControlGroupL(CFepUiBaseCtrl* aCtrl)
+	{
+	AddControlL(aCtrl);
+	}    
+
+TBool CPeninputGenericVkbWindow::CreateCustomControlL( TInt16 aControlId, TInt32 aImageId )
+	{
+	TBool create = ETrue;
+    switch ( aControlId )
+        {
+        case EPeninutWindowCtrlIdMoveBtn:
+            {
+            if ( !iMoveButton )
+                {
+                iMoveButton = CAknFepCtrlDragButton::NewL(UiLayout(), EPeninutWindowCtrlIdMoveBtn);
+                AddControlL(iMoveButton);
+                iMoveButton->AddPositionObserver(this);
+                iMoveButton->AddEventObserver( UiLayout() );
+                iMoveButton->SetResourceId( aImageId );
+                iMoveButton->SetImageFrameId(KAknsIIDQsnFrFunctionButtonNormal,
+        									  KAknsIIDQsnFrFunctionButtonPressed,
+        									  KAknsIIDQsnFrFunctionButtonInactive);
+                UiLayout()->EnableLayoutMoving( static_cast<CDragBar*>( iMoveButton ) );
+                }
+            iMoveButton->ConstructFromResourceL();
+            }
+            break;
+        case EPeninupWindowCtrlIdArrowLeftBtn:
+            {
+            if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
+                {
+                break;
+                }
+
+            if (!iArrowLeftButton)
+                {
+                
+	            iArrowLeftButton = CAknFepCtrlRepeatButton::NewL( 
+	                UiLayout(), aControlId, EPeninputLayoutEventLeftArrow, EKeyLeftArrow, 
+	            								  KAknsIIDQsnFrFunctionButtonNormal,
+	        									  KAknsIIDQsnFrFunctionButtonPressed,
+	        									  KAknsIIDQsnFrFunctionButtonInactive );
+
+                AddControlL(iArrowLeftButton);
+                iArrowLeftButton->AddEventObserver(UiLayout());
+                iArrowLeftButton->SetResourceId( aImageId );
+                }
+
+            iArrowLeftButton->ConstructFromResourceL();
+            }
+            break;
+        case EPeninupWindowCtrlIdArrowRightBtn:
+            {
+            if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ )
+                {
+                break;
+                }
+
+            if (!iArrowRightButton)
+                {
+	            iArrowRightButton = CAknFepCtrlRepeatButton::NewL( 
+	                UiLayout(), aControlId, EPeninputLayoutEventRightArrow, EKeyRightArrow, 
+	            								  KAknsIIDQsnFrFunctionButtonNormal,
+	        									  KAknsIIDQsnFrFunctionButtonPressed,
+	        									  KAknsIIDQsnFrFunctionButtonInactive );
+
+                AddControlL(iArrowRightButton);
+                iArrowRightButton->AddEventObserver(UiLayout());
+                iArrowRightButton->SetResourceId( aImageId );
+
+                }
+            iArrowRightButton->ConstructFromResourceL();
+            }
+            break;
+        default:
+            {
+            create = EFalse;
+            }
+        }
+        return create;
+    }
+    
+void CPeninputGenericVkbWindow::SetPromptTextL(TUint8* aData)
+    {
+    RDesReadStream readStream;
+
+    TPtr8 countPtr(aData, 2*sizeof(TInt), 2*sizeof(TInt));
+	  readStream.Open(countPtr);
+	  CleanupClosePushL(readStream);
+    const TInt dataCount = readStream.ReadInt32L();
+	  const TInt textCount = readStream.ReadInt32L();
+    CleanupStack::PopAndDestroy(&readStream);
+    
+    TPtr8 ptr( aData+2*sizeof(TInt), dataCount+textCount, dataCount+textCount );            
+	  readStream.Open(ptr);
+	  CleanupClosePushL(readStream);
+	
+	  HBufC8* dataBuf = HBufC8::NewLC(dataCount);
+	  TPtr8 dataBufPtr = dataBuf->Des();
+	  readStream.ReadL(dataBufPtr, dataCount);
+
+    TFepPromptText* pIcfData = 
+        reinterpret_cast<TFepPromptText*>(const_cast<TUint8*>(dataBufPtr.Ptr()));
+
+    HBufC* textBuf;
+    if (textCount > 0)
+        {
+        textBuf = HBufC::NewLC(textCount/2);
+    	  TPtr textBufPtr = textBuf->Des();
+    	  readStream.ReadL(textBufPtr, textCount/2);
+        static_cast<CFepLayoutMultiLineIcf*>
+            (Control(EPeninputWindowCtrlIdMultiLineICF))->SetPromptTextL
+                (textBuf->Des(), pIcfData->iCleanContent);
+        CleanupStack::PopAndDestroy(textBuf);
+        }
+    else
+        {
+        static_cast<CFepLayoutMultiLineIcf*>
+            (Control(EPeninputWindowCtrlIdMultiLineICF))->SetPromptTextL(KNullDesC, pIcfData->iCleanContent);
+        }
+
+    CleanupStack::PopAndDestroy(dataBuf);
+	CleanupStack::PopAndDestroy(&readStream);
+    }    
+
+void CPeninputGenericVkbWindow::UpdateLafData()
+    {
+    TRAP_IGNORE( iLafMgr->UpdateLafDataL() );
+    }
+
+void CPeninputGenericVkbWindow::ReorgnizeICFAndButtons()
+	{
+    TRect rect;
+    
+    TPoint winPoint = Rect().iTl;
+    TPoint LafPoint = iLafMgr->EntirePaneRect().iTl;
+    
+    TInt x = winPoint.iX - LafPoint.iX;
+    TInt y = winPoint.iY - LafPoint.iY;    
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        x = 0;
+        y = 0;
+        }
+        
+    TRect inRect;
+    TRect exRect;
+    
+   
+    rect = iLafMgr->ICFRect();
+    rect.Move(x, y);
+    
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                  (Control(EPeninputWindowCtrlIdMultiLineICF));
+
+    const CFont* icfFont = iLafMgr->ICFTextFont();
+    
+    // set icf margin
+    TPeninputICFConfig icfConfig;
+    iLafMgr->GetICFConfig( icfConfig );
+    icf->SetTextMargin( icfConfig.iLeftMargin,
+    					icfConfig.iRightMargin,
+    					icfConfig.iTopMargin,
+    					0 );    			
+    icf->SetLineSpace( icfConfig.iLineSpaceMargin );
+    TRAP_IGNORE(icf->SizeChangedL( 
+          		rect, 
+				icfConfig.iTextLineHeight,
+				icfFont->FontMaxHeight(),
+				icfFont));
+
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        iLafMgr->GetButtonRect( 
+                EPeninutWindowCtrlIdMultiRangeBtn, exRect, inRect );
+        exRect.Move(x, y); 
+        inRect.Move(x, y);
+        static_cast<CAknFepCtrlEventButton*>
+            ( Control( EPeninutWindowCtrlIdMultiRangeBtn ))->SizeChanged( 
+              exRect, inRect, ETrue );
+            
+        TRAP_IGNORE( icf->MsgBubbleCtrl()->SetTextL( KEmptyString ));
+        iIndiWithText = EFalse;
+        IndiBubbleWithoutText();
+        }
+    
+    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdOptionBtn,exRect ,inRect);
+    exRect.Move(x, y); 
+    inRect.Move(x, y);
+    static_cast<CAknFepCtrlEventButton*>
+        ( Control( EPeninutWindowCtrlIdOptionBtn ) )->SizeChanged( exRect, inRect, ETrue );
+
+    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdCloseBtn,exRect ,inRect);
+    exRect.Move(x, y); 
+    inRect.Move(x, y);
+    static_cast<CAknFepCtrlCommonButton*>
+        ( Control( EPeninutWindowCtrlIdCloseBtn ) )->SizeChanged( exRect, inRect, ETrue );
+
+    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdBackspaceBtn,exRect ,inRect);
+    exRect.Move(x, y); 
+    inRect.Move(x, y);
+    
+    // Check size change of bk button, need for mirroring when arabic
+    CAknFepCtrlCommonButton* bkBtn = static_cast<CAknFepCtrlCommonButton*>
+        ( Control( EPeninutWindowCtrlIdBackspaceBtn ) );
+    TBool bBKSizeChanged = EFalse;
+	if( exRect.Size() != bkBtn->Rect().Size() &&
+		inRect.Size() != bkBtn->ForgroundBmpRect().Size() )
+		{
+		bBKSizeChanged = ETrue;
+		}    
+    bkBtn->SizeChanged( exRect, inRect, ETrue );
+
+
+    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdSpaceBtn,exRect ,inRect);
+    inRect = exRect;
+    inRect.Shrink(10, 0);
+    
+    exRect.Move(x, y); 
+    inRect.Move(x, y);
+    static_cast<CAknFepCtrlCommonButton*>
+        ( Control( EPeninutWindowCtrlIdSpaceBtn ) )->SizeChanged( exRect, inRect, ETrue );
+        
+    TRect spaceIconRect = inRect;
+    spaceIconRect.Shrink(10, 0);
+	static_cast<CAknFepCtrlCommonButton*>
+        ( Control( EPeninutWindowCtrlIdSpaceBtn ) )->SetDraw3PieceFrameInfo(
+                      TDraw3PiecesFrame(KAknsIIDQgnIndiInputSpaceL,
+            													  KAknsIIDQgnIndiInputSpaceMiddle,
+            													  KAknsIIDQgnIndiInputSpaceR,
+            													  spaceIconRect));
+
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        iLafMgr->GetButtonRect(EPeninupWindowCtrlIdArrowLeftBtn,exRect ,inRect);
+        exRect.Move(x, y); 
+        inRect.Move(x, y);
+        iArrowLeftButton->SizeChanged( exRect, inRect, ETrue );
+        
+        iLafMgr->GetButtonRect(EPeninupWindowCtrlIdArrowRightBtn,exRect ,inRect);
+        exRect.Move(x, y);
+        inRect.Move(x, y); 
+        iArrowRightButton->SizeChanged( exRect, inRect, ETrue );
+        }
+	else
+		{
+	    iLafMgr->GetButtonRect(EPeninutWindowCtrlIdMoveBtn,exRect ,inRect);
+	    exRect.Move(x, y); 
+	    inRect.Move(x, y);
+	    static_cast<CAknFepCtrlDragButton*>
+	        ( Control( EPeninutWindowCtrlIdMoveBtn ) )->SizeChanged( exRect, inRect, ETrue );
+		}    
+
+    //If backspace size changed when language is RtoL mirror should be used    
+    if( bBKSizeChanged && IsRtoLLanguage( iLanguage ) )
+    	{
+		//Mirror backspace graphic
+		HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
+    	}		
+		    
+	}
+void CPeninputGenericVkbWindow::ShowBubble(TInt aShow)
+    {
+    if (aShow > 0)
+        {
+        iVkbCtrl->ShowBubble(ETrue);    
+        }
+    else
+        {
+        iVkbCtrl->ShowBubble(EFalse);     
+        }
+    }
+	
+void CPeninputGenericVkbWindow::ConstructAccentListL(TInt aLang)
+	{
+	iPopupWnd->ClearItemsL();
+	
+	if (aLang == ELangVietnamese)
+		{
+		_LIT( KVietAccentList1, "\x00E0 - \x013A" );
+		_LIT( KVietAccentList2, "\x013C - \x017E" );
+		
+	    CFepLayoutChoiceList::SItem item;
+
+	    item.iCommand = EPeninputVkbLayoutAccented1;
+	    item.iText.Copy( KVietAccentList1 );
+	    iPopupWnd->AddItemL( item );
+	    
+	    item.iCommand = EPeninputVkbLayoutAccented2;
+	    item.iText.Copy( KVietAccentList2 );
+	    iPopupWnd->AddItemL( item );
+		}
+	// 10X3
+	else if (aLang == ELangEnglish
+	        || aLang == ELangAmerican
+	        || aLang == ELangDutch
+	        || aLang == ELangTagalog
+	        || aLang == ELangIndonesian
+	        || aLang == ELangMalay)
+		    {
+	        _LIT( KVietAccentList1, "\x00E0 - \x0121" );
+	        _LIT( KVietAccentList2, "\x0123 - \x014F" );
+	        _LIT( KVietAccentList3, "\x0151 - \x017E" );
+	        
+	        CFepLayoutChoiceList::SItem item;
+
+	        item.iCommand = EPeninputVkbLayoutAccented1;
+	        item.iText.Copy( KVietAccentList1 );
+	        iPopupWnd->AddItemL( item );
+	        
+	        item.iCommand = EPeninputVkbLayoutAccented2;
+	        item.iText.Copy( KVietAccentList2 );
+	        iPopupWnd->AddItemL( item );
+	        
+            item.iCommand = EPeninputVkbLayoutAccented3;
+            item.iText.Copy( KVietAccentList3 );
+            iPopupWnd->AddItemL( item );
+		    }
+	//10X4
+	else
+		{
+	    // Add item
+	    TResourceReader reader;
+	    CFepLayoutChoiceList::SItem item;
+
+	    item.iCommand = EPeninputVkbLayoutAccented1;
+	    CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT1 );
+	    TPtrC p1 = reader.ReadTPtrC();
+	    item.iText.Copy( p1 );
+	    iPopupWnd->AddItemL( item );
+	    CleanupStack::PopAndDestroy( 1 );
+	    item.iCommand = EPeninputVkbLayoutAccented2;
+	    CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT2 );
+	    TPtrC p2 = reader.ReadTPtrC();
+	    item.iText.Copy( p2 );
+	    iPopupWnd->AddItemL( item );
+	    CleanupStack::PopAndDestroy( 1 );
+	    
+		item.iCommand = EPeninputVkbLayoutAccented3;
+		CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT3 );
+		TPtrC p3 = reader.ReadTPtrC();
+		item.iText.Copy( p3 );
+		iPopupWnd->AddItemL( item );
+		CleanupStack::PopAndDestroy( 1 );      	
+		}
+	iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() );
+    iPopupInited = ETrue;
+    iPopupSet = ETrue;
+	}
+// ---------------------------------------------------------------------------
+// Load accent labels for range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ConstructFSQAccentListL( TInt aLangId )
+    {  
+    iAccentCmdList.Reset();
+    
+    TBool is10x3 = ( aLangId == ELangEnglish ) || ( aLangId == ELangAmerican )
+                   || ( aLangId == ELangDutch)  || (aLangId == ELangTagalog ) 
+                   || ( aLangId == ELangIndonesian) || (aLangId == ELangMalay );
+    
+    if ( aLangId == ELangVietnamese )
+        {
+        _LIT( KVietAccentList1, "\x00E0 - \x013A" );
+        _LIT( KVietAccentList2, "\x013C - \x017E" );
+        
+        CFepLayoutChoiceList::SItem item;
+
+        item.iCommand = EPeninputVkbLayoutAccented1;
+        item.iText.Copy( KVietAccentList1 );      
+        iAccentCmdList.Append( item );
+        
+        item.iCommand = EPeninputVkbLayoutAccented2;
+        item.iText.Copy( KVietAccentList2 );
+        iAccentCmdList.Append( item );
+        }
+    else if( aLangId == ELangRussian || aLangId == ELangUkrainian || aLangId == ELangBulgarian )
+    	{
+        _LIT( KCyrillicAccent, "\x00E0 - \x017E" );
+        CFepLayoutChoiceList::SItem item;
+
+        item.iCommand = EPeninputVkbLayoutAccented1;
+        item.iText.Copy( KCyrillicAccent );      
+        iAccentCmdList.Append( item );        
+    	}
+    // 10X3
+    else if ( is10x3 )
+        {
+        _LIT( KVietAccentList1, "\x00E0 - \x0121" );
+        _LIT( KVietAccentList2, "\x0123 - \x014F" );
+        _LIT( KVietAccentList3, "\x0151 - \x017E" );
+        
+        CFepLayoutChoiceList::SItem item;
+
+        item.iCommand = EPeninputVkbLayoutAccented1;
+        item.iText.Copy( KVietAccentList1 );
+        iAccentCmdList.Append( item );
+        
+        item.iCommand = EPeninputVkbLayoutAccented2;
+        item.iText.Copy( KVietAccentList2 );
+        iAccentCmdList.Append( item );
+
+        
+        item.iCommand = EPeninputVkbLayoutAccented3;
+        item.iText.Copy( KVietAccentList3 );
+        iAccentCmdList.Append( item );
+        }
+    //10X4
+    else
+        {
+        // Add item
+        TResourceReader reader;
+        CFepLayoutChoiceList::SItem item;
+
+        item.iCommand = EPeninputVkbLayoutAccented1;
+        CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT1 );
+        TPtrC p1 = reader.ReadTPtrC();
+        item.iText.Copy( p1 );
+        iAccentCmdList.Append( item );
+        CleanupStack::PopAndDestroy( 1 ); //reader
+        
+        item.iCommand = EPeninputVkbLayoutAccented2;
+        CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT2 );
+        TPtrC p2 = reader.ReadTPtrC();
+        item.iText.Copy( p2 );
+        iAccentCmdList.Append( item );
+        CleanupStack::PopAndDestroy( 1 ); //reader
+        
+        item.iCommand = EPeninputVkbLayoutAccented3;
+        CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT3 );
+        TPtrC p3 = reader.ReadTPtrC();
+        item.iText.Copy( p3 );
+        iAccentCmdList.Append( item );
+        CleanupStack::PopAndDestroy( 1 );//reader          
+        }
+
+    iPopupInited = ETrue;
+    iPopupSet = ETrue;
+    }
+void CPeninputGenericVkbWindow::UpdateICFTextL()
+    {
+    CFepLayoutMultiLineIcf* icf = 
+        static_cast<CFepLayoutMultiLineIcf*>(Control(EPeninputWindowCtrlIdMultiLineICF));
+    if( icf )
+        {
+        icf->UpdateSecretTextL();    
+        }
+    }
+    
+void CPeninputGenericVkbWindow::HandleButtonResOnLangDirChange( TInt aControlId )
+	{
+    TRAP_IGNORE(HandleButtonResOnLangDirChangeL(aControlId));
+    }
+void CPeninputGenericVkbWindow::HandleButtonResOnLangDirChangeL( TInt aControlId )
+	{
+	CAknFepCtrlCommonButton* ctrl = static_cast<CAknFepCtrlCommonButton*>(
+										Control(aControlId) );
+	if( ctrl && iBmpRotator)
+		{
+		TSyncRotationAngle rotChoice = CBitmapRotator::EMirrorVerticalAxis; 
+		User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmp() ,
+								  				 rotChoice ) );
+		User::LeaveIfError( iBmpRotator->Rotate( *ctrl->ForgroundBmpMask() ,
+								  				 rotChoice ) );   								  
+		}		
+	}    
+		
+// --------------------------------------------------------------------------
+// Show tooltip of ICF
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ShowTooltipL( const TDesC& aText, TInt aLangCode )
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                (Control(EPeninputWindowCtrlIdMultiLineICF));    
+    CPeninputGenericVkbLayout* layout 
+                      = static_cast<CPeninputGenericVkbLayout*>( UiLayout() );    
+    if ( !icf || !( layout->IsEnableITIOnFSQ() ) )
+        {
+        return;
+        }    
+    
+    // Calculate tooltip width
+    const TPeninputTooltipBoxLayoutData& tooltipBoxLAF 
+                                      = iLafMgr->TooltipBoxLayoutData();
+    TRect tooltipRect = tooltipBoxLAF.iRect;
+    // Calculate inner rect
+    TRect innerRect = tooltipRect;
+    innerRect.iTl += TPoint( KTooltipLeftMargin, KTooltipTopMargin );
+    innerRect.iBr -= TPoint( KTooltipRightMargin, KTooltipBottomMargin );          
+    const CFont* font = tooltipBoxLAF.iFont;
+    // Set inner width in terms of text width
+    innerRect.SetWidth( font->TextWidthInPixels( aText ) );    
+    tooltipRect.iTl 
+           = innerRect.iTl - TPoint( KTooltipLeftMargin, KTooltipTopMargin );
+    tooltipRect.iBr 
+           = innerRect.iBr + TPoint( KTooltipRightMargin, KTooltipBottomMargin );
+    // Set tooltip rect in terms of inner rect
+    icf->ShowTooltipL( aText, tooltipRect, aLangCode );
+    }
+	
+// --------------------------------------------------------------------------
+// Hide tooltip of ICF
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HideTooltip()
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                (Control(EPeninputWindowCtrlIdMultiLineICF));
+    if ( !icf  )
+        {
+        return;
+        }
+    icf->HideTooltip();
+    }
+
+// --------------------------------------------------------------------------
+// Hide candidate list
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HideCandidateList()
+    {
+    if ( !iCandidateList )
+        {
+        return;
+        }
+    iCandidateList->Hide( ETrue );
+    }
+	
+// --------------------------------------------------------------------------
+// Show candidate list
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::ShowCandidateListL( TInt aAlign, const CDesCArray* aItemArray,
+                                                   TInt aActiveIndex )
+    {
+    if ( !iCandidateList )
+        {
+        return;
+        }                
+    iCandidateList->ClearItemsL();
+	iCandidateList->SetTextAlignment((CGraphicsContext::TTextAlign) aAlign);
+
+    if ( aItemArray )
+        {
+		CFepLayoutChoiceList::SItem item;
+		item.iCommand = 0;
+		
+        for (TInt i = 0; i < aItemArray->Count(); ++i)
+            {
+            if ((*aItemArray)[i].Length() <= item.iText.MaxLength())
+                {
+                item.iText.Copy((*aItemArray)[i]);
+                }
+            else
+                {
+                // Given longer than maxlength, display the part of less than max
+                item.iText.Copy((*aItemArray)[i].Left(item.iText.MaxLength()));
+                }
+			
+            iCandidateList->AddItemL( item );
+            }
+        }
+    iCandidateList->SetCurrentFocusedIndex( aActiveIndex );
+    
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+         (Control(EPeninputWindowCtrlIdMultiLineICF)); 
+
+    TPoint posBelow( 0, 0 );
+    TPoint posRight( 0, 0 );
+    posBelow = posRight = icf->Rect().iTl;
+    icf->InlineTextPos( posBelow, posRight );
+    TPoint tlPos = posRight;
+    iCandidateList->Display( TRect( tlPos, tlPos ), 
+                             CFepLayoutPopupWnd::EDispBottomRight );
+    }
+
+// --------------------------------------------------------------------------
+// Handle candidate list selected events.
+// --------------------------------------------------------------------------
+//
+void CPeninputGenericVkbWindow::HandleCandidateListSelectedL
+                         ( CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+    {
+    if ( aCtrl != iCandidateList )
+        {
+        return;
+        }
+
+    CFepLayoutChoiceList::SEvent* event = 
+            (CFepLayoutChoiceList::SEvent*)aEventData.Ptr();
+    if ( event->iIndex != KErrNotFound )
+        {
+        TPtrC ptr;
+        ptr.Set( reinterpret_cast<TUint16*>(&( event->iIndex ) ), 
+                 sizeof( TInt ) );            
+        UiLayout()->SignalOwner( ESignalSelectCandidate, ptr );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// Create a candidate list control.
+// --------------------------------------------------------------------------
+//    
+void CPeninputGenericVkbWindow::CreateCandidateListL()
+    {
+    iCandidateList = CFepLayoutScrollableList::NewL( 
+                            UiLayout(), 
+                            EPentinputHwrCandidateList,
+                            TSize( 0, 0 ),
+                            0,
+                            0,
+                            TSize( 0, 0 ),
+                            TSize( 0, 0 ) );
+         
+    iCandidateList->SetImgFrId(KAknsIIDQsnFrPopupSub, 
+                                KAknsIIDQsnFrFunctionButtonNormal,
+								KAknsIIDQsnFrFunctionButtonPressed,
+								KAknsIIDQsnFrFunctionButtonInactive,
+                                KAknsIIDQsnFrList,
+                                KAknsIIDQsnFrPopupSub);
+                                
+    iCandidateList->SetResourceId(R_PENINPUT_FSQ_CANDIDATE_LIST);
+    iCandidateList->ConstructFromResourceL();
+    iCandidateList->SetPageInfoResID( R_PENINPUT_FSQ_CANDIDATE_LIST_PAGE_NUM );
+    iCandidateList->AddEventObserver( UiLayout() );
+    AddControlL(iCandidateList);    
+    }
+
+// --------------------------------------------------------------------------
+// Retrieve text color from skin for candidiate list.
+// --------------------------------------------------------------------------
+//
+TRgb CPeninputGenericVkbWindow::CandidateListTextColor()
+    {
+    MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
+    TRgb matchlistcolor = KRgbBlack;
+    AknsUtils::GetCachedColor( skininstance, 
+                                matchlistcolor, 
+                                KAknsIIDQsnTextColors,
+                                EAknsCIQsnTextColorsCG43 );
+    return matchlistcolor;
+    }
+
+// --------------------------------------------------------------------------
+// Retrieve text color from skin for autocompletion part.
+// --------------------------------------------------------------------------
+//
+TRgb CPeninputGenericVkbWindow::AutoCompletionPartColor()
+    {
+    MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
+    TRgb matchlistcolor = KRgbBlack;
+    AknsUtils::GetCachedColor( skininstance, 
+                                matchlistcolor, 
+                                KAknsIIDQsnTextColors,
+                                EAknsCIQsnTextColorsCG64 );
+    return matchlistcolor;
+    }
+
+void CPeninputGenericVkbWindow::SetIndiBubbleImageL( const TInt aImgID1,
+                                              const TInt aMaskID1,
+                                              const TInt aImgID2,
+                                              const TInt aMaskID2 )
+    {
+    MAknsSkinInstance* skininstance = UiLayout()->SkinInstance();
+
+    CFbsBitmap* bmp1 = NULL;
+    CFbsBitmap* mask1 = NULL;
+    
+    TInt colorIndex = EAknsCIQsnIconColorsCG30;
+
+    AknsUtils::CreateColorIconL(skininstance,
+                                KAknsIIDQsnIconColors,
+                                KAknsIIDQsnIconColors,
+                                colorIndex,
+                                bmp1,
+                                mask1,
+                                AknIconUtils::AvkonIconFileName(),
+                                aImgID1,
+                                aMaskID1,
+                                KRgbGray);
+    CleanupStack::PushL( bmp1 );
+    CleanupStack::PushL( mask1 );
+                                
+    AknIconUtils::GetContentDimensions(bmp1, iIndicatorSize);
+
+    CFbsBitmap* bmp2 = NULL;
+    CFbsBitmap* mask2 = NULL;
+    AknsUtils::CreateColorIconL(skininstance,
+                                KAknsIIDQsnIconColors,
+                                KAknsIIDQsnIconColors,
+                                colorIndex,
+                                bmp2,
+                                mask2,
+                                AknIconUtils::AvkonIconFileName(),
+                                aImgID2,
+                                aMaskID2,
+                                KRgbGray);
+ 
+    CleanupStack::PushL( bmp2 );
+    CleanupStack::PushL( mask2 );
+    
+    AknIconUtils::GetContentDimensions(bmp2, iIndicatorTextSize);
+    
+    TRect boundRect;
+    if ( iIndiWithText )
+        {
+        boundRect = iLafMgr->IndiIconRectWithText();
+        }
+    else
+        {
+        boundRect = iLafMgr->IndiIconRectWithoutText();
+        }
+    
+    TRect imgrect, textrect;
+    
+    CalIndicatorRect(boundRect, imgrect, textrect, EIndiAlignCenter);
+    AknIconUtils::SetSize(bmp1, imgrect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(mask1, imgrect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(bmp2, textrect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(mask2, textrect.Size(), EAspectRatioNotPreserved);
+
+    CFbsBitmap* bmp3 = AknPenImageUtils::CombineTwoImagesL(bmp1, bmp2, bmp1->DisplayMode());
+    CFbsBitmap* mask3 = AknPenImageUtils::CombineTwoImagesL(mask1, mask2, EGray256);
+    
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                                   (Control(EPeninputWindowCtrlIdMultiLineICF));
+    icf->MsgBubbleCtrl()->SetBitmapParam( bmp3, mask3, 
+                    KAknsIIDQsnFrInputPreviewSideL,
+                    KAknsIIDQsnFrInputPreviewMiddle,
+                    KAknsIIDQsnFrInputPreviewSideR );
+    
+    CleanupStack::PopAndDestroy( mask2 );
+    CleanupStack::PopAndDestroy( bmp2 );
+    CleanupStack::PopAndDestroy( mask1 );
+    CleanupStack::PopAndDestroy( bmp1 );
+    }
+
+void CPeninputGenericVkbWindow::CalIndicatorRect(const TRect& aBoundRect,
+                                          TRect& aRealRect1,
+                                          TRect& aRealRect2,
+                                          TIndicatorAlign aAlign) 
+    {
+    TInt imgAspectText = iIndicatorTextSize.iWidth / iIndicatorTextSize.iHeight;
+    TInt imgAspectIndi = iIndicatorSize.iWidth / iIndicatorSize.iHeight;
+    TSize imgSizeText( aBoundRect.Size().iHeight * imgAspectText, 
+                       aBoundRect.Size().iHeight );
+    TSize imgSizeIndi( aBoundRect.Size().iHeight * imgAspectIndi, 
+                               aBoundRect.Size().iHeight );
+    // check if the length of img > bound rect width
+    TInt nTotalWidth = imgSizeText.iWidth + imgSizeIndi.iWidth;
+    if( nTotalWidth > aBoundRect.Size().iWidth )
+        {
+        TReal nAspect = (TReal)imgSizeText.iWidth / nTotalWidth;
+        imgSizeText.iWidth = aBoundRect.Size().iWidth * nAspect;
+        imgSizeIndi.iWidth = aBoundRect.Size().iWidth - imgSizeText.iWidth;
+        imgSizeText.iHeight = imgSizeText.iWidth / imgAspectText;
+        // make sure the height of two rect is equal
+        imgSizeIndi.iHeight = imgSizeText.iHeight;
+        }
+    if( aAlign == EIndiAlignRight )
+        {
+        aRealRect2 = TRect(TPoint( aBoundRect.iBr.iX - imgSizeText.iWidth, aBoundRect.iTl.iY),
+                       imgSizeText);
+        aRealRect1 = TRect(TPoint(aRealRect2.iTl.iX - imgSizeIndi.iWidth, aRealRect2.iTl.iY),
+                       imgSizeIndi);
+        }
+    else if( aAlign == EIndiAlignCenter )
+        {
+        TInt offsetX = ( aBoundRect.Size().iWidth - imgSizeText.iWidth - imgSizeIndi.iWidth ) / 2;
+        TInt offsetY = ( aBoundRect.Size().iHeight - imgSizeText.iHeight ) / 2;
+        aRealRect2 = TRect( TPoint( aBoundRect.iBr.iX - imgSizeText.iWidth - offsetX, 
+                                   aBoundRect.iTl.iY + offsetY),
+                            imgSizeText );
+        aRealRect1 = TRect( TPoint(aRealRect2.iTl.iX - imgSizeIndi.iWidth, aRealRect2.iTl.iY),
+                       imgSizeIndi );
+        }
+    else if( aAlign == EIndiAlignLeft )
+        {
+        aRealRect1 = TRect( aBoundRect.iTl, imgSizeIndi );
+        aRealRect2 = TRect( TPoint( aRealRect1.iBr.iX, aRealRect1.iTl.iY ), imgSizeText );
+        }
+    }
+
+void CPeninputGenericVkbWindow::IndiBubbleWithText()
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                           (Control(EPeninputWindowCtrlIdMultiLineICF));
+    if ( icf )
+        {
+        TAknTextLineLayout textLine = iLafMgr->IndiText();
+        TRect bubbleRect = iLafMgr->IndiPaneRectWithText();
+        TRect iconRect = iLafMgr->IndiIconRectWithText();
+        TSize offset;
+        offset.iHeight = iconRect.iTl.iY - bubbleRect.iTl.iY;
+        offset.iWidth = iconRect.iTl.iX - bubbleRect.iTl.iX;
+        TSize size( iconRect.Width(), iconRect.Height());
+        
+        icf->MsgBubbleCtrl()->SetRect( bubbleRect );
+        icf->MsgBubbleCtrl()->SetIconOffsetAndSize( offset, size );
+        icf->MsgBubbleCtrl()->SetTextFormat( textLine );
+        icf->MsgBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
+        }
+    }
+
+void CPeninputGenericVkbWindow::IndiBubbleWithoutText()
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                               (Control(EPeninputWindowCtrlIdMultiLineICF));
+    if ( icf )
+        {
+        TRect bubbleRect = iLafMgr->IndiPaneRectWithoutText();
+        TRect iconRect = iLafMgr->IndiIconRectWithoutText();
+        TSize offset;
+        offset.iHeight = iconRect.iTl.iY - bubbleRect.iTl.iY;
+        offset.iWidth = iconRect.iTl.iX - bubbleRect.iTl.iX;
+        TSize size( iconRect.Width(), iconRect.Height());
+        
+        icf->MsgBubbleCtrl()->SetRect( bubbleRect );
+        icf->MsgBubbleCtrl()->SetIconOffsetAndSize( offset, size );
+        }
+    }
+
+void CPeninputGenericVkbWindow::SetIndiWithTextFlag( TBool aFlag )
+    {
+    iIndiWithText = aFlag;
+    }
+
+void CPeninputGenericVkbWindow::UpdateIndiBubbleL( TUint8* aData )
+    {
+    CFepLayoutMultiLineIcf* icf = static_cast<CFepLayoutMultiLineIcf*>
+                               (Control(EPeninputWindowCtrlIdMultiLineICF));
+    
+    RDesReadStream readStream;
+    TFepIndicatorInfo indicatorData;
+
+    TPtr8 countPtr( aData, 4*sizeof(TInt), 4*sizeof(TInt) );            
+    readStream.Open(countPtr);
+    CleanupClosePushL(readStream);
+
+    indicatorData.iIndicatorImgID = readStream.ReadInt32L();
+    indicatorData.iIndicatorMaskID = readStream.ReadInt32L();
+    indicatorData.iIndicatorTextImgID = readStream.ReadInt32L();
+    indicatorData.iIndicatorTextMaskID = readStream.ReadInt32L();
+
+    CleanupStack::PopAndDestroy(&readStream);
+    
+    if ( indicatorData.iIndicatorImgID != 0 && 
+        indicatorData.iIndicatorMaskID != 0 && 
+        indicatorData.iIndicatorTextImgID != 0 &&
+        indicatorData.iIndicatorTextMaskID != 0 )
+        { 
+        SetIndicatorData( indicatorData );
+        
+        if ( icf )
+            {
+            SetIndiBubbleImageL( indicatorData.iIndicatorImgID,
+                    indicatorData.iIndicatorMaskID,
+                    indicatorData.iIndicatorTextImgID,
+                    indicatorData.iIndicatorTextMaskID );
+                 
+            TBuf<100> text;
+            icf->MsgBubbleCtrl()->GetText( text );
+            icf->ShowBubble( text, icf->MsgBubbleCtrl()->Rect());
+            }
+        }
+    }
+
+void CPeninputGenericVkbWindow::HandleRangeButtonShortPress()
+    {
+    const TInt range = CPeninputDataConverter::AnyToInt(
+        iLayoutContext->RequestData(EPeninputDataTypeCurrentRange));
+    
+    const TInt langId = IntContext( EPeninputDataTypeInputLanguage );
+
+    switch ( langId )
+        {
+        case ELangRussian:
+        case ELangBulgarian:
+        case ELangUkrainian:
+            {
+            range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative );
+            }
+            break;
+
+        case ELangArabic:
+        case ELangFarsi:
+        case ELangUrdu:
+            {
+            range == ERangeNative ? ChangeRange( ERangeNativeNumber ) : ChangeRange( ERangeNative );
+            }
+            break;
+            
+        case ELangThai:
+            {
+            range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative ); 
+            }
+            break;
+
+        case ELangGreek:
+        case ELangHebrew:
+            {
+            range == ERangeNative ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeNative ); 
+            }
+            break;
+        default: // Latin, vietnamese, and other possible languages
+            {
+            if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNative ) )
+                {
+                if ( range == ERangeNative )
+                    {
+                    if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNativeNumber ) )
+                        {
+                        ChangeRange( ERangeNativeNumber );
+                        }
+                    else if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeNumber ) )
+                        {
+                        ChangeRange( ERangeNumber );
+                        }
+                    }
+                else
+                    {
+                    ChangeRange( ERangeNative );
+                    }
+                }
+            else if ( ConfigInfo()->RangeBarInfo()->FindRange( ERangeEnglish ) )
+                {
+                range == ERangeEnglish ? ChangeRange( ERangeNumber ) : ChangeRange( ERangeEnglish );
+                }
+            }
+            break;
+        }
+    
+    TRAP_IGNORE( UpdateRangeCtrlsL() );
+    }
+// End Of File