fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlJapaneseCandidatePane.cpp
branchRCL_3
changeset 21 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlJapaneseCandidatePane.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,973 @@
+/*
+* 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:            Candidate list
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include <eikdef.h>
+#include <aknViewAppUi.h>
+#include <avkon.hrh>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <aknPopupHeadingPane.h>
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <AknLayout.lag>
+#include <aknfep.rsg>
+
+#include <skinlayout.cdl.h>
+#include <AknLayout2ScalableDef.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+
+#include "AknFepUiInterfacePanic.h"
+#include "AknFepUIAvkonCtrlJapaneseCandidateListbox.h"
+#include "AknFepUIAvkonCtrlJapaneseCandidateHeadingPane.h"
+#include "AknFepUIAvkonCtrlJapaneseCandidatePane.h"
+#include "AknFepUIManagerJapanese.h"
+
+// CONSTANTS
+const TInt KMaxTitleLength = 32;
+
+const TInt KMaxListRows = 7;
+const TInt KMinListRows = 5;
+const TInt KMaxListColumns = 9;
+const TInt KMinListColumns = 3;
+const TInt KLAFBaseListColumns = 3;
+const TInt KLAFBaseListRows = 1;
+
+const TInt KLAFBelowTextBaseline = 2;
+const TInt KLAFAboveTextBaseline = 1;
+const TInt KListboxMarge = 4;
+
+/**
+*  CAknFepUICtrlJapaneseCandidatePane class.
+*
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapaneseCandidatePane* CAknFepUICtrlJapaneseCandidatePane::NewL(CAknFepUIManagerJapanese* aUiMng)
+    {
+    CAknFepUICtrlJapaneseCandidatePane* self =
+        new(ELeave) CAknFepUICtrlJapaneseCandidatePane(aUiMng);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);    // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::~CAknFepUICtrlJapaneseCandidatePane
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapaneseCandidatePane::~CAknFepUICtrlJapaneseCandidatePane()
+    {
+    if (IsVisible())
+        {
+        HideWindow();
+        }
+    if (iListBox)
+        {
+        delete iListBox;
+        iListBox = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::ShowWindow
+// Show Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::ShowWindow()
+    {
+    RWindow& window=Window();
+    //Set ordinal position to top
+    window.SetOrdinalPosition(0,ECoeWinPriorityFep);
+    window.SetFaded(EFalse, RWindowTreeNode::EFadeIncludeChildren);
+    window.SetPointerCapture(ETrue);
+    TRAP_IGNORE( ActivateL());
+    MakeVisible(ETrue);
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::CloseCandidateList
+// Close Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::CloseCandidateList()
+    {
+    CancelPopup();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetCurrentItemIndex
+// Specify the cursor position of a pop-up list.
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetCurrentItemIndexL(
+        TInt aItemIndex,
+        TBool aDraw)
+    {
+    CTextListBoxModel* model =
+        static_cast<CTextListBoxModel*>(ListBox()->Model());
+    TInt numOfItem = model->NumberOfItems();
+    TBuf<KMaxTitleLength> title;
+    title.Format(_L("%d / %d"), aItemIndex + 1, numOfItem);
+    SetTitleL(title);
+
+    if (aDraw)
+        {
+        iListBox->SetCurrentItemIndexAndDraw(aItemIndex);
+        iTitle->DrawNow();
+        }
+    else
+        {
+        iListBox->SetCurrentItemIndex(aItemIndex);
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetOffsetPosition
+// Specify the display position of a pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetOffsetPosition(TPoint aOffset)
+    {
+    iOffsetPosition = aOffset;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetWindowPosition
+// Set the drawing position for candidate list popup window
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetWindowPosition(
+        const TPoint& aLeftSideOfBaseLine, TInt aHeight, TInt aAscent)
+    {
+    // getting rectangle for main pane
+    TRect screen =
+        TRect(0, 0,
+              AKN_LAYOUT_WINDOW_screen.iW, AKN_LAYOUT_WINDOW_screen.iH);
+    TAknLayoutRect main_pane;
+    main_pane.LayoutRect(screen, AKN_LAYOUT_WINDOW_main_pane(screen, 0, 1, 1));
+    iMainPaneRect = main_pane.Rect();
+
+    TInt leftPos = aLeftSideOfBaseLine.iX;
+    if (leftPos < 0)
+        {
+        leftPos = iOffsetPosition.iX;
+        }
+
+    TPoint windowOffset(
+        leftPos,
+        aLeftSideOfBaseLine.iY + aHeight - aAscent - iMainPaneRect.iTl.iY);
+    SetOffsetPosition(windowOffset);
+
+    iSrcTextHeight = aHeight;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::ShowCandidateListL
+// Show Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::ShowCandidateListL(
+        CDesCArrayFlat* aItems, TInt aIndex, TInt aResourceID)
+    {
+    __ASSERT_DEBUG(aItems->Count() > 0,
+                   AknFepUiInterfacePanic(EAknFepUiInterfacePanicCandidatesEmpty));
+
+    // Set listitems.
+    CTextListBoxModel* model =
+        static_cast<CTextListBoxModel*>(ListBox()->Model());
+    model->SetItemTextArray(aItems);
+    model->SetOwnershipType(ELbmDoesNotOwnItemArray);
+
+    iMaximumColumns = MaximumColumns(model);
+    iMaximumRows    = MaximumRows(model);
+
+    SetCurrentItemIndexL(aIndex, EFalse);
+    SetMaximumHeight(iMaximumRows);
+
+    CAknFepUICtrlJapaneseCandidateListbox* listBox =
+        static_cast<CAknFepUICtrlJapaneseCandidateListbox*>(ListBox());
+
+    listBox->SetMaximumColumns(iMaximumColumns);
+
+    // Show popup list
+    TBool notShowingPopup = model->NumberOfItems() == 0 && iWindowType < 0x80;
+    if (!notShowingPopup)
+        {
+        const TSize screenSize=iCoeEnv->ScreenDevice()->SizeInPixels();
+        iPopoutCba->SetBoundingRect(TRect(screenSize));
+        }
+
+    // Create a CBA for use with the popup
+    if (aResourceID)
+        {
+        UpdateCbaL(aResourceID);
+        }
+
+    SetupWindowLayout(iWindowType);
+
+    iListBox->SetListBoxObserver(this);
+    iPopoutCba->MakeVisible(ETrue);
+
+    if (iMarkable)
+        {
+        // If markable, set the popup to observe event change events.
+        // Call HandleControlEvent to set the CBA appropriate to the 1st item
+        iListBox->SetObserver(this);
+        HandleControlEventL(iListBox, EEventStateChanged);
+        }
+
+    if (IsVisible())
+        {
+        DrawDeferred();
+        }
+    else
+        {
+        ShowWindow();
+        ActivateL();
+        ShowWindowCbaL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::HideWindow
+// Hide Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::HideWindow()
+    {
+    MakeVisible(EFalse);
+    Window().SetPointerCapture(EFalse);
+
+    iEikonEnv->RemoveFromStack(iPopoutCba);
+
+    iPopoutCba->MakeVisible(EFalse);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::CurrentItemIndexOfCandidate
+// Return a selected candidate item number currently
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapaneseCandidatePane::CurrentItemIndexOfCandidate()
+    {
+    return iListBox->CurrentItemIndex();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::MoveItem
+// Move a current item in an appointed direction
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapaneseCandidatePane::MoveItem(
+        TAknFepUICtrlScroll aDirection)
+    {
+    __ASSERT_DEBUG(iListBox->IsVisible(),
+                   AknFepUiInterfacePanic(EAknFepUiInterfacePanicNoCandidatePane));
+
+    TInt index = iListBox->CurrentItemIndex();
+
+    CTextListBoxModel* model =
+        static_cast<CTextListBoxModel*>(ListBox()->Model());
+    const TInt numberOfItems = model->NumberOfItems();
+
+    switch(aDirection)
+        {
+        case EScrollUp:
+            {
+            --index;
+            if (index < 0)
+                index = numberOfItems - 1;
+            }
+        break;
+
+        case EScrollDown:
+            {
+            ++index;
+            if (index >= numberOfItems)
+                index = 0;
+            }
+        break;
+
+        default:
+            {
+            //Panic
+            AknFepUiInterfacePanic(EAknFepUiInterfacePanicCandidatePaneNotSupportScrollDirection);
+            }
+        break;
+        }
+    TRAPD(err, SetCurrentItemIndexL(index, ETrue));
+    if (err != KErrNone)
+        {
+        HideWindow();
+        index = 0;
+        }
+    return index;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetupWindowLayout
+// Set up a window layout type
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetupWindowLayout(
+        AknPopupLayouts::TAknPopupLayouts /*aType*/)
+    {
+    HandleSizeChanged(Layout(), Heading(), ListBox(), this);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::AttemptExitL
+// Set the title for the selection list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::AttemptExitL(TBool aAccept)
+    {
+    if (iReturn) //Always not null unless ExecuteLD leaves
+        *iReturn = aAccept;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::MopSupplyObject
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CAknFepUICtrlJapaneseCandidatePane::MopSupplyObject(TTypeUid aId)
+    {
+    SetMopParent( iEikonEnv->EikAppUi() );
+    return CAknPopupList::MopSupplyObject(aId);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CAknFepUICtrlJapanesePredictivePane
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapaneseCandidatePane::CAknFepUICtrlJapaneseCandidatePane(CAknFepUIManagerJapanese* aUiMng)
+    : iUiMng(aUiMng)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::ConstructL()
+    {
+    // Create listbox.
+    CAknFepUICtrlJapaneseCandidateListbox* list =
+                new(ELeave) CAknFepUICtrlJapaneseCandidateListbox;
+    // "iListBox" member variable is defined in CAknPopupList class.
+    iListBox = list;
+    CAknPopupList::ConstructL(
+        iListBox, R_AKNFEP_SOFTKEYS_EMPTY_EMPTY_COMMIT, AknPopupLayouts::EMenuWindow);
+
+    list->ConstructL(this, CEikListBox::ELeftDownInViewRect);
+    list->CreateScrollBarFrameL(ETrue);
+    list->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                CEikScrollBarFrame::EOff,
+                                CEikScrollBarFrame::EAuto);
+    iEikonEnv->RemoveFromStack(this);
+    SetNonFocusing();
+    MakeVisible(EFalse);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetTitleL
+// Set the title for the selection list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetTitleL(const TDesC& aTitle)
+    {
+    if (!iTitle)
+        {
+        iTitle = new(ELeave) CAknFepUICtrlJapaneseCandidateHeadingPane;
+        iTitle->SetContainerWindowL(*this);
+        iTitle->ConstructL(aTitle);
+        iTitle->SetMopParent(iListBox);
+        }
+    else
+        {
+        iTitle->SetTextL(aTitle);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::HandleSizeChanged
+// The handler function for size change
+// Original function is AknPopupLayouts::HandleSizeChanged()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::HandleSizeChanged(
+        TAknPopupWindowLayoutDef &aDef,
+        CAknPopupHeadingPane *aHeading,
+        CEikListBox *aListBox,
+        CCoeControl *aWindowOwningControl)
+    {
+    if ( aHeading )
+        {
+        aHeading->SetLayout( CAknPopupHeadingPane::EListHeadingPane );
+        aHeading->SetSkinFrameId(TAknsItemID());
+        aHeading->SetSkinFrameCenterId(TAknsItemID());
+        }
+
+    TInt numofitems = aListBox->Model()->NumberOfItems();
+
+    TInt minItems = iMaximumRows;
+    TInt maxItems = KMaxListRows;
+
+    if (aDef.iMaximumHeight)
+        {
+        maxItems = aDef.iMaximumHeight;
+        }
+    AknPopupLayouts::CheckRange(numofitems, minItems, maxItems);
+    CalcPopupMenuWindow(aDef, iMainPaneRect, numofitems);
+    SetupMenuPopupWindow(aDef, numofitems, aHeading != 0);
+
+    CAknFepUICtrlJapaneseCandidateListbox* listbox =
+        static_cast<CAknFepUICtrlJapaneseCandidateListbox*>(aListBox);
+    listbox->SetMaximumColumns(iMaximumColumns);
+    listbox->SetMaximumRows(iMaximumRows);
+    SetMaximumHeight(iMaximumRows);
+
+    aWindowOwningControl->SetRect(AknPopupLayouts::WindowRect(aDef));
+    HandleSizeAndPositionOfComponents(aDef, aListBox, aHeading);
+
+    TRect windowRect = AknPopupLayouts::WindowRect(aDef);
+    MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
+    TBool defaultContext = EFalse;
+    if (!cc)
+        {
+        cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
+        defaultContext = ETrue;
+        }
+
+    if (cc)
+        {
+        CAknsBasicBackgroundControlContext *bcc =
+            (CAknsBasicBackgroundControlContext*)cc;
+        TAknLayoutRect popupBgRect;
+        popupBgRect.LayoutRect(
+            windowRect,
+            ELayoutEmpty,
+            0, 0, ELayoutEmpty, ELayoutEmpty,
+            windowRect.Size().iWidth, windowRect.Size().iHeight);
+        bcc->SetBitmap(KAknsIIDQsnFrPopupCenter);
+        if (defaultContext)
+            {
+            bcc->SetRect(popupBgRect.Rect());
+            }
+        bcc->SetParentPos(aWindowOwningControl->PositionRelativeToScreen());
+        if (defaultContext)
+            {
+            bcc->SetParentPos(TPoint(0,0));
+            }
+        }
+     }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::HandleDraw
+// The handler function for Draw
+// Original function is AknPopupLayouts::HandleDraw()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::HandleDraw(CEikonEnv* /*aEikEnv*/,
+                  CWindowGc& aGc,
+                  const TAknPopupWindowLayoutDef& aDef,
+                  CEikListBox* aListBox,
+                  CAknPopupHeadingPane* aHeading)
+    {
+    TRect windowRect =
+        AknPopupLayouts::MenuRect(const_cast<TAknPopupWindowLayoutDef&>(aDef));
+    MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+    MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
+    TBool windowFrameDrawn = EFalse;
+    if (!cc)
+        {
+        cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
+        }
+
+    if (cc)
+        {
+		TRegionFix<2> dontDrawRegion;
+		TRegionFix<8> drawRegion;
+		if ( aListBox )
+		    {
+	    	dontDrawRegion.AddRect( aListBox->Rect() );
+		    }
+		if ( aHeading )
+		    {
+	    	dontDrawRegion.AddRect( aHeading->Rect() );
+		    }
+		drawRegion.AddRect( windowRect );
+		drawRegion.SubRegion( dontDrawRegion );
+
+		const TAknsItemID *popupBgId = &KAknsIIDQsnBgPopupBackground;
+		TAknLayoutRect popupBgRect;
+        popupBgRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_1(windowRect));
+		AknsDrawUtils::DrawCachedImage(skin, aGc, popupBgRect.Rect(), *popupBgId);
+
+		const TAknsItemID *sliceId = &KAknsIIDQsnBgSlicePopup;
+		TAknLayoutRect sliceRect;
+        sliceRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_2());
+		AknsDrawUtils::DrawCachedImage(skin, aGc, sliceRect.Rect(), *sliceId);
+
+        // drawing frame
+        TAknLayoutRect topLeft;
+        topLeft.LayoutRect(
+            windowRect,
+            ELayoutEmpty, 0,0, ELayoutEmpty, ELayoutEmpty, KListboxMarge, KListboxMarge);
+
+        TAknLayoutRect bottomRight;
+        bottomRight.LayoutRect(
+            windowRect,
+            ELayoutEmpty,
+            ELayoutEmpty, ELayoutEmpty, 0, 0, KListboxMarge, KListboxMarge);
+
+        TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
+        TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
+        aGc.SetPenStyle(CGraphicsContext::ENullPen);
+        const TAknsItemID *frameId = &KAknsIIDQsnFrPopup;
+        const TAknsItemID *frameCenterId = &KAknsIIDQsnFrPopupCenter;
+		aGc.SetClippingRegion( drawRegion );
+        windowFrameDrawn =
+            AknsDrawUtils::DrawFrame(
+                skin, aGc,
+                outerRect, innerRect, *frameId, *frameCenterId);
+		aGc.CancelClippingRegion();
+        }
+
+    if (!windowFrameDrawn)
+        {
+        DrawWindowShadow(
+            aGc, aDef.iCover,
+            aDef.iSecond, aDef.iFirst, aDef.iOutline, aDef.iInside);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::CalcPopupMenuWindow
+// Set up the information on a pop-up window
+// Original function is AknPopupLayouts::CalcPopupMenuWindow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::CalcPopupMenuWindow(
+        TAknPopupWindowLayoutDef &aDef,const TRect& aRect, TInt /*num*/)
+    {
+    TAknLayoutRect popup_menu_window;
+
+    TBool sizeDesideFlag = EFalse;
+    TInt adjustOffsetX = 0;
+    TInt adjustOffsetY = 0;
+    TInt i;
+    TAknWindowLineLayout lafwidth =
+        AknLayoutScalable_Avkon::popup_fep_japan_candidate_window(iMaximumColumns - KLAFBaseListColumns).LayoutLine();
+
+    // calculating the number of indication line again in order to be able to arrange under a plan position
+    for (i = iMaximumRows; i >= KLAFBaseListRows && !sizeDesideFlag; i--)
+        {
+        TAknWindowLineLayout laf =
+            AknLayoutScalable_Avkon::popup_fep_japan_candidate_window(i).LayoutLine();
+        laf.il = 0;
+        laf.it = 0;
+        laf.iW = lafwidth.iW;
+        popup_menu_window.LayoutRect(aRect, laf);
+        // calculate a drawing position Y
+        TInt drawY = iMainPaneRect.iTl.iY + iOffsetPosition.iY
+                         + KLAFBelowTextBaseline + popup_menu_window.Rect().Height();
+        if (drawY < iMainPaneRect.iBr.iY)
+            {
+            adjustOffsetY = (-1) * KLAFBelowTextBaseline;
+            iMaximumRows = i;
+            sizeDesideFlag = ETrue;
+            }
+        if (iMaximumRows >= KMinListRows && i == KMinListRows)
+            {
+            break;
+            }
+        }
+
+    // if popup window cannot be arranged under a plan positon, it try whether popup is arranged top or not.
+    //
+    for (i = iMaximumRows; i >= KLAFBaseListRows && !sizeDesideFlag; i--)
+        {
+        TAknWindowLineLayout laf =
+            AknLayoutScalable_Avkon::popup_fep_japan_candidate_window(i).LayoutLine();
+        laf.il = 0;
+        laf.it = 0;
+        laf.iW = lafwidth.iW;
+        popup_menu_window.LayoutRect(aRect, laf);
+        // calculate a drawing position Y
+        TInt drawY = iMainPaneRect.iTl.iY + iOffsetPosition.iY - KLAFAboveTextBaseline
+                    - iSrcTextHeight - popup_menu_window.Rect().Height();
+        if (drawY > iMainPaneRect.iTl.iY)
+            {
+            adjustOffsetY = iSrcTextHeight + KLAFAboveTextBaseline + popup_menu_window.Rect().Height();
+            iMaximumRows = i;
+            sizeDesideFlag = ETrue;
+            }
+        if (iMaximumRows >= KMinListRows && i == KMinListRows)
+            {
+            break;
+            }
+        }
+
+    // In case popup window cannot be arrange both under and top,
+    // popup is shown on the bottom on screen.
+    if (!sizeDesideFlag)
+        {
+        TAknWindowLineLayout laf =
+            AknLayoutScalable_Avkon::popup_fep_japan_candidate_window(KMinListRows).LayoutLine();
+        laf.il = 0;
+        laf.it = 0;
+        laf.iW = lafwidth.iW;
+        popup_menu_window.LayoutRect(aRect, laf);
+        adjustOffsetY = iMainPaneRect.iTl.iY + iOffsetPosition.iY + KLAFBelowTextBaseline
+                      + popup_menu_window.Rect().Height()
+                      - iMainPaneRect.iBr.iY;
+        iMaximumRows = KMinListRows;
+        sizeDesideFlag = ETrue;
+        }
+
+    adjustOffsetX =
+        iMainPaneRect.iTl.iX
+        + iOffsetPosition.iX
+        + popup_menu_window.Rect().Width() - iMainPaneRect.iBr.iX;
+    adjustOffsetX = (adjustOffsetX > 0) ? adjustOffsetX : 0;
+    TPoint adjustOffset(-adjustOffsetX, -adjustOffsetY);
+
+    aDef.iWindowRect = popup_menu_window.Rect();
+    aDef.iWindowRect.Move(iOffsetPosition);
+    aDef.iWindowRect.Move(adjustOffset);
+
+    // getting a information of shadow in candidate list
+    TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+
+    TAknWindowLineLayout laf1 =
+        AKN_LAYOUT_WINDOW_Candidate_selection_pop_up_window_graphics_Line_1(
+            aDef.iWindowRect);
+    laf1.iW = TInt16(aDef.iWindowRect.Width());
+    TAknWindowLineLayout laf2 =
+        AKN_LAYOUT_WINDOW_Candidate_selection_pop_up_window_graphics_Line_2(
+            aDef.iWindowRect);
+    laf2.iW = TInt16(aDef.iWindowRect.Width() - 4);
+    TAknWindowLineLayout laf3 =
+        AKN_LAYOUT_WINDOW_Candidate_selection_pop_up_window_graphics_Line_3(
+            aDef.iWindowRect);
+    laf3.iW = TInt16(aDef.iWindowRect.Width() - 3);
+    TAknWindowLineLayout laf4 =
+        AKN_LAYOUT_WINDOW_Candidate_selection_pop_up_window_graphics_Line_4(
+            aDef.iWindowRect);
+    laf4.iW = TInt16(aDef.iWindowRect.Width() - 5);
+
+    aDef.iCover.LayoutRect(window_rect, laf1);
+    aDef.iSecond.LayoutRect(window_rect, laf2);
+    aDef.iFirst.LayoutRect(window_rect, laf2);
+    aDef.iOutline.LayoutRect(window_rect, laf3);
+    aDef.iInside.LayoutRect(window_rect, laf4);
+    aDef.iPopupMenuWindowOffset = TPoint(0, 0);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::SetupMenuPopupWindow
+// Set up the information on a pop-up window
+// Original function is AknPopupLayouts::SetupMenuPopupWindow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::SetupMenuPopupWindow(
+        TAknPopupWindowLayoutDef &aDef, TInt /*num*/, TBool /*heading*/)
+    {
+    AknPopupLayouts::SetupDefaults(aDef);
+    TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+
+    // setting window size of listbox pane
+    // Those arguments aren't used in it.
+    TAknWindowLineLayout laf = AKN_LAYOUT_WINDOW_candidate_pane(0,0);
+    TAknWindowLineLayout textWindowLayout =
+        AKN_LAYOUT_WINDOW_list_single_popup_jap_candidate_pane(0,0);
+    laf.ib = ELayoutEmpty;
+    laf.iH = iMaximumRows * textWindowLayout.iH;
+    aDef.iListRect.LayoutRect(window_rect, laf);
+
+    // setting window size of heading pane
+    //   calculating window size of heading pane based on a shadow of popup window
+    //
+    TAknTextLineLayout lafHead =
+        AknLayoutScalable_Avkon::popup_fep_japan_candidate_window_t1().LayoutLine();
+
+    TRect rectFirstShadow = aDef.iFirst.Rect();
+    TRect rectListBox     = aDef.iListRect.Rect();
+    laf.it = (TInt16)(rectFirstShadow.iTl.iY - window_rect.iTl.iY);
+    laf.ib = ELayoutEmpty;
+    laf.iH = (TInt16)(rectListBox.iTl.iY - rectFirstShadow.iTl.iY);
+    aDef.iHeadingRect.LayoutRect(window_rect, laf);
+
+    CAknFepUICtrlJapaneseCandidateHeadingPane* headingPane =
+        static_cast<CAknFepUICtrlJapaneseCandidateHeadingPane*>(Heading());
+    headingPane->SetParentRect(aDef.iWindowRect);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::HandleSizeAndPositionOfComponents
+// The handler function for size and a location
+// Original function is AknPopupLayouts::HandleSizeAndPositionOfComponents()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::HandleSizeAndPositionOfComponents(
+        const TAknPopupWindowLayoutDef &aDef,
+        CCoeControl *aContent,
+        CAknPopupHeadingPane *aHeading)
+    {
+    TRect lbrect = aDef.iListRect.Rect();
+    TRect headrect;
+
+   if (AknLayoutUtils::ScalableLayoutInterfaceAvailable())
+        {
+        // set scroll size
+        CAknFepUICtrlJapaneseCandidateListbox* listBox =
+            static_cast<CAknFepUICtrlJapaneseCandidateListbox*>(aContent);
+        CTextListBoxModel* model = static_cast<CTextListBoxModel*>(listBox->Model());
+        const TInt items = model->NumberOfItems();
+        if (items > listBox->MaximumRows())
+            {
+            TAknWindowLineLayout scrollllinelayout = AknLayoutScalable_Avkon::scroll_pane_cp30().LayoutLine();
+            lbrect.iBr.iX -= scrollllinelayout.iW;
+            }
+        }
+
+    // set listbox view rectangle
+    aContent->SetRect(lbrect);
+    if (aHeading)
+        {
+        headrect = aDef.iHeadingRect.Rect();
+        aHeading->SetRect(headrect);
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::DrawWindowShadow
+// Draw window shadow
+//
+// Original function is AknDrawWithSkins::DrawWindowShadow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::DrawWindowShadow(
+        CWindowGc &aGc,
+        const TAknLayoutRect &aCoverRect,
+        const TAknLayoutRect &aSecondShadowRect,
+        const TAknLayoutRect &aFirstShadowRect,
+        const TAknLayoutRect &aOutlineFrameRect,
+        const TAknLayoutRect &aInsideAreaRect)
+    {
+    MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+
+    TInt x2 = aFirstShadowRect.Rect().iTl.iX;
+    TInt x3 = aSecondShadowRect.Rect().iTl.iX;
+
+    TInt y2 = aFirstShadowRect.Rect().iTl.iY;
+    TInt y3 = aSecondShadowRect.Rect().iTl.iY;
+
+    TInt x4 = aOutlineFrameRect.Rect().iBr.iX;
+    TInt x5 = aFirstShadowRect.Rect().iBr.iX;
+    TInt x6 = aSecondShadowRect.Rect().iBr.iX;
+
+    TInt y4 = aOutlineFrameRect.Rect().iBr.iY;
+    TInt y5 = aFirstShadowRect.Rect().iBr.iY;
+    TInt y6 = aSecondShadowRect.Rect().iBr.iY;
+
+    aGc.SetBrushColor(aCoverRect.Color());
+    AknsDrawUtils::Background(skin, NULL, NULL, aGc, aCoverRect.Rect());
+    AknsDrawUtils::BackgroundBetweenRects(
+        skin, NULL, NULL, aGc,
+        TRect(x2,y2,x4-1,y4-1), aInsideAreaRect.Rect());
+
+    aOutlineFrameRect.DrawOutLineRect(aGc);
+    aGc.SetBrushColor(aFirstShadowRect.Color());
+    aGc.Clear(TRect(x2,y4,x5,y5));
+    aGc.Clear(TRect(x4,y2,x5,y4));
+    aGc.SetBrushColor(aSecondShadowRect.Color());
+    aGc.Clear(TRect(x3,y5,x6,y6));
+    aGc.Clear(TRect(x5,y3,x6,y5));
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::MaximumColumns
+// This function returns maximum columns to be able to display in listbox.
+// -----------------------------------------------------------------------------
+TInt CAknFepUICtrlJapaneseCandidatePane::MaximumColumns(
+        CTextListBoxModel* aModel)
+    {
+    TInt maximumCharacters = 0;
+    TInt numberOfItems = aModel->NumberOfItems();
+    TInt i;
+    for (i = 0; i < numberOfItems; i++)
+        {
+        TPtrC text = aModel->ItemText(i);
+        TInt textLength = text.Length();
+        if (maximumCharacters < textLength)
+            {
+            maximumCharacters = textLength;
+            }
+        }
+
+    TInt maximumColumns = Min(KMaxListColumns, maximumCharacters);
+    maximumColumns = Max(KMinListColumns, maximumColumns);
+
+    return maximumColumns;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::MaximumRows
+// This function returns maximum rows to be able to display in listbox.
+// -----------------------------------------------------------------------------
+TInt CAknFepUICtrlJapaneseCandidatePane::MaximumRows(
+        CTextListBoxModel* aModel)
+    {
+    TInt numberOfItems = aModel->NumberOfItems();
+    TInt maximumRows = Min(KMaxListRows, numberOfItems);
+
+    return maximumRows;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::Draw
+// Called by the framework to draw the control
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::Draw(const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.Clear();
+    HandleDraw(iEikonEnv, gc, Layout(), iListBox, Heading());
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::OfferKeyEventL
+// Handle key events. When a key event occurs
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CAknFepUICtrlJapaneseCandidatePane::OfferKeyEventL(
+        const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+    {
+    return EKeyWasNotConsumed;
+    }
+
+void CAknFepUICtrlJapaneseCandidatePane::ShowWindowCbaL()
+    {
+    RDrawableWindow* cbaWindow = iPopoutCba->ButtonGroup()->AsControl()->DrawableWindow();
+    cbaWindow->SetOrdinalPosition(0,ECoeWinPriorityFep);
+    cbaWindow->SetFaded(EFalse, RWindowTreeNode::EFadeWindowOnly);
+    cbaWindow->SetNonFading(ETrue);
+    iEikonEnv->EikAppUi()->AddToStackL(iPopoutCba,
+                                       ECoeStackPriorityFep,
+                                       ECoeStackFlagRefusesFocus);
+    iPopoutCba->ActivateL();
+    iPopoutCba->MakeVisible(ETrue);
+    iPopoutCba->DrawDeferred(); // to update the cba
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::ProcessCommandL
+// Processes events from the softkeys. Responds to EAknSoftkeyOk and EAknSoftkeyBack
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::ProcessCommandL(TInt aCommandId)
+    {
+    // Respond to softkey events
+    switch (aCommandId)
+        {
+        case EAknFepSoftkeyCommit:
+            iUiMng->HandleCommandL(aCommandId);
+            break;
+        case EAknFepSoftkeyRetroActiveHalf:
+        case EAknFepSoftkeyRetroActiveFull:
+            iUiMng->HandleCommandL(aCommandId);
+            break;
+        default:
+            CAknPopupList::ProcessCommandL(aCommandId);
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::UpdateCbaL
+// Changing the cba
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::UpdateCbaL(TInt aResourceID)
+    {
+    if (iCurrentResource == aResourceID)
+        {
+        return;
+        }
+
+    // store resource id
+    iPopoutCba->SetCommandSetL( aResourceID );
+    iCurrentResource = aResourceID;
+    iPopoutCba->DrawDeferred();
+    }
+
+// CallBack from ListBox
+// ---------------------------------------------------------------------------
+// CAknFepUICtrlJapaneseCandidatePane::HandleListBoxEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapaneseCandidatePane::HandleListBoxEventL(
+    CEikListBox* /*aListBox*/, TListBoxEvent aEventType)
+    {
+    switch (aEventType)
+        {
+        case EEventItemDraggingActioned: // Item Moved
+            DrawNow();
+            break;
+        case EEventItemClicked:
+            {
+            TKeyEvent ccpuStart = {EKeyOK, EStdKeyDevice3, 0, 0};
+            iEikonEnv->SimulateKeyEventL(ccpuStart, EEventKey);
+            }
+            break;
+        default:
+           break;
+        }
+    }
+// End of File