diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonctrlsjp/src/peninputjapanesepredictivelistbox.cpp --- /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 + +#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(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(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(View()); + return view->CurrentCandidateNo(); + } + +// ----------------------------------------------------------------------------- +// CPeninputJapanesePredictiveListBox::MovePreviousItem +// selecting a previous candidate +// ----------------------------------------------------------------------------- +TInt CPeninputJapanesePredictiveListBox::MovePreviousItem() const + { + CPeninputJapanesePredictiveListBoxView* view = + static_cast(View()); + + TInt candidateNo = view->PreviousItem(); + SetCurrentCandidateNo(candidateNo, ETrue); + + return candidateNo; + } + +// ----------------------------------------------------------------------------- +// CPeninputJapanesePredictiveListBox::MoveNextItem +// selecting a next candidate +// ----------------------------------------------------------------------------- +TInt CPeninputJapanesePredictiveListBox::MoveNextItem() const + { + CPeninputJapanesePredictiveListBoxView* view = + static_cast(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(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(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(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(Model()); + CPeninputJapanesePredictiveListBoxView* view = + static_cast(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