textinput/peninputsplitqwerty/src/peninputsplitqwertywindow.cpp
changeset 0 eb1f2e154e89
child 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputsplitqwerty/src/peninputsplitqwertywindow.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1916 @@
+/*
+* 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 <peninputssqwin.rsg>
+#include <peninputssqwinconfiginfo_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 <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 "peninputsplitqwerty.hrh"
+#include "peninputsplitqwertywindow.h"
+#include "peninputsplitqwertyenum.h"
+#include "peninputrangebarinfo.h"
+#include "peninputsplitqwertylafdatamgr.h"
+#include "peninputsplitqwertylangmeritpair.h"
+#include "peninputsplitqwertylayout.h"
+
+// Constants
+const TInt KPeninputVkbWndInvalidIndex = -1;
+const TInt KInvalidImg = -1 ;
+
+_LIT( KVkbWindowResourceFile, "z:\\resource\\plugins\\peninputssqwin.rsc" );
+_LIT( KConfigurationResourceFile, "z:\\resource\\plugins\\peninputssqwinconfiginfo_" );
+_LIT( KResourceFileExtName, ".rsc" );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Symbian constructor
+// ---------------------------------------------------------------------------
+// 
+CPeninputSplitQwertyWindow* CPeninputSplitQwertyWindow::NewL(
+                                        CFepUiLayout* aUiLayout, 
+                                        MPeninputLayoutContext* aLayoutContext, 
+                                        MPeninputUiStateMgr* aUiStateMgr )
+    {
+    CPeninputSplitQwertyWindow* 
+        self = new ( ELeave ) CPeninputSplitQwertyWindow( aUiLayout,
+                                                          aLayoutContext, 
+                                                          aUiStateMgr );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ destructor
+// ---------------------------------------------------------------------------
+//
+CPeninputSplitQwertyWindow::~CPeninputSplitQwertyWindow()
+    {
+    delete iIdle;
+    iUnits.Close();
+    
+    delete iLafMgr;
+    iLafMgr = NULL;
+    delete iBmpRotator;
+    
+    iAccentCmdList.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Get id of window config resource
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputSplitQwertyWindow::GetWindowConfigResId()
+    {
+    return R_PENINPUT_LAYOUT_CONFIG_INFO;
+    }
+
+// ---------------------------------------------------------------------------
+// Get id of window resource
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputSplitQwertyWindow::GetWindowResId()
+    {
+    return R_PENINPUT_LAYOUT_FSQ_WINDOW_INFO;
+    }
+
+// ---------------------------------------------------------------------------
+// Get resource id of numeric keymapping
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputSplitQwertyWindow::GetNumKeymappingResId()
+    {
+    return R_PENINPUT_LAYOUT_KEY_MAPPING_STRING_LIST;
+    }
+
+// ---------------------------------------------------------------------------
+// Get file name of window config resource
+// ---------------------------------------------------------------------------
+//
+const TDesC& CPeninputSplitQwertyWindow::GetWindowConfigResFileName( TInt aLangID )
+    {
+    if ( aLangID <= 0 ) 
+        {
+        return KNullDesC;
+        }
+        
+    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;
+    }
+
+// ---------------------------------------------------------------------------
+// Get file name of window resource
+// ---------------------------------------------------------------------------
+//
+const TDesC& CPeninputSplitQwertyWindow::GetWindowResFileName()
+    {
+    return KVkbWindowResourceFile();
+    }
+
+// ---------------------------------------------------------------------------
+// Change unit size
+// ---------------------------------------------------------------------------
+//
+const TRect CPeninputSplitQwertyWindow::ChangeUnitSize()
+    {
+    return TRect();
+    }
+
+// ---------------------------------------------------------------------------
+// Change size of client area
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ChangeClientSize()
+    {
+    if ( !iPopupWnd->Hiden() )
+        {
+        iPopupWnd->CloseWindow();
+        iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+        }
+        
+    HandlePopupSizeChange();
+            
+    TInt clientLayoutId = IntContext( EPeninputDataTypeClientLayout );
+    CPeninputClientLayoutInfo* 
+        clientLayout = ConfigInfo()->FindClientLayoutInfo( clientLayoutId );
+        
+    if ( clientLayout )
+        {
+        ReorganizeControls( clientLayout->LayoutID(), EFalse );
+        } 
+
+    UpdateArea( iVkbCtrl->Rect(), EFalse );
+    }
+
+// ---------------------------------------------------------------------------
+// Construct all controls specified in resource
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::CreateAllControlsL()
+    {
+    // 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 );
+    
+    iVkbCtrl->SetIrregularKeyBoard( EFalse );
+    iVkbLayout->SetNonIrregularResourceId( R_AKN_FEP_VKB_NONIRREGULAR_BITMAP );
+    iVkbLayout->ConstructFromNonIrregularResourceL();        
+
+    //todo split-view FSQ, bubble support
+    /*
+    iVkbCtrl->ShowBubble(ETrue);    
+    iVkbCtrl->SetGowithPointerDown(ETrue);
+    iVkbCtrl->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); 
+    */
+       
+    //set key to be 9 piece graphics
+    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
+        TInt resid = R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK;
+        TResourceReader reader;
+        CCoeEnv::Static()->CreateResourceReaderLC( reader, resid );
+        button->SetResourceId( resid );      
+        button->ConstructFromResourceL();  
+        
+        CleanupStack::PopAndDestroy( 1 ); //reader
+        
+        AddControlL( button );
+        button->AddEventObserver( UiLayout() );
+        }
+    CleanupStack::Pop( button );  
+
+    
+    // Space button          
+    CAknFepCtrlEventButton* spaceButton = EventButtonCtrl( 
+                                                EPeninutWindowCtrlIdSpaceBtn ); 
+
+    // Create 3-pieces color icon for space button
+    CPenInput3PiecesColorIcons* colorIcons = NULL;
+    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
+    spaceButton->SetImageFrameId( KAknsIIDQsnFrKeypadButtonFrNormal, 
+                                  KAknsIIDQsnFrKeypadButtonFrPressed,
+                                  KAknsIIDQsnFrKeypadButtonFrInactive );
+
+    // Add popup window
+    AddPopupWindowL();
+  
+    }
+
+// ---------------------------------------------------------------------------
+// Set control fonts. Fonts info comes from resource
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::SetControlsFont()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Pop up choice list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::PopupChoiceList()
+    {
+    TRAP_IGNORE( PopupRangeListL() );
+    }
+
+// ---------------------------------------------------------------------------
+// Re-organize all controls in the assigned client area layout
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::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();
+    
+    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;
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        controlID = controlList[i]->ControlID();
+        ctrl = Control( controlID );
+
+        if ( !ctrl )
+            {
+            continue;
+            }
+        
+        AddNotOwnedControl( ctrl );
+        
+        if ( ( ctrl->ControlType() | ECtrlButton ) == ECtrlButton )
+            {
+            
+            iLafMgr->GetButtonRect( 
+                            TPeninputCommonCtrlID(ctrl->ControlId() ), 
+                            exRect, inRect );
+            
+            if( controlID ==  EPeninutWindowCtrlIdShiftBtn)
+                {
+                CAknFepCtrlMultiModeButton* btn = NULL;
+                btn = static_cast<CAknFepCtrlMultiModeButton*>(ctrl);
+                btn->SizeChanged( exRect, inRect, ETrue );
+                }
+            else
+                {
+                CAknFepCtrlCommonButton* btn = NULL;
+                btn = static_cast<CAknFepCtrlCommonButton*>(ctrl);
+                
+                if ( ctrl->ControlId() == EPeninutWindowCtrlIdSpaceBtn )
+                    {
+                    // config 3 pieces icon info       
+                    TRect frameRect, middleRect;
+                    iLafMgr->GetSpaceButtonExLayoutInfo( frameRect, middleRect );
+                    inRect = frameRect;
+                    
+                    TDraw3PiecesFrame pic3frame( 
+                            KAknsIIDQgnIndiInputSpaceL,
+                            KAknsIIDQgnIndiInputSpaceMiddle,
+                            KAknsIIDQgnIndiInputSpaceR,
+                            middleRect);
+                    
+                    btn->SetDraw3PieceFrameInfo( pic3frame );
+                    }
+                
+                btn->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();
+            CPeninputVkbCtrlExt* ctrlext = static_cast<CPeninputVkbCtrlExt*>(ctrl);
+            ctrlext->SizeChanged(rect);
+            }  
+        }  
+    }
+
+// ---------------------------------------------------------------------------
+// Do when case changed
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::DoCaseChange( TInt aNewCase )
+    {
+    TInt curCase = IntContext( EPeninputDataTypeCase );
+    
+    if ( aNewCase == curCase )
+        {
+        return;
+        }
+        
+    TInt curRange = IntContext( EPeninputDataTypeCurrentRange ); 
+                               
+    if ( ( curRange == ERangeEnglish ) 
+         || ( curRange == ERangeAccent ) 
+         || ( curRange == ERangeNative && ConfigInfo()->CaseSensitive() ) 
+       )
+        {
+        // Set shift and caplock button
+        TInt shfit;  
+        TInt capslock;  
+        
+        CPeninputDataConverter::ShiftCapslockByCase( aNewCase, shfit, capslock );
+
+        iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shfit ); 
+        iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock );        
+        iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase ); 
+        ChangeMergedButtonStatus( shfit, capslock );
+        
+        TInt vkblayout = ConfigInfo()->ShiftCapsSingleVkbLayoutByCase( curRange, 
+                                                                       aNewCase );
+
+        if ( curRange == ERangeAccent ) 
+           {
+           TInt curAccentIndex = IntContext( EPeninputDataTypeCurrentAccent );
+           vkblayout = vkblayout + curAccentIndex * 2;
+           }
+        
+        ChangeVkbLayout( vkblayout );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handle control event
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::HandleControlEvent( TInt aEventType,
+                                                    CFepUiBaseCtrl* aCtrl, 
+                                                    const TDesC& aEventData )
+    {
+    // Call this function in base class
+    CPeninputLayoutWindowExt::HandleControlEvent( aEventType, aCtrl, 
+                                                  aEventData );
+    
+    TInt* data = (TInt*) aEventData.Ptr(); 
+    TInt ctrlId = aCtrl ? aCtrl->ControlId() : -1;
+    
+    switch ( aEventType )
+        {
+        case EEventButtonUp:
+            {
+            if ( ctrlId == EPeninutWindowCtrlIdRangeBtn )
+                {
+                PopupChoiceList();
+                }
+            }
+            break;
+        case EPeninputLayoutVkbEventResetShift: 
+            {
+            HandleShiftAndCapslockBtnClicked();
+            }
+            break;  
+        case EPenInputLayoutEventClosePopup:
+            {
+            if ( iPopupWnd && !iPopupWnd->Hiden() )
+                {
+                iPopupWnd->CloseWindow();
+                iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+                }
+            }
+            break;
+        case EEventChoiceSelected:
+            {
+            CFepLayoutChoiceList::SEvent* event = NULL;
+            event = (CFepLayoutChoiceList::SEvent*) aEventData.Ptr();
+
+            if ( event->iIndex != KPeninputVkbWndInvalidIndex )
+                {
+                if ( ctrlId == EPeninutWindowCtrlIdAccentPopupWindow )
+                    {
+                    TRAP_IGNORE( HandleRangeListSelectedL( aCtrl, aEventData ) );
+                    }
+                }
+            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+            }
+            break;
+        case EEventVirtualKeyLatched:
+            {
+            HandleVirtualKeyLatchedEvent( aEventType, aCtrl, aEventData );
+            }
+            break;
+        case EEventVirtualKeyUnLatched:
+            {
+            UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf );
+            TBool deadKeyChange = EFalse;
+            iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange );
+            iNewDeadKeyBuf = KNullDesC;
+            }
+            break;
+        case EPeninputLayoutEventBack:
+            {
+            TInt latchedFlag = IntContext( 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 = IntContext( EAkninputDataTypeLatchedSet );
+            if ( latchedFlag )
+                {
+                TInt length = aEventData.Length() + iNewDeadKeyBuf.Length();
+                HBufC* newCharBuf = HBufC::New( length );
+                if ( newCharBuf )
+                    {
+                    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
+                UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf );
+                iNewDeadKeyBuf = KNullDesC;
+                delete newCharBuf;
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// load settings from resource
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::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;
+    }
+
+// ---------------------------------------------------------------------------
+// Callback function to do background construction
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputSplitQwertyWindow::BackgroundTaskL( TAny* aPtr )
+    {
+    CPeninputSplitQwertyWindow* self = static_cast<CPeninputSplitQwertyWindow*>(aPtr);
+    self->DoIdleConstructL();
+    return EFalse; // only run once
+    }
+
+// ---------------------------------------------------------------------------
+// Set current language
+// ---------------------------------------------------------------------------
+//
+void  CPeninputSplitQwertyWindow::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 );
+        }
+    
+    TPeninputVkbLafOption option = iLafMgr->OptionType();
+    if ( aLang ==ELangHebrew || aLang == ELangGreek || aLang == ELangHindi 
+                                                    || aLang == ELangMarathi ) 
+        {
+        option = (TPeninputVkbLafOption)( option & ( ~EOption3CellRange ) );
+        iLafMgr->SetLafOption( option );    
+        }
+    else
+        {
+        option = (TPeninputVkbLafOption)( option | EOption3CellRange );
+        iLafMgr->SetLafOption( option );    
+        }
+            
+    if( isLangDirectionChange )
+        {
+        //Mirror backspace graphic
+        HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
+        }
+            
+    iLanguage = aLang;    
+    }
+
+// ---------------------------------------------------------------------------
+// Set current editor is secret
+// ---------------------------------------------------------------------------
+//    
+void  CPeninputSplitQwertyWindow::SetSwitchlistSecretFlag( TBool aSecret )
+    {
+    CFepUiBaseCtrl* ctrl = Control( EPeninutWindowCtrlIdSwitcherPopupWindow );
+    CPeninputLayoutInputmodelChoice* choice =
+                        static_cast<CPeninputLayoutInputmodelChoice*>( ctrl );
+    if ( choice )
+        {
+        choice->SetSecretEditor( aSecret );    
+        }
+    //disable or enable arrow keys of FSQ in secret editor.
+    }
+
+// ---------------------------------------------------------------------------
+// Dim the arrow keys on qwerty when the editor is findpane or secret editor
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::DimArrowKeys( TBool aDimArrow )
+    {
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ 
+         && iArrowLeftButton && iArrowRightButton )
+        {
+        iArrowLeftButton->SetDimmed( aDimArrow );
+        iArrowRightButton->SetDimmed( aDimArrow );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handle accented char event
+// ---------------------------------------------------------------------------
+//     
+TBool CPeninputSplitQwertyWindow::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);
+
+    if ( aDeadKey.Compare( KNullDesC ) != 0 ) // One DeadKey is latched
+        {
+        for ( TInt 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;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle virtual key latched event
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::HandleVirtualKeyLatchedEvent(TInt /*aEventType*/, 
+                                                         CFepUiBaseCtrl* /*aCtrl*/, 
+                                                         const TDesC& aEventData )
+    {
+    TBuf<16> deadKey(KNullDesC);
+    TKeyEvent* event = (TKeyEvent*) aEventData.Ptr();
+    deadKey.Append(event->iCode);
+        
+    TInt latchedFlag = IntContext( EAkninputDataTypeLatchedSet );
+    if ( latchedFlag )
+        {
+        // Update the new and old DeadKey buffer
+        iOldDeadKeyBuf = iNewDeadKeyBuf;
+        iNewDeadKeyBuf = deadKey;
+
+        // When type another DeadKey, submit the previous one.
+        UiLayout()->SignalOwner( ESignalKeyEvent, iOldDeadKeyBuf );
+        // Unlatch the previous DeadKey
+        UnLatchDeadKey(iOldDeadKeyBuf);
+        }
+    else
+        {
+        iNewDeadKeyBuf = deadKey;
+        
+        // Set DeadKey state to latched
+        TBool deadKeyChange = ETrue;
+        iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange );
+        }
+   
+    // Send the char to FEP
+    // Not submit the DeadKey when latch it.
+//    UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf );
+    }
+
+// ---------------------------------------------------------------------------
+// Handle virtual key up event
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputSplitQwertyWindow::HandleVirtualKeyUpEvent(TInt aEventType, 
+                                                    CFepUiBaseCtrl* /*aCtrl*/, 
+                                                    const TDesC& aEventData )
+    {
+    // Get DeadKey state
+    TInt latchedFlag = IntContext( 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;
+    } 
+
+// ---------------------------------------------------------------------------
+// Set dead key
+// ---------------------------------------------------------------------------
+//     
+void CPeninputSplitQwertyWindow::SetDeadKey()
+    {
+    // Get VKB list
+    RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
+    vkbListInfo = iVkbLayout->VkbLayoutInfoList();
+    TInt vkbListNum = vkbListInfo.Count();
+    
+    CPeninputVkbKeyInfo* keyinfo;
+    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 )
+                {
+                keyinfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
+                if ( keyinfo )
+                    {
+                    // Set the DeadKey as a latch button
+                    CVirtualKey* key = keyinfo->Key();
+                    key->SetLatchKey( ETrue );
+                    }
+                }
+            }
+        }
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Unlatch a DeadKey by the key buffer
+// ---------------------------------------------------------------------------
+//     
+void CPeninputSplitQwertyWindow::UnLatchDeadKey( const TDesC& abuf )
+    {
+    RPointerArray<CPeninputVkbLayoutInfo> vkbListInfo;
+    vkbListInfo = iVkbLayout->VkbLayoutInfoList();
+    TInt vkbListNum = vkbListInfo.Count();
+    
+    CPeninputVkbKeyInfo* keyinfo;
+    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
+                keyinfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey );
+                if ( keyinfo )
+                    {
+                    CVirtualKey* key = keyinfo->Key();
+                    if ( key->Latched() )
+                        {
+                        if ( abuf == KNullDesC )
+                            {
+                            // When focus change, the latched key will be released
+                            TBool deadKeyChange = EFalse;
+                            iLayoutContext->SetData( EAkninputDataTypeLatchedSet, 
+                                                     &deadKeyChange );
+                            key->SetLatched( EFalse );
+                            TRect rect = key->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
+                            key->SetLatched( EFalse );
+                            TRect rect = key->Rect();
+                            rect.Move( iVkbCtrl->Rect().iTl );
+                            UpdateArea( rect, EFalse ); 
+                            return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Update laf data
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::UpdateLafData()
+    {
+    TRAP_IGNORE( iLafMgr->UpdateLafDataL() );
+    }
+
+// ---------------------------------------------------------------------------
+// Load accent labels for range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ConstructAccentListL( 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 );
+        }
+    
+    // 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;
+    }
+
+// ---------------------------------------------------------------------------
+// Load range labels for range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ConstructRangeLabelListL( TInt aLangId )
+    {
+    iRangeLabels.iLabelNativeChar.Zero();
+    iRangeLabels.iLabelNativeNumber.Zero();
+    iRangeLabels.iLabelLatinChar.Zero();
+    iRangeLabels.iLabelLatinNumber.Zero();
+    iRangeLabels.iLabelSymbol.Zero();
+    iRangeLabels.iLabelAccent.Zero();
+    
+    TInt resid = -1;
+    switch ( aLangId )
+        {
+        case 16: //Cyrillic
+        case 42:
+        case 93:
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_CYRILLIC;
+            }
+            break;
+        
+        case 54: //Greek
+        case 55:
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_GREEK;
+            }
+            break;        
+        case 57: //Hebrew
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_HEBREW;
+            }
+            break;  
+        case 37: //Arabic
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_ARABIC;
+            }
+            break;
+        case 50://Farsi
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_FARSI;
+            }
+            break;
+        case 94: //Urdu
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_URDU;
+            }
+            break;
+        case 33: //Thai
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_THAI;
+            }
+            break;
+        case 29: //chinese
+        case 30:
+        case 31:
+            break;
+        case 58: //Devanagiri
+        case 72:
+            {
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_DEVANAGIRI;
+            }
+            break;
+        default: //Latin        
+            {
+            //1,   2,   3,   4,   5,   6,   7,   8,   9,   10, 
+            //11,  12,  13,  14,  15,  17,  18,  20,  21,  22,  
+            //23,  24,  25,  26,  27,  28,  39,  44,  45,  46,  
+            //47,  48,  49,  51,  59,  67,  68,  70,  76,  78,  
+            //79,  82,  83,  85,  91,  96,  102, 103, 401, 402
+            resid = R_PENINPUT_LAYOUT_VKB_RANGES_LATIN;
+            }
+        }
+    
+    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        
+    }
+
+// ---------------------------------------------------------------------------
+// Show or hide preview bubble
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ShowBubble( TInt aShow )
+    {
+    iVkbCtrl->ShowBubble( EFalse ); 
+    }
+
+// ---------------------------------------------------------------------------
+// Update state of range button
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::UpdateRangeCtrlsL()
+    {
+    TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
+    
+    TInt resid = ConfigInfo()->RangebarResId();
+    
+    TResourceReader reader;
+    
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); 
+    
+    TInt count = reader.ReadInt16();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        const TInt16 rangeId = reader.ReadInt16();
+        const TInt16 rangeType = reader.ReadInt16();
+        const TInt16 ctrlId = reader.ReadInt16();
+        const TInt16 ctrlType = reader.ReadInt16(); 
+        const TInt32 ctrlResId = reader.ReadInt32();
+        const TInt actionStyle = reader.ReadInt16();
+        TBool hide = reader.ReadInt16();
+        TInt posidx = reader.ReadInt16();        
+        
+        if ( currentRange == rangeId )
+            {
+            iRangeButton->SetResourceId( ctrlResId );
+            iRangeButton->ConstructFromResourceL();
+            break;
+            }
+        }
+    
+    // Pop and destroy reader
+    CleanupStack::PopAndDestroy( 1 );
+    
+    }
+
+// ---------------------------------------------------------------------------
+// Update layout position and size
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::UpdateLayoutPosAndSize()
+    {
+    if ( iLafMgr )
+        {
+        TRect rect = iLafMgr->ClientRect();
+        TPoint pos = iLafMgr->EntirePaneRect().iTl;
+        
+        UiLayout()->SetRect( rect );
+        UiLayout()->LayoutOwner()->SetPosition( pos );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Set laf layout type
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::SetLafLayOut( TInt aRows, TInt aColumns )
+    {
+    iLafMgr->SetLayoutType( 
+                iLafMgr->LayoutTypeFromRowsColumns( aRows, aColumns )
+                );
+    }
+
+// ---------------------------------------------------------------------------
+// Create custom control
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputSplitQwertyWindow::CreateCustomControlL( TInt16 aControlId, 
+                                                        TInt32 aImageId )
+    {
+    TBool create = ETrue;
+    switch ( aControlId )
+        {
+        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;
+    }
+
+// ---------------------------------------------------------------------------
+// Add custom control to this group
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::AddCustomControlGroupL( CFepUiBaseCtrl* aCtrl )
+    {
+    AddControlL( aCtrl );
+    }    
+
+// ---------------------------------------------------------------------------
+// Set layout size
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::SetVkbLayoutSize()
+    {
+    TRect outrect,innerrect;   
+    iLafMgr->GetPreviewWndRect( outrect, innerrect );
+    
+    iVkbCtrl->SetTextFormat( iLafMgr->PreviewWndText() );  //Read laf 
+    
+    TSize bubbleSize( outrect.Width(), outrect.Height() );
+    iVkbCtrl->SetBubbleSize( bubbleSize );  // 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 = IntContext( 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() )
+            {
+            CFbsBitmap* bitmap = iVkbCtrl->IrregularKeyBitmap( EKeyLeftDown,
+                                                              EKeyStateNormal );
+            
+            TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
+            TSize size = bitmap->SizeInPixels();
+            if ( curSize != size )
+                {
+                for ( TInt i = 0; i <= EKeyRightUp; i++ )
+                    {
+                    for ( TInt j = 0; j <= EKeyStateDimmedMask; j++ )
+                        {
+                        bitmap = iVkbCtrl->IrregularKeyBitmap(
+                                              (TVirtualKeyIrregularKeyType)i,
+                                              (TVirtualKeyIrregularKeyState)j );
+                        
+                        AknIconUtils::SetSize( bitmap, curSize, 
+                                               EAspectRatioNotPreserved ); 
+
+                        }
+                    }
+                }
+            }
+        else
+            {
+            CFbsBitmap* bitmap = iVkbCtrl->NonIrregularKeyBitmap( EKeyBmpNormal );
+            TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size();
+            TSize size = bitmap->SizeInPixels();
+            if( curSize != size )    
+                {
+                for ( TInt i = 0; i <= EKeyBmpLastType; i++ )
+                    {
+                    bitmap = iVkbCtrl->NonIrregularKeyBitmap( (TVirtualKeyBmpType)i );
+                    if( bitmap )
+                        {
+                        AknIconUtils::SetSize( bitmap, curSize, 
+                                               EAspectRatioNotPreserved );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CPeninputSplitQwertyWindow::CPeninputSplitQwertyWindow( 
+                                        CFepUiLayout* aUiLayout, 
+                                        MPeninputLayoutContext* aLayoutContext, 
+                                        MPeninputUiStateMgr* aUiStateMgr )
+    : CPeninputLayoutWindowExt( aUiLayout, aLayoutContext )
+    , iUiStateMgr( aUiStateMgr )
+    , iPopupInited( EFalse )
+    , iPopupSet( EFalse )
+    , iFirstConstruct( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian constructor
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ConstructL()
+    {
+    iBmpRotator = CPeninputSyncBitmapRotator::NewL();
+    iLafMgr = CPeninputSplitQwertyLafMgr::NewL();
+    iLafMgr->SetInputModeL( TPluginInputMode( iLayoutContext->LayoutType() ) );
+    CPeninputLayoutWindowExt::ConstructL();   
+    }
+
+// ---------------------------------------------------------------------------
+// Add range bar into client area
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::AddRangeBarL()
+    {
+    CAknFepCtrlCommonButton* button = CAknFepCtrlCommonButton::NewL(
+                                        UiLayout(), 
+                                        EPeninutWindowCtrlIdRangeBtn,
+                                        KAknsIIDQsnFrFunctionButtonNormal,
+                                        KAknsIIDQsnFrFunctionButtonPressed,
+                                        KAknsIIDQsnFrFunctionButtonInactive );
+
+    CleanupStack::PushL( button ); 
+    button->SetResourceId( R_PENINPUT_LAYOUT_VKB_RANGE_DEFAULT );
+    button->ConstructFromResourceL();
+    AddControlL( button );
+    CleanupStack::Pop( button );
+    
+    button->AddEventObserver( UiLayout() );  
+    iRangeButton = button;  
+    }
+
+// ---------------------------------------------------------------------------
+// Add button to client area
+// ---------------------------------------------------------------------------
+//
+CAknFepCtrlEventButton* CPeninputSplitQwertyWindow::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
+        {
+        button = CAknFepCtrlEventButton::NewL( UiLayout(), 
+                                               aControlId, 
+                                               aEventId, 
+                                               aUnicode );
+        }
+        
+    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;
+    }
+
+// ---------------------------------------------------------------------------
+// Add popup window to display accented char list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::AddPopupWindowL()
+    {
+    iPopupWnd = CPeninputCommonChoiceList::NewL( 
+                                        UiLayout(), 
+                                        EPeninutWindowCtrlIdAccentPopupWindow,
+                                        KAknsIIDQsnFrList,
+                                        KAknsIIDQsnFrPopupSub );
+
+    iPopupWnd->AddEventObserver( UiLayout() );
+    
+    AddControlL( iPopupWnd );
+    iIdle = CIdle::NewL( CActive::EPriorityIdle );
+    iIdle ->Start( TCallBack( BackgroundTaskL, this ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Reorgnize position and size of function buttons
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::ReorgnizeTitleBar()
+    {
+    TRect inner, bound;
+    
+    CAknFepCtrlEventButton* evtButton = NULL;
+    CAknFepCtrlCommonButton* cmmButton = NULL;
+    TBool bBKSizeChanged = EFalse;
+       
+    evtButton = EventButtonCtrl( EPeninutWindowCtrlIdOptionBtn );
+    if ( evtButton )
+        {
+        iLafMgr->GetButtonRect(EPeninutWindowCtrlIdOptionBtn, bound, inner );
+        evtButton->SizeChanged( bound, inner, ETrue );
+        }
+
+    cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdCloseBtn );
+    if ( cmmButton )
+        {
+        iLafMgr->GetButtonRect(EPeninutWindowCtrlIdCloseBtn, bound ,inner );
+        cmmButton->SizeChanged( bound, inner, ETrue );
+        }
+    
+    cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdBackspaceBtn );
+    if ( cmmButton )
+        {
+        iLafMgr->GetButtonRect( EPeninutWindowCtrlIdBackspaceBtn, bound, inner );
+
+        if( bound.Size() != cmmButton->Rect().Size() &&
+            inner.Size() != cmmButton->ForgroundBmpRect().Size() )
+            {
+            bBKSizeChanged = ETrue;
+            }    
+        cmmButton->SizeChanged( bound, inner, ETrue );
+        }
+
+    cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdSpaceBtn );
+    if ( cmmButton )
+        {
+        iLafMgr->GetButtonRect(EPeninutWindowCtrlIdSpaceBtn, bound, inner );
+        inner = bound;
+        inner.Shrink( 10, 0 );
+        
+        cmmButton->SizeChanged( bound, inner, ETrue );
+            
+        TRect spaceIconRect = inner;
+        spaceIconRect.Shrink( 10, 0 );
+        TDraw3PiecesFrame draw3pic( KAknsIIDQgnIndiInputSpaceL,
+                                    KAknsIIDQgnIndiInputSpaceMiddle,
+                                    KAknsIIDQgnIndiInputSpaceR,
+                                    spaceIconRect);
+        cmmButton->SetDraw3PieceFrameInfo( draw3pic );
+        }
+    
+    if ( iRangeButton )
+        {
+        iLafMgr->GetButtonRect( EPeninutWindowCtrlIdRangeBtn, bound, inner );
+        iRangeButton->SetRect( bound );
+        iRangeButton->SizeChanged( bound, inner, ETrue );
+        }  
+    
+    if ( iArrowLeftButton )
+        {
+        iLafMgr->GetButtonRect( EPeninupWindowCtrlIdArrowLeftBtn, bound, inner );
+        iArrowLeftButton->SizeChanged( bound, inner, ETrue );
+        }
+    if ( iArrowRightButton )
+        {
+        iLafMgr->GetButtonRect( EPeninupWindowCtrlIdArrowRightBtn, bound, inner );
+        iArrowRightButton->SizeChanged( bound, inner, ETrue );
+        }  
+
+    //If backspace size changed when language is RtoL mirror should be used    
+    if ( bBKSizeChanged && IsRtoLLanguage( iLanguage ) )
+        {
+        //Mirror backspace graphic
+        HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn );
+        }   
+    }
+
+
+// ---------------------------------------------------------------------------
+// Show range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::PopupRangeListL()
+    {
+    TInt currentRange = IntContext( EPeninputDataTypeCurrentRange );
+    TInt permittedRange = IntContext( EPeninputDataTypePermittedRange );
+    TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent );
+    
+    CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdRangeBtn );
+    if( !btn ) 
+        {
+        return;
+        }
+    
+    if ( !iPopupInited )
+        {
+        TRAP_IGNORE( DoIdleConstructL() );
+        }
+    
+    iPopupWnd->ClearItemsL();
+    
+    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 )
+                    {
+                    iPopupWnd->AddItemL( 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 );
+            iPopupWnd->AddItemL( item );
+            }
+        }
+    
+    if ( permittedRange & ERangeNativeNumber )
+        {
+        rgninfo = rbinfo->FindRange( ERangeNativeNumber );
+        if ( rgninfo && currentRange != ERangeNativeNumber )
+            {
+            item.iCommand = EPeninputVkbLayoutNativeNumber;
+            item.iText.Copy( iRangeLabels.iLabelNativeNumber );
+            iPopupWnd->AddItemL( item );
+            }
+        }
+   
+    if ( permittedRange & ERangeEnglish )
+        {
+        rgninfo = rbinfo->FindRange( ERangeEnglish );
+        if ( rgninfo && currentRange != ERangeEnglish )
+            {
+            item.iCommand = EPeninputVkbLayoutLatinChar;
+            item.iText.Copy( iRangeLabels.iLabelLatinChar );
+            iPopupWnd->AddItemL( item );
+            }
+        }
+    
+    if ( permittedRange & ERangeNumber )
+        {
+        rgninfo = rbinfo->FindRange( ERangeNumber );
+        if ( rgninfo && currentRange != ERangeNumber )
+            {
+            item.iCommand = EPeninputVkbLayoutLatinNumber;
+            item.iText.Copy( iRangeLabels.iLabelLatinNumber );
+            iPopupWnd->AddItemL( item );
+            }
+        }
+    
+    /*
+    if ( permittedRange & ERangeSymbol )
+        {
+        rgninfo = rbinfo->FindRange( ERangeSymbol );
+        if ( rgninfo && currentRange != ERangeSymbol )
+            {
+            item.iCommand = EPeninputVkbLayoutSymbol;
+            item.iText.Copy( _L("#*") );
+            iPopupWnd->AddItemL( item );
+            }
+        }
+    */
+    
+    iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() );
+    
+    iPopupWnd->SetCurrentFocusedIndex( - 1 ); //no active item
+    iPopupWnd->Display( btn->Rect() );
+    iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup );    
+    }
+
+// ---------------------------------------------------------------------------
+// get resource info of accented chars popup window
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::GetPopupWndInfoFromResL( TResourceReader aRes,
+                                                          const TRect& aRect )
+    {
+    TPtrC bmpFileName = aRes.ReadTPtrC();        
+    TInt32 imgMajorSkinId = aRes.ReadInt32();
+
+    TAknsItemID id;
+    
+    MAknsSkinInstance* skininstance = AknsUtils::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 );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Background constructor
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::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 );
+
+    }
+
+// ---------------------------------------------------------------------------
+// Simulate raw event
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::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);
+    }
+
+TInt CPeninputSplitQwertyWindow::IntContext( TPeninputDataType aDataIndex )
+    {
+    return CPeninputDataConverter::AnyToInt( 
+                iLayoutContext->RequestData( aDataIndex ) 
+                );
+    }
+
+// ---------------------------------------------------------------------------
+// Handle size changed for range list
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::HandlePopupSizeChange()
+    {
+    if ( IntContext( 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 ) );
+
+    TSize imgSize ( iPopupItemRect.Width(), iPopupItemRect.Height() * 3 );
+    AknIconUtils::SetSize( iPopupWndBgImg, imgSize, EAspectRatioNotPreserved );
+    AknIconUtils::SetSize(iPopupWndFocusImg, imgSize, EAspectRatioNotPreserved );
+    
+    iPopupSet = ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Handle dead key event
+// ---------------------------------------------------------------------------
+//
+ TBool CPeninputSplitQwertyWindow::HandleDeadKeyL( TInt aEventType, 
+                                                   const TDesC& aEventData )
+     {
+    // Set DeadKey to unlatched state
+    TBool deadKeyChange = EFalse;
+    iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange );
+    UnLatchDeadKey( iNewDeadKeyBuf );
+
+    // Get the accent char
+    HBufC* newCharBuf = HBufC::NewL( 1 );
+    
+    TBool handled = HandleAccentCharEvent( aEventType, 
+                                           aEventData, 
+                                           iNewDeadKeyBuf, 
+                                           newCharBuf );
+    
+    if( handled )
+        {
+        // Send ths accent key to FEP
+        UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf );
+        iNewDeadKeyBuf = KNullDesC;
+        delete newCharBuf;
+        return ETrue;
+        }
+    
+    delete newCharBuf;
+    
+    return EFalse;
+     }
+
+ // --------------------------------------------------------------------------
+ // Handle resource of button(base on language direction)
+ // --------------------------------------------------------------------------
+ //
+void CPeninputSplitQwertyWindow::HandleButtonResOnLangDirChange( TInt aControlId )
+    {
+    TRAP_IGNORE( HandleButtonResOnLangDirChangeL( aControlId ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Handle resource of button(base on language direction)
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::HandleButtonResOnLangDirChangeL( TInt aControlId )
+    {
+    CAknFepCtrlCommonButton* ctrl = CommonButtonCtrl( aControlId ); 
+    if ( ctrl && iBmpRotator )
+        {
+        TSyncRotationAngle rotChoice = CBitmapRotator::EMirrorVerticalAxis; 
+        
+        User::LeaveIfError( 
+                iBmpRotator->Rotate( *ctrl->ForgroundBmp() ,rotChoice ) 
+                );
+        
+        User::LeaveIfError( 
+                iBmpRotator->Rotate( *ctrl->ForgroundBmpMask(), rotChoice ) 
+                );
+        }        
+    }    
+
+// ---------------------------------------------------------------------------
+// Handle range list event
+// ---------------------------------------------------------------------------
+//
+void CPeninputSplitQwertyWindow::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();
+    }
+
+// End Of File