textinput/peninputvkbkr/src/PeninputVkbKrWindow.cpp
changeset 0 eb1f2e154e89
child 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputvkbkr/src/PeninputVkbKrWindow.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1572 @@
+/*
+* 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:  peninput VKB data manager
+*
+*/
+
+#include <PeninputVkbKrWindowConfigInfo_65.rsg>
+#include <PeninputVkbKrWindowKr.rsg>
+
+#include <aknlayoutscalable_apps.cdl.h>
+#include <AknLayoutScalable_Avkon.cdl.h>
+
+#include <e32keys.h>
+#include <S32MEM.h>
+#include <AknFepGlobalEnums.h>
+#include <AknFepPeninputEnums.h>
+#include <AknLayoutDef.h>
+#include <AknIconUtils.h>
+#include <AknUtils.h>
+#include <AknFontAccess.h> 
+
+#include <PeninputCommonLayoutGlobalEnum.h>
+#include <PeninputLayoutMultilineIcf.h>
+#include <PeninputLayoutContext.h>
+#include <PeninputInputContextField.h>
+#include <PeninputLayoutBubbleCtrl.h>
+#include <PeninputRangebar.h>
+#include <PeninputRangebarInfo.h>
+#include <PeninputClientLayoutInfo.h>
+#include <PeninputLayoutChoiceList.h>
+#include <PeninputLayoutInputmodeChoice.h>
+#include <PeninputLayoutBubbleCtrl.h>
+#include <PeninputLabel.h>
+
+#include <PeninputMultimodeButton.h>
+#include <PeninputEventButton.h>
+#include <PeninputDragButton.h>
+#include <PeninputRepeatButton.h>
+
+#include <PeninputDataConverter.h>
+#include <PeninputUiStatemgrInterface.h>
+
+#include "PeninputVkbKrDbg.h"
+#include "PeninputVkbKr.pan"
+#include "PeninputVkbKr.hrh"
+#include "PeninputVkbKrEnum.h"
+#include "PeninputVkbKrUiStateType.h"
+#include "PeninputVkbKrWindow.h"
+#include "peninputgenericvkblafdatamgr.h"
+
+_LIT( KWindowConfigurationResourceFile,
+      "z:\\resource\\plugins\\PeninputVkbKrWindowConfigInfo_65.rsc" );
+_LIT( KWindowResourceFile,
+      "z:\\resource\\plugins\\PeninputVkbKrWindowKr.rsc" );
+const TInt KInvalidImg = -1 ;
+const TInt KPeninputVkbWndInvalidIndex = -1;
+//const TUint32 KDefaultTextColor = 0x000000;
+//const TUint32 KDefaultShadowTextColor = 0x000000;
+
+struct TDummyRangeInfo // from CPeninputRangeInfo
+    {
+    
+    void* vertual1;
+
+    /**
+     * Range id
+     */
+    TInt iRangeId;
+    
+    /**
+     * Response style
+     */
+    TPeninputRangeResponseStyle iResponseStyle;
+
+    /**
+     * Client layout id
+     */
+    TInt iClientLayoutId;
+
+    /**
+     * Vkb layout id
+     */
+    TInt iVkbLayoutId;
+
+    };
+
+struct TSymbolTableInfo
+    {
+    TInt iVkbLayoutId;
+    TInt iClientLayoutId;
+    };
+
+const TSymbolTableInfo sSymbolTableInfo[] = 
+    {
+        {EPeninputVkbLayoutSymbol1,EPeninputClientLayout11x4},
+        {EPeninputVkbLayoutSymbol2,EPeninputClientLayout11x4},
+        {EPeninputVkbLayoutSymbol3,EPeninputClientLayout11x4},
+        {EPeninputVkbLayoutSymbol4,EPeninputClientLayoutMacroChars},
+        {EPeninputVkbLayoutSymbol5,EPeninputClientLayoutMacroChars},
+    };
+
+const TInt KMaxSymbolTable = sizeof(sSymbolTableInfo)/sizeof(TSymbolTableInfo);
+
+namespace SymbolTableUtil
+    {
+    
+    LOCAL_C TInt FindIndex(TInt aVkbLayoutId)
+        {
+        TInt ret(KErrNotFound);
+        for (TInt i=0;i<KMaxSymbolTable;i++)
+            {
+            if (aVkbLayoutId==sSymbolTableInfo[i].iVkbLayoutId)
+                {
+                ret=i;
+                break;
+                }
+            }
+        return ret;
+        }
+
+    LOCAL_C TInt GetClientLaytoutFor(TInt aVkbLayoutId)
+        {
+        TInt ret(0);
+        TInt index(FindIndex(aVkbLayoutId));
+        if (index!=KErrNotFound)
+            {
+            ret=sSymbolTableInfo[index].iClientLayoutId;
+            }
+        return ret;
+        }
+    
+    LOCAL_C TInt GetNextVkbLayout(TInt aVkbLayoutId)
+        {
+        TInt ret(aVkbLayoutId);
+        TInt index=FindIndex(aVkbLayoutId);
+        if (index!=KErrNotFound)
+            {
+            index=(index+1)%KMaxSymbolTable;
+            ret=sSymbolTableInfo[index].iVkbLayoutId;
+            }
+        return ret;
+        }
+    
+    LOCAL_C TInt GetPrevVkbLayout(TInt aVkbLayoutId)
+        {
+        TInt ret(aVkbLayoutId);
+        TInt index=FindIndex(aVkbLayoutId);
+        if (index!=KErrNotFound)
+            {
+            index=(index+KMaxSymbolTable-1)%KMaxSymbolTable;
+            ret=sSymbolTableInfo[index].iVkbLayoutId;
+            }
+        return ret;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Constructor & Destructor
+// ---------------------------------------------------------------------------
+//
+
+CPeninputVkbKrWindow* CPeninputVkbKrWindow::NewLC(
+        CFepUiLayout* aUiLayout, 
+        MPeninputLayoutContext* aLayoutContext,
+        MPeninputUiStateMgr* aUiStateMgr)
+    {
+    CPeninputVkbKrWindow* self = 
+        new (ELeave) CPeninputVkbKrWindow(aUiLayout,aLayoutContext,aUiStateMgr);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+CPeninputVkbKrWindow* CPeninputVkbKrWindow::NewL(
+        CFepUiLayout* aUiLayout, 
+        MPeninputLayoutContext* aLayoutContext,
+        MPeninputUiStateMgr* aUiStateMgr)
+    {
+    CPeninputVkbKrWindow* self = 
+        CPeninputVkbKrWindow::NewLC(aUiLayout,aLayoutContext,aUiStateMgr);
+    CleanupStack::Pop(); // self;
+    return self;
+    }
+
+CPeninputVkbKrWindow::CPeninputVkbKrWindow(
+        CFepUiLayout* aUiLayout, 
+        MPeninputLayoutContext* aLayoutContext,
+        MPeninputUiStateMgr* aUiStateMgr)
+    : CPeninputLayoutWindowExt(aUiLayout,aLayoutContext),
+      iUiStateMgr(aUiStateMgr),
+      iTableUpButton(NULL),
+      iTableDownButton(NULL),
+      iTablePageLabel(NULL),
+      iFirstConstruct(ETrue),
+      iPopupSet(EFalse),
+      iPopupInited(EFalse)
+    {
+    // No implementation required
+    }
+
+void CPeninputVkbKrWindow::ConstructL()
+    {
+    CPeninputLayoutWindowExt::ConstructL();
+    iLafMgr = CPeninputGenericVkbLafMgr::NewL();
+    iLafMgr->SetInputModeL(TPluginInputMode(iLayoutContext->LayoutType()));
+    TInt option(iLafMgr->OptionType());
+    option|=EOption3CellRange;
+    iLafMgr->SetLafOption((TPeninputVkbLafOption)option);  
+    }
+
+CPeninputVkbKrWindow::~CPeninputVkbKrWindow()
+    {
+    delete iLafMgr;
+    delete iIdle;
+    }
+
+// ---------------------------------------------------------------------------
+// from CPeninputLayoutWindow
+// ---------------------------------------------------------------------------
+//
+
+void CPeninputVkbKrWindow::HandleControlEvent(
+        TInt aEventType,
+        CFepUiBaseCtrl* aCtrl, 
+        const TDesC& aEventData )
+    {
+    TInt* data = ( TInt* ) aEventData.Ptr(); 
+    // Call this function in base class
+    
+    if (aEventType==EPeninputLayoutEventRange)
+        {
+        PreProcessRange(*data);
+        }
+    
+    CPeninputLayoutWindowExt::HandleControlEvent(
+        aEventType, 
+        aCtrl, 
+        aEventData );
+    
+    switch ( aEventType )
+        {   
+        case EPeninputLayoutVkbEventResetShift: 
+            {
+            HandleShiftBtnClicked();
+            }
+            break;  
+        case EPenInputLayoutEventClosePopup:
+            {
+            if ( iPopupWnd && !iPopupWnd->Hiden() )
+                {
+                iPopupWnd->CloseWindow();
+                ResetAccentButton();
+                iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+                }
+            }
+            break;
+        case EPeninputLayoutEventOpen:
+        case EPeninputLayoutEventRange:
+            {
+            UpdateArea( Rect(), ETrue );
+            }
+            break;
+        case EEventChoiceSelected:
+            {
+            CFepLayoutChoiceList::SEvent* event = 
+                ( CFepLayoutChoiceList::SEvent* ) aEventData.Ptr();
+
+            if ( event->iIndex != KPeninputVkbWndInvalidIndex )
+                {
+                if (aCtrl->ControlId() == EPeninutWindowCtrlIdAccentPopupWindow)
+                    {
+                    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
+                {
+                ResetAccentButton();   
+                }
+            iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+            }
+            break;
+        case EPeninputLayoutEventToHwr:
+            {
+            TRAP_IGNORE(UpdateICFTextL());
+            TRAP_IGNORE(PopupSwitchWindowL());
+            }
+            break;
+        case EPeninputLayoutVkbEventTableUp:
+            if (IsSymbolRange())
+                {
+                TInt curVkbLayout = CPeninputDataConverter::AnyToInt(
+                    iLayoutContext->RequestData(EPeninputDataTypeVkbLayout));
+                TInt prevVkbLayout=SymbolTableUtil::GetPrevVkbLayout(curVkbLayout);
+                TRAP_IGNORE( FakeClientLayoutUpdateL(prevVkbLayout));
+                ChangeRange(ERangeSymbol,prevVkbLayout);
+                }
+            break;
+        case EPeninputLayoutVkbEventTableDown:
+            if (IsSymbolRange())
+                {
+                TInt curVkbLayout = CPeninputDataConverter::AnyToInt(
+                    iLayoutContext->RequestData(EPeninputDataTypeVkbLayout));
+                TInt nextVkbLayout=SymbolTableUtil::GetNextVkbLayout(curVkbLayout);
+                TRAP_IGNORE( FakeClientLayoutUpdateL(nextVkbLayout));
+                ChangeRange(ERangeSymbol,nextVkbLayout);
+                }
+            break;
+        default:
+            break;
+        }
+    }
+
+
+TInt CPeninputVkbKrWindow::GetWindowConfigResId()
+    {
+    return R_PENINPUT_LAYOUT_CONFIG_INFO;
+    }
+
+TInt CPeninputVkbKrWindow::GetWindowResId()
+    {
+    if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ )
+        {
+        return R_PENINPUT_LAYOUT_FSQ_WINDOW_INFO;
+        }
+    return R_PENINPUT_LAYOUT_VKB_WINDOW_INFO;        
+    }
+
+TInt CPeninputVkbKrWindow::GetNumKeymappingResId()
+    {
+    return R_PENINPUT_LAYOUT_KEY_MAPPING_STRING_LIST;
+    }
+
+const TDesC& CPeninputVkbKrWindow::GetWindowConfigResFileName( TInt /*aLangID*/ )
+    {
+    return KWindowConfigurationResourceFile();
+    }
+
+const TDesC& CPeninputVkbKrWindow::GetWindowResFileName()
+    {
+    return KWindowResourceFile();
+    }
+
+const TRect CPeninputVkbKrWindow::ChangeUnitSize()
+    {
+    return TRect();
+    }
+
+void CPeninputVkbKrWindow::ChangeClientSize()
+    {
+    LOG("Vkb.Window.ChangeClientSize");
+    if ( !iPopupWnd->Hiden() )
+        {
+        iPopupWnd->CloseWindow();
+        ResetAccentButton();
+        iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby );
+        }
+        
+    PopupWindowSizeChange();
+
+    TInt clientLayoutId = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) );
+    CPeninputClientLayoutInfo* clientLayout = 
+        ConfigInfo()->FindClientLayoutInfo( clientLayoutId );
+
+    if ( clientLayout )
+        {
+        ReorganizeControls( clientLayout->LayoutID(), EFalse );
+        } 
+
+    TRect rect=iVkbCtrl->Rect();
+    LOG2("Vkb.Window.ChangeClientSize %d %d",rect.Width(),rect.Height());
+    UpdateArea( iVkbCtrl->Rect(), EFalse );
+    }
+
+void CPeninputVkbKrWindow::CreateAllControlsL()
+    {
+    //LOG("Vkb.Window.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);  
+    
+    /* Teleca change begin, 20.05.2008 ssal */									  
+    icf->InfoBubbleCtrl()->SetTextFormat(iBubbleTextLayout);
+    icf->InfoBubbleCtrl()->SetTextColorIndex( EAknsCIQsnTextColorsCG67 );
+    //Change the ID when ID into release
+    icf->InfoBubbleCtrl()->SetBitmapParam(NULL,
+    									  NULL,
+    									  KAknsIIDQsnFrInputPreviewSideL,
+    									  KAknsIIDQsnFrInputPreviewMiddle,
+    									  KAknsIIDQsnFrInputPreviewSideR);
+    /* Teleca change end, 20.05.2008 ssal */
+    
+    if (iLayoutContext->LayoutType() == EPluginInputModeFSQ)
+        {
+        icf->SetMsgBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
+         /* Teleca change begin, 20.05.2008 ssal */
+        icf->SetInfoBubbleCtrlSize(TSize(iBubbleSize.iW,iBubbleSize.iH));
+        /* Teleca change end, 20.05.2008 ssal */
+        }
+        
+    // Range bar
+    iRangeBar = CAknFepCtrlRangeBar::NewL(
+        UiLayout(),
+        EPeninutWindowCtrlIdRangeBar, 
+        //CAknFepCtrlRangeBar::EBtnGroupHorizontal );
+        CAknFepCtrlRangeBar::EBtnGroupVertical );
+
+    // Set event id    
+    iRangeBar->SetEventIdForRange( EPeninputLayoutEventRange );
+    iRangeBar->SetEventIdForCase( EPeninputLayoutEventRangeLoop );
+
+    AddControlL( iRangeBar );
+    iRangeBar->AddEventObserver((MEventObserver*)UiLayout());    
+
+    // 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
+    
+                                        
+    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 );
+    
+    // Switch to hwr button  
+    AddButtonL( EPeninutWindowCtrlIdSwitchToHwrBtn, 
+                EPeninputLayoutEventToHwr, 
+                R_PENINPUT_LAYOUT_VKB_HWR );
+                  
+    // Add popup window
+    //AddPopupWindowL();
+    iPopupWnd = CPeninputCommonChoiceList::NewL( UiLayout(), 
+                    EPeninutWindowCtrlIdAccentPopupWindow,
+                    KAknsIIDQsnFrList,
+                    KAknsIIDQsnFrPopupSub );
+    
+        
+   
+    iPopupWnd->AddEventObserver( UiLayout() );
+    
+    AddControlL( iPopupWnd );
+    iIdle = CIdle::NewL(CActive::EPriorityIdle );
+    iIdle ->Start(TCallBack(BackgroundTaskL,this));
+    }
+
+void CPeninputVkbKrWindow::SetControlsFont()
+    {
+    //LOG("Vkb.Window.SetControlsFont");
+    }
+
+void CPeninputVkbKrWindow::PopupChoiceList()
+    {
+    LOG("Vkb.Window.PopupChoiceList");
+    }
+
+void CPeninputVkbKrWindow::ReorganizeControls( 
+        TInt aClientLayoutId,
+        TBool aNeedReset )
+    {
+    LOG("Vkb.Window.ReorganizeControls");
+    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();
+    ReorgnizeTableUpDown();
+    
+    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->KeyTextLayout() );  //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));
+                }
+            }
+        }    
+    }
+
+void CPeninputVkbKrWindow::DoCaseChange( TInt aNewCase )
+    {
+    LOG1("Vkb.Window.DoCaseChange %d",aNewCase);
+    TInt curCase = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCase ) );            
+    
+    if ( aNewCase == curCase )
+        {
+        return;
+        }
+        
+    TInt curRange = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) ); 
+        
+    TInt latchFlag = CPeninputDataConverter::AnyToInt
+                     (iLayoutContext->RequestData(EAkninputDataTypeLatchedSet));
+                            
+    if ( latchFlag == 0 && (( curRange == ERangeAccent ) || ( ( curRange == ERangeEnglish ) 
+            || ( ( curRange == ERangeNative ) && ( ConfigInfo()->CaseSensitive()) ) ) ) )
+        {
+        // Set shift and caplock button
+        TInt shift;  
+        TInt capslock;  
+        
+        CPeninputDataConverter::ShiftCapslockByCase( aNewCase, 
+            shift, capslock );
+        
+        iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shift );
+        //ChangeButtonStatus( shfit, EPeninutWindowCtrlIdShiftBtn );          
+        iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock );        
+        //ChangeButtonStatus( capslock, EPeninutWindowCtrlIdCapslockBtn );
+        iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase ); 
+        ChangeMergedButtonStatus( shift, capslock );
+        
+        TRAP_IGNORE( iRangeBar->SetCaseL( curRange, aNewCase ) );
+        
+        TInt vkblayout = ConfigInfo()->ShiftCapsSingleVkbLayoutByCase
+            ( curRange, aNewCase );
+
+        if ( curRange == ERangeAccent ) 
+           {
+           TInt curAccentIndex = CPeninputDataConverter::AnyToInt
+               ( iLayoutContext->RequestData( EPeninputDataTypeCurrentAccent ) );
+                 vkblayout = vkblayout + curAccentIndex * 2;
+           }
+        
+        ChangeVkbLayout( vkblayout );
+        }
+    }
+
+TBool CPeninputVkbKrWindow::CreateCustomControlL( TInt16 aControlId, TInt32 aImageId )
+    {
+    //LOG2("Vkb.Window.CreateCustomControlL %d %d",aControlId,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;
+            
+        case EPeninutVkbCtrlIdSymbolTableUp:
+            {
+            if (!iTableUpButton)
+                {
+                
+                iTableUpButton = CAknFepCtrlRepeatButton::NewL( 
+                    UiLayout(), aControlId, EPeninputLayoutVkbEventTableUp, EKeyPageUp, 
+                                                  KAknsIIDQsnFrFunctionButtonNormal,
+                                                  KAknsIIDQsnFrFunctionButtonPressed,
+                                                  KAknsIIDQsnFrFunctionButtonInactive );
+
+                AddControlL(iTableUpButton);
+                iTableUpButton->AddEventObserver(UiLayout());
+                iTableUpButton->SetResourceId( aImageId );
+                }
+
+            iTableUpButton->ConstructFromResourceL();
+            }
+            break;
+        case EPeninutVkbCtrlIdSymbolTableDown:
+            {
+            if (!iTableDownButton)
+                {
+                iTableDownButton = CAknFepCtrlRepeatButton::NewL( 
+                    UiLayout(), aControlId, EPeninputLayoutVkbEventTableDown, EKeyPageDown, 
+                                                  KAknsIIDQsnFrFunctionButtonNormal,
+                                                  KAknsIIDQsnFrFunctionButtonPressed,
+                                                  KAknsIIDQsnFrFunctionButtonInactive );
+
+                AddControlL(iTableDownButton);
+                iTableDownButton->AddEventObserver(UiLayout());
+                iTableDownButton->SetResourceId( aImageId );
+
+                }
+            iTableDownButton->ConstructFromResourceL();
+            }
+            break;
+        case EPeninutVkbCtrlIdSymbolTablePageLabel:
+            {
+            if (!iTablePageLabel)
+                {
+                /*
+                iTablePageLabel=CAknFepCtrlCommonButton::NewL(
+                    UiLayout(),
+                    aControlId,
+                    KAknsIIDQsnFrFunctionButtonNormal,
+                    KAknsIIDQsnFrFunctionButtonPressed,
+                    KAknsIIDQsnFrFunctionButtonInactive);
+                */
+                iTablePageLabel=CAknFepCtrlEventButton::NewL(
+                    UiLayout(),
+                    aControlId,
+                    0xFFFF,
+                    0,
+                    KAknsIIDQsnFrFunctionButtonInactive,
+                    KAknsIIDQsnFrFunctionButtonInactive,
+                    KAknsIIDQsnFrFunctionButtonInactive);
+                AddControlL(iTablePageLabel);
+                iTablePageLabel->AddEventObserver(UiLayout());
+                iTablePageLabel->Hide(EFalse);
+                }
+            }
+            break;
+        default:
+            {
+            create = EFalse;
+            }
+        }
+    return create;
+    }
+
+void CPeninputVkbKrWindow::AddCustomControlGroupL(CFepUiBaseCtrl* aCtrl)
+    {
+    //LOG("Vkb.Window.AddCustomControlGroupL");
+    AddControlL(aCtrl);
+    }
+
+void CPeninputVkbKrWindow::SetVkbLayoutSize()
+    {
+    TInt vkbLayoutid = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeVkbLayout ) );
+    CPeninputVkbLayoutInfo* vkbLayout = 
+        ConfigInfo()->FindVkbLayoutInfo( vkbLayoutid );
+
+    TRect outrect,innerrect;   
+    iLafMgr->GetPreviewWndRect(outrect,innerrect);
+    
+    if (SymbolTableUtil::GetClientLaytoutFor(vkbLayoutid)==EPeninputClientLayoutMacroChars)
+        {
+        TInt widthOutrect=outrect.Width();
+        TInt widthInnerrect=innerrect.Width();
+        outrect.SetWidth(widthOutrect*3);
+        innerrect.SetWidth(widthInnerrect*3);
+        }
+    
+    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);
+    
+    // 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 );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+void CPeninputVkbKrWindow::ConstructFromResourceL()
+    {               
+    CPeninputLayoutWindowExt::ConstructFromResourceL();
+    if( iVkbLayout && !iFirstConstruct )
+        {
+        if( iVkbCtrl->IsIrregularKeyBoard() )       
+            iVkbLayout->ConstructFromIrregularResourceL();
+        else
+            iVkbLayout->ConstructFromNonIrregularResourceL();
+        SetVkbLayoutSize();
+        }
+    iFirstConstruct = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Internal Functions
+// ---------------------------------------------------------------------------
+//
+
+void CPeninputVkbKrWindow::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 );
+    }
+
+CAknFepCtrlEventButton* CPeninputVkbKrWindow::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,
+              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;
+    }
+
+void CPeninputVkbKrWindow::ReorgnizeTitleBar()
+    {
+    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));
+
+    
+    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, bBKSizeChanged );
+
+
+    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 );
+        }    
+
+    }
+
+void CPeninputVkbKrWindow::ReorgnizeTableUpDown()
+    {
+    TPoint winPoint = Rect().iTl;
+    TPoint LafPoint = iLafMgr->EntirePaneRect().iTl;
+    
+    TRect inRect;
+    TRect exRect;
+    
+    TInt x = winPoint.iX - LafPoint.iX;
+    TInt y = winPoint.iY - LafPoint.iY;    
+    
+    iLafMgr->GetButtonRect(
+        (TPeninputCommonCtrlID)EPeninutVkbCtrlIdSymbolTableUp,
+        exRect ,
+        inRect);
+    exRect.Move(x, y); 
+    inRect.Move(x, y);
+    if (exRect.IsEmpty())
+        {
+        iTableUpButton->Hide(ETrue);
+        }
+    else
+        {
+        iTableUpButton->Hide(EFalse);
+        iTableUpButton->SizeChanged( exRect, inRect, ETrue );
+        iTableUpButton->Draw();        
+        }
+
+    iLafMgr->GetButtonRect(
+        (TPeninputCommonCtrlID)EPeninutVkbCtrlIdSymbolTablePageLabel,
+        exRect ,
+        inRect);
+    exRect.Move(x, y);
+    inRect.Move(x, y); 
+    
+    /* for CButtonBase
+    TRgb color( KRgbBlack );  // sane default for nonskinned case
+    AknsUtils::GetCachedColor( 
+        AknsUtils::SkinInstance(),
+        color,
+        KAknsIIDQsnTextColors,
+        EAknsCIQsnTextColorsCG59);
+    iTablePageLabel->SetCaptionColor(color);
+    TFontStyle style;
+    CFbsFont* font=AknFontAccess::GetClosestFont(
+        *BitmapDevice(),
+        style,
+        BitmapDevice()->VerticalPixelsToTwips(exRect.Height()/3),
+        AknFontAccess::EAknFontFamilyNotSpecified);
+    iTablePageLabel->SetFont(font);
+    */
+    /* for Common
+    TAknTextLineLayout layout=iLafMgr->KeyTextLayout();
+    layout.iFont=ELatinPlain12;
+    iTablePageLabel->SetTextFormat(layout);
+    iTablePageLabel->SetTextColorIndex(EAknsCIQsnTextColorsCG59);
+    */
+    /*
+    TAknTextLineLayout langSwitch;
+    TAknTextLineLayout langSwitchShadow;
+    langSwitch = 
+        AknLayoutScalable_Avkon::cell_vkb_side_pane_t1().LayoutLine();
+    langSwitchShadow = 
+        AknLayoutScalable_Avkon::cell_vkb_side_pane_t1_copy1().LayoutLine();
+    iTablePageLabel->SetFont(AknLayoutUtils::FontFromId(langSwitch.iFont, NULL));
+    iTablePageLabel->SetShadowFont(AknLayoutUtils::FontFromId(langSwitchShadow.iFont, NULL));
+    */
+    TAknTextLineLayout langSwitch;
+    TAknTextLineLayout langSwitchShadow;
+    langSwitch = 
+        AknLayoutScalable_Avkon::cell_vkb_side_pane_t1().LayoutLine();
+    TAknTextLineLayout layout=iLafMgr->KeyTextLayout();
+    
+    if (iLayoutContext->LayoutType()==EPluginInputModeVkb)
+        {
+        layout.iFont=langSwitch.iFont;        
+        }
+    iTablePageLabel->SetTextFormat(layout);
+    iTablePageLabel->SetTextColorIndex(EAknsCIQsnTextColorsCG59);
+    
+    if (exRect.IsEmpty())
+        {
+        iTablePageLabel->Hide(ETrue);
+        }
+    else
+        {
+        iTablePageLabel->Hide(EFalse);
+        iTablePageLabel->SizeChanged( exRect, inRect, ETrue );
+        iTablePageLabel->Draw();
+        }
+
+    iLafMgr->GetButtonRect(
+        (TPeninputCommonCtrlID)EPeninutVkbCtrlIdSymbolTableDown,
+        exRect ,
+        inRect);
+    exRect.Move(x, y);
+    inRect.Move(x, y); 
+    if (exRect.IsEmpty())
+        {
+        iTableDownButton->Hide(ETrue);
+        }
+    else
+        {
+        iTableDownButton->Hide(EFalse);
+        iTableDownButton->SizeChanged( exRect, inRect, ETrue );
+        iTableDownButton->Draw();
+        }
+    
+    TRect updateArea;
+    updateArea.iTl=iTableUpButton->Rect().iTl;
+    updateArea.iBr=iTableDownButton->Rect().iBr;
+    UpdateArea( updateArea, ETrue );
+    }
+
+void CPeninputVkbKrWindow::ResetAccentButton()
+    {
+    TInt curRange = CPeninputDataConverter::AnyToInt
+        ( iLayoutContext->RequestData( EPeninputDataTypeCurrentRange ) );
+        
+    if ( iRangeBar )
+        {
+        iRangeBar->ActiveRange( curRange );
+        }        
+    }
+
+void CPeninputVkbKrWindow::UpdateICFTextL()
+    {
+    CFepLayoutMultiLineIcf* icf = 
+        static_cast<CFepLayoutMultiLineIcf*>(Control(EPeninputWindowCtrlIdMultiLineICF));
+    if( icf )
+        {
+        icf->UpdateSecretTextL();    
+        }
+    }
+
+
+TInt CPeninputVkbKrWindow::BackgroundTaskL(TAny* aPtr)
+    {
+    CPeninputVkbKrWindow* self = static_cast<CPeninputVkbKrWindow*>(aPtr);
+    self->DoIdleConstructL();
+    return EFalse; // only run once
+    }
+
+void CPeninputVkbKrWindow::PopupWindowSizeChange()
+    {
+    TAknTextLineLayout choiceTextLayout;
+    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);
+        
+        choiceTextLayout = 
+                         AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1).LayoutLine();
+        }
+        
+    const CFont* font = AknLayoutUtils::FontFromId(choiceTextLayout.iFont, NULL);
+    iPopupWnd->SetFont(font);
+    iPopupWnd->SetItemRect(iPopupItemRect, iPopupItemRect);
+
+    TInt leftMargin = choiceTextLayout.il;
+    
+    iPopupWnd->SetMarginAndBaseline(leftMargin, font->HeightInPixels());
+    
+    iPopupWnd->SetFontColor(AKN_LAF_COLOR_STATIC(choiceTextLayout.iC));
+
+    AknIconUtils::SetSize(iPopupWndBgImg, TSize(iPopupItemRect.Width(), 
+                          iPopupItemRect.Height()*3), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(iPopupWndFocusImg, TSize(iPopupItemRect.Width(), 
+                          iPopupItemRect.Height()* 3), EAspectRatioNotPreserved);
+    
+    iPopupSet = ETrue;
+    }
+
+void CPeninputVkbKrWindow::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 );
+
+    }
+
+void CPeninputVkbKrWindow::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 );
+        }
+    }
+
+void CPeninputVkbKrWindow::PopupSwitchWindowL()
+    {
+    CFepUiBaseCtrl* switchBtn = Control(EPeninutWindowCtrlIdSwitchToHwrBtn);
+
+    if ( switchBtn )
+        {
+        /*
+        if (!iPopupInited)
+            {
+            DoIdleConstructL();
+            }
+        TRect rect = switchBtn->Rect();   
+        */
+        static_cast<CPeninputLayoutInputmodelChoice*>
+                (Control(EPeninutWindowCtrlIdSwitcherPopupWindow))->PopUpSwitchListL( switchBtn->Rect() );
+        }         
+    }
+
+TBool CPeninputVkbKrWindow::IsSymbolRange()
+    {
+    TInt currentRange = CPeninputDataConverter::AnyToInt(
+        iLayoutContext->RequestData(EPeninputDataTypeCurrentRange));
+    return currentRange==ERangeSymbol;
+    }
+
+void CPeninputVkbKrWindow::FakeClientLayoutUpdateL(const TInt& aVkbLayoutId)
+    {
+    TInt vkbLayoutToUpdate=aVkbLayoutId;
+    CPeninputRangeBarInfo* rangeBarInfo = iConfigInfo->RangeBarInfo();
+    CPeninputRangeInfo* rangeInfo = rangeBarInfo->FindRange(ERangeSymbol);
+    if (vkbLayoutToUpdate==0)
+        {
+        vkbLayoutToUpdate = rangeInfo->VkbLayoutId();
+        }
+    
+    // TODO: find better way to handle changing client layout.
+    TDummyRangeInfo* dummyRangeInfo=(TDummyRangeInfo*)rangeInfo;
+    dummyRangeInfo->iClientLayoutId=
+        SymbolTableUtil::GetClientLaytoutFor(vkbLayoutToUpdate);
+
+    if (iTablePageLabel)
+        {
+        TBuf<50> buf;
+        buf.Format(_L("%d/%d"),SymbolTableUtil::FindIndex(vkbLayoutToUpdate)+1,KMaxSymbolTable);
+        //iTablePageLabel->SetCaptionL(buf);
+        iTablePageLabel->SetTextL(buf);
+        iTablePageLabel->Draw();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// External Functions
+// ---------------------------------------------------------------------------
+//
+
+void CPeninputVkbKrWindow::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());
+        CleanupStack::PopAndDestroy(textBuf);
+        }
+    else
+        {
+        static_cast<CFepLayoutMultiLineIcf*>
+                    (Control(EPeninputWindowCtrlIdMultiLineICF))->SetPromptTextL(KNullDesC);
+        }
+
+    CleanupStack::PopAndDestroy(dataBuf);
+      CleanupStack::PopAndDestroy(&readStream);
+    }    
+
+void CPeninputVkbKrWindow::SetSwitchlistSecretFlag(TBool aSecret)
+    {
+    static_cast<CPeninputLayoutInputmodelChoice*>
+            (Control(EPeninutWindowCtrlIdSwitcherPopupWindow))->SetSecretEditor(aSecret);    
+    //disable or enable arrow keys of FSQ in secret editor.     
+    }
+
+void CPeninputVkbKrWindow::DimArrowKeys( TBool aDimArrow )
+    {
+    if(iLayoutContext->LayoutType() == EPluginInputModeFSQ 
+       && iArrowLeftButton && iArrowRightButton)
+        {
+        iArrowLeftButton->SetDimmed( aDimArrow );
+        iArrowRightButton->SetDimmed( aDimArrow );
+        }           
+    }
+
+void CPeninputVkbKrWindow::ShowBubble(TInt aShow)
+    {
+    if (aShow > 0)
+        {
+        iVkbCtrl->ShowBubble(ETrue);    
+        }
+    else
+        {
+        iVkbCtrl->ShowBubble(EFalse);     
+        }
+    }
+
+void CPeninputVkbKrWindow::PreProcessRange(const TInt& aRange)
+    {
+    CAknFepCtrlMultiModeButton* ctrlShift=
+        (CAknFepCtrlMultiModeButton*)ControlById(EPeninutWindowCtrlIdShiftBtn);
+    if (aRange==ERangeSymbol)
+        {
+        TRAP_IGNORE( FakeClientLayoutUpdateL());
+        ctrlShift->SetDimmed(ETrue);
+        }
+    else
+        {
+        ctrlShift->SetDimmed(EFalse);
+        }
+    }
+
+void CPeninputVkbKrWindow::UpdateLafData()
+    {
+    TRAP_IGNORE( iLafMgr->UpdateLafDataL() );
+    }