/*
* 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:  drop-down list control
*
*/


#include <PtiEngine.h>
#include <coemain.h>
#include <AknUtils.h>
#include <peninputgeneralitutnew.rsg>
#include <peninputitutconfig_chinese.rsg>
#include <peninputitutconfig_latin.rsg>
#include <peninputitutconfig_korean.rsg>
#include <peninputitutconfig_hebrew.rsg>
#include <peninputitutconfig_farsi.rsg>
#include <AknFepGlobalEnums.h>
#include <eikon.hrh>
#include <bautils.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <peninputlayoutmultilineicf.h>
#include <AknSettingCache.h>
#include <AknFepInternalCRKeys.h>
#include <centralrepository.h>
#include <featmgr.h> 

#include "peninputgenericitutdatamgr.h"
#include "peninputgenericitutlayoutcontext.h"
#include "peninputgenericitutconverter.h"
#include "peninputgenericitutcustomization.h"
#include "peninputgenericitutwindowmanager.h"

#define LAF_MODIFY 1
_LIT(KItutCommonResFile, "z:\\resource\\plugins\\peninputgeneralitutnew.rsc");
_LIT(KConfigResourceFile, 
     "z:\\resource\\plugins\\peninputitutconfig_");
_LIT(KResourceFileExtName, ".rsc");

_LIT(KAvkonResourceFile, "z:\\resource\\avkon.rsc");
     
const TInt KOnePageCandidateCount = 40;
const TInt KMaxPredictCandCnt = 250;
const TInt KInvalidResId = -1;
const TInt KInvalidImMode = -1;
const TInt KInvalidIndex = -1;
const TUint16 KPlusChar = '+';

// For virtual ITUT candidate list in landscape mode. No reason
const TInt KCandsAdjustment = 7;


CGenericItutDataMgr* CGenericItutDataMgr::NewL(MItutLayoutContext* aLayoutContext, 
                                               CPtiEngine* aPtiEngine)
    {
    CGenericItutDataMgr* self = new (ELeave) CGenericItutDataMgr(aLayoutContext, aPtiEngine);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);//self
    return self;
    }

void CGenericItutDataMgr::ClearChnCandidates(TInt aCmd)
    {
    switch (aCmd)
        {
        case EItutCandidates:
            {
            iCandidates.ResetAndDestroy();
            iCandidates.Close();
            }
            break;
        case EItutPuncCandidates:
            {
            iPuncCandidates.ResetAndDestroy();
            iPuncCandidates.Close();
            }
            break;
        default:
            break;
        }
    }

CGenericItutDataMgr::~CGenericItutDataMgr()
    {
    iSubscriberList.Close();  

    iMenuItemList.ResetAndDestroy();
    
    CCoeEnv::Static()->DeleteResourceFile(iAvkonResId);
        
    CCoeEnv::Static()->DeleteResourceFile(iCommonResId);
    
    // Remove the resource file of current input language
    if ( iConfigResId )
        {
        CCoeEnv::Static()->DeleteResourceFile( iConfigResId );
        }
    
    // Remove the resource file of some special controls
    if ( iSpecialResId )
        {
        CCoeEnv::Static()->DeleteResourceFile( iSpecialResId );
        }

    ClearChnCandidates(EItutCandidates);
    ClearChnCandidates(EItutPuncCandidates);

    iKeypadCellRects.Close();
    iKeypadCellRectsCn.Close();
    iKeypadCellRectsQuery.Close(); 
    iKeypadCellRectsForPrtWest.Close();
    delete iNumericKeymapData;
    }

void CGenericItutDataMgr::ConstructL()
    {
    // initialize layout info of controls and layout
    ReadLafInfo();

    TFileName resourceCommonName(KItutCommonResFile);
    CCoeEnv* coeEnv = CCoeEnv::Static();
    BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resourceCommonName);
    iCommonResId = coeEnv->AddResourceFileL(resourceCommonName);
    
    TFileName resourceAvkonName(KAvkonResourceFile);
    BaflUtils::NearestLanguageFile(coeEnv->FsSession(), resourceAvkonName);
    iAvkonResId = coeEnv->AddResourceFileL(resourceAvkonName);
    
    TResourceReader reader;
    CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AVKON_TOUCH_INDICATOR_EDIT_MODE_MENU);
        
    const TInt count=reader.ReadInt16();
    for ( TInt ii=0; ii<count; ++ii )
        {
        TMenuItem* item = new (ELeave) TMenuItem();
        CleanupStack::PushL( item );
        item->iCommand = reader.ReadInt32();
        reader.ReadInt32();
        reader.ReadInt32();
        item->iText =  reader.ReadTPtrC();
        reader.ReadTPtrC();
        reader.ReadTPtrC();
        reader.ReadInt16();
        reader.ReadInt16();
        CleanupStack::Pop(); // pop first, since additem pushes again
        iMenuItemList.Append( item );
        reader.ReadInt32(); // extension link
        }        
    CleanupStack::PopAndDestroy(); //reader

    // There are some special controls in Chinese and Korean VITUT,
    // and these controls are hidden when changing to other input language, 
    // so related resource file should be in control environment at all times.
    // Otherwise crash happens when reading resource for them sometime. 
    // For example: If writing language is Chinese, enters spell mode,
    // then switches theme, crash happens. 
    if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) ||
            FeatureManager::FeatureSupported( KFeatureIdKorean ) )
        {
        TFileName  resourceFilename( KConfigResourceFile ) ;
        if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
            {
            // Chinese variant
            resourceFilename.Append( ResFileExtByScriptIdx( EChnExt ) );
            }
        else
            {
            // Korean variant
            resourceFilename.Append( ResFileExtByScriptIdx( EHangulExt ) );
            }
        resourceFilename.Append(KResourceFileExtName);
        
        BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFilename );
        iSpecialResId = coeEnv->AddResourceFileL( resourceFilename );        
        }
    }

CGenericItutDataMgr::TMenuItem* CGenericItutDataMgr::GetMenuItem(TInt aCommand)
    {
    for (TInt i=0;i<iMenuItemList.Count();i++)
        {
        if ( iMenuItemList[i]->iCommand == aCommand )
            return iMenuItemList[i];
        }
    return NULL;
    }
    
void CGenericItutDataMgr::AddSubscriber(MItutPropertySubscriber* aSubscriber)
    {
    if (aSubscriber)
        {
        const TInt index = iSubscriberList.Find(aSubscriber);

        if (index == KErrNotFound)
            {
            iSubscriberList.Append(aSubscriber);
            }
        }
    }

void CGenericItutDataMgr::ReadLafInfoForPrtWest()
	{
	// Screen
	TRect rect;

	rect = AknLayoutScalable_Avkon::application_window(0).LayoutLine().Rect();

	TAknWindowLineLayout mainWnd, bottomWnd, bottomPane;
	TAknLayoutRect mainWndRect, bottomwndtrect, bottompanerect;

	mainWnd = AknLayoutScalable_Avkon::main_fep_vtchi_ss_pane(0).LayoutLine();
	mainWndRect.LayoutRect(rect, mainWnd);
	
	bottomWnd = AknLayoutScalable_Avkon::popup_fep_ituss_window(0).LayoutLine();    
	bottomwndtrect.LayoutRect(mainWndRect.Rect(), bottomWnd);

	bottomPane = AknLayoutScalable_Avkon::ituss_keypad_pane(0).LayoutLine();
	bottompanerect.LayoutRect(bottomwndtrect.Rect(), bottomPane);   
	
	iLayoutRectForPrtWest = mainWndRect.Rect();
	iLayoutOffsetForPrtWest = mainWndRect.Rect().iTl;

	// ICF
	TAknWindowLineLayout icflayout, icflayoutbg, icflayoutpane;
	TAknLayoutRect icfRect, icfRectBg, icfRectPane;
	
	icflayoutpane = AknLayoutScalable_Avkon::popup_fep_vtchi_icf_pane(0).LayoutLine();
	icfRectPane.LayoutRect( mainWndRect.Rect(), icflayoutpane );
	
	icflayoutbg = AknLayoutScalable_Avkon::bg_icf_pane_cp01(0).LayoutLine();
	icfRectBg.LayoutRect( icfRectPane.Rect(), icflayoutbg );
	
	icflayout = AknLayoutScalable_Avkon::vtchi_icf_list_pane(0).LayoutLine();
	icfRect.LayoutRect( icfRectBg.Rect(), icflayout );
	
	iIcfRectForPrtWest = icfRect.Rect();
	
	// icf indicator
	TAknWindowLineLayout icfIndiPaneWithText, icfIndiPaneWithoutText, 
		indiIconWithText, indiIconWithoutText;
	TAknLayoutRect icfIndiPaneRectWithText, icfIndiPaneRectWithoutText, 
		indiIconRectWithText, indiIconRectWithoutText;
	TAknTextLineLayout indiTextLayout;
	
	icfIndiPaneWithText = AknLayoutScalable_Avkon::icf_edit_indi_pane(1).LayoutLine();
	icfIndiPaneRectWithText.LayoutRect(icfRect.Rect(), icfIndiPaneWithText);
	iIndiPaneRectWithTextForPrtWest = icfIndiPaneRectWithText.Rect();
	
	icfIndiPaneWithoutText = AknLayoutScalable_Avkon::icf_edit_indi_pane(0).LayoutLine();
	icfIndiPaneRectWithoutText.LayoutRect(icfRect.Rect(), icfIndiPaneWithoutText);
	iIndiPaneRectWithoutTextForPrtWest = icfIndiPaneRectWithoutText.Rect();
	
	indiIconWithText = AknLayoutScalable_Avkon::icf_edit_indi_pane_g2(1).LayoutLine();
	indiIconRectWithText.LayoutRect( icfIndiPaneRectWithText.Rect(), indiIconWithText );
	iIndiIconRectWithTextForPrtWest = indiIconRectWithText.Rect();
	
	indiIconWithoutText = AknLayoutScalable_Avkon::icf_edit_indi_pane_g2(0).LayoutLine();
	indiIconRectWithoutText.LayoutRect( 
			icfIndiPaneRectWithoutText.Rect(), indiIconWithoutText );
	iIndiIconRectWithoutTextForPrtWest = indiIconRectWithoutText.Rect();
	
	indiTextLayout = AknLayoutScalable_Avkon::icf_edit_indi_pane_t1(0).LayoutLine();
	iIndiTextForPrtWest = indiTextLayout;
	
	// icf text
	TAknTextLineLayout icflefttext, icflefttext1; 
	icflefttext = AknLayoutScalable_Avkon::vtchi_icf_list_pane_t1(0, 0, 0).LayoutLine();
	icflefttext1 = AknLayoutScalable_Avkon::vtchi_icf_list_pane_t1(0, 0, 1).LayoutLine();

	iIcfTextAlignmentForPrtWest = icflefttext.iJ;
	iIcfTextLeftMarginForPrtWest = icflefttext.il;
	//iIcfTextRightMarginForPrtWest = icflefttext.ir;
	iIcfTextRightMarginForPrtWest = iIcfTextLeftMarginForPrtWest;
	    
	TAknLayoutText ctxt, ctxt1;
	ctxt.LayoutText( icfRect.Rect(), icflefttext );
	ctxt1.LayoutText( icfRect.Rect(), icflefttext1 );
	    
	iIcfTextTopMarginForPrtWest = ctxt.TextRect().iTl.iY - icfRect.Rect().iTl.iY;
	iIcfTextLineSpaceMarginForPrtWest = ctxt1.TextRect().iTl.iY - ctxt.TextRect().iBr.iY;
	iIcfTextHeightForPrtWest = ctxt.TextRect().Height();
	
	TInt maxRow = ( iIcfRectForPrtWest.Height() - iIcfTextTopMarginForPrtWest ) 
        / ( iIcfTextHeightForPrtWest + iIcfTextLineSpaceMarginForPrtWest );
	
	iIcfTextBottomMarginForPrtWest = 
        iIcfRectForPrtWest.Height() - ( iIcfTextHeightForPrtWest + iIcfTextLineSpaceMarginForPrtWest ) 
        * maxRow - iIcfTextTopMarginForPrtWest;
	    
	iIcfFontForPrtWest = const_cast<CFont*>(AknLayoutUtils::FontFromId(icflefttext.iFont, NULL));	
	
	// Keypad
	TAknWindowLineLayout itucell, ituinnercell;
	TAknLayoutRect itucellrect, ituinnercellrect;
   
	iKeypadCellRectsForPrtWest.Reset();

	itucell = AknLayoutScalable_Avkon::cell_ituss_key_pane(0).LayoutLine();           
	itucellrect.LayoutRect(bottompanerect.Rect(), itucell);
	ituinnercell = AknLayoutScalable_Avkon::bg_cell_ituss_key_g1(1).LayoutLine();
	
	iKeypadRectForPrtWest = bottompanerect.Rect();
	iKeypadRectForPrtWest.SetHeight(itucellrect.Rect().Height() * 4);
	iKeypadRectForPrtWest.Move(-iLayoutOffsetForPrtWest); 
	
	TRect cellrect = itucellrect.Rect();
	cellrect.Move(-iLayoutOffsetForPrtWest);
	cellrect.Move(-iKeypadRectForPrtWest.iTl);
	   
	// keypad is 4 rows, 3 cols
	for (TInt i = 0; i < 4; i++)
		{
		for (TInt j = 0; j < 3; j++)
			{
			TRect keyrect = cellrect;
			keyrect.Move(itucellrect.Rect().Width() * j, itucellrect.Rect().Height() * i);

			ituinnercellrect.LayoutRect(keyrect, ituinnercell);
			iKeypadCellRectsForPrtWest.Append(ituinnercellrect.Rect());
			
			// read shift icon rect
			if( i == 3 &&  j == 2 )
				{
				TAknWindowLineLayout shiftIcon =  AknLayoutScalable_Avkon::
								cell_ituss_key_pane_g2( 0 ).LayoutLine();
				TAknLayoutRect shiftIconRect;
				shiftIconRect.LayoutRect( keyrect, shiftIcon );                
				iShiftIconRectForPrtWest = shiftIconRect.Rect();          
				}    

			// read star icon rect
			if( i == 3 &&  j == 0 )
				{
				TAknWindowLineLayout starIcon =  AknLayoutScalable_Avkon::
								cell_ituss_key_pane_g2( 0 ).LayoutLine();
				TAknLayoutRect starIconRect;
				starIconRect.LayoutRect( keyrect, starIcon );                
				iStarIconRectForPrtWest = starIconRect.Rect();          
				}			
			
			}
		} 
	 

	// Num text row
	iVkBigNumTextForPrtWest = AknLayoutScalable_Avkon::cell_ituss_key_t1(4).LayoutLine(); 
	iVkNumTextForPrtWest = AknLayoutScalable_Avkon::cell_ituss_key_t1(1).LayoutLine();
	
	// Key text row 1                               
	iVkAlphaText1ForPrtWest = AknLayoutScalable_Avkon::cell_ituss_key_t2(1).LayoutLine();
	// Key text row 3
	iVkAlphaText3ForPrtWest = AknLayoutScalable_Avkon::cell_ituss_key_t4(1).LayoutLine();
	// Key text row 2                               
	iVkAlphaText2ForPrtWest = AknLayoutScalable_Avkon::cell_ituss_key_t3(1).LayoutLine();
	
	// Plus for Numberic Only keypad
	iVkTextPlusForNumbericOnlyForPrtWest = 
			AknLayoutScalable_Avkon::cell_ituss_key_t5(0).LayoutLine();
	
	// close button
	TAknWindowLineLayout funcbtn, funcbtnbg, funcbtninner;
	TAknLayoutRect funcrect, funcbgrect, funcinnerrect, arrowleftinnerrect, arrowrightinnerrect;
	TAknLayoutRect optioninnerrect, backspaceinnerrect;
	
	funcbtn = AknLayoutScalable_Avkon::cell_ituss_key_pane(1).LayoutLine();
	funcrect.LayoutRect(bottompanerect.Rect(), funcbtn);
	
	funcbtnbg = AknLayoutScalable_Avkon::bg_cell_ituss_key_g1(1).LayoutLine();
	funcbgrect.LayoutRect(funcrect.Rect(), funcbtnbg);
	
	funcbtninner = AknLayoutScalable_Avkon::cell_ituss_key_pane_g1(0).LayoutLine();
	funcinnerrect.LayoutRect(funcrect.Rect(), funcbtninner);
	
	TInt btnWidth = funcrect.Rect().Width();
	// close button
	iCloseRectForPrtWest = funcbgrect.Rect();
	iCloseRectForPrtWest.Move(0, funcrect.Rect().Height() * 4);
	iCloseRectForPrtWest.Move(-iLayoutOffsetForPrtWest);

	iCloseInnerRectForPrtWest = funcinnerrect.Rect();
	iCloseInnerRectForPrtWest.Move(0, funcrect.Rect().Height() * 4);
	iCloseInnerRectForPrtWest.Move(-iLayoutOffsetForPrtWest);
	
	// arrow left button
	iArrowLeftRectForPrtWest = iCloseRectForPrtWest;     
	iArrowLeftRectForPrtWest.Move(btnWidth, 0);
	arrowleftinnerrect.LayoutRect(iArrowLeftRectForPrtWest, funcbtninner);
	iArrowLeftInnerRectForPrtWest = arrowleftinnerrect.Rect();
	
	// option button
	iOptionsRectForPrtWest = iArrowLeftRectForPrtWest;
	iOptionsRectForPrtWest.Move(btnWidth, 0);    
	optioninnerrect.LayoutRect(iOptionsRectForPrtWest, funcbtninner);
	iOptionInnerRectForPrtWest = optioninnerrect.Rect();
	
	// arrow right button
	iArrowRightRectForPrtWest = iOptionsRectForPrtWest;
	iArrowRightRectForPrtWest.Move(btnWidth, 0);    
	arrowrightinnerrect.LayoutRect(iArrowRightRectForPrtWest, funcbtninner);
	iArrowRightInnerRectForPrtWest = arrowrightinnerrect.Rect();
	
	// backspace button
	iBackspaceRectForPrtWest = iArrowRightRectForPrtWest;
	iBackspaceRectForPrtWest.Move(btnWidth, 0);  
	backspaceinnerrect.LayoutRect(iBackspaceRectForPrtWest, funcbtninner);
	iBackspaceInnerRectForPrtWest = backspaceinnerrect.Rect();

	// preview popup window 
	TAknWindowLineLayout previewWnd, previewBackground, previewWndInner;
	TAknLayoutRect previewWndRect, previewBackgroundRect, previewWndInnerRect;
	TAknLayoutText previewWndText;
	previewWnd = AknLayoutScalable_Avkon::popup_fshwr2_char_preview_window(0).LayoutLine(); 
				
	previewWndRect.LayoutRect( iLayoutRectForPrtWest, previewWnd );
	previewBackground = AknLayoutScalable_Avkon::bg_popup_fep_char_preview_window_cp01().LayoutLine();
	previewBackgroundRect.LayoutRect( previewWndRect.Rect(), previewBackground );
	iPreviewWndRectForPrtWest = previewBackgroundRect.Rect();
	
	previewWndInner = AknLayoutScalable_Avkon::bg_popup_fep_char_preview_window_g9().LayoutLine();
	previewWndInnerRect.LayoutRect( previewBackgroundRect.Rect(), previewWndInner );
	
	iPreviewWndInnerRectForPrtWest = previewWndInnerRect.Rect();
	iPreviewWndTextForPrtWest = 
		AknLayoutScalable_Avkon::popup_fshwr2_char_preview_window_t1(0).LayoutLine();
	previewWndText.LayoutText(previewWndRect.Rect(), iPreviewWndTextForPrtWest);
	iBubbleFontForPrtWest = const_cast<CFont*>(previewWndText.Font());	
	
	// LAF for spell mode
	TAknWindowLineLayout spellwnd;
	TAknLayoutRect okBtnRect, cancelBtnRect, spellwndtrect;
	
	iSpellQueryPaneRectForPrtWest = mainWndRect.Rect();
	
    spellwnd = AknLayoutScalable_Avkon::popup_fep_ituss_window(1).LayoutLine();
    spellwndtrect.LayoutRect( mainWndRect.Rect(), spellwnd ); 
	
	TAknWindowLineLayout queryTopPane, queryICFPane, icfSpellIndiPane, 
		middleInnerBtn, middleBtn, bottomInnerBtn;
	TAknLayoutRect queryTopPaneRect, queryICFPaneRect, icfSpellIndiPaneRect, 
		bottomButton, bottomInnerRect, middleBtnRect;
	
	queryTopPane = AknLayoutScalable_Avkon::popup_fep_vtchi_icf_pane(1).LayoutLine();
	queryTopPaneRect.LayoutRect( mainWndRect.Rect(), queryTopPane );
	
	queryICFPane = AknLayoutScalable_Avkon::vtchi_query_pane(0).LayoutLine();
	queryICFPaneRect.LayoutRect( queryTopPaneRect.Rect(), queryICFPane );
	iSpellICFRectForPrtWest = queryICFPaneRect.Rect();
	
	// Middle pane
	TRect middleButtonPaneRect = spellwndtrect.Rect();
	TInt leftMargin = itucellrect.Rect().iTl.iX;
	middleButtonPaneRect.Move( leftMargin, 0 );
	
	middleBtn = AknLayoutScalable_Avkon::cell_ituss_key_pane(3).LayoutLine();
	middleBtnRect.LayoutRect( bottompanerect.Rect(), middleBtn );
	middleInnerBtn = AknLayoutScalable_Avkon::bg_cell_ituss_key_g1(5).LayoutLine();
	
	TRect cellMiddleRect;
	cellMiddleRect.iTl = middleButtonPaneRect.iTl;
	cellMiddleRect.SetHeight( middleBtnRect.Rect().Height());
	cellMiddleRect.SetWidth( middleBtnRect.Rect().Width());
	
	// OK button
	okBtnRect.LayoutRect( cellMiddleRect, middleInnerBtn );
	iOKRectForPrtWest = okBtnRect.Rect();
	
	// Cancel button
	cellMiddleRect.Move( middleBtnRect.Rect().Width(), 0 );
	
	cancelBtnRect.LayoutRect( cellMiddleRect, middleInnerBtn );
	iCancelRectForPrtWest = cancelBtnRect.Rect();
	
	iBtnOKTextForPrtWest = AknLayoutScalable_Avkon::ituss_sks_pane_t1(0).LayoutLine();
	iBtnCancelTextForPrtWest = AknLayoutScalable_Avkon::ituss_sks_pane_t2(0).LayoutLine();
	
	iBtnOKTextForPrtWest.ir = 7;
	iBtnCancelTextForPrtWest.ir = 7;
	
	iBtnCancelTextForPrtWest = iBtnOKTextForPrtWest;
	
	// Bottom pane
	TRect cellSpellRect;
	cellSpellRect.iTl.iX = middleButtonPaneRect.iTl.iX;
	cellSpellRect.iTl.iY = middleButtonPaneRect.iTl.iY + 
			itucellrect.Rect().Height() * 5;
	cellSpellRect.SetHeight( itucellrect.Rect().Height());
	cellSpellRect.SetWidth( itucellrect.Rect().Width());
		
	// Left
	bottomButton.LayoutRect( cellSpellRect, ituinnercell );
	iSpellArrowLeftRectForPrtWest = bottomButton.Rect();
	
	bottomInnerBtn = AknLayoutScalable_Avkon::cell_ituss_key_pane_g1(2).LayoutLine();
	bottomInnerRect.LayoutRect( bottomButton.Rect(), bottomInnerBtn );
	iSpellArrowLeftInnerRectForPrtWest = bottomInnerRect.Rect();
	
	// Right
	cellSpellRect.Move( itucellrect.Rect().Width(), 0 );
	bottomButton.LayoutRect( cellSpellRect, ituinnercell );
	iSpellArrowRightRectForPrtWest = bottomButton.Rect();
	
	bottomInnerRect.LayoutRect( bottomButton.Rect(), bottomInnerBtn );
	iSpellArrowRightInnerRectForPrtWest = bottomInnerRect.Rect();
	
	// BackSpace
	cellSpellRect.Move( itucellrect.Rect().Width(), 0 );
	bottomButton.LayoutRect( cellSpellRect, ituinnercell );
	iSpellICFBtnRectForPrtWest = bottomButton.Rect();
	
	bottomInnerRect.LayoutRect( bottomButton.Rect(), bottomInnerBtn );
	iSpellICFBtnInnerRectForPrtWest = bottomInnerRect.Rect();
	
	//iSpellText1ForPrtWest = AknLayoutScalable_Avkon::vtchi_query_pane_t1(0).LayoutLine();
	iSpellText1ForPrtWest = AknLayoutScalable_Avkon::vtchi_icf_list_pane_t1(0, 0, 0).LayoutLine();
	//iSpellText2ForPrtWest = AknLayoutScalable_Avkon::vtchi_query_pane_t2(0).LayoutLine();
	iSpellText2ForPrtWest = AknLayoutScalable_Avkon::vtchi_icf_list_pane_t1(0, 0, 1).LayoutLine();
	iSpellText3ForPrtWest = AknLayoutScalable_Avkon::vtchi_query_pane_t3(0).LayoutLine();
	
	iSpellIcfTextLeftMarginForPrtWest = iSpellText1ForPrtWest.il;
	iSpellIcfTextRightMarginForPrtWest = iSpellIcfTextLeftMarginForPrtWest;
	
	iSpellIcfFontForPrtWest = const_cast<CFont*>(
	        AknLayoutUtils::FontFromId(iSpellText1ForPrtWest.iFont, NULL));
	
	TAknLayoutText cSpelltxt1, cSpelltxt2;
	cSpelltxt1.LayoutText( queryICFPaneRect.Rect(), iSpellText1ForPrtWest );
	cSpelltxt2.LayoutText( queryICFPaneRect.Rect(), iSpellText2ForPrtWest );
	
	iSpellIcfTextTopMarginForPrtWest = 
			cSpelltxt1.TextRect().iTl.iY - queryICFPaneRect.Rect().iTl.iY;
	
	iSpellIcfTextLineSpaceMarginForPrtWest = 
			cSpelltxt2.TextRect().iTl.iY - cSpelltxt1.TextRect().iBr.iY;
	
	iSpellIcfTextHeightForPrtWest = cSpelltxt1.TextRect().Height();
	
	TInt maxSpellRow = ( iSpellICFRectForPrtWest.Height() - iSpellIcfTextTopMarginForPrtWest ) 
	        / ( iSpellIcfTextHeightForPrtWest + iSpellIcfTextLineSpaceMarginForPrtWest );
	
	iSpellIcfTextBottomMarginForPrtWest = 
			iSpellICFRectForPrtWest.Height() - 
			( iSpellIcfTextHeightForPrtWest + iSpellIcfTextLineSpaceMarginForPrtWest ) 
	        * maxSpellRow - iSpellIcfTextTopMarginForPrtWest;
	
	icfSpellIndiPane = AknLayoutScalable_Avkon::icf_edit_indi_pane(0).LayoutLine();
	icfSpellIndiPaneRect.LayoutRect(queryICFPaneRect.Rect(), icfSpellIndiPane);
	iSpellIndiPaneWithoutTextForPrtWest = icfSpellIndiPaneRect.Rect();
	
	TAknWindowLineLayout spellIndiIcon;
	TAknLayoutRect spellIndiIconRect;
	spellIndiIcon = AknLayoutScalable_Avkon::icf_edit_indi_pane_g2(0).LayoutLine();
	spellIndiIconRect.LayoutRect( icfSpellIndiPaneRect.Rect(), spellIndiIcon );
	iSpellIndiIconWithoutTextForPrtWest = spellIndiIconRect.Rect();
	}

void CGenericItutDataMgr::ReadLafInfo()
    {
    // Screen
    TRect rect, rectcn;
    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, rect);
    iScreenSize = rect.Size();

    iLandScape = iScreenSize.iWidth < iScreenSize.iHeight ? EFalse : ETrue;

    ReadLafInfoForPrtWest();
    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EApplicationWindow, rect);

    // finger Layout
    TAknWindowLineLayout vitulayout;
    TAknLayoutRect viturect;

    if (iLandScape)
        {
        vitulayout = AknLayoutScalable_Apps::popup_vitu2_window(1).LayoutLine();
        }
    else
        {
        vitulayout = AknLayoutScalable_Apps::popup_vitu2_window(0).LayoutLine();
        }
    
    viturect.LayoutRect(rect, vitulayout);

    iLayoutRect = viturect.Rect();
    iLayoutOffset = iLayoutRect.iTl;

    // ICF & Keypad
    TAknWindowLineLayout icflayoutlatin, icflayoutcn,itukeypad, itucell,icflayoutbgcn;
    TAknTextLineLayout icflefttext;    
    TAknTextLineLayout icflefttext1, icflefttext2, icflefttext3; 
    TAknLayoutRect icfrectlatin, icfrectcn, itukeypadrect, itucellrect,icfrectcnbg;

    if (iLandScape)
        {
        icflayoutlatin = AknLayoutScalable_Apps::field_vitu2_entry_pane(1).LayoutLine();
        icflayoutcn = AknLayoutScalable_Apps::field_vitu2_entry_pane(3).LayoutLine();
        }
    else
        {
        icflayoutlatin = AknLayoutScalable_Apps::field_vitu2_entry_pane(0).LayoutLine();
        icflayoutcn = AknLayoutScalable_Apps::field_vitu2_entry_pane(2).LayoutLine();
        }

    icfrectlatin.LayoutRect(viturect.Rect(), icflayoutlatin);
    icflayoutbgcn = AknLayoutScalable_Apps::bg_popup_call_pane_cp08(0).LayoutLine();
    icfrectcn.LayoutRect(viturect.Rect(), icflayoutcn);
    icfrectcnbg.LayoutRect(icfrectcn.Rect(),icflayoutbgcn);
	
    TAknLayoutScalableParameterLimits entryPaneVariety = 
                AknLayoutScalable_Apps::field_vitu2_entry_pane_t1_ParamLimits(2);
    // Calc the max row number
    TInt maxRow = entryPaneVariety.LastRow();
    
    // latin ICF layout
    icflefttext = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(2, 0, 0).LayoutLine();
    icflefttext1 = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(2, 0, 1).LayoutLine();
    icflefttext2 = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(2, 0, 2).LayoutLine();
    icflefttext3 = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(2, 0, maxRow).LayoutLine();

    iIcfTextAlignment = icflefttext.iJ;
    iIcfTextLeftMargin = icflefttext.il;
    iIcfTextRightMargin = icflefttext.ir;
    
    TAknLayoutText ctxt, ctxt1, ctxt2, ctxt3;
    ctxt.LayoutText( icfrectlatin.Rect(), icflefttext );
    ctxt1.LayoutText( icfrectlatin.Rect(), icflefttext1 );
    ctxt2.LayoutText( icfrectlatin.Rect(), icflefttext2 );
    ctxt3.LayoutText( icfrectlatin.Rect(), icflefttext3 );

    
    iIcfTextTopMargin = ctxt.TextRect().iTl.iY - icfrectlatin.Rect().iTl.iY;
    iIcfTextLineSpaceMargin = ctxt1.TextRect().iTl.iY - ctxt.TextRect().iBr.iY;
    iIcfTextBottomMargin = icfrectlatin.Rect().iBr.iY - ctxt3.TextRect().iBr.iY 
                                                      - iIcfTextLineSpaceMargin;  
    iIcfTextHeight = ctxt.TextRect().Height();
    
    iIcfFont = const_cast<CFont*>(AknLayoutUtils::FontFromId(icflefttext.iFont, NULL));
    
    // chinese ICF layout
   	entryPaneVariety = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1_ParamLimits(0);
    // Calc the max row number
   	maxRow = entryPaneVariety.LastRow();
    icflefttext = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(0, 0, 0).LayoutLine();
    icflefttext1 = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(0, 0, 1).LayoutLine();
    icflefttext3 = AknLayoutScalable_Apps::field_vitu2_entry_pane_t1(0, 0, maxRow).LayoutLine();
    iIcfTextLeftMarginCn = icflefttext.il;
    iIcfTextRightMarginCn = icflefttext.ir;
    
    ctxt.LayoutText( icfrectcn.Rect(), icflefttext );
    ctxt1.LayoutText( icfrectcn.Rect(), icflefttext1 );
    ctxt3.LayoutText( icfrectcn.Rect(), icflefttext3 );
	
    TInt topOffset = icfrectcnbg.Rect().iTl.iY - icfrectcn.Rect().iTl.iY;
    iIcfTextTopMarginCn = ctxt.TextRect().iTl.iY - icfrectcn.Rect().iTl.iY - topOffset;
    iIcfTextLineSpaceMarginCn = ctxt1.TextRect().iTl.iY - ctxt.TextRect().iBr.iY;
    iIcfTextBottomMarginCn = icfrectcn.Rect().iBr.iY - ctxt3.TextRect().iBr.iY 
                                                     - iIcfTextLineSpaceMarginCn;
    iIcfTextHeightCn = ctxt.TextRect().Height();    
 	
    iIcfFontCn = const_cast<CFont*>(AknLayoutUtils::FontFromId(icflefttext.iFont, NULL));

    rect = icfrectlatin.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    iIcfWesRect = rect;
	
    rect = icfrectcnbg.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    iIcfChnRect = rect;
    //iIcfChnRect.iTl.iY += 10;
//#ifdef LAF_MODIFY
    //if(IsChinese())
//        {
//        iIcfChnRect.Move(0,-iIcfChnRect.iTl.iY + 14);
//        }
//#endif

    // Keypad
    TInt keypadvariety = iLandScape ? 1 : 0;
    itukeypad = AknLayoutScalable_Apps::grid_vitu2_itu_pane(keypadvariety).LayoutLine();
    itukeypadrect.LayoutRect(viturect.Rect(), itukeypad);
    iKeypadRect = itukeypadrect.Rect();
    iKeypadRect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    
    TInt cnParam  = iLandScape ? 3 : 2;    
    itukeypad = AknLayoutScalable_Apps::grid_vitu2_itu_pane(cnParam).LayoutLine();
    itukeypadrect.LayoutRect(viturect.Rect(), itukeypad);
    iKeypadRectCn = itukeypadrect.Rect();
    iKeypadRectCn.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);

    TInt queryParam  = iLandScape ? 5 : 4;    
    itukeypad = AknLayoutScalable_Apps::grid_vitu2_itu_pane(queryParam).LayoutLine();
    itukeypadrect.LayoutRect(viturect.Rect(), itukeypad);
    iKeypadRectQuery = itukeypadrect.Rect();
    iKeypadRectQuery.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);

    iKeypadCellRects.Reset();
    iKeypadCellRectsCn.Reset();
    iKeypadCellRectsQuery.Reset();

    // keypad is 4 rows, 3 cols
    for (TInt i = 0; i < 4; i++)
        {
        for (TInt j = 0; j < 3; j++)
            {
            itucell = AknLayoutScalable_Apps::cell_vitu2_itu_pane(keypadvariety, 
                                                                  j, 
                                                                  i).LayoutLine();
            itucellrect.LayoutRect(iKeypadRect, itucell);
            TRect cellrect = itucellrect.Rect();
            cellrect.Move(-iKeypadRect.iTl.iX, -iKeypadRect.iTl.iY);
            iKeypadCellRects.Append(cellrect);
            
            // read shift icon rect
            if( i == 3 &&  j == 2 )
            	{
            	TAknWindowLineLayout shiftIcon =  AknLayoutScalable_Apps::
            					cell_vitu2_itu_pane_g1( keypadvariety ).LayoutLine();
            	TAknLayoutRect shiftIconRect;
            	shiftIconRect.LayoutRect( cellrect, shiftIcon );				
            	iShiftIconRect = shiftIconRect.Rect();			
            	}
            itucellrect.LayoutRect(iKeypadRectCn, itucell);
            cellrect = itucellrect.Rect();
            cellrect.Move(-iKeypadRectCn.iTl.iX, -iKeypadRectCn.iTl.iY);
            iKeypadCellRectsCn.Append(cellrect);
           
            itucellrect.LayoutRect(iKeypadRectQuery, itucell);
            cellrect = itucellrect.Rect();
            cellrect.Move(-iKeypadRectQuery.iTl.iX, -iKeypadRectQuery.iTl.iY);
            iKeypadCellRectsQuery.Append(cellrect);
            }
        }

    iVkNumText = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t1(4).LayoutLine() :
    						  AknLayoutScalable_Apps::cell_vitu2_itu_pane_t1(0).LayoutLine(); 
	// Key text row 1   						  	
    iVkAlphaText1 = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(2).LayoutLine() :
    					AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(0).LayoutLine();
    iVkAlphaText3 = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(3).LayoutLine() :
    					AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(1).LayoutLine();
	iVkAlphaText3.iJ = 3;   

    iVkAlphaText1ForThai = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t3(6).LayoutLine() :
                            AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(7).LayoutLine();
    iVkAlphaText3ForThai = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(10).LayoutLine() :
                        AknLayoutScalable_Apps::cell_vitu2_itu_pane_t2(8).LayoutLine();
    iVkAlphaText3ForThai.iJ = 3;
					   					    					
    // Key text row 2    						  	
    iVkAlphaText2 = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t3(1).LayoutLine() :
    					AknLayoutScalable_Apps::cell_vitu2_itu_pane_t3(0).LayoutLine();
    iVkAlphaText2.iJ = 3;
    
    iVkAlphaText2ForThai = iLandScape ? AknLayoutScalable_Apps::cell_vitu2_itu_pane_t3(6).LayoutLine() :
                        AknLayoutScalable_Apps::cell_vitu2_itu_pane_t3(5).LayoutLine();
    iVkAlphaText2ForThai.iJ = 3;
    
    // backspace and switch button
    TAknWindowLineLayout funcbtn, funcclr, funcswitch, funcinner, funcinnercn, funcleft, funcright;
    TAknWindowLineLayout funcswitchcn, funcleftcn, funcrightcn, funcclrcn;
    TAknWindowLineLayout funcind, funcindcn, funcindinner, funcbtncn, funccell;
    TAknLayoutRect funcbtnrect, funcclrrect, funcswitchrect, funcbtncnrect;
    TAknLayoutRect funcindrect, funcindrectinner, funcindcnrect, funccellrect;
    TAknLayoutRect funcinnerrect, funcinnerrectcn, funcleftrect, funcrightrect;
    TAknLayoutRect funcclrcnrect, funcleftcnrect, funcrightcnrect, funcswitchcnrect;
  
    
    if (iLandScape)
        {
        funcbtn = AknLayoutScalable_Apps::grid_vitu2_function_pane(1).LayoutLine();
        funcbtncn = AknLayoutScalable_Apps::grid_vitu2_function_pane(3).LayoutLine();
        }
    else
        {
        funcbtn = AknLayoutScalable_Apps::grid_vitu2_function_pane(0).LayoutLine();
        funcbtncn = AknLayoutScalable_Apps::grid_vitu2_function_pane(2).LayoutLine();
        }

    funcclr = AknLayoutScalable_Apps::cell_vitu2_function_pane(0, 3, 0).LayoutLine();
    funcswitch = AknLayoutScalable_Apps::cell_vitu2_function_pane(0, 0, 0).LayoutLine();

    funcinner = AknLayoutScalable_Apps::cell_vitu2_function_pane_g1(0).LayoutLine();

    funcbtnrect.LayoutRect(viturect.Rect(), funcbtn);
    funcbtncnrect.LayoutRect(viturect.Rect(), funcbtncn);
    rect = funcbtnrect.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    funcclrrect.LayoutRect(rect, funcclr);
    funcswitchrect.LayoutRect(rect, funcswitch);

    // left and right button
    funcleft = AknLayoutScalable_Apps::cell_vitu2_function_pane(0, 1, 0).LayoutLine();
    funcright = AknLayoutScalable_Apps::cell_vitu2_function_pane(0, 2, 0).LayoutLine();
    funcleftrect.LayoutRect(rect, funcleft);
    funcrightrect.LayoutRect(rect, funcright);
    iArrowLeftRect 	= funcleftrect.Rect();
    iArrowRightRect	= funcrightrect.Rect();
    funcinnerrect.LayoutRect(iArrowLeftRect, funcinner);
    iArrowLeftInnerRect = funcinnerrect.Rect();
    funcinnerrect.LayoutRect(iArrowRightRect, funcinner);
    iArrowRightInnerRect = funcinnerrect.Rect();

    // funcinnerrect
    iBackspaceRect = funcclrrect.Rect();
    funcinnerrect.LayoutRect(iBackspaceRect, funcinner);
    iBackspaceInnerRect = funcinnerrect.Rect();
    iSwitchRect = funcswitchrect.Rect();
    funcinnerrect.LayoutRect( iSwitchRect, funcinner );
    iSwitchInnerRect = funcinnerrect.Rect();

    // Cursor button in Chinese input mode
    rect = funcbtncnrect.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    funcinnercn = AknLayoutScalable_Apps::cell_vitu2_function_pane_g1(1).LayoutLine();
    // 1. left arrow
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 1, 0 ).LayoutLine();
    funccellrect.LayoutRect( rect, funccell );
    iArrowLeftCnRect = funccellrect.Rect();
    funcinnerrectcn.LayoutRect( funccellrect.Rect(), funcinnercn );
    iArrowLeftInnerCnRect = funcinnerrectcn.Rect();
    
    // 2, up arrow
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 0, 0 ).LayoutLine();
    funccellrect.LayoutRect( rect, funccell );
    iArrowUpRect = funccellrect.Rect();
    funcinnerrectcn.LayoutRect( funccellrect.Rect(), funcinnercn );
    iArrowUpInnerRect = funcinnerrectcn.Rect();
    
    // 3. right arrow
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 2, 0 ).LayoutLine();
    funccellrect.LayoutRect( rect, funccell );
    iArrowRightCnRect = funccellrect.Rect();
    funcinnerrectcn.LayoutRect( funccellrect.Rect(), funcinnercn );
    iArrowRightInnerCnRect = funcinnerrectcn.Rect();
    
    // 4. down arrow
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 0, 1 ).LayoutLine();
    funccellrect.LayoutRect( rect, funccell );
    iArrowDownRect = funccellrect.Rect();
    funcinnerrectcn.LayoutRect( funccellrect.Rect(), funcinnercn );
    iArrowDownInnerRect = funcinnerrectcn.Rect();
#ifdef LAF_MODIFY    
    //indicator bar rect
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 1, 1 ).LayoutLine();
    funccellrect.LayoutRect( rect, funccell );
    iImIndiOuterRectCn = funccellrect.Rect();
    funccell = AknLayoutScalable_Apps::cell_vitu2_function_pane( 1, 2, 1 ).LayoutLine();
    funccellrect.LayoutRect(rect,funccell);
    iImIndiOuterRectCn.iBr = funccellrect.Rect().iBr;    

    iImIndicatorChnRect	= iImIndiOuterRectCn;
    iImIndicatorChnRect.Shrink( 24, 12 );

#endif
    
	// candidate list
    TAknWindowLineLayout candlist, candlistpane, charpane, listctrl;
    TAknLayoutRect candlistrect, candlistpanerect, charpanerect1, charpanerect2;
    TAknLayoutRect charpanerect3, listctrlrect;
	
    if (iLandScape)
        {
		candlist = AknLayoutScalable_Apps::popup_vitu2_dropdown_list_window(1).
										LayoutLine();        
        }
    else
        {
       	candlist = AknLayoutScalable_Apps::popup_vitu2_dropdown_list_window(0).
										LayoutLine();
        }
    candlistrect.LayoutRect( viturect.Rect(), candlist );
    rect = candlistrect.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    candlistpane = AknLayoutScalable_Apps::grid_vitu2_dropdown_list_pane().
										LayoutLine();
    candlistpanerect.LayoutRect( rect, candlistpane );
	
    charpane = AknLayoutScalable_Apps::cell_vitu2_dropdown_list_char_pane( 0 , 0 , 0 ).
										LayoutLine();
    charpanerect1.LayoutRect( candlistpanerect.Rect(), charpane );
    charpane = AknLayoutScalable_Apps::cell_vitu2_dropdown_list_char_pane( 0 , 1 , 0 ).
										LayoutLine();
    charpanerect2.LayoutRect( candlistpanerect.Rect(), charpane );
    charpane = AknLayoutScalable_Apps::cell_vitu2_dropdown_list_char_pane( 0 , 0 , 1 ).
										LayoutLine();
    charpanerect3.LayoutRect( candlistpanerect.Rect(), charpane );
    listctrl = AknLayoutScalable_Apps::cell_vitu2_dropdown_list_ctrl_pane( 0, 0, 0 ).
										LayoutLine();
    listctrlrect.LayoutRect( candlistpanerect.Rect(), listctrl );
									
    iCandsHorizontalMargin = charpanerect2.Rect().iTl.iX - charpanerect1.Rect().iBr.iX;
    iCandsVerticalMargin = charpanerect3.Rect().iTl.iY - charpanerect1.Rect().iBr.iY;
    iCandsNaviWidth = listctrlrect.Rect().Width();
	
    iCandsUnitWidth = charpanerect1.Rect().Width();
    iCandsUnitHeight = charpanerect1.Rect().Height() ;
    
    iCandsSpinBtnHeight = listctrlrect.Rect().Height();
    
    TInt gapValue = ( iScreenSize.iWidth - ( 
    		iCandsUnitWidth + iCandsHorizontalMargin + KCandsAdjustment ) * 6 ) / 2;
    if ( gapValue < 0 )
    	{
		gapValue = 0;
    	}
    
    iCandsSpellLTPos = charpanerect1.Rect().iTl;
    iCandsSpellLTPos.iX = gapValue;
    iCandsLTPos = charpanerect3.Rect().iTl;
    iCandsLTPos.iX = gapValue;
    iCandsPuncLTPos = iCandsSpellLTPos;
    
    TAknTextLineLayout candstxtlayout = 
                     AknLayoutScalable_Apps::cell_vitu2_dropdown_list_char_pane_t1().LayoutLine();
    TAknLayoutText candstxt;
    candstxt.LayoutText( charpanerect1.Rect(), candstxtlayout );
    iCandsFont = const_cast<CFont*>( AknLayoutUtils::FontFromId( candstxtlayout.iFont, NULL ) );
    iCandsTextMargin = candstxt.TextRect().iTl.iX - charpanerect1.Rect().iTl.iX;
    iCandsTextColor = candstxt.Color();
    
    //extra adjustment
    // No reason to add the iCandsTextMargin and KCandsAdjustment
    iCandsUnitWidth += KCandsAdjustment;
    iCandsNaviWidth += iCandsTextMargin;
    
    TPtrC ptr(reinterpret_cast<TText*>(&iLandScape), sizeof(iLandScape)/sizeof(TText));
    NotifySubscriber(MItutPropertySubscriber::EItutPropertyLandscape, ptr);

    TSize spellSize( iCandsUnitWidth * 6 + iCandsHorizontalMargin * 7, iCandsUnitHeight );
    iSpellRect = TRect( iCandsSpellLTPos, spellSize );
    iSpellFont = const_cast<CFont*>( AknLayoutUtils::FontFromId( candstxtlayout.iFont, NULL ) );
    iSpellTextColor = candstxt.Color();
    

    
    // Navi buttons
    TAknWindowLineLayout toppane, toppanecn, btnup, btndown, btnopt, btncls, btnback;
    TAknLayoutRect toppanerect, toppanerectcn, btnuprect, btndownrect, 
                   btnoptrect, btnoptrectcn, btnclsrect, btnclsrectcn, btnbackrectcn;
    TAknWindowLineLayout upinner, downinner, optinner, clsinner;
    TAknLayoutRect upinrect, downinrect, optinrect, optinrectcn, clsinrect, clsinrectcn;	
    if (iLandScape)
        {
        toppane = AknLayoutScalable_Apps::grid_vitu2_function_top_pane(1).LayoutLine();
        toppanecn = AknLayoutScalable_Apps::grid_vitu2_function_top_pane(3).LayoutLine();
        }
    else
        {
        toppane = AknLayoutScalable_Apps::grid_vitu2_function_top_pane(0).LayoutLine();
        toppanecn = AknLayoutScalable_Apps::grid_vitu2_function_top_pane(2).LayoutLine();
        }	
    toppanerect.LayoutRect( viturect.Rect(), toppane );
    toppanerectcn.LayoutRect(viturect.Rect(), toppanecn);
    rect = toppanerect.Rect();
    rectcn = toppanerectcn.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    rectcn.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);
    
    // Chinese input mode
    funcswitchcn = AknLayoutScalable_Apps::cell_vitu2_function_top_pane( 0, 2, 0 ).LayoutLine();
    funcswitchcnrect.LayoutRect( rectcn, funcswitchcn );
    iSwitchCnRect = funcswitchcnrect.Rect();
    funcinnercn = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(0).LayoutLine();
    funcinnerrectcn.LayoutRect( funcswitchcnrect.Rect(), funcinnercn );
    iSwitchInnerCnRect = funcinnerrectcn.Rect();
    
    btnopt= AknLayoutScalable_Apps::cell_vitu2_function_top_pane( 0, 1, 0 ).LayoutLine();
    btnoptrect.LayoutRect( rect, btnopt );
    btnoptrectcn.LayoutRect(rectcn, btnopt);
    optinner = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(1).LayoutLine();
    optinrect.LayoutRect( btnoptrect.Rect(), optinner );
    optinner = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(0).LayoutLine();
    optinrectcn.LayoutRect(btnoptrectcn.Rect(), optinner);
    iOptionInnerRect = optinrect.Rect();
#ifdef LAF_MODIFY	
    iOptionInnerRectCn = optinrectcn.Rect();
#endif	
    btncls= AknLayoutScalable_Apps::cell_vitu2_function_top_pane( 0, 0, 0 ).LayoutLine();
    btnclsrect.LayoutRect( rect, btncls );
    btnclsrectcn.LayoutRect(rectcn, btncls);
    clsinner = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(1).LayoutLine();
    clsinrect.LayoutRect( btnclsrect.Rect(), clsinner );
    clsinner = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(0).LayoutLine();
    clsinrectcn.LayoutRect(btnclsrectcn.Rect(), clsinner);
    iCloseInnerRect = clsinrect.Rect();
#ifdef LAF_MODIFY	
    iCloseInnerRectCn = clsinrectcn.Rect();
#endif	
    btnback= AknLayoutScalable_Apps::cell_vitu2_function_top_pane( 0, 3, 0 ).LayoutLine();
    btnbackrectcn.LayoutRect(rectcn, btnback);
    iBackspaceCnRect = btnbackrectcn.Rect();
    funcinner = AknLayoutScalable_Apps::cell_vitu2_function_top_pane_g1(0).LayoutLine();
    funcinnerrect.LayoutRect( btnbackrectcn.Rect(), funcinner );
    iBackspaceInnerCnRect = funcinnerrect.Rect();
	
	
    iOptionsRect = btnoptrect.Rect();
    iOptionsRectCn = btnoptrectcn.Rect();
    iCloseRect = btnclsrect.Rect();
    iCloseRectCn = btnclsrectcn.Rect();

    // input mode indicator, should use laf data in the future
#ifndef LAF_MODIFY    
    funcindcn = AknLayoutScalable_Apps::field_vitu2_entry_pane_g1().LayoutLine();
    funcindcnrect.LayoutRect( icfrectcn.Rect(), funcindcn );
#endif    
    funcind = AknLayoutScalable_Apps::cell_vitu2_function_top_wide_pane(1).LayoutLine();
    funcindrect.LayoutRect(rect, funcind);
    
    funcindinner = AknLayoutScalable_Apps::cell_vitu2_function_top_wide_pane_g1(2).LayoutLine();
    funcindrectinner.LayoutRect(funcindrect.Rect(), funcindinner);
    //iBackspaceCnRect = funcindcnrect.Rect();

    iImIndicatorWesRect = funcindrectinner.Rect();	
    iImIndiOuterRect = funcindrect.Rect();
#ifndef LAF_MODIFY
    funcindinner = AknLayoutScalable_Apps::cell_vitu2_function_top_wide_pane_g1(1).LayoutLine();
    funcindrectinner.LayoutRect(funcindrect.Rect(), funcindinner);    
    iImIndicatorChnRect = funcindrectinner.Rect();
#endif
	// match selection list
	TAknWindowLineLayout matchlist, listpane, itempane1, itempane2, scrollpane;
	TAknLayoutRect matchlistrect, listpanerect, itempanerect1, itempanerect2, scrollpanerect;
	TAknWindowLineLayout arrowup, arrowdown, arrowupinner, arrowdowninner;
	TAknLayoutRect arrowuprect, arrowdownrect, arrowupinnerRect, arrowdowninnerRect;
	
	if( iLandScape )
		{
		matchlist = AknLayoutScalable_Apps::popup_vitu2_match_list_window(3).LayoutLine();
		listpane = AknLayoutScalable_Apps::list_vitu2_match_list_pane(1).LayoutLine();
		scrollpane = AknLayoutScalable_Apps::vitu2_page_scroll_pane(1).LayoutLine();
		}
	else
		{
		matchlist = AknLayoutScalable_Apps::popup_vitu2_match_list_window(2).LayoutLine();
		listpane = AknLayoutScalable_Apps::list_vitu2_match_list_pane(0).LayoutLine();
		scrollpane = AknLayoutScalable_Apps::vitu2_page_scroll_pane(0).LayoutLine();
		}
	
	matchlistrect.LayoutRect( viturect.Rect(), matchlist );
	rect = matchlistrect.Rect();
    rect.Move(-iLayoutOffset.iX, -iLayoutOffset.iY);	
    
	listpanerect.LayoutRect( rect, listpane );
	scrollpanerect.LayoutRect( rect, scrollpane );
	itempane1 = AknLayoutScalable_Apps::list_vitu2_match_list_item_pane( 0, 0, 0 ).LayoutLine();
	itempanerect1.LayoutRect( listpanerect.Rect(), itempane1 );
	itempane2 = AknLayoutScalable_Apps::list_vitu2_match_list_item_pane( 0, 0, 1 ).LayoutLine();
	itempanerect2.LayoutRect( listpanerect.Rect(), itempane2 );
	
	arrowupinner= AknLayoutScalable_Apps::vitu2_page_scroll_pane_g1().LayoutLine();
	arrowdowninner = AknLayoutScalable_Apps::vitu2_page_scroll_pane_g2().LayoutLine();
	arrowup = AknLayoutScalable_Apps::bg_button_pane_cp023().LayoutLine();
	arrowdown= AknLayoutScalable_Apps::bg_button_pane_cp024().LayoutLine();
	arrowuprect.LayoutRect( scrollpanerect.Rect(), arrowup );
	arrowdownrect.LayoutRect( scrollpanerect.Rect(), arrowdown );
	arrowupinnerRect.LayoutRect( scrollpanerect.Rect(), arrowupinner );
	arrowdowninnerRect.LayoutRect( scrollpanerect.Rect(), arrowdowninner );
	
	//iSelectionTl = rect.iTl;
	iSelectionHorMargin = listpanerect.Rect().iTl.iX;
	iSelectionVerMargin = listpanerect.Rect().iTl.iY;
	iSelectionTl = TPoint(iIcfWesRect.iTl.iX + 10, iIcfWesRect.iTl.iY + 10);
	iSelectionItemSize = itempanerect1.Rect().Size();
	iSelectionItemMargin = itempanerect1.Rect().iBr.iY - itempanerect2.Rect().iTl.iY;
	iSelectionNaviSize = arrowuprect.Rect().Size();
	iSelectionNaviInnerSize = arrowupinnerRect.Rect().Size();
	iSelectionTextLine = AknLayoutScalable_Apps::list_vitu2_match_list_item_pane_t1().LayoutLine();
    iSelectionPageTextLine = AknLayoutScalable_Apps::vitu2_page_scroll_pane_t1().LayoutLine();
	
	// read spell popup window laf
	TAknWindowLineLayout queryPane, btnOK, btnCancle, ICFArea, btnClr, btnClrInner;
	TAknWindowLineLayout editIndicator;
	TAknLayoutRect queryPaneRect, btnOKRect, btnCancleRect, ICFAreaRect, btnClrRect;
	TAknLayoutRect btnClrInnerRect, editIndicatorRect; 
	TAknTextLineLayout btnOKText, btnCancleText;
	if( iLandScape )
		{
		queryPane = AknLayoutScalable_Apps::popup_vitu2_query_window(1).LayoutLine();
		}
	else
		{
		queryPane = AknLayoutScalable_Apps::popup_vitu2_query_window(0).LayoutLine();	
		}
	queryPaneRect.LayoutRect( viturect.Rect(), queryPane );
	btnOK = AknLayoutScalable_Apps::bg_button_pane_cp016().LayoutLine();
	btnOKRect.LayoutRect( queryPaneRect.Rect(), btnOK );
	btnCancle = AknLayoutScalable_Apps::bg_button_pane_cp017().LayoutLine();
	btnCancleRect.LayoutRect( queryPaneRect.Rect(), btnCancle );
	btnOKText = AknLayoutScalable_Apps::popup_vitu2_query_window_t4(0).LayoutLine();
	btnCancleText = AknLayoutScalable_Apps::popup_vitu2_query_window_t5(0).LayoutLine();
	
	editIndicator = AknLayoutScalable_Apps::popup_vitu2_query_window_g1().LayoutLine();
	editIndicatorRect.LayoutRect( queryPaneRect.Rect(), editIndicator  );
	
	ICFArea = AknLayoutScalable_Apps::input_focus_pane_cp08().LayoutLine();
	ICFAreaRect.LayoutRect( queryPaneRect.Rect(), ICFArea  );
	
	btnClr = AknLayoutScalable_Apps::bg_button_pane_cp015().LayoutLine();
	btnClrRect.LayoutRect( queryPaneRect.Rect(), btnClr );
	btnClrInner = AknLayoutScalable_Apps::popup_vitu2_query_window_g2().LayoutLine();
	btnClrInnerRect.LayoutRect( queryPaneRect.Rect(), btnClrInner );
	
	iSpellQueryPaneRect = queryPaneRect.Rect();
	iSpellEditIndicator = editIndicatorRect.Rect();
    iOkRect = btnOKRect.Rect();
    iCancelRect = btnCancleRect.Rect();
    iSpellICFRect = ICFAreaRect.Rect();
    iSpellClrRect = btnClrRect.Rect();
    iSpellClrInnerRect = btnClrInnerRect.Rect();  
    
    //iBtnTextFormat  = iVkAlphaText1;//btnOKText;
	//iBtnTextFormat1 = iVkAlphaText1;//btnCancleText;
    iBtnTextFormat = AknLayoutScalable_Apps::popup_vitu2_query_button_pane_t1(0).LayoutLine();
    iBtnTextFormat1 = AknLayoutScalable_Apps::popup_vitu2_query_button_pane_t1(0).LayoutLine();
	
	
    // just test if there is size change of added ctrls
    iSendRect = iArrowLeftRect;
    iDisconnRect = iArrowRightRect;
    // end test    
    
    // preview popup window 
  	TAknWindowLineLayout previewWnd, previewBackground, previewWndInner;
  	TAknLayoutRect previewWndRect, previewBackgroundRect, previewWndInnerRect;
  	TAknLayoutText previewWndText;
  	previewWnd = AknLayoutScalable_Avkon::popup_fshwr2_char_preview_window(0).LayoutLine();	
  	            
  	previewWndRect.LayoutRect( iLayoutRect, previewWnd );
  	previewBackground = AknLayoutScalable_Avkon::bg_popup_fep_char_preview_window_cp01().LayoutLine();
  	previewBackgroundRect.LayoutRect( previewWndRect.Rect(), previewBackground );
  	iPreviewWndRect = previewBackgroundRect.Rect();
  	
  	previewWndInner = AknLayoutScalable_Avkon::bg_popup_fep_char_preview_window_g9().LayoutLine();
  	previewWndInnerRect.LayoutRect( previewBackgroundRect.Rect(), previewWndInner );
  	
  	iPreviewWndInnerRect = previewWndInnerRect.Rect();
  	iPreviewWndText = 
        AknLayoutScalable_Avkon::popup_fshwr2_char_preview_window_t1(0).LayoutLine();
    previewWndText.LayoutText(previewWndRect.Rect(), iPreviewWndText);
    iBubbleFont = const_cast<CFont*>(previewWndText.Font());
    }
    
void CGenericItutDataMgr::SetTextAlignment()
    {
    CFepLayoutMultiLineIcf* icffield = static_cast<CFepLayoutMultiLineIcf*>(iLayoutContext->Control(ECtrlIdICF));
    
    if (icffield && InputLanguage() != ELangNone)
        {
        if ( IsPortraitWest())
            {
            TRAP_IGNORE(icffield->SetTextAlignmentL(
                    iIcfTextAlignmentForPrtWest, InputLanguage()));
            }
        else
            {
            TRAP_IGNORE(icffield->SetTextAlignmentL(
                    iIcfTextAlignment, InputLanguage()));
            }
        }
    }
    
void CGenericItutDataMgr::SetIcfTextAlignment(TInt aAlignment)
    {
    if ( IsPortraitWest())
        {
        iIcfTextAlignmentForPrtWest = aAlignment;
        }
    else
        {
        iIcfTextAlignment = aAlignment;
        }
    }

void CGenericItutDataMgr::SetLanguageL(TInt aLanguage)
    {    
    ASSERT( IsValidLanguage( aLanguage ) );
        
    if (iLanguage != aLanguage)
        {            
        if( IsValidLanguage( iLanguage ) )
            iIsLangDirectionSwitch =  IsRtoLLanguage( aLanguage ) ^ IsRtoLLanguage( iLanguage );
        else        
            //Check mirroring is needed when first setting language
            iIsLangDirectionSwitch = IsRtoLLanguage( aLanguage );            
        
        iLanguage = aLanguage;
        iInputMode = KInvalidImMode;
        
        //SetTextAlignment();

        TInt scriptIdx = GetConfigResFileName(aLanguage);

        if (scriptIdx != iCurrentScriptIdx)
            {
            iCurrentScriptIdx = scriptIdx;

            CCoeEnv* coeEnv = CCoeEnv::Static();
            
            // Remove the resource file of previous input language.
            // The previous resource file should be removed first,
            // Because there are some same keypad ids in the resource file
            // of latin, Cyrillic, and etc.
            if ( iConfigResId )
                {
                coeEnv->DeleteResourceFile( iConfigResId );
                }

            // Add the resource file of current input language
            TFileName resourceConfigName( iResourceFilename );
            BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceConfigName );
            iConfigResId = coeEnv->AddResourceFileL( resourceConfigName );
            
            if (IsChinese())
                {
                iLayoutContext->UiManager()->CreateChineseSpecificCtrlsIfNeededL();
                }
            
            if( IsKorean())
                {
                iLayoutContext->UiManager()->CreateKoreanSpecificCtrlsIfNeededL();
                }

            NotifyChangeControlLayout(MItutPropertySubscriber::EItutPropertyKeypadResourceId, 
                                      KeypadResourceId());  
            }
        }
    }

void CGenericItutDataMgr::SetCase(TInt aCase)
    {
    if (iCase != aCase || iInputMode == ELatin)
        {
        iCase = aCase;
        NotifyChangeControlLayout(MItutPropertySubscriber::EItutPropertyKeypadResourceId, 
                                  KeypadResourceId());  
        }
    }

void CGenericItutDataMgr::SetInputModeL(TInt aMode)
    {
    TInt engineMode = KInvalidImMode;

    switch (aMode)
        {
        case EPinyin:
            {
            engineMode = EPtiEnginePinyinByPhrase;
            }
            break;
        case EStroke:
            {
            engineMode = EPtiEngineStrokeByPhrase;
            }
            break;
        case EZhuyin:
            {
            engineMode = EPtiEngineZhuyinByPhrase;
            }
            break;
        case ELatin:
        case EHindi:
        case ENumber:
        case EHangul:
        case ENativeNumber:
            {
            iInputMode = aMode;
            NotifyChangeControlLayout(MItutPropertySubscriber::EItutPropertyKeypadResourceId, 
                                      KeypadResourceId());  
            }
            break;
        case EZhuyinFind:
            {
            iInputMode = EZhuyin; 
            
            return; 
            }
        case EStrokeFind:
            {
            iInputMode = EStroke;  
            
            return;
            }
        default:
            return;    
        }

    if (IsChinese())
        {
        TInt err = iPtiEngine->ActivateLanguageL(iLanguage, TPtiEngineInputMode(engineMode));
        if (err == KErrNone)
            {
            iPtiEngine->SetCandidatePageLength(KOnePageCandidateCount);
            iInputMode = aMode;
            }
        }
    }




void CGenericItutDataMgr::SetChineseSpellFlag( TBool aFlag )
	{
	iIsChineseSpell = aFlag;
	}

TBool CGenericItutDataMgr::IsChineseSpellMode()
	{
	return iIsChineseSpell;
	}

TAny* CGenericItutDataMgr::RequestDataForPortraitWestUIAndChineseSpellUI(TInt aDataType)
    {
    switch ( aDataType )
        {
        case EScreenSize:
            {
            return &iScreenSize;
            }
        case ELayoutOffset:
            {
            return &iLayoutOffsetForPrtWest;
            }
        case ELayoutRect:
            {
            return &iLayoutRectForPrtWest;
            }
        case EIcfRect:
            {
            return &iIcfRectForPrtWest;
            }
        case EIcfFont:
            {
            if ( IsChineseSpellMode())
            	{
				return reinterpret_cast<TAny*>(iIcfFont);
            	}
            else
                {
                return reinterpret_cast<TAny*>(iIcfFontForPrtWest);
                }
            }
        case EBackspaceRect:
        case EItutPosClear:
            {
            return &iBackspaceRectForPrtWest;
            }
        case EKeypadRect:
            {
			if ( IsChineseSpellMode())
            	{
				return &iKeypadRect;
            	}
            else
                {
                return &iKeypadRectForPrtWest;
                }
            }               
        case EKeypadCellRects:
            {
            if ( IsChineseSpellMode())
            	{
				return &iKeypadCellRects;
            	}
            else
                {
                return &iKeypadCellRectsForPrtWest;
                }
            }
        case EKeypadLeftTextLine:
            {
            if ( IsChineseSpellMode())
                {
                return &iVkNumText;
                }
            else
                {
                // Modify new begin
                if ( iInputMode == ENumber || iInputMode == ENativeNumber )
                	{
					return &iVkBigNumTextForPrtWest;
                	}
                else
                	{
					return &iVkNumTextForPrtWest;
                	}
                // Modify new end
                }
            }
        case EKeypadRightTextLine1:
            {
            if ( IsChineseSpellMode())
                {
                return IsThai() ? &iVkAlphaText1ForThai : &iVkAlphaText1;
                }
            else
                {
				if ( iInputMode == ENumber || iInputMode == ENativeNumber )
					{
					return &iVkTextPlusForNumbericOnlyForPrtWest;
					}
				else
					{
					return &iVkAlphaText1ForPrtWest;
					}
                }
            }
        case EKeypadRightTextLine2:
            {
            if ( IsChineseSpellMode())
                {
                return IsThai() ? &iVkAlphaText2ForThai : &iVkAlphaText2;
                }
            else
                {
                return &iVkAlphaText2ForPrtWest;
                }
            }
        case EKeypadRightTextLine3:
            {
            if ( IsChineseSpellMode())
                {
                return IsThai() ? &iVkAlphaText3ForThai : &iVkAlphaText3;
                }
            else
                {
                return &iVkAlphaText3ForPrtWest;
                }
            }
        case EDropdownlistUnitWidth:
            {
            return &iCandsUnitWidth;
            }
        case EDropdownlistUnitHeight:
            {
            return &iCandsUnitHeight;
            }
        case EDropdownlistHorizontalMargin:
            {
            return &iCandsHorizontalMargin;
            }
        case EDropdownlistVerticalMargin:
            {
            return &iCandsVerticalMargin;
            }
        case EDropdownListNaviWidth:
            {
            return &iCandsNaviWidth;
            }
        case EDropdownListSpinBtnHeight:
            {
            return &iCandsSpinBtnHeight;
            }
        case EDropdownListSpellLTPos:
            {
            return &iCandsSpellLTPos;
            }
        case EDropdownListCandsLTPos:
            {
            return &iCandsLTPos;
            }
        case EDropdownListPuncLTPos:
            {
            return &iCandsPuncLTPos;
            }
        case EDropdownListFont:
            {
            return reinterpret_cast<TAny*>(iCandsFont);
            }
        case EDropdownListTextMargin:
            {
            return &iCandsTextMargin;
            }
        case EDropdownListTextColor:
            {
            return &iCandsTextColor;
            }
        case ESpellRect:
            {
            return &iSpellRect;
            }
        case ESpellFont:
            {
            return reinterpret_cast<TAny*>(iSpellIcfFontForPrtWest);
            }
        case ESpellTextColor:
            {
            return &iSpellTextColor;
            }
        case ELanguage:
            {
            return &iLanguage;
            }
        case EInputMode:
            {
            return &iInputMode;
            }
        case ECase:
            {
            return &iCase;
            }
        case EChnCandidates:
            {
            return &iCandidates;
            }
        case EChnPuncCandidates:
            {
            return &iPuncCandidates;
            }
        case EArrowLeftRect:
        case EItutPosArrowLeft:
            {
            return &iArrowLeftRectForPrtWest;
            }
        case EArrowRightRect:
        case EItutPosArrowRight:
            {
            return &iArrowRightRectForPrtWest;
            }
        case EArrowUpRect:
        case EItutPosArrowUp:
            {
            return &iArrowUpRect;
            }
        case EArrowDownRect:
        case EItutPosArrowDown:
            {
            return &iArrowDownRect;
            }
        case EItutPosSend:
            {
            return &iSendRect;
            }
        case EItutPosDisconn:
            {
            return &iDisconnRect;
            }
        case EMatchSelectionTlPos:
            {
            return &iSelectionTl;
            }
        case EMatchSelectionItemSize:
            {
            return &iSelectionItemSize;
            }
        case EMatchSelectionItemMargin:
            {
            return &iSelectionItemMargin;
            }
        case EMatchSelectionTextLine:
            {
            return &iSelectionTextLine;
            }
        case EOptionsRect:   
            {
            return &iOptionsRectForPrtWest;
            }           
        case ECloseRect:
            {
            return &iCloseRectForPrtWest;
            }          
        case ELeftInnerRect:
            {
            return &iArrowLeftInnerRectForPrtWest;
            }
        case ERightInnerRect:
            {
            return &iArrowRightInnerRectForPrtWest;
            }
        case EUpInnerRect:
            {
            return &iArrowUpInnerRect;
            }
        case EDownInnerRect:
            {
            return &iArrowDownInnerRect;
            }
        case EBackspaceInnerRect:
            {
            return &iBackspaceInnerRectForPrtWest;
            }
        case ECloseInnerRect:
            {
            return &iCloseInnerRectForPrtWest;
            }       
        case EOptionInnerRect:
            {
            return &iOptionInnerRectForPrtWest;
            }         
        case EItutPosOk:
            {
            if ( IsChineseSpellMode())
                {
                return &iOkRect;
                }
            else
                {
                return &iOKRectForPrtWest;
                }
            }
        case EItutPosCancel:
            {
            if ( IsChineseSpellMode())
                {
                return &iCancelRect;
                }
            else
                {
                return &iCancelRectForPrtWest;
                }
            }
        case EBtnTextLine:
            {
            if ( IsChineseSpellMode())
                {
                return &iBtnTextFormat;
                }
            else
                {
                return &iBtnOKTextForPrtWest;
                }
            }
        case ESpellTextCancle:
            {
            if ( IsChineseSpellMode())
                {
                return &iBtnTextFormat1;
                }
            else
                {
                return &iBtnCancelTextForPrtWest;
                }
            }
        case ESpellICFRect:
            {
            if ( IsChineseSpellMode())
                {
                return &iSpellICFRect;
                }
            else
                {
                return &iSpellICFRectForPrtWest;
                }
            }
        case ESpellClrRect:
            {
            if ( IsChineseSpellMode())
                {
                return &iSpellClrRect;
                }
            else
                {
                return &iSpellICFBtnRectForPrtWest;
                }
            }
        case ESpellClrInnerRect:
            {
            if ( IsChineseSpellMode())
                {
                return &iSpellClrInnerRect;
                }
            else
                {
                return &iSpellICFBtnInnerRectForPrtWest;
                }
            }
        case ESpellEditIndicatorRect:
            {
            return &iSpellEditIndicator;
            }
        case ESpellQueryPaneRect:
            {
            if ( IsChineseSpellMode())
                {
                return &iSpellQueryPaneRect;
                }
            else
                {
                return &iSpellQueryPaneRectForPrtWest;
                }
            }
        case ELatinOnly:
            {
            return &iLatinOnly;
            }
        case EPreviewBubbleRect:
            {
            return &iPreviewWndRectForPrtWest;
            }
        case EPreviewBubbleInnerRect:
            {
            return &iPreviewWndInnerRectForPrtWest;
            }   
        case EPreviewBubbleTextlayout:
            {
            return &iPreviewWndTextForPrtWest;
            }
        case EPreviewBubbleFont:
            {
            return reinterpret_cast<TAny*>(iBubbleFontForPrtWest);
            }
        case EImIndicatorRect:
            {
            if (iSpellMode)
                {
                return &iSpellEditIndicator;
                }
                 
            CalWesternIndicator();
            return &iCalindwesternRect;
            }
        case EImIndicatorOuterRect:
            {
            return &iImIndiOuterRect;
            }
        case EIndiPaneWithTextRect:
            {
            return &iIndiPaneRectWithTextForPrtWest;
            }
        case EIndiPaneWithoutTextRect:
            {
            return &iIndiPaneRectWithoutTextForPrtWest;
            }
        case EIndiIconWithTextRect:
            {
            return &iIndiIconRectWithTextForPrtWest;
            }
        case EIndiIconWithoutTextRect:
            {
            return &iIndiIconRectWithoutTextForPrtWest;
            }
        case EIndiTextLine:
            {
            return &iIndiTextForPrtWest;
            }
        case ESpellIndiPaneWithoutTextRect:
            {
            return &iSpellIndiPaneWithoutTextForPrtWest;
            }
        case ESpellIndiIconWithoutTextRect:
            {
            return &iSpellIndiIconWithoutTextForPrtWest;
            }
        case ESpellArrowLeft:
        	{
        	return &iSpellArrowLeftRectForPrtWest;
        	}
        case ESpellArrowLeftInner:
        	{
        	return &iSpellArrowLeftInnerRectForPrtWest;
        	}
        case ESpellArrowRight:
        	{
        	return &iSpellArrowRightRectForPrtWest;
        	}
        case ESpellArrowRightInner:
        	{
        	return &iSpellArrowRightInnerRectForPrtWest;
        	}
        default:
            break;
        }

    return NULL;
    }
TAny* CGenericItutDataMgr::RequestData(TInt aDataType)
    {
    if ( IsPortraitWest())
        {
        return RequestDataForPortraitWestUIAndChineseSpellUI( aDataType );
        }
    switch ( aDataType )
        {
        case EScreenSize:
            return &iScreenSize;
        case ELayoutOffset:
            return &iLayoutOffset;
        case ELayoutRect:
            return &iLayoutRect;
        case EIcfRect:
            return IsChinese() ? &iIcfChnRect : & iIcfWesRect;
        case EIcfFont:
            return IsChinese() ? reinterpret_cast<TAny*>(iIcfFontCn) : 
                                 reinterpret_cast<TAny*>(iIcfFont);
        case EBackspaceRect:
        case EItutPosClear:
            return IsChinese() ? &iBackspaceCnRect : &iBackspaceRect;
        case ESwitchRect:
        case EItutPosSwitchLayout:
            return IsChinese() ? &iSwitchCnRect : &iSwitchRect;
        case EImIndicatorRect:
            if (iSpellMode)
            	{
            	return &iSpellEditIndicator;
            	}
            	
            if (IsChinese())
            	{
            	return &iImIndicatorChnRect;
            	} 
            CalWesternIndicator();
            return &iCalindwesternRect;
       	case EImIndicatorOuterRect:
       	    if(IsChinese())
       	        {
       	        return &iImIndiOuterRectCn;
       	        }
       	    else
       	        {
       	        return &iImIndiOuterRect;
       	        }
        case EKeypadRect:
        	return IsChinese() ? &iKeypadRectCn : &iKeypadRect;	        	
        case EKeypadCellRects:
        	return IsChinese() ? &iKeypadCellRectsCn : &iKeypadCellRects;	
        case EKeypadLeftTextLine:
            return &iVkNumText;
        case EKeypadRightTextLine1:
            return IsThai() ? &iVkAlphaText1ForThai : &iVkAlphaText1;
        case EKeypadRightTextLine2:
            return IsThai() ? &iVkAlphaText2ForThai : &iVkAlphaText2;
        case EKeypadRightTextLine3:
            return IsThai() ? &iVkAlphaText3ForThai : &iVkAlphaText3;
        case EDropdownlistUnitWidth:
            return &iCandsUnitWidth;
        case EDropdownlistUnitHeight:
            return &iCandsUnitHeight;
        case EDropdownlistHorizontalMargin:
            return &iCandsHorizontalMargin;
        case EDropdownlistVerticalMargin:
            return &iCandsVerticalMargin;
        case EDropdownListNaviWidth:
            return &iCandsNaviWidth;
        case EDropdownListSpinBtnHeight:
            return &iCandsSpinBtnHeight;
        case EDropdownListSpellLTPos:
            return &iCandsSpellLTPos;
        case EDropdownListCandsLTPos:
            return &iCandsLTPos;
        case EDropdownListPuncLTPos:
            return &iCandsPuncLTPos;
        case EDropdownListFont:
            return reinterpret_cast<TAny*>(iCandsFont);
        case EDropdownListTextMargin:
            return &iCandsTextMargin;
        case EDropdownListTextColor:
            return &iCandsTextColor;
        case ESpellRect:
            return &iSpellRect;
        case ESpellFont:
            return reinterpret_cast<TAny*>(iSpellFont);
        case ESpellTextColor:
            return &iSpellTextColor;
        case ELanguage:
            return &iLanguage;
        case EInputMode:
            return &iInputMode;
        case ECase:
            return &iCase;
        case EChnCandidates:
            return &iCandidates;
        case EChnPuncCandidates:
            return &iPuncCandidates;
        case EArrowLeftRect:
        case EItutPosArrowLeft:
            return IsChinese() ? &iArrowLeftCnRect : &iArrowLeftRect;
        case EArrowRightRect:
        case EItutPosArrowRight:
            return IsChinese() ? &iArrowRightCnRect : &iArrowRightRect;
        case EArrowUpRect:
        case EItutPosArrowUp:
            return &iArrowUpRect;
        case EArrowDownRect:
        case EItutPosArrowDown:
            return &iArrowDownRect;
        case EItutPosSend:
            return &iSendRect;
        case EItutPosDisconn:
            return &iDisconnRect;
        case EMatchSelectionTlPos:
            return &iSelectionTl;
        case EMatchSelectionItemSize:
            return &iSelectionItemSize;
        case EMatchSelectionItemMargin:
            return &iSelectionItemMargin;
        case EMatchSelectionTextLine:
            return &iSelectionTextLine;
        case EOptionsRect:
#ifdef LAF_MODIFY	
        	return IsChinese() ? &iOptionsRectCn : &iOptionsRect;
#else        	
            return &iOptionsRect;
#endif            
        case ECloseRect:
#ifdef LAF_MODIFY	
        	return IsChinese() ? &iCloseRectCn : &iCloseRect;
#else        	
            return &iCloseRect;
#endif            
       	case ESwitchInnerRect:
        	return IsChinese() ? &iSwitchInnerCnRect : &iSwitchInnerRect;
        case ELeftInnerRect:
        	return IsChinese() ? &iArrowLeftInnerCnRect : &iArrowLeftInnerRect;
        case ERightInnerRect:
        	return IsChinese() ? &iArrowRightInnerCnRect : &iArrowRightInnerRect;
        case EBackspaceInnerRect:
        	return IsChinese() ? &iBackspaceInnerCnRect : &iBackspaceInnerRect;
       	case EUpInnerRect:
        	return &iArrowUpInnerRect;
        case EDownInnerRect:
        	return &iArrowDownInnerRect;
       	case ECloseInnerRect:
#ifdef LAF_MODIFY	       	
        	return IsChinese() ? &iCloseInnerRectCn : &iCloseInnerRect;
#else        	
        	return &iCloseInnerRect;
#endif        	
        case EOptionInnerRect:
#ifdef LAF_MODIFY	
        	return IsChinese() ? &iOptionInnerRectCn : &iOptionInnerRect;
#else        	
        	return &iOptionInnerRect;
#endif        	
        case EItutPosOk:
            return &iOkRect;
        case EItutPosCancel:
            return &iCancelRect;
        case EBtnTextLine:
            return &iBtnTextFormat;
        case ESpellTextCancle:
            return &iBtnTextFormat1;            
        case ESpellICFRect:
            return &iSpellICFRect;
        case ESpellClrRect:
            return &iSpellClrRect;
        case ESpellClrInnerRect:
            return &iSpellClrInnerRect;
        case ESpellEditIndicatorRect:
            return &iSpellEditIndicator;
        case ESpellQueryPaneRect:
            return &iSpellQueryPaneRect;       
        case ELatinOnly:
            return &iLatinOnly;
        case EPreviewBubbleRect:
            return &iPreviewWndRect;
        case EPreviewBubbleInnerRect:
            return &iPreviewWndInnerRect;
        case EPreviewBubbleTextlayout:
            return &iPreviewWndText;
        case EPreviewBubbleFont:
            return reinterpret_cast<TAny*>(iBubbleFont);    
        default:
            break;
        }

    return NULL;
    }

CGenericItutDataMgr::CGenericItutDataMgr(MItutLayoutContext* aLayoutContext, 
                                         CPtiEngine* aPtiEngine)
                                        :
                                         iPtiEngine( aPtiEngine ),
                                         iLanguage(ELangNone),
                                         iInputMode(KInvalidImMode),
                                         iCase(EAknEditorUpperCase),
                                         iIsChineseSpell( EFalse ),
                                         iLayoutContext(aLayoutContext),
                                         iCurrentScriptIdx(KInvalidIndex),
                                         iLandScape(EFalse),
                                         iSpellMode(EFalse)
    {
    }

void CGenericItutDataMgr::NotifySubscriber(MItutPropertySubscriber::TItutProperty aPropertyName, 
                                           const TDesC& aValue)
    {
    for (TInt i = 0; i < iSubscriberList.Count(); i++)
        {
        TRAP_IGNORE(iSubscriberList[i]->SetPropertyL(aPropertyName, aValue));
        }
    }

void CGenericItutDataMgr::NotifyChangeControlLayout(
    MItutPropertySubscriber::TItutProperty aPropertyName, TInt aCtrlResId)
    {
    TInt ctrlResId = KInvalidResId;

    switch (aPropertyName)
        {
        case MItutPropertySubscriber::EItutPropertyKeypadResourceId:
            {
            ctrlResId = iLayoutContext->Control(ECtrlIdStdItut)->ResourceId();
            }
            break;
        case MItutPropertySubscriber::EItutPropertyCandidateListResourceId:
            {
            ctrlResId = iLayoutContext->Control(ECtrlIdStdCandsList)->ResourceId();
            }
            break;
        default:
            break;
        }

    // since keypad resource divided by script, so maybe ctrlResId unchanged,
    // but it is actually changed in different script
    if ((ctrlResId != aCtrlResId) ||
        (aPropertyName == MItutPropertySubscriber::EItutPropertyKeypadResourceId))
        {
        TPtrC ptr(reinterpret_cast<TText*>(&aCtrlResId), sizeof(aCtrlResId)/sizeof(TText));

        NotifySubscriber(aPropertyName, ptr);
        }
    }

TInt CGenericItutDataMgr::GetNextPageCandidateL(RPointerArray<HBufC>& aList)
    {
    if (iPtiEngine && (iPtiEngine->NextCandidatePage()))
        {
        TItutDataConverter::ConvertChnPhraseCandidateL(iPtiEngine->CandidatePage(), aList);

        return KErrNone;
        }

    return KErrNotSupported;
    }

TBool CGenericItutDataMgr::NextPageCandidateExist()
    {
    if (iPtiEngine)
        {
        return iPtiEngine->MoreCandidatePages();
        }

    return EFalse;    
    }

TInt CGenericItutDataMgr::KeypadResourceId()
    {
    if (iInputMode == ENumber )
        {
        if( IsExistPlusChar()  )
            return R_FINGER_INPUT_KEYPAD_NUMBER_WITH_PLUS;
        else
        	return R_FINGER_INPUT_KEYPAD_NUMBER;
        }
    if( iInputMode == ENativeNumber )
        {
        if( IsExistPlusChar() )
        	return R_FINGER_INPUT_KEYPAD_NATIVE_NUMBER_WITH_PLUS;
        else
        	return R_FINGER_INPUT_KEYPAD_NATIVE_NUMBER;
        }

    if ( iLatinOnly )
    	{
    	if ( iCase == EAknEditorTextCase || iCase == EAknEditorUpperCase )
    		{
    		return R_FINGER_INPUT_KEYPAD_LATINONLY_UPPERCASE;
    		}
        return R_FINGER_INPUT_KEYPAD_LATINONLY_LOWERCASE;
    	}

    if (!iLangCaseSensitive )
        {
        return R_FINGER_INPUT_KEYPAD_ABC;
        }
    if ( IsChinese() )
        {
        return ChineseKeypadResourceId();
        }
    if ( IsHindi() )
        {
        return HindiKeypadResourceId();
        }
        
    if ( IsKorean() )
        {
        return KoreanKeypadResourceId();
        }
    if (iCase == EAknEditorTextCase || iCase == EAknEditorUpperCase)
        {
        return R_FINGER_INPUT_KEYPAD_ABC_UPPERCASE;
        }
    else
        {
        return R_FINGER_INPUT_KEYPAD_ABC_LOWERCASE;
        }
    }
    
TInt CGenericItutDataMgr::ChineseKeypadResourceId()
    {
    
    if (iInputMode == EZhuyin)
        {
        return R_FINGER_INPUT_KEYPAD_ZHUYIN_STANDBY_PREDICT;
        }
    if (iInputMode == EPinyin)
        {
        return R_FINGER_INPUT_KEYPAD_PINYIN_STANDBY_PREDICT;
        }
    if (iInputMode == EStroke)
        {
        TInt resID;
        if (InputLanguage() == ELangPrcChinese)
            {
            resID = R_FINGER_INPUT_KEYPAD_STROKE_STANDBY_PREDICT_PRC;
            }
        else
            {
            resID = R_FINGER_INPUT_KEYPAD_STROKE_STANDBY_PREDICT_TRA;
            }
        return resID;
        }
        
    if (iCase == EAknEditorTextCase || iCase == EAknEditorUpperCase)
        {
        return R_FINGER_INPUT_KEYPAD_ABC_UPPERCASE_CHN;
        }
    else
        {
        return R_FINGER_INPUT_KEYPAD_ABC_LOWERCASE_CHN;
        }
    }

TInt CGenericItutDataMgr::HindiKeypadResourceId()
    {
    if ( iInputMode == EHindi )
        {
        return R_FINGER_INPUT_KEYPAD_ABC;
        }
        
    if (iCase == EAknEditorTextCase || iCase == EAknEditorUpperCase)
        {
        return R_FINGER_INPUT_KEYPAD_LATINONLY_UPPERCASE;
        }
    else
        {
        return R_FINGER_INPUT_KEYPAD_LATINONLY_LOWERCASE;
        }
    }
    
TInt CGenericItutDataMgr::KoreanKeypadResourceId()
    {
    if ( iInputMode == EHangul )
        {
        return R_FINGER_INPUT_KEYPAD_KOREAN;
        }
        
    if (iCase == EAknEditorTextCase || iCase == EAknEditorUpperCase)
        {
        return R_FINGER_INPUT_KEYPAD_LATINONLY_UPPERCASE;
        }
    else
        {
        return R_FINGER_INPUT_KEYPAD_LATINONLY_LOWERCASE;
        }
    }
    
    
TInt CGenericItutDataMgr::GetConfigResFileName(TInt aLang)
    {
    iResourceFilename.Zero();
    iResourceFilename = KConfigResourceFile();

    for (TInt i = 0; i < sizeof(TScriptMapping) / sizeof(TScriptMapping[0]); i++)
        {
        TScriptInfo script = TScriptMapping[i];

        if (FindLang(&(LangsArr[script.iStartIdx]), script.iEndIdx - script.iStartIdx, aLang) != 
            KErrNotFound)
            {
            iResourceFilename.Append(ResFileExtByScriptIdx(script.iScriptExt));
            iResourceFilename.Append(KResourceFileExtName);
            iLangCaseSensitive = script.iCaseSensitive;
            return i;
            }
        }

    // default resource file is latin
    iResourceFilename.Append(ResFileExtByScriptIdx(TScriptMapping[0].iScriptExt));
    iResourceFilename.Append(KResourceFileExtName);    
    iLangCaseSensitive = TScriptMapping[0].iCaseSensitive;
    return 0;
    }

TInt CGenericItutDataMgr::FindLang(const TInt* aArray, 
                                   TInt aEndIdx,
                                   TInt aLang) 
    {
    for (TInt i = 0; i <= aEndIdx; i++)
        {
        if (aLang == *aArray)
            {
            return i;
            }

        aArray++;    
        }

    return KErrNotFound;
    }

TBool CGenericItutDataMgr::IsChinese()
    {
    return (iLanguage == ELangPrcChinese || iLanguage == ELangHongKongChinese 
         || iLanguage == ELangTaiwanChinese);
    }

// tp teleca addon
TBool CGenericItutDataMgr::IsKorean()
    {
    return ( iLanguage == ELangKorean );
    }

TBool CGenericItutDataMgr::IsHindi()
    {
    return ( iLanguage == ELangHindi );
    }

TBool CGenericItutDataMgr::IsThai()
    {
    return ( iLanguage == ELangThai );
    }

TBool CGenericItutDataMgr::IsRtoLLanguage()
	{
	return ( iLanguage == ELangArabic ||
			 iLanguage == ELangHebrew ||
			 iLanguage == ELangFarsi  ||
			 iLanguage == ELangUrdu );	
	}
	
TBool CGenericItutDataMgr::IsRtoLLanguage( TInt aLanguage )
	{
	return ( aLanguage == ELangArabic ||
			 aLanguage == ELangHebrew ||
			 aLanguage == ELangFarsi  ||
			 aLanguage == ELangUrdu );	
	}

TBool CGenericItutDataMgr::IsLangDirectionSwitch() const
	{
	return iIsLangDirectionSwitch;	
	}
	
const TDesC& CGenericItutDataMgr::ResFileExtByScriptIdx(const TScriptExtIndex aIndex)
    {
    switch (aIndex)
        {
        case ELatinExt:
            return KLatinExt;
        case ECyrillicExt:
            return KCyrillicExt;
        case EGreekExt:
            return KGreekExt;
        case EHebrewExt:
            return KHebrewExt;
        case EArabicExt:
            return KArabicExt;
        case EFarsiExt:
            return KFarsiExt;
        case EUrduExt:
            return KUrduExt;
        case EThaiExt:
            return KThaiExt;
        case EChnExt:
            return KChnExt;
        case EDevanagiriExt:
        	return KDevanagiriExt;
        case EHangulExt:
        	return KHangulExt;
        default:
            break;    
        }

    return KNullDesC;
    }
    
void CGenericItutDataMgr::SetUpdate(TBool aNeedUpdate)
	{
	iNeedUpdate = 	aNeedUpdate;
	}
	
TBool CGenericItutDataMgr::IsUpdate() const
	{
	return 	iNeedUpdate;
	}
	
void CGenericItutDataMgr::CalWesternIndicator()
	{
    TSize indSize(iImIndicatorWesRect.Width() * 5 / 6, iImIndicatorWesRect.Height() * 5 / 6);
    
    TInt offsetX = ( iImIndicatorWesRect.Width() - indSize.iWidth ) / 2;
    TInt offsetY = ( iImIndicatorWesRect.Height() - indSize.iHeight ) / 2;
    
    TInt x = iImIndicatorWesRect.iTl.iX + offsetX;
    TInt y = iImIndicatorWesRect.iTl.iY + offsetY;
    
    iCalindwesternRect.SetRect(TPoint(x,y) , indSize);	
	}

void CGenericItutDataMgr::SetNumericKeymap( const TInt aKeymap )
	{
	iNumericKeymap = aKeymap;
	}

void CGenericItutDataMgr::SetNumericKeymapData( TInt* aKeymapData )
	{
	delete iNumericKeymapData;
    TInt* len = (TInt*)((TUint8*)aKeymapData - 4);
    TPtrC16 keymapRes((const TUint16*)aKeymapData, *len/2);  
    iNumericKeymapData = keymapRes.Alloc();
	}

TBool CGenericItutDataMgr::IsExistPlusChar()
    {
    if( !IsNumericOnly() )
    	{
    	return EFalse;
    	}
    if ( iNumericKeymap == EKeymapFromResource )
    	{
    	HBufC* keyRes = iNumericKeymapData;
    	if( keyRes != NULL && keyRes->Locate( TChar( KPlusChar ) ) != KErrNotFound )
    		{
    		return ETrue;
    		}
    	}
    else if ( iNumericKeymap == EAknEditorStandardNumberModeKeymap 
    		|| iNumericKeymap == EAknEditorConverterNumberModeKeymap
    		|| iNumericKeymap == EAknEditorCalculatorNumberModeKeymap 
    		|| iNumericKeymap == EAknEditorToFieldNumberModeKeymap 
    		|| iNumericKeymap == EAknEditorFixedDiallingNumberModeKeymap 
    		|| iNumericKeymap == EAknEditorSATNumberModeKeymap )
    	{
    	return ETrue;
    	}
    return EFalse;
    }

// End Of File
