textinput/peninputcommonctrlsjp/src/peninputjapanesepredictivelistbox.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputcommonctrlsjp/src/peninputjapanesepredictivelistbox.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,395 @@
+/*
+* Copyright (c) 2002-2007 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 <aknlayoutscalable_avkon.cdl.h>
+
+#include "peninputeventjp.h"
+#include "peninputjapanesepredictivelistboxview.h"
+#include "peninputjapanesepredictiveListboxitemdrawer.h"
+#include "peninputjapanesepredictivecelllistboxdata.h"
+#include "peninputjapanesepredictivelistboxmodel.h"
+#include "peninputjapanesepredictivelistbox.h"
+#include "peninputjapanesepredictivewnd.h"
+
+// CONSTANTS
+const TInt KScrollRightMarge = 5;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::ConstructL(
+        const CCoeControl* aParent,
+        TInt aFlags)
+    {
+    CAknFilteredTextListBoxModel* model =
+            new(ELeave) CPeninputJapanesePredictiveListBoxModel;
+    iModel=model;
+    model->ConstructL();
+    CreateItemDrawerL();
+
+    EnableExtendedDrawingL();
+
+    iItemDrawer->SetDrawMark(EFalse);
+    CEikListBox::ConstructL(aParent,aFlags);
+    iLineCount = KPENINPUT_LAYOUT_PREDICTIONPANE_ROW_COUNT;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::SetCurrentCandidateNo
+// Selecting a candidate number appointed with an argument
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::SetCurrentCandidateNo(
+        TInt aCandidateNo, TBool aDraw) const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+    TInt itemIndex = view->SetCurrentCandidateNo(aCandidateNo);
+    if (itemIndex >= 0)
+        {
+        if (aDraw)
+            {
+            SetCurrentItemIndexAndDraw(itemIndex);
+            }
+        else
+            {
+            SetCurrentItemIndex(itemIndex);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::SetCurrentCandidateNo
+// Selecting a candidate number appointed with an argument
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::SetCurrentCandidateNo(
+        TInt aLineNo, const TPoint& aPoint, TBool aDraw) const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+    TInt itemIndex = view->SetCurrentCandidateNo(aLineNo, aPoint);
+
+    if (aDraw)
+        {
+        SetCurrentItemIndexAndDraw(itemIndex);
+        }
+    else
+        {
+        SetCurrentItemIndex(itemIndex);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::CurrentCandidateNo
+// Returning a selected number
+// -----------------------------------------------------------------------------
+TInt CPeninputJapanesePredictiveListBox::CurrentCandidateNo() const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+    return view->CurrentCandidateNo();
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::MovePreviousItem
+// selecting a previous candidate
+// -----------------------------------------------------------------------------
+TInt CPeninputJapanesePredictiveListBox::MovePreviousItem() const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+
+    TInt candidateNo = view->PreviousItem();
+    SetCurrentCandidateNo(candidateNo, ETrue);
+
+    return candidateNo;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::MoveNextItem
+// selecting a next candidate
+// -----------------------------------------------------------------------------
+TInt CPeninputJapanesePredictiveListBox::MoveNextItem() const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+
+    TInt candidateNo = view->NextItem();
+    SetCurrentCandidateNo(candidateNo, ETrue);
+
+    return candidateNo;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::MovePreviousLineItem
+// selecting a previous line candidate
+// -----------------------------------------------------------------------------
+TInt CPeninputJapanesePredictiveListBox::MovePreviousLineItem() const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+    TInt candidateNo = view->PreviousLineItem();
+    SetCurrentCandidateNo(candidateNo, ETrue);
+
+    return candidateNo;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::MoveNextLineItem
+// selecting a next line candidate
+// -----------------------------------------------------------------------------
+TInt CPeninputJapanesePredictiveListBox::MoveNextLineItem() const
+    {
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+    TInt candidateNo = view->NextLineItem();
+    SetCurrentCandidateNo(candidateNo, ETrue);
+
+    return candidateNo;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::HandlePointerEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    CAknSinglePopupMenuStyleListBox::HandlePointerEventL(aPointerEvent);
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::Draw
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::Draw() const
+    {
+    CWindowGc* gcSave = CCoeEnv::Static()->SwapSystemGc(ItemDrawer()->Gc());
+    DrawNow();
+    CCoeEnv::Static()->SwapSystemGc(gcSave);
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::SetLineCount
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::SetLineCount(TInt aLineCount)
+    {
+    iLineCount = aLineCount;
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::SizeChanged
+// This function is called in case changing size
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::SizeChanged()
+    {
+    CEikFormattedCellListBox& listBox = *this;
+    CFormattedCellListBoxItemDrawer* itemDrawer = listBox.ItemDrawer();
+
+    TAknWindowLineLayout textWindowLayout =
+        AknLayoutScalable_Avkon::list_single_choice_list_pane(0).LayoutLine();
+
+    TAknTextLineLayout textLineLayout =
+        AknLayoutScalable_Avkon::fep_vkb_top_text_pane_t1().LayoutLine();
+    const CFont* font = AknLayoutUtils::FontFromId(textLineLayout.iFont, NULL);
+    textWindowLayout.iH = Rect().Size().iHeight/2;  // control itemheight
+
+    AknListBoxLayouts::SetupStandardListBox(listBox);  // SetBorder(TGulBorder::ENone)
+    AknListBoxLayouts::SetupStandardFormListbox(itemDrawer); // Set Standard Colors
+    AknListBoxLayouts::SetupListboxPos(listBox, textWindowLayout);  // ItemDrawer()->SetItemCellSize()
+    {
+    TRgb color( KRgbBlack );
+    // this does not modify color unless it gets a correct one
+    // no real need to check errors
+    AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+                              color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG10 );
+    itemDrawer->SetHighlightedTextColor( color );
+    AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+                               color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG7 );
+    iItemDrawer->SetTextColor( color );
+    }
+
+    TSize itemSize = View()->ItemSize();
+
+    // setting textbox size in listbox
+    TInt baseline = itemSize.iHeight/2 + font->AscentInPixels() / 2;
+    textLineLayout.iB = ELayoutP - baseline;  // control itemheight
+
+    AknListBoxLayouts::SetupFormAntiFlickerTextCell(listBox, itemDrawer, 0,
+                            textLineLayout,
+                            TPoint(0, 0),
+                            TPoint(itemSize.iWidth, itemSize.iHeight));
+
+    CEikFormattedCellListBox::SizeChanged();
+
+    // Scroll bar
+    TAknWindowLineLayout scrollLineLayout = AknLayoutScalable_Avkon::scroll_pane_cp30().LayoutLine();
+    scrollLineLayout.il = ELayoutEmpty;
+    scrollLineLayout.ir = KScrollRightMarge;
+    scrollLineLayout.it = 0;
+    scrollLineLayout.ib = 0;
+    TRect scrollBarParent = TRect(TPoint(listBox.Rect().iTl),
+                                  TSize(listBox.Rect().Width() + scrollLineLayout.iW + scrollLineLayout.ir,
+                                        listBox.Rect().Height()));
+    AknLayoutUtils::LayoutVerticalScrollBar(iSBFrame, scrollBarParent, scrollLineLayout);
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::MakeViewClassInstanceL
+// Creating a view
+// -----------------------------------------------------------------------------
+CListBoxView* CPeninputJapanesePredictiveListBox::MakeViewClassInstanceL()
+    {
+    return new(ELeave) CPeninputJapanesePredictiveListBoxView;
+    }
+
+void CPeninputJapanesePredictiveListBox::HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType)
+    {
+    TInt oldThumbPos = (aEventType & KEikScrollEventBarMask) ? iView->HScrollOffset() : iView->TopItemIndex();
+    TInt newThumbPos = oldThumbPos;
+    TInt maxThumbPos = static_cast<CTextListBoxModel*>(Model())->NumberOfItems() - iLineCount;
+
+    switch (aEventType & KEikScrollEventBarMask)
+        {
+    case KEikScrollEventFromVBar:
+        switch (aEventType)
+            {
+        case EEikScrollUp:
+            if (newThumbPos > 0)
+                {
+                -- newThumbPos;
+                }
+            if ( oldThumbPos == 0  && (iListBoxFlags & ELoopScrolling))
+                {
+                newThumbPos = maxThumbPos;              
+                }
+            break;
+        case EEikScrollDown:
+            if (newThumbPos < maxThumbPos)
+                {
+                ++ newThumbPos;
+                }
+            if ( oldThumbPos == maxThumbPos && (iListBoxFlags & ELoopScrolling) )
+                {
+                newThumbPos = 0;                
+                }
+            break;
+
+        default:
+            break;
+            }
+
+        if ( newThumbPos != oldThumbPos )
+            {
+            iView->VScrollTo(newThumbPos);
+            aScrollBar->SetModelThumbPosition(iView->TopItemIndex());
+            UpdateScrollBarThumbs();
+            }
+        break;
+    default:
+        break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::CreateItemDrawerL
+// Creating a ItemDrawer
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::CreateItemDrawerL()
+    {
+    CPeninputJapanesePredictiveCellListBoxData*
+        cellData = CPeninputJapanesePredictiveCellListBoxData::NewL();
+    CleanupStack::PushL(cellData);
+
+    iItemDrawer =
+        new(ELeave) CPeninputJapanesePredictiveListBoxItemDrawer(
+                        Model(), NULL, cellData);
+
+    CleanupStack::Pop(cellData);    // cellData
+    }
+
+// -----------------------------------------------------------------------------
+// CPeninputJapanesePredictiveListBox::UpdateCurrentItem
+// Update the current index
+// Notes: The argument of aItemIndex means the current line. (not current candidate index)
+// -----------------------------------------------------------------------------
+void CPeninputJapanesePredictiveListBox::UpdateCurrentItem(TInt aItemIndex) const
+    {
+    CPeninputJapanesePredictiveListBoxModel* model =
+        static_cast<CPeninputJapanesePredictiveListBoxModel*>(Model());
+    CPeninputJapanesePredictiveListBoxView* view =
+        static_cast<CPeninputJapanesePredictiveListBoxView*>(View());
+
+    if (!model->LineInfoArray())
+        {
+        return;
+        }
+    TPredictivePopupElement element;
+    TInt curCandi = view->CurrentCandidateNo();
+    TInt oldCandi = view->OldCandidateNo();
+    TInt maxLine = model->LineInfoArray()->Count();
+
+    TInt oldCurrentItemIndex = view->CurrentItemIndex();
+    if (oldCurrentItemIndex != aItemIndex)
+        {
+        // Set the current line
+        view->SetCurrentItemIndex(aItemIndex);
+
+        if ( IsReadyToDraw() )
+            {
+            // Draw the old line
+            view->DrawItem(oldCurrentItemIndex);
+            }
+
+        if (oldCurrentItemIndex+1 < maxLine
+         && oldCurrentItemIndex+1 != aItemIndex)
+            {
+            if (model->SearchElement(oldCurrentItemIndex+1,
+                                     oldCandi, element))
+                {
+                view->DrawItem(oldCurrentItemIndex+1);
+                }
+            }
+        // Set the top position
+        if (!(view->ItemIsVisible(aItemIndex)))
+            {
+            SetTopItemIndex(view->CalcNewTopItemIndexSoItemIsVisible(aItemIndex));
+            DrawNow();
+            }
+        }
+    // Draw the current line
+    DrawItem(aItemIndex);
+    // Check next line including the same candidate
+    TInt nextLine = aItemIndex+1;
+    if (nextLine < maxLine
+     && model->SearchElement(nextLine, curCandi, element))
+        {
+        if (!(view->ItemIsVisible(nextLine)))
+            {
+            SetTopItemIndex(view->CalcNewTopItemIndexSoItemIsVisible(nextLine));
+            DrawNow();
+            }
+        DrawItem(nextLine);
+        }
+    UpdateScrollBarThumbs();
+    }
+
+// End of File