fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlJapanesePredictivePane.cpp
branchRCL_3
changeset 44 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUiAvkonCtrlJapanesePredictivePane.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,1089 @@
+/*
+* 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:            Predictive 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 <aknfep.rsg>
+#include <barsread.h>
+#include <eikmop.h>
+#include <AknLayout.lag>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include "AknFepUiInterfacePanic.h"
+#include "AknFepGlobalEnums.h"
+#include "AknFepUIAvkonCtrlJapanesePredictiveListbox.h"
+#include "AknFepUIAvkonCtrlJapanesePredictivePane.h"
+#include "AknFepUIManagerJapanese.h"
+
+// CONSTANTS
+const TInt KMaxListColumns = 30;
+const TInt KLAFBaseListRows = 1;
+const TInt KLAFBelowTextBaseline = 2;
+const TInt KLAFAboveTextBaseline = 1;
+const TInt KSpaceCharCode = ' ';
+const TInt KListboxFlameMarge = 4;
+const TInt KScrollRightMarge = 5;
+const TInt KListboxMarge = 3;
+
+/**
+*  CAknFepUICtrlJapanesePredictivePane class.
+*
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapanesePredictivePane* CAknFepUICtrlJapanesePredictivePane::NewL(CAknFepUIManagerJapanese* aUiMng)
+    {
+    CAknFepUICtrlJapanesePredictivePane* self =
+        new(ELeave)CAknFepUICtrlJapanesePredictivePane(aUiMng);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);    // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::~CAknFepUICtrlJapanesePredictivePane
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapanesePredictivePane::~CAknFepUICtrlJapanesePredictivePane()
+    {
+    if (IsVisible())
+        {
+        HideWindow();
+        }
+
+    if (iListBox)
+        {
+        delete iListBox;
+        iListBox = NULL;
+        }
+
+    if (iLineInfoArray)
+        {
+        iLineInfoArray->ResetAndDestroy();
+        delete iLineInfoArray;
+        iLineInfoArray = NULL;
+        }
+
+    if (iListTextArray)
+        {
+        delete iListTextArray;
+        iListTextArray = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::ShowWindow
+// Show Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::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();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::ClosePredictiveList
+// Close Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::ClosePredictiveList()
+    {
+    CancelPopup();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::SetCurrentItemIndex
+// Specify the cursor position of a pop-up list.
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::SetCurrentItemIndex(TInt aItemIndex)
+    {
+    CAknFepUICtrlJapanesePredictiveListBoxModel* model =
+        static_cast<CAknFepUICtrlJapanesePredictiveListBoxModel*>(ListBox()->Model());
+    const TInt maximumItems = model->MaximumItems();
+
+    if (aItemIndex > maximumItems)
+        {
+        aItemIndex = maximumItems;
+        }
+
+    CAknFepUICtrlJapanesePredictiveListbox* listBox =
+        static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+
+    listBox->SetCurrentCandidateNo(aItemIndex, EFalse);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::SetOffsetPosition
+// Specify the display position of a pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::SetOffsetPosition(TPoint aOffset)
+    {
+    iOffsetPosition = aOffset;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::SetWindowPosition
+// Set position to show candidate list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::SetWindowPosition(
+                                                const TPoint& aLeftSideOfBaseLine,
+                                                TInt aHeight,
+                                                TInt aAscent)
+    {
+    // getting rectangle of 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;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::ShowCandidateListL
+// Show Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::ShowCandidateListL(
+        CDesCArrayFlat* aItems, TInt aIndex, TInt aResourceID)
+    {
+    __ASSERT_DEBUG(aItems->Count() > 0,
+                   AknFepUiInterfacePanic(EAknFepUiInterfacePanicCandidatesEmpty));
+
+    if (iLineInfoArray)
+        {
+        iLineInfoArray->ResetAndDestroy();
+        }
+    delete iLineInfoArray;
+    delete iListTextArray;
+    iLineInfoArray = NULL;
+    iListTextArray = NULL;
+    // getting listbox width by a pixel unit
+    TAknWindowLineLayout laf =
+        AKN_LAYOUT_WINDOW_popup_fep_japan_predictive_window(0, 0);
+    TAknTextLineLayout textLineLayout =
+        AKN_LAYOUT_TEXT_Predictive_candidate_selection_list_texts_Line_1(0,0);
+    TAknWindowLineLayout scrollLineLayout = AknLayoutScalable_Avkon::scroll_pane_cp29().LayoutLine();
+    TAknLayoutText text;
+    text.LayoutText(laf.Rect(), textLineLayout);
+    TInt allowDrawWidth = text.TextRect().Width() - scrollLineLayout.iW;
+
+    iLineInfoArray = CreatePredictivePopupLineInfoArrayL(
+        aItems, allowDrawWidth, textLineLayout.iFont);
+    iListTextArray = CreateListTextArrayL(iLineInfoArray);
+
+    // Set listitems.
+    CAknFepUICtrlJapanesePredictiveListBoxModel* model =
+        static_cast<CAknFepUICtrlJapanesePredictiveListBoxModel*>(ListBox()->Model());
+    model->SetMaximumItems(aItems->Count());
+    model->SetLineInfoArray(iLineInfoArray);
+    model->SetItemTextArray(iListTextArray);
+    model->SetOwnershipType(ELbmDoesNotOwnItemArray);
+
+    iMaximumRows = MaximumRows(model);
+
+    SetCurrentItemIndex(aIndex);
+    SetMaximumHeight(iMaximumRows);
+
+    // 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);
+
+    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();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::HideWindow
+// Hide Pop-up list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::HideWindow()
+    {
+    MakeVisible(EFalse);
+    Window().SetPointerCapture(EFalse);
+
+    iEikonEnv->RemoveFromStack(iPopoutCba);
+
+    iPopoutCba->MakeVisible(EFalse);
+
+    iCurrentResource = 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CurrentItemIndexOfCandidate
+// Return a selected candidate item number currently
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::CurrentItemIndexOfCandidate()
+    {
+    if (IsVisible())
+        {
+        CAknFepUICtrlJapanesePredictiveListbox* listBox =
+            static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+        return listBox->CurrentCandidateNo();
+        }
+    return -1;      // Disable window
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MoveItem
+// Move a current item in an appointed direction
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MoveItem(
+        TAknFepUICtrlScroll aDirection)
+    {
+    __ASSERT_DEBUG(iListBox->IsVisible(),
+                   AknFepUiInterfacePanic(EAknFepUiInterfacePanicNoCandidatePane));
+
+    TInt ret = 0;
+
+    switch(aDirection)
+        {
+        case EScrollLeft:
+            ret = MovePreviousItem();
+            break;
+
+        case EScrollRight:
+            ret = MoveNextItem();
+            break;
+
+        case EScrollUp:
+            ret = MovePreviousLineItem();
+            break;
+
+        case EScrollDown:
+            ret = MoveNextLineItem();
+            break;
+
+        default:
+        //Panic
+            AknFepUiInterfacePanic(EAknFepUiInterfacePanicCandidatePaneNotSupportScrollDirection);
+            break;
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::SetupWindowLayout
+// Set up a window layout type
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::SetupWindowLayout(
+        AknPopupLayouts::TAknPopupLayouts /*aType*/)
+    {
+    HandleSizeChanged(Layout(), NULL, ListBox(), this);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::AttemptExitL
+// Set the title for the selection list
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::AttemptExitL(TBool aAccept)
+    {
+    if (iReturn) //Always not null unless ExecuteLD leaves
+        *iReturn = aAccept;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MopSupplyObject
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CAknFepUICtrlJapanesePredictivePane::MopSupplyObject(TTypeUid aId)
+    {
+    SetMopParent( iEikonEnv->EikAppUi() );
+    return CAknPopupList::MopSupplyObject(aId);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CAknFepUICtrlJapanesePredictivePane
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CAknFepUICtrlJapanesePredictivePane::CAknFepUICtrlJapanesePredictivePane(CAknFepUIManagerJapanese* aUiMng)
+    : iUiMng(aUiMng)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::ConstructL()
+    {
+    // Create listbox
+    CAknFepUICtrlJapanesePredictiveListbox* list =
+                new(ELeave) CAknFepUICtrlJapanesePredictiveListbox;
+    // "iListBox" member variable is defined in CAknPopupList class.
+    iListBox = list;
+    CAknPopupList::ConstructL(
+        list, R_AKNFEP_SOFTKEYS_CONVERT_OTHER_SELECT, AknPopupLayouts::EMenuWindow);
+
+    list->ConstructL(this, CEikListBox::ELeftDownInViewRect);
+    list->CreateScrollBarFrameL(ETrue);
+    list->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                CEikScrollBarFrame::EOff,
+                                CEikScrollBarFrame::EAuto);
+
+    SetNonFocusing();
+    MakeVisible(EFalse);
+    iLineInfoArray = NULL;
+    iListTextArray = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CreatePredictivePopupLineInfoArrayL
+// Create a array with line information in candidate list
+// -----------------------------------------------------------------------------
+CPredictivePopupLineInfoArray*
+CAknFepUICtrlJapanesePredictivePane::CreatePredictivePopupLineInfoArrayL(
+        CDesCArrayFlat* aItems,
+        const TInt aMaxDisplayWidthInPixel,
+        const TInt aFontId)
+    {
+    CPredictivePopupLineInfoArray* lineArray =
+        new(ELeave) CPredictivePopupLineInfoArray(1);
+    CleanupStack::PushL(lineArray);
+
+    // getting font object from font id
+    const CFont* font = AknLayoutUtils::FontFromId(aFontId);
+
+    TInt displayWidthInPixel = aMaxDisplayWidthInPixel;
+    TInt elementStartXPos = 0;
+
+    TBuf<KMaxListColumns*2> bufferOfLine;
+    CPredictivePopupElementArray* elementArray = NULL;
+
+    const TInt widthOfSpaceInPixel = font->CharWidthInPixels(KSpaceCharCode);
+    const TInt numberOfItem = aItems->Count();
+    TInt i;
+    for (i = 0; i < numberOfItem; i++)
+        {
+        TPtrC itemText = aItems->MdcaPoint(i);
+        TInt itemTextLength = itemText.Length();
+
+        // getting a number of characters within width
+        TInt count = font->TextCount(itemText, displayWidthInPixel);
+
+        // If a candidate cannot occupy a line, it is
+        // continued in next line
+        if (count < itemTextLength && elementArray)
+            {
+            PredictivePopupAppendLineL(lineArray, bufferOfLine, elementArray);
+            CleanupStack::Pop(elementArray);    // elementArray
+            elementArray = NULL;
+            bufferOfLine.SetLength(0);
+
+            displayWidthInPixel = aMaxDisplayWidthInPixel;
+            elementStartXPos = 0;
+            count = font->TextCount(itemText, displayWidthInPixel);
+            }
+
+        FOREVER
+            {
+            if (!elementArray)
+                {
+                elementArray = new(ELeave) CPredictivePopupElementArray(1);
+                CleanupStack::PushL(elementArray);
+                }
+
+            TPtrC elementText = itemText.Left(count);
+            TInt  elementWidthInPixels = font->TextWidthInPixels(elementText);
+
+            // setting a item string to line string
+            bufferOfLine.Append(elementText);
+            displayWidthInPixel -= elementWidthInPixels;
+
+            TPredictivePopupElement& element = elementArray->ExtendL();
+            element.iStartXPos = elementStartXPos;
+            elementStartXPos += elementWidthInPixels;
+            element.iEndXPos   = elementStartXPos;
+            element.iCandidateNo = i;
+
+            // creating a string which removes a item string
+            itemTextLength -= count;
+            if (itemTextLength > 0)
+                {
+                // If this line is full, add this line and create a new line.
+                PredictivePopupAppendLineL(lineArray, bufferOfLine, elementArray);
+                CleanupStack::Pop(elementArray);    // elementArray
+                elementArray = NULL;
+                bufferOfLine.SetLength(0);
+
+                itemText.Set(itemText.Right(itemTextLength));
+                displayWidthInPixel = aMaxDisplayWidthInPixel;
+                elementStartXPos = 0;
+
+                // Calculating a number of characters which be able to shown in the width and
+                // cutting the string
+                count = font->TextCount(itemText, displayWidthInPixel);
+                }
+            else
+                {
+                break;
+                }
+            }
+
+        if (displayWidthInPixel > widthOfSpaceInPixel)
+            {
+            // adding space if it is possible to add space
+            bufferOfLine.Append(KSpaceCharCode);
+            displayWidthInPixel -= widthOfSpaceInPixel;
+            elementStartXPos    += widthOfSpaceInPixel;
+            }
+        else
+            {
+            // adding a line information if it isn't possible to add space
+            PredictivePopupAppendLineL(lineArray, bufferOfLine, elementArray);
+            CleanupStack::Pop(elementArray);    // elementArray
+            elementArray = NULL;
+            bufferOfLine.SetLength(0);
+
+            displayWidthInPixel = aMaxDisplayWidthInPixel - 1;
+            elementStartXPos = 0;
+            }
+        }
+
+    if (bufferOfLine.Length() > 0 && elementArray)
+        {
+        PredictivePopupAppendLineL(lineArray, bufferOfLine, elementArray);
+        CleanupStack::Pop(elementArray);    // elementArray
+        }
+
+    CleanupStack::Pop(lineArray);    // lineArray
+
+    return lineArray;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::PredictivePopupAppendLineL
+// Append to array with line information
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::PredictivePopupAppendLineL(
+        CPredictivePopupLineInfoArray* aLineArray,
+        const TDesC& aLineText,
+        CPredictivePopupElementArray* aElementArray)
+    {
+    HBufC* lineTextBuf = HBufC::NewL(aLineText.Length());
+    CleanupStack::PushL(lineTextBuf);
+    TPtr lineTextBufPtr = lineTextBuf->Des();
+    lineTextBufPtr.Copy(aLineText);
+
+    CPredictivePopupLineInfo* lineInfo = new(ELeave) CPredictivePopupLineInfo;
+    CleanupStack::PushL(lineInfo);
+
+    aLineArray->AppendL(lineInfo);
+    CleanupStack::Pop(2, lineTextBuf); // lineTextBuf, lineInfo
+
+    // After that set to line information items,
+    // becasue the following member variables are deleted
+    // in the destractor of CPredictivePopupLineInfo if leave occurs.
+    lineInfo->iLineText = lineTextBuf;
+    lineInfo->iElementsOnLine = aElementArray;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CreateListTextArrayL
+// Create arrary with string to show in a line
+// -----------------------------------------------------------------------------
+//
+CDesCArrayFlat* CAknFepUICtrlJapanesePredictivePane::CreateListTextArrayL(
+        CPredictivePopupLineInfoArray* aLineArray)
+    {
+    CDesCArrayFlat* textArray = new(ELeave) CDesCArrayFlat(1);
+    CleanupStack::PushL(textArray);
+
+    const TInt numberOfItem = aLineArray->Count();
+    TInt i;
+    for (i = 0; i < numberOfItem; i++)
+        {
+        CPredictivePopupLineInfo* lineInfo = aLineArray->At(i);
+        textArray->AppendL(*lineInfo->iLineText);
+        }
+
+    CleanupStack::Pop(textArray);    // textArray
+
+    return textArray;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::HandleSizeChanged
+// The handler function for size change
+//
+// Original function is AknPopupLayouts::HandleSizeChanged()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::HandleSizeChanged(
+        TAknPopupWindowLayoutDef& aDef,
+        CAknPopupHeadingPane* aHeading,
+        CEikListBox* aListBox,
+        CCoeControl* aWindowOwningControl)
+    {
+    TInt numofitems = aListBox->Model()->NumberOfItems();
+
+    TInt minItems = KJapPredictiveVisibleListRowsMin;
+    TInt maxItems = KJapPredictiveVisibleListRowsMax;
+
+    if (aDef.iMaximumHeight)
+        {
+        maxItems = aDef.iMaximumHeight;
+        }
+    AknPopupLayouts::CheckRange(numofitems, minItems, maxItems);
+    CalcPopupMenuWindow(aDef, iMainPaneRect, numofitems);
+    SetupMenuPopupWindow(aDef, numofitems, aHeading != 0);
+
+    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));
+            }
+        }
+     }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::HandleDraw
+// The handler function for Draw
+//
+// Original function is AknPopupLayouts::HandleDraw()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::HandleDraw(CEikonEnv* /*aEikEnv*/,
+                  CWindowGc& aGc,
+                  const TAknPopupWindowLayoutDef& aDef,
+                  CEikListBox* aListBox,
+                  CAknPopupHeadingPane* /*aHeading*/)
+    {
+    aGc.Clear();
+
+    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)
+        {
+        // drawing frame
+        TAknLayoutRect topLeft;
+        topLeft.LayoutRect(
+            windowRect,
+            ELayoutEmpty,
+            0, 0, ELayoutEmpty, ELayoutEmpty, KListboxFlameMarge, KListboxFlameMarge);
+
+        TAknLayoutRect bottomRight;
+        bottomRight.LayoutRect(
+            windowRect,
+            ELayoutEmpty,
+            ELayoutEmpty, ELayoutEmpty, 0, 0, KListboxFlameMarge, KListboxFlameMarge);
+
+        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 = &KAknsIIDQsnFrPopupSub;
+        const TAknsItemID *frameCenterId = &KAknsIIDQsnFrPopupCenter;
+        windowFrameDrawn = AknsDrawUtils::DrawFrame(
+                skin, aGc, outerRect, innerRect, *frameId, *frameCenterId);
+        }
+
+    if (!windowFrameDrawn)
+        {
+        DrawWindowShadow(
+            aGc,
+            aDef.iCover, aDef.iSecond, aDef.iFirst, aDef.iOutline, aDef.iInside);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::CalcPopupMenuWindow
+// Set up the information on a pop-up window
+//
+// Original function is AknPopupLayouts::CalcPopupMenuWindow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::CalcPopupMenuWindow(
+        TAknPopupWindowLayoutDef &aDef,const TRect& aRect, TInt /*aNum*/)
+    {
+    TAknLayoutRect popup_menu_window;
+
+    TBool sizeDesideFlag = EFalse;
+    TInt adjustOffsetX = 0;
+    TInt adjustOffsetY = 0;
+
+    TAknWindowLineLayout laf =
+        AKN_LAYOUT_WINDOW_popup_fep_japan_predictive_window(
+            0, iMaximumRows - KJapPredictiveVisibleListRowsMin);
+    laf.il = 0;
+    laf.it = 0;
+    TAknWindowLineLayout maxlaf =
+        AKN_LAYOUT_WINDOW_popup_fep_japan_predictive_window(
+            0, KJapPredictiveVisibleListRowsMax - KJapPredictiveVisibleListRowsMin);
+    laf.il = 0;
+    maxlaf.it = 0;
+
+    popup_menu_window.LayoutRect(aRect, laf);
+
+    // checking whether list can be drawn under the position which popup window is dispalyed
+    if (iMainPaneRect.iTl.iY
+        + iOffsetPosition.iY + KLAFBelowTextBaseline
+        + maxlaf.iH < iMainPaneRect.iBr.iY)
+        {
+        // deciding the position which popup window is dispalyed
+        adjustOffsetY = (-1) * KLAFBelowTextBaseline;
+        sizeDesideFlag = ETrue;
+        }
+
+        // checking whether list can be drawn top the position which popup window is dispalyed
+    else if (iMainPaneRect.iTl.iY
+            + iOffsetPosition.iY - KLAFAboveTextBaseline
+            - iSrcTextHeight
+            - popup_menu_window.Rect().Height() > iMainPaneRect.iTl.iY)
+        {
+        // deciding the position which popup window is dispalyed
+        adjustOffsetY = iSrcTextHeight + KLAFAboveTextBaseline + popup_menu_window.Rect().Height();
+        sizeDesideFlag = ETrue;
+        }
+
+    // display the bottom of window in case the displaying position isn't decided
+    //
+    if (!sizeDesideFlag)
+        {
+        TAknWindowLineLayout laf =
+            AKN_LAYOUT_WINDOW_popup_fep_japan_predictive_window(
+                0, KJapPredictiveVisibleListRowsMax - KLAFBaseListRows);
+        laf.il = 0;
+        laf.it = 0;
+        popup_menu_window.LayoutRect(aRect, laf);
+        adjustOffsetY =
+            iMainPaneRect.iTl.iY
+            + iOffsetPosition.iY + KLAFBelowTextBaseline
+            + popup_menu_window.Rect().Height() - iMainPaneRect.iBr.iY;
+
+        iMaximumRows = KJapPredictiveVisibleListRowsMin;
+        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);
+
+    TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+    aDef.iCover.LayoutRect(
+        window_rect,
+        AKN_LAYOUT_WINDOW_Predictive_candidate_selection_popup_window_graphics_Line_1(aDef.iWindowRect));
+    aDef.iSecond.LayoutRect(
+        window_rect,
+        AKN_LAYOUT_WINDOW_Predictive_candidate_selection_popup_window_graphics_Line_2(aDef.iWindowRect));
+    aDef.iFirst.LayoutRect(
+        window_rect,
+        AKN_LAYOUT_WINDOW_Predictive_candidate_selection_popup_window_graphics_Line_2(aDef.iWindowRect));
+    aDef.iOutline.LayoutRect(
+        window_rect,
+        AKN_LAYOUT_WINDOW_Predictive_candidate_selection_popup_window_graphics_Line_3(aDef.iWindowRect));
+    aDef.iInside.LayoutRect(
+        window_rect,
+        AKN_LAYOUT_WINDOW_Predictive_candidate_selection_popup_window_graphics_Line_4(aDef.iWindowRect));
+    aDef.iPopupMenuWindowOffset = TPoint(0, 0);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::SetupMenuPopupWindow
+// Set up the information on a pop-up window
+//
+// Original function is AknPopupLayouts::SetupMenuPopupWindow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::SetupMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, TInt /*num*/, TBool /*heading*/)
+    {
+    AknPopupLayouts::SetupDefaults(aDef);
+    TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+
+    // setting size of listbox pane
+    TAknWindowLineLayout laf =
+        AKN_LAYOUT_WINDOW_popup_fep_japan_predictive_window(0, iMaximumRows - KLAFBaseListRows);
+
+    laf.il = KListboxMarge;
+    laf.it = KListboxMarge;
+    laf.iW -= KListboxMarge*2;
+    laf.iH = laf.iH - KListboxMarge*2 - (laf.iH-KListboxMarge*2)%iMaximumRows;
+    aDef.iListRect.LayoutRect(window_rect, laf);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::HandleSizeAndPositionOfComponents
+// The handler function for size and a location
+//
+// Original function is AknPopupLayouts::HandleSizeAndPositionOfComponents()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::HandleSizeAndPositionOfComponents(
+        const TAknPopupWindowLayoutDef &aDef,
+        CCoeControl *aContent,
+        CAknPopupHeadingPane* /*aHeading*/)
+    {
+    TRect lbrect = aDef.iListRect.Rect();
+
+   if (AknLayoutUtils::ScalableLayoutInterfaceAvailable())
+        {
+        // set scroll size
+        CAknFepUICtrlJapanesePredictiveListbox* listBox =
+            static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(aContent);
+        CAknFepUICtrlJapanesePredictiveListBoxModel* model =
+            static_cast<CAknFepUICtrlJapanesePredictiveListBoxModel*>(listBox->Model());
+        TInt maxRows = model->LineInfoArray()->Count();
+        if (maxRows > KJapPredictiveVisibleListRowsMax)
+            {
+            TAknWindowLineLayout scrollLineLayout = AknLayoutScalable_Avkon::scroll_pane_cp29().LayoutLine();
+            lbrect.iBr.iX -= (scrollLineLayout.iW + KScrollRightMarge - KListboxMarge);
+            }
+        }
+
+    aContent->SetRect(lbrect);
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::DrawWindowShadow
+// Draw window shadow
+//
+// Original function is AknDrawWithSkins::DrawWindowShadow()
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::DrawWindowShadow(
+        CWindowGc& aGc,
+        const TAknLayoutRect& aCoverRect,
+        const TAknLayoutRect& /*aSecondShadowRect*/,
+        const TAknLayoutRect& aFirstShadowRect,
+        const TAknLayoutRect& aOutlineFrameRect,
+        const TAknLayoutRect& aInsideAreaRect)
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    // draw rectangle
+    aGc.SetBrushColor(aCoverRect.Color());
+    AknsDrawUtils::Background(skin, NULL, NULL, aGc, aCoverRect.Rect());
+
+    aFirstShadowRect.DrawOutLineRect(aGc);
+
+    aOutlineFrameRect.DrawOutLineRect(aGc);
+
+    aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    aGc.SetBrushColor(aInsideAreaRect.Color());
+    AknsDrawUtils::Background(skin, NULL, NULL, aGc, aInsideAreaRect.Rect());
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MaximumRows
+// calculate maximum columns from items of listbox
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MaximumRows(
+        CTextListBoxModel* aModel)
+    {
+    CAknFepUICtrlJapanesePredictiveListBoxModel* model =
+        static_cast<CAknFepUICtrlJapanesePredictiveListBoxModel*>(aModel);
+    TInt maxRows = model->LineInfoArray()->Count();
+    TInt maxVisibleRows = Min(KJapPredictiveVisibleListRowsMax, maxRows);
+    maxVisibleRows = Max(KJapPredictiveVisibleListRowsMin, maxVisibleRows);
+    return maxVisibleRows;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::Draw
+// Called by the framework to draw the control
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::Draw(const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.Clear();
+    HandleDraw(iEikonEnv, gc, Layout(), iListBox, Heading());
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::OfferKeyEventL
+// Handle key events. When a key event occurs
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CAknFepUICtrlJapanesePredictivePane::OfferKeyEventL(
+        const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+    {
+    return EKeyWasNotConsumed;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MovePreviousItem
+// selecting a next candidate
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MovePreviousItem()
+    {
+    CAknFepUICtrlJapanesePredictiveListbox* listBox =
+        static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+
+    return listBox->MovePreviousItem();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MoveNextItem
+// selecting a next candidate
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MoveNextItem()
+    {
+    CAknFepUICtrlJapanesePredictiveListbox* listBox =
+        static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+
+    return listBox->MoveNextItem();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MovePreviousLineItem
+// selecting a previous line candidate
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MovePreviousLineItem()
+    {
+    CAknFepUICtrlJapanesePredictiveListbox* listBox =
+        static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+
+    return listBox->MovePreviousLineItem();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::MoveNextLineItem
+// selecting a next line candidate
+// -----------------------------------------------------------------------------
+//
+TInt CAknFepUICtrlJapanesePredictivePane::MoveNextLineItem()
+    {
+    CAknFepUICtrlJapanesePredictiveListbox* listBox =
+        static_cast<CAknFepUICtrlJapanesePredictiveListbox*>(ListBox());
+
+    return listBox->MoveNextLineItem();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::UpdateCbaL
+// Changing the cba
+// -----------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::UpdateCbaL(TInt aResourceID)
+    {
+    if (iCurrentResource == aResourceID)
+        {
+        return;
+        }
+
+    // store resource id
+    iPopoutCba->SetCommandSetL( aResourceID );
+    iCurrentResource = aResourceID;
+    iPopoutCba->DrawDeferred();
+    }
+
+/**
+ * Processes events from the softkeys. Responds to EAknSoftkeyOk and EAknSoftkeyBack
+ * to accept or cancel the pop-up.
+ *
+ * @param   aCommandId  Event Id from the soft-key
+ */
+void CAknFepUICtrlJapanesePredictivePane::ProcessCommandL(TInt aCommandId)
+    {
+    // Respond to softkey events
+    switch (aCommandId)
+        {
+        case EAknFepSoftkeyConvert:
+        case EAknFepSoftkeyCloseWindow:
+        case EAknFepSoftkeyCommit:
+        case EAknFepSoftkeySelectCandidate:
+        case EAknFepSoftkeyOtherModes:
+            iUiMng->HandleCommandL(aCommandId);
+            break;
+        default:
+            CAknPopupList::ProcessCommandL(aCommandId);
+            break;
+        }
+    }
+
+void CAknFepUICtrlJapanesePredictivePane::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
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepUICtrlJapanesePredictivePane::HandleListBoxEventL
+// CallBack from ListBox
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepUICtrlJapanesePredictivePane::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