diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutaknchoicelist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutaknchoicelist.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,524 @@ +/* +* Copyright (c) 2005-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: Implementation for avkon based choice list control +* +*/ + + +#include "peninputlayoutaknchoicelist.h" +#include "peninputlayout.h" + +#include // AknButton flags +#include +//#include + +#include +#include +#include + +#include +#include + +#include + + + +const TInt KMaxTxtLen = 256; + +NONSHARABLE_CLASS(CPenUiScrolbarCtrl) : public CFepUiBaseCtrl + { + public: + CPenUiScrolbarCtrl(CCoeControl* aCtrl, CFepUiLayout* aLayout); + void ConstructL(); + }; + +CPenUiScrolbarCtrl::CPenUiScrolbarCtrl(CCoeControl* aCtrl, CFepUiLayout* aLayout) + : CFepUiBaseCtrl(aCtrl,aLayout,EFalse) + { + } + +void CPenUiScrolbarCtrl::ConstructL() + { + BaseConstructL(); + } + +// implementation for class CFepLayoutAknChoiceList +EXPORT_C CFepLayoutAknChoiceList* CFepLayoutAknChoiceList::NewL(CFepUiLayout* aUiLayout, + TInt aControlId,CCoeControl* aParent) + { + CFepLayoutAknChoiceList* self = new (ELeave) CFepLayoutAknChoiceList(aUiLayout, + aControlId,aParent); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CFepLayoutAknChoiceList::CFepLayoutAknChoiceList(CFepUiLayout* aUiLayout, + TInt aControlId,CCoeControl* aParent) + : CFepLayoutChoiceList(aUiLayout,aControlId) + { + iParent = aParent; + } + +EXPORT_C CFepLayoutAknChoiceList::~CFepLayoutAknChoiceList() + { + delete iScrollbarCtrl; + delete iTxtTransferBuf; + delete iBgContext; + } + +EXPORT_C void CFepLayoutAknChoiceList::ConstructL() + { + CFepLayoutChoiceList::ConstructL(); + + iListBox = new(ELeave) CAknSinglePopupMenuStyleListBox ;//CAknSingleStyleListBox; + + iListBox->ConstructL(iParent,EAknListBoxMenuList); + iListBox->MakeVisible(EFalse); + + + CWindowGc* gc = RootControl()->GetRWindowGcL();//(static_cast(UiLayout()))->WindowGc(); + iListBox->SetGc(gc); + + iListBox->SetGc(gc); + iListBox->ItemDrawer()->SetGc(gc); + + iListBox->CreateScrollBarFrameL(ETrue,EFalse,EFalse); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto); + + CEikScrollBar* scrbar = iListBox->ScrollBarFrame()->VerticalScrollBar(); + iScrollbarCtrl = new(ELeave) CPenUiScrolbarCtrl(scrbar, UiLayout()); + static_cast(iScrollbarCtrl)->ConstructL(); + UpdateTextColors(); + + CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData(); + TBool b = d->SubCellIsTransparent(0); + TMargins m = d->SubCellMargins(0); + //UseSubCellColors + + + iWndControl = iListBox; + + iTxtTransferBuf = HBufC::NewL(KMaxTxtLen); + + TRect nullRect( 0, 0, 0, 0 ); + + iBgContext = CAknsFrameBackgroundControlContext::NewL( + KAknsIIDQsnFrPopupSub, nullRect, nullRect, EFalse ); + + + } + +EXPORT_C void CFepLayoutAknChoiceList::SetItemsL(const RPointerArray& + aItemList) + { + TRect r = iRect; + CFepLayoutChoiceList::SetItemsL(aItemList); + // + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + //= (CDesCArray*) itemList; + + for(int ii = 0; ii < aItemList.Count(); ++ii) + { + itemArray->AppendL(aItemList[ii]->iText); + } + iListBox->HandleItemAdditionL(); + SetRect(r); + } + + +EXPORT_C void CFepLayoutAknChoiceList::AddItemL(const CFepLayoutChoiceList::SItem& aItem) + { + TRect r = iRect; + CFepLayoutChoiceList::AddItemL(aItem); + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + itemArray->AppendL(AdjustColumnText(aItem.iText)); + iListBox->HandleItemAdditionL(); + SetRect(r); + } + + +EXPORT_C void CFepLayoutAknChoiceList::InsertItemL(TInt aPostion, + const CFepLayoutChoiceList::SItem& aItem) + { + TRect r = iRect; + CFepLayoutChoiceList::InsertItemL(aPostion,aItem); + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + itemArray->InsertL(aPostion,AdjustColumnText(aItem.iText)); + iListBox->HandleItemAdditionL(); + SetRect(r); + } + +EXPORT_C void CFepLayoutAknChoiceList::RemoveItemByCommand(TInt aCommand) + { + TInt idx = FindCommand(aCommand); + if(idx > 0) + { + RemoveItemByIndex(idx); + } + } + +void CFepLayoutAknChoiceList::RemoveItemByIndexL(TInt aIndex) + { + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + __ASSERT_DEBUG(aIndex >= 0 && aIndex < itemArray->Count(),User::Leave(EUiGeneralIndexError)); + CFepLayoutChoiceList::RemoveItemByIndex(aIndex); + itemArray->Delete(aIndex); + TRAP_IGNORE(iListBox->HandleItemRemovalL()); + } + +EXPORT_C void CFepLayoutAknChoiceList::RemoveItemByIndex(TInt aIndex) + { + TRAP_IGNORE(RemoveItemByIndexL(aIndex)); + } + +EXPORT_C void CFepLayoutAknChoiceList::ClearItemsL() + { + CFepLayoutChoiceList::ClearItemsL(); + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + itemArray->Reset(); + } + +EXPORT_C TInt CFepLayoutAknChoiceList::ItemsCount() + { + CDesCArray* itemArray = static_cast(FormatedCellListBox()->Model()->ItemTextArray()); + return itemArray->Count(); + } + +EXPORT_C void CFepLayoutAknChoiceList::Draw() + { + + if(iWndControl && AbleToDraw()) + { + DrawOpaqueMaskBackground(); + CFbsBitGc* gc = static_cast(BitGc()); + gc->Activate( BitmapDevice() ); + + const TRect& r = Rect(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TRAP_IGNORE(CWindowGc& sysgc = *(RootControl()->GetRWindowGcL())); + //if ( !AknsDrawUtils::Background( skin, iBgContext, sysgc, r ) ) + { + gc->Clear( Rect()); + } + + iWndControl->DrawNow(); + UpdateArea(iRect, EFalse); + } + + } + +EXPORT_C void CFepLayoutAknChoiceList::SetItemRect(const TRect& , const TRect& ) + { + //do nothing + } + +// CFepLayoutChoiceList::OnDisplay +// Prepare display. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepLayoutAknChoiceList::OnDisplay(const TPoint& /*aOffset*/) + { + //set window position + //iListBox->ActivateL(); + //TBool b = iListBox->IsVisible(); + TPoint layoutPos = UiLayout()->LayoutOwner()->LayoutRect().iTl; + layoutPos = TPoint(0,0); + //CFepLayoutChoiceList::OnDisplay(aOffset); + // iListBox->SetExtent(layoutPos + aOffset,Rect().Size()); + + CListBoxView* view = iListBox->View(); + TRect r = view->ViewRect(); + r.iBr.iY -= 50; + view->SetViewRect(r); + + TSize is = view->ItemSize(0); + TInt w = MinItemWidthInPixels(); + TSize s = iListBox->ItemDrawer()->MinimumCellSize(); + TSize ls = iListBox->ItemDrawer()->LafItemSize (); + + UpdateControlContext(); + UpdateTextColors(); + iListBox->MakeVisible(ETrue); + TRAP_IGNORE(iListBox->ActivateL()); +// iListBox->ItemDrawer()->FormattedCellData()->SetSkinEnabledL( EFalse ); + // Marquee can be requested.. ;) + // iListBox->ItemDrawer()->FormattedCellData()->EnableMarqueeL( EFalse ); + + } + + + +EXPORT_C CEikColumnListBox* CFepLayoutAknChoiceList::ListBox() + { + return 0;//iListBox; + } +EXPORT_C CEikFormattedCellListBox* CFepLayoutAknChoiceList::FormatedCellListBox() + { + return iListBox; + } + +void CFepLayoutAknChoiceList::UpdateTextColors() + { + TRgb color( KRgbBlack ); // sane default for nonskinned case + if ( AknsUtils::AvkonSkinEnabled() ) + { + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8 ); + } + + iListBox->ItemDrawer()->SetTextColor( color ); + iListBox->ItemDrawer()->SetBackColor( AKN_LAF_COLOR( 0 ) ); + + if ( AknsUtils::AvkonSkinEnabled() ) + { + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG8 ); + } + + CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData(); + + iListBox->ItemDrawer()->SetHighlightedTextColor( color ); + iListBox->ItemDrawer()->SetHighlightedBackColor( AKN_LAF_COLOR( 0 ) ); + } + +void CFepLayoutAknChoiceList::UpdateControlContext() + { + + CFormattedCellListBoxItemDrawer* itemDrawer = iListBox->ItemDrawer(); + CFormattedCellListBoxData* d = itemDrawer->FormattedCellData(); + + TAknLayoutRect cellRect; + cellRect.LayoutRect( Rect(), + AknLayoutScalable_Avkon::list_single_choice_list_pane(0) ); + + TRect cell( cellRect.Rect() ); + + TRAP_IGNORE(iListBox->SetItemHeightL( cell.Height() )); + + //d->SetTextSubCellL( 0, AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(0) ); + { + + const TAknTextLineLayout& aTextLayout = + AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(0); + + TAknLayoutText t; + TInt subCell = 0; + t.LayoutText( iListBox->View()->ItemDrawer()->ItemCellSize(), aTextLayout ); + CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData(); + TRAP_IGNORE(d->SetSubCellSizeL( subCell, t.TextRect().Size() )); + TRAP_IGNORE(d->SetSubCellPositionL( subCell, t.TextRect().iTl )); + TRAP_IGNORE(d->SetSubCellFontL( subCell, t.Font() )); + TRAP_IGNORE(d->SetSubCellAlignmentL( subCell, + AknLayoutUtils::TextAlignFromId( aTextLayout.iJ ) )); + TInt B = 22;//AknLayoutUtils::CorrectBaseline( iListBox->View()->ItemDrawer()->ItemCellSize().iHeight, aTextLayout.iB, aTextLayout.FontId() ); + TRAP_IGNORE(d->SetSubCellBaselinePosL( subCell, B )); + } + + + { + TAknLayoutRect cellRect; + cellRect.LayoutRect( Rect(), + AknLayoutScalable_Avkon::list_single_choice_list_pane(0) ); + + iListBox->View()->ItemDrawer()->SetItemCellSize( cellRect.Rect().Size() ); + + TRAP_IGNORE(iListBox->SetItemHeightL( cell.Height()*2 )); + + } +/* TRect rectParent( Rect() ); + + TAknLayoutRect layoutRect; + TInt variety = 0; + + // check if scrollbar-layout should be selected + if ( ScrollbarVisible() ) + { + variety = 1; + + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOn); + + AknLayoutUtils::LayoutVerticalScrollBar( iListBox->ScrollBarFrame(), + rectParent, + AknLayoutScalable_Avkon::scroll_pane_cp23().LayoutLine() + ); + } + else + { + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EOff); + } + + layoutRect.LayoutRect( rectParent, + AknLayoutScalable_Avkon::list_choice_list_pane( variety ).LayoutLine() ); + iListBox->SetRect( layoutRect.Rect() ); + + TAknLayoutRect innerRect; + innerRect.LayoutRect( + rectParent, + AknLayoutScalable_Avkon::list_choice_list_pane(0).LayoutLine() + ); + + iBgContext->SetFrameRects(rectParent, innerRect.Rect()); */ + } +// --------------------------------------------------------------------------- +// CFepLayoutPopupWnd::SetRect +// Set the pop up window's rect +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepLayoutAknChoiceList::SetRect(const TRect& aRect) + { + + //Ensure that the top left of pop up window is always (0,0) + //iRect.Move(-aRect.iTl.iX,-aRect.iTl.iY); + if(iRect == aRect) + return; + + iRect = aRect; + /* + if(iWndControl) + iWndControl->SetRect(iRect); + */ + iListBox->SetRect( aRect); + UpdateControlContext(); + if(iScrollbarCtrl) + { + //set the rect of the scroll bar + TRect rect = iScrollbarCtrl->WndControl()->Rect(); + iScrollbarCtrl->SetRect(rect); + } + + } + +EXPORT_C TBool CFepLayoutAknChoiceList::ScrollbarVisible() + { + return ETrue; + } + +// --------------------------------------------------------------------------- +// CFepLayoutAknChoiceList::HandlePointerDownEventL +// Handle pointer down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerDownEventL(const TPoint& aPoint) + { + if(ScrollbarVisible()) + { + if(iScrollbarCtrl->Rect().Contains(aPoint)) + { + iScrollbarCaptured = ETrue; + return iScrollbarCtrl->HandlePointerDownEventL(aPoint); + } + } + CFepUiBaseCtrl::HandlePointerDownEventL(aPoint); + //CFepLayoutChoiceList::HandlePointerDownEventL(aPoint); + return this; + } + +// --------------------------------------------------------------------------- +// CFepLayoutAknChoiceList::HandlePointerUpEventL +// Handle pointer up event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerUpEventL( + const TPoint& aPoint) + { + if(iScrollbarCaptured) + { + iScrollbarCaptured = EFalse; + return iScrollbarCtrl->HandlePointerUpEventL(aPoint); + } + //CFepUiBaseCtrl::HandlePointerUpEventL(aPoint); + CFepLayoutChoiceList::HandlePointerUpEventL(aPoint); + return this; + } + +// --------------------------------------------------------------------------- +// CFepLayoutAknChoiceList::HandlePointerMoveEventL +// Handle pointer move event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CFepLayoutAknChoiceList::HandlePointerMoveEventL( + const TPoint& aPoint) + { + if(iScrollbarCaptured) + { + iScrollbarCtrl->HandlePointerMoveEventL(aPoint); + } + if(PointerDown()) //only handle move event after pointer down + CFepUiBaseCtrl::HandlePointerMoveEventL(aPoint); + //CFepLayoutChoiceList::HandlePointerMoveEventL(aPoint); + return this; + + } + +// --------------------------------------------------------------------------- +// CFepLayoutAknChoiceList::AdjustColumnText +// Adjust the txt which is added to column list. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +const TDesC& CFepLayoutAknChoiceList::AdjustColumnText(const TDesC& aTxt) + { + return aTxt; + /*_LIT(KLitTabulate,"\t"); + if(aTxt.Find(KLitTabulate) >=0) + return aTxt; + if(KMaxTxtLen < aTxt.Length() + KLitTabulate().Length()) + { + delete iTxtTransferBuf; + iTxtTransferBuf = 0; + iTxtTransferBuf = HBufC::NewL(aTxt.Length() + KLitTabulate().Length()); + } + TPtr ptr = iTxtTransferBuf->Des(); + ptr.Zero(); + ptr.Append(KLitTabulate); + ptr.Append(aTxt); + return *iTxtTransferBuf;*/ + } + +// CFepLayoutAknChoiceList::ReCalcLayout +// Calculates the displaying rect. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepLayoutAknChoiceList::ReCalcLayout() + { + //do nothing + } + +EXPORT_C TInt CFepLayoutAknChoiceList::MinItemWidthInPixels() + { + + TInt minWidth = 0; + for(TInt i = 0; i < ItemsCount(); ++i) + { + TInt itemWidth = iListBox->ItemDrawer()->ItemWidthInPixels (i); + minWidth = itemWidth > minWidth ? itemWidth : minWidth; + } + + + CFormattedCellListBoxData* d = iListBox->ItemDrawer()->FormattedCellData(); + TSize s1 = d->SubCellSize(0); + TSize s2 = d->SubCellSize(1); + return minWidth; + } + +//END OF FILE +