fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlContainerChinese.cpp
changeset 0 eb1f2e154e89
child 50 5a1685599b76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlContainerChinese.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,692 @@
+/*
+* Copyright (c) 2002-2004 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:           
+*       Provides the CAknFepUICtrlContainerChinese methods.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include <coemain.h>
+#include <eikenv.h>
+#include <eikappui.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikdefmacros.h>
+#endif
+
+
+#include <AknLayoutDef.h>
+#include <AknLayout.lag>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <skinlayout.cdl.h>
+#include <AknDef.h>
+
+#include "AknFepUiInterfacePanic.h"
+#include "AknFepUIAvkonCtrlContainerChinese.h"
+#include "AknFepUIAvkonCtrlCandidatePane.h"
+#include "AknFepUIAvkonCtrlInputPane.h"
+#include "AknFepUIAvkonCtrlPinyinPopup.h"
+#include "aknfepuictrlpinyineep.h"
+#include "AknFepManager.h"
+#include "aknfepchineseuidataconv.h"
+#include "aknfepuilayoutdatamgr.h"
+
+MAknFepUICtrlContainerChinese::~MAknFepUICtrlContainerChinese()
+	{
+	}
+	
+CAknFepUICtrlContainerChinese::CAknFepUICtrlContainerChinese()
+    :
+    iPaneLayout(ELayoutInput),
+    iContainerPosition(TPoint(0,0)),
+    isPCLPosed(EFalse)
+    {
+
+    }
+
+CAknFepUICtrlContainerChinese* CAknFepUICtrlContainerChinese::NewL()
+    {
+    CAknFepUICtrlContainerChinese* self = new(ELeave) CAknFepUICtrlContainerChinese;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+MAknFepUICtrlInputPane* CAknFepUICtrlContainerChinese::InputPane() const
+    {
+    return iInputPane;
+    }
+
+MAknFepUICtrlCandidatePane* CAknFepUICtrlContainerChinese::CandidatePane() const
+    {
+    return iCandidatePane;
+    }
+
+MAknFepUICtrlPinyinPopup* CAknFepUICtrlContainerChinese::PinyinPopupWindow() const
+    {
+    return iPinyinPopupWindow;
+    }
+
+MAknFepUICtrlEditPane* CAknFepUICtrlContainerChinese::EditPaneWindow() const
+    {
+    return iEditPane;
+    }
+
+TBool CAknFepUICtrlContainerChinese::IsEnabled() const
+    {
+    return iEnabled;
+    }
+
+void CAknFepUICtrlContainerChinese::Enable(TBool aEnable)
+    {
+	if(!COMPARE_BOOLS(iEnabled, aEnable))
+        {
+        iEnabled = aEnable;
+        if(aEnable)
+            {
+            Window().SetOrdinalPosition(0, ECoeWinPriorityFep); // right at the front
+            // make sure we are not faded even if a query has appeared
+            Window().SetFaded(EFalse, RWindowTreeNode::EFadeIncludeChildren); 
+            }
+        else
+            {
+            // make sure that the popup window is disabled as well
+            iInputPane->MakeVisible(aEnable); 
+            iPinyinPopupWindow->Enable(aEnable);
+            iEditPane->Enable(aEnable);
+            iCandidatePane->Enable(aEnable);
+            }
+        MakeVisible(aEnable);
+        }
+    if ( aEnable == EFalse )
+        {
+        if ( iFepMan )
+            {
+            iFepMan->PinyinPhraseCreation( EFalse );
+            iFepMan->EntryPhrase( EFalse );
+            iFepMan->EnableKeyStar( ETrue );
+            iFepMan->PhraseCreation( EFalse );
+            }
+        PinyinPopupWindow()->ResetStrokeArray();
+        PinyinPopupWindow()->SetLastResouce( 0 );
+	    iPinyinPopupWindow->ResetInputLayoutMiniQwertyZhuyin();
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+	    iEditPane->ResetAllArray();
+	    iEditPane->SetEffictiveLength( 0 );
+	    iEditPane->SetChangeState( EFalse );
+#endif
+        }
+    }  
+  
+void CAknFepUICtrlContainerChinese::ConstructL()
+    {
+    CreateWindowL();
+    SetNonFocusing();
+    RWindow& window=Window();
+    window.SetOrdinalPosition(0, ECoeWinPriorityFep); // right at the front
+    MakeVisible(EFalse);
+
+    iEikonEnv->EikAppUi()->AddToStackL(this, ECoeStackPriorityDefault, ECoeStackFlagRefusesFocus);
+
+    iLafDataMgr = CAknFepUiLayoutDataMgr::NewL();
+    iInputPane = CAknFepUICtrlInputPane::NewL(window, CAknFepUICtrlInputPane::ELayoutPhraseInputPane, iLafDataMgr);
+    iCandidatePane = CAknFepUICtrlCandidatePane::NewL(window, iLafDataMgr);
+    iPinyinPopupWindow = CAknFepUICtrlPinyinPopup::NewL(window , iLafDataMgr);
+    iEditPane = CAknFepUICtrlPinyinEEP::NewL( window, iLafDataMgr );
+    iInputPane->SetMopParent(this);
+    iCandidatePane->SetMopParent(this);
+    iEditPane->SetMopParent(this);
+
+    iInputPane->SetSizeChangedObserver(this);
+    iPinyinPopupWindow->SetSizeChangedObserver(this);
+    iPinyinPopupWindow->MakeVisible(EFalse);
+    iEditPane->Enable(EFalse);
+
+    iCandidatePane->SetPaneLayout(iPaneLayout); // set pane layout
+    iCandidatePane->SetVisibleCandidateCount(iPaneLayout);
+ 	iHorizLine = 
+ 	    CAknFepChineseUIDataConv::AnyToLayoutRect(iLafDataMgr->RequestData(EHorizLine));	    
+ 	iEEPFirstHorizLine = 
+ 	    CAknFepChineseUIDataConv::AnyToLayoutRect(iLafDataMgr->RequestData(EEEPFirstHorizLine));
+ 	iEEPSecondHorizLine = 
+ 	    CAknFepChineseUIDataConv::AnyToLayoutRect(iLafDataMgr->RequestData(EEEPSecondHorizLine));
+ 	TInt index = ConvertLayoutToIndex();
+    if ( index == 2 || index == 3 )
+        {
+        index = 0;
+        }
+    iInputPane->SetLayoutIndex(index);
+    TRect outerRect = TRect();
+    TRect innerRect = TRect();
+    CalculateFrameRects(outerRect, innerRect);
+
+    iBgContext = CAknsFrameBackgroundControlContext::NewL(KAknsIIDQsnFrPopup, outerRect, innerRect, ETrue);
+    LayoutContainer();
+    ActivateL();
+    }
+
+CAknFepUICtrlContainerChinese::~CAknFepUICtrlContainerChinese()
+    {
+    iEikonEnv->EikAppUi()->RemoveFromStack(this);
+    delete iLafDataMgr;
+    delete iInputPane;
+    delete iCandidatePane;
+    delete iPinyinPopupWindow;
+    delete iEditPane;
+    delete iBgContext;
+    }
+
+CCoeControl* CAknFepUICtrlContainerChinese::ComponentControl(TInt aIndex) const 
+    {
+    CCoeControl* controls[] = 
+        {
+        iInputPane,
+        iCandidatePane,
+        iEditPane,
+        iPinyinPopupWindow
+        } ;
+
+    for (TUint ii = 0; (ii < sizeof(controls) / sizeof(CCoeControl*)) ; ii++)
+        {
+        if (controls[ii] && aIndex-- == 0)
+            {
+            return controls[ii] ;
+            }
+        }
+    // shouldn't be called while no components.
+    return NULL ;
+    }
+
+TInt CAknFepUICtrlContainerChinese::CountComponentControls() const
+    {
+    CCoeControl* controls[] = 
+        {
+        iInputPane,
+        iCandidatePane,
+        iEditPane,
+        iPinyinPopupWindow
+        } ;
+
+    TInt count = 0 ;
+    for (TUint ii = 0 ; ii < (sizeof(controls) / sizeof(CCoeControl*)) ; ii++)
+        {
+        if(controls[ii])
+            {
+            count++ ;
+            }
+        }
+    return count ;
+    }
+
+TInt CAknFepUICtrlContainerChinese::ConvertLayoutToIndex() const
+    {
+    TInt layout = -1;
+    // switch on the cases in reverse order, and count our way through
+    // the possible layouts to determine the index into the layout
+    // this means that it is easier to add another layout in between
+    switch(iPaneLayout)
+        {
+        case ELayoutKeystroke: //index 3
+            layout++;
+        case ELayoutPhraseCreation: //index 2
+            layout++;
+	    case ELayoutCandidate: //index 1
+		    layout++;
+	    case ELayoutInput: //index 0
+		    layout++;
+        default:
+            break;
+        }
+    return layout;
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutFrames()
+    {
+    TRect outerRect;
+    TRect innerRect;
+    CalculateFrameRects(outerRect, innerRect);
+    iBgContext->SetFrameRects(outerRect, innerRect);
+    iBgContext->SetParentPos(PositionRelativeToScreen());
+    }
+
+void CAknFepUICtrlContainerChinese::CalculateFrameRects(TRect& aOuterRect, TRect& aInnerRect) const
+    {
+    TRect windowRect = Rect();
+    TPoint lPoint(0,0);
+    TPoint rPoint(0,0);
+    TAknLayoutRect topLeft;
+    topLeft.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_2());
+
+    TAknLayoutRect bottomRight;
+    bottomRight.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_5());
+    lPoint.iX = bottomRight.Rect().iTl.iX;
+    lPoint.iY = bottomRight.Rect().iTl.iY;
+    rPoint.iX = bottomRight.Rect().iBr.iX;
+    rPoint.iY = bottomRight.Rect().iBr.iY;
+
+    aOuterRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
+    aInnerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
+    }
+
+void CAknFepUICtrlContainerChinese::Draw(const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+    TBool skinnedDraw = EFalse;
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    TRect outerRect;
+    TRect innerRect;
+    CalculateFrameRects(outerRect, innerRect);
+    gc.Clear(Rect());
+
+    skinnedDraw = AknsDrawUtils::DrawFrame(
+	    skin, gc, 
+	    outerRect, innerRect, 
+	    KAknsIIDQsnFrPopupSub, KAknsIIDQsnFrPopupCenterSubmenu); 
+
+    TRgb separatorColor = iHorizLine.Color();
+    AknsUtils::GetCachedColor( skin, separatorColor,
+          KAknsIIDQsnLineColors, EAknsCIQsnLineColorsCG8 );
+    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+    gc.SetBrushColor( separatorColor );
+
+    if(!skinnedDraw)
+	    {
+	    iRectCoverMainPaneInput.DrawRect(gc);
+	    iRectFirstShadowInput.DrawRect(gc);
+	    iRectOutlineFrameInput.DrawRect(gc);
+	    iRectInsideAreaInput.DrawRect(gc);
+	    }
+	    
+    TInt index = ConvertLayoutToIndex();
+    if ( iInputPane->IsVisible( ) || iPinyinPopupWindow->IsVisible() || 
+            iPhraseCreationLaf)
+        {
+        if ( index == 0 || index == 1 )
+            {
+            iHorizLine.DrawRect(gc);
+            }
+        }
+    if ( index == 2 )
+        {
+        iEEPFirstHorizLine.DrawRect(gc);
+        iEEPSecondHorizLine.DrawRect(gc);
+        }
+    else if ( index == 3 )
+        {
+        iEEPFirstHorizLine.DrawRect(gc);
+        }
+
+    } 
+
+void CAknFepUICtrlContainerChinese::SizeChanged()
+    {
+    iLafDataMgr->ReadLafInfo();
+    LayoutRects();
+    LayoutContainedControls();
+    LayoutFrames();
+    }
+
+void CAknFepUICtrlContainerChinese::SetLayout(TPaneLayout aPaneLayout)
+    {
+    if(iPaneLayout != aPaneLayout)
+        {
+        iPaneLayout = aPaneLayout;
+        SetControlVisibility();
+        // set visible candidate length 
+        iCandidatePane->SetPaneLayout(aPaneLayout);
+        TInt index = ConvertLayoutToIndex();
+        if ( index == 2 || index == 3)
+            {
+            index = 0;
+            }
+        iCandidatePane->SetVisibleCandidateCount(aPaneLayout - index);
+        iInputPane->SetLayoutIndex( index );
+        LayoutContainer();
+        DrawDeferred();
+        }
+    }
+
+void CAknFepUICtrlContainerChinese::FocusCandidatePane(TBool aValue)
+    {
+    iInputPane->SetHighlighted(!aValue);
+    iCandidatePane->SetHighlighted(aValue);
+    }
+
+void CAknFepUICtrlContainerChinese::SelectionPopupEnabled(TBool /*aEnabled*/)
+    {
+    // ensure that the input pane is only visible if the popup is not enabled
+    SetControlVisibility();
+    }
+
+TTypeUid::Ptr CAknFepUICtrlContainerChinese::MopSupplyObject(TTypeUid aId)
+    {
+    if (aId.iUid == MAknsControlContext::ETypeId)
+        return ( MAknsControlContext::SupplyMopObject(aId, iBgContext));
+    return CCoeControl::MopSupplyObject(aId);
+    }
+
+void CAknFepUICtrlContainerChinese::SelectionPopupSizeChanged(TInt /*aNumLines*/)
+    {
+    LayoutContainer();
+    DrawDeferred();
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutPinyinPopupWindow()
+    {
+    TRect popupRect(Position(), Size()); 
+    TRect pinyinRect = popupRect;
+    TAknWindowLineLayout entryHorizLine = 
+        CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( EEntryHorizLineWindow ));
+    TAknWindowLineLayout entryPaneLine = 
+        CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( EEntryPaneWindowLine ));
+    TAknWindowLineLayout eepFirstHorizLine = 
+        CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( EEEPFirstHorizLineWindow ));
+    TAknWindowLineLayout eepSecondHorizLine = 
+        CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( EEEPSecondHorizLineWindow ));
+    TAknLayoutRect layoutLineEntry, layoutLineEntryPane, layoutLineFirstHorizEEP, layoutLineSecondHorizEEP;
+    TRect layoutLineRectEntry, layoutLineRectEntryPane, layoutLineRectFirstHorizEEP, layoutLineRectSecondHorizEEP;
+    TInt index = ConvertLayoutToIndex();
+    if ( 2 == index )
+        {
+        layoutLineFirstHorizEEP.LayoutRect( popupRect, eepFirstHorizLine );
+        layoutLineRectFirstHorizEEP = layoutLineFirstHorizEEP.Rect();
+        layoutLineSecondHorizEEP.LayoutRect( popupRect, eepSecondHorizLine );
+        layoutLineRectSecondHorizEEP = layoutLineSecondHorizEEP.Rect();
+        
+        pinyinRect.iTl.iY = layoutLineRectFirstHorizEEP.iBr.iY;
+        pinyinRect.iBr.iY = layoutLineRectSecondHorizEEP.iTl.iY;
+        }
+    else
+        {
+        layoutLineEntry.LayoutRect( popupRect, entryHorizLine );
+        layoutLineRectEntry = layoutLineEntry.Rect();
+        layoutLineEntryPane.LayoutRect( popupRect, entryPaneLine );
+        layoutLineRectEntryPane = layoutLineEntryPane.Rect();
+        pinyinRect.iTl.iY = layoutLineRectEntryPane.iTl.iY;
+        pinyinRect.SetHeight(layoutLineRectEntry.iTl.iY - pinyinRect.iTl.iY);
+        }
+    iPinyinPopupWindow->SetRect(pinyinRect);
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutPinyinEEPWindow()
+    {
+    TRect rect = Rect();  
+    TAknWindowLineLayout EEPWindowLayout;
+    if ( iPaneLayout == ELayoutPhraseCreation )
+    	{
+    	EEPWindowLayout =
+    	    CAknFepChineseUIDataConv::AnyToWindowLine(iLafDataMgr->RequestData(EEEPWindowLayout));
+    	}
+    else
+    	{
+    	EEPWindowLayout =
+    	    	    CAknFepChineseUIDataConv::AnyToWindowLine(iLafDataMgr->RequestData(EEntryPaneWindowLine));
+    	}       
+    AknLayoutUtils::LayoutControl(iEditPane, rect, EEPWindowLayout);
+    }
+
+void CAknFepUICtrlContainerChinese::SetControlVisibility()
+    {
+    TBool popupEnabled = iPinyinPopupWindow->IsEnabled();
+
+    switch(iPaneLayout)
+	    {
+    case ELayoutCandidate:
+        // predicative candidate state
+        iInputPane->MakeVisible(EFalse);
+        iPhraseCreationLaf = EFalse;
+        break;
+    case ELayoutInput:
+        // input state
+        iInputPane->MakeVisible(!popupEnabled);
+        iPhraseCreationLaf = EFalse;
+        break;
+    case ELayoutPhraseCreation:
+        if ( !iPhraseCreationLaf )
+            {
+            // input state
+            iInputPane->MakeVisible( !popupEnabled );
+            }
+        else
+            {
+            iPhraseCreationLaf= EFalse;
+            }
+    default:
+	    break;
+	    }
+    }
+
+void CAknFepUICtrlContainerChinese::SetIsShownWithPopupWindows(TBool aValue)
+    {
+    if(!COMPARE_BOOLS(iIsShownWithPopupWindows,aValue))	
+        { 
+        iIsShownWithPopupWindows = aValue;
+        // need to layout container first, so that the parent rect is the right size...
+        LayoutContainer();
+        // ... now we can layout the rects relative to the resized parent
+        LayoutRects();
+        // don't need to layout controls, only the rects are affected
+        DrawDeferred();
+        }
+    }
+
+void CAknFepUICtrlContainerChinese::SetContainerPosition(TPoint aCurPos, TInt aHeight)
+    {
+    TRect parentRect;
+    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, parentRect);
+    TInt windowHeight = 0;
+    TInt index = ConvertLayoutToIndex();
+    
+    if ( index != 2 )
+        {
+        windowHeight = 
+            CAknFepChineseUIDataConv::AnyToInt( iLafDataMgr->RequestData( EPopupHeightEntry ));
+        isPCLPosed = EFalse;
+        }
+    else
+        {
+        windowHeight = CAknFepChineseUIDataConv::AnyToInt( iLafDataMgr->RequestData( EPopupHeightEEP ));
+        isPCLPosed = ETrue;
+        }
+    // Laf comments: In case there is enough space on the main pane to show the window under the entry,
+    // the window is placed 3 pixels below the text baseline of the entry. In case there is no space on 
+    // the main pane to show the window fully under the entry, the window is placed 17(16 pixel font) or
+    // 13(12 pixel font) pixels above the baseline of the entry.
+    if(aCurPos.iY + 3 + windowHeight < parentRect.iBr.iY) 
+        {
+        iContainerPosition.iY = aCurPos.iY + 3; 
+        }
+    else
+        {
+        iContainerPosition.iY = aCurPos.iY - windowHeight - (aHeight + 1); 
+        }
+    if ((( iContainerPosition.iY + windowHeight ) > parentRect.iBr.iY ) ||
+        ( iContainerPosition.iY < parentRect.iTl.iY ))
+    {
+    iContainerPosition.iY = parentRect.iBr.iY - ( parentRect.iBr.iY - 
+                            parentRect.iTl.iY ) / 2 - windowHeight / 2;
+    }
+    LayoutContainer();
+    }
+
+void CAknFepUICtrlContainerChinese::ShowHorizontalScrollArrows(TBool aValue)
+    {
+    iCandidatePane->ShowHorizontalScrollArrows(aValue);
+    }    
+   
+void CAknFepUICtrlContainerChinese::ShowVerticalScrollArrows(TBool aValue)
+    {
+    iCandidatePane->ShowVerticalScrollArrows(aValue);
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutInputPane()
+    {
+    TRect rect = Rect();
+    TAknWindowLineLayout entryPaneWindowLine = 
+        CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( EEntryPaneWindowLine ));
+    TInt index = ConvertLayoutToIndex();
+    if ( index == 2)
+        {
+        TInt eepPopupHeight = CAknFepChineseUIDataConv::AnyToInt( iLafDataMgr->RequestData( EPopupHeightEEP ));
+        TInt entryPopupHeight = CAknFepChineseUIDataConv::AnyToInt( iLafDataMgr->RequestData( EPopupHeightEntry ));
+        rect.iTl.iY = rect.iTl.iY + eepPopupHeight - entryPopupHeight;
+        }
+    AknLayoutUtils::LayoutControl(iInputPane, rect, entryPaneWindowLine);
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutContainedControls()
+    {
+    LayoutInputPane();
+    // layout candidate pane
+    TAknWindowLineLayout candidatePaneWindowLine = 
+                CAknFepChineseUIDataConv::AnyToWindowLine( iLafDataMgr->RequestData( ECandidatePaneWindowLine ));
+    TInt index = ConvertLayoutToIndex();
+    if (index == 2)
+        {
+        if ( isPCLPosed )
+            {
+            iEditPane->Enable( ETrue );      
+            AknLayoutUtils::LayoutControl( iCandidatePane, Rect(), candidatePaneWindowLine );
+            LayoutPinyinPopupWindow();
+            LayoutPinyinEEPWindow();
+            }
+        }
+    else if ( index == 0 || index == 1 ) 
+        {
+        TRect rect = Rect();
+        iEditPane->Enable(EFalse);
+        AknLayoutUtils::LayoutControl(iCandidatePane, rect, candidatePaneWindowLine);
+        LayoutPinyinPopupWindow();
+        }
+    else
+        {
+        iEditPane->Enable(ETrue);
+        iPinyinPopupWindow->Enable(EFalse);
+        AknLayoutUtils::LayoutControl(iCandidatePane, Rect(), candidatePaneWindowLine);
+        LayoutPinyinEEPWindow();
+        }
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutContainer()
+    {
+    TInt layoutIndex = ConvertLayoutToIndex(); // 0 : input state layout, 1 : candidate state layout
+    TRect rect;
+    switch ( layoutIndex )
+        {
+        case 2:
+            rect = CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EPopupRectEEP ));
+            break;
+        case 1:
+            rect = CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EPopupRectCandatate ));
+            break;
+        default:
+            rect = CAknFepChineseUIDataConv::AnyToRect( iLafDataMgr->RequestData( EPopupRectEntry ));
+            break;
+        }
+    TInt rectHeight = rect.iBr.iY - rect.iTl.iY;
+    rect.iTl.iY = iContainerPosition.iY;
+    rect.iBr.iY = iContainerPosition.iY + rectHeight;
+    SetRect(rect); 
+    }
+
+void CAknFepUICtrlContainerChinese::LayoutRects()
+    {
+    TInt index = ConvertLayoutToIndex();
+    TRect rect = Rect();
+
+    if ( index == 3 )
+        {
+        index = 0;
+        }
+    
+    switch (index) // 0 : input state, 1: predicative candidate state
+	    {
+	    case 0:
+		    iRectCoverMainPaneInput = CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectCoverMainPaneInputEntry ));
+		    iRectFirstShadowInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectFirstShadowInputEntry ));
+		    iRectOutlineFrameInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectOutlineFrameInputEntry ));
+		    iRectInsideAreaInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectInsideAreaInputEntry ));
+		    break;
+        case 1:
+		    iRectCoverMainPaneInput = CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectCoverMainPaneInputCandidate ));
+		    iRectFirstShadowInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectFirstShadowInputCandidate ));
+		    iRectOutlineFrameInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectOutlineFrameInputCandidate ));
+		    iRectInsideAreaInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectInsideAreaInputCandidate ));
+		    break;
+        case 2:
+		    iRectCoverMainPaneInput = CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectCoverMainPaneInputEEP));
+		    iRectFirstShadowInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectFirstShadowInputEEP ));
+		    iRectOutlineFrameInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectOutlineFrameInputEEP ));
+		    iRectInsideAreaInput= CAknFepChineseUIDataConv::AnyToLayoutRect( iLafDataMgr->RequestData( ERectInsideAreaInputEEP ));
+            break;
+        default: 
+            break;
+	    }
+    }
+
+void CAknFepUICtrlContainerChinese::HandleResourceChange(TInt aType)
+    {
+    // maybe should be KEikDynamicLayoutVariantSwitch_APAC, need to have a try after it's ready.
+    if(aType == KEikDynamicLayoutVariantSwitch)
+        {
+        LayoutContainer();
+        }
+    else
+        {
+        CCoeControl::HandleResourceChange(aType);
+        }
+    }
+void CAknFepUICtrlContainerChinese::SetControlInVisible( TBool aVisible )
+    {
+    ShowVerticalScrollArrows( EFalse );
+    if ( aVisible == EFalse )
+        {
+        iCandidatePane->SetInVisiable();
+        }
+    iPinyinPopupWindow->MakeVisible( EFalse );
+    iInputPane->MakeVisible( EFalse );
+    iPhraseCreationLaf= ETrue;
+    }
+
+
+TInt& CAknFepUICtrlContainerChinese::IsPhraseCreation()
+    {
+    return iPhraseCreation;
+    }
+
+void CAknFepUICtrlContainerChinese::PhraseCreation(  TBool aPhraseCreation )
+    {
+    if ( iPhraseCreation != aPhraseCreation )
+        {
+        iPhraseCreation = aPhraseCreation;
+        }
+    }
+
+void CAknFepUICtrlContainerChinese::SetFepMan( MAknFepManagerUIInterface* aFepMan )
+    {
+    iFepMan = aFepMan;
+    }