diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonctrls/src/peninputselectionlist/peninputselectionlist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonctrls/src/peninputselectionlist/peninputselectionlist.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,426 @@ +/* +* Copyright (c) 2009 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: +* +*/ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "peninputselectionlist.h" + +// constant definition +const TInt KInvalidResId = -1; +const TInt KInvalidBmp = -1; +const TInt KInvalidItemIndex = -1; + +EXPORT_C CPenInputSelectionList* CPenInputSelectionList::NewL(CFepUiLayout* aUiLayout, + TInt aControlId, + TPoint aTopLeftPoint, + TSize aItemSize, + TInt aItemHorizontalMargin) + { + CPenInputSelectionList* self = new (ELeave) CPenInputSelectionList(aUiLayout, + aControlId, + aTopLeftPoint, + aItemSize, + aItemHorizontalMargin); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CPenInputSelectionList::~CPenInputSelectionList() + { + iItemList.Reset(); + iItemList.Close(); + + iBmpList.ResetAndDestroy(); + iBmpList.Close(); + } + +void CPenInputSelectionList::RecalculateCtrlRect() + { + if (iItemList.Count() == 0) + { + SetRect(TRect(0, 0, 0, 0)); + } + else + { + SetRect(TRect(iItemList[0].iRect.iTl, + iItemList[iItemList.Count() - 1].iRect.iBr)); + } + } + +EXPORT_C void CPenInputSelectionList::SizeChanged(TPoint aTopLeftPoint, + TSize aItemSize, + TInt aItemHorizontalMargin) + { + iTopLeftPoint = aTopLeftPoint; + iItemSize = aItemSize; + iItemHorizontalMargin = aItemHorizontalMargin; + + for (TInt i = 0; i < iItemList.Count(); i++) + { + iItemList[i].iRect = TRect(TPoint(aTopLeftPoint.iX, + aTopLeftPoint.iY + + i * (aItemHorizontalMargin + iItemSize.iHeight)), + aItemSize); + } + + RecalculateCtrlRect(); + } + +EXPORT_C void CPenInputSelectionList::SetItemsL(const RPointerArray& aItemList) + { + Hide(ETrue); + + iItemList.Reset(); + + for (TInt i = 0; i < aItemList.Count(); i++) + { + SItem item(TRect(TPoint(iTopLeftPoint.iX, + iTopLeftPoint.iY + i * (iItemHorizontalMargin + iItemSize.iHeight)), + iItemSize), + *aItemList[i]); + iItemList.AppendL(item); + } + + RecalculateCtrlRect(); + } + +EXPORT_C void CPenInputSelectionList::AddItemL(const TDesC& aItem) + { + SItem item(TRect(TPoint(iTopLeftPoint.iX, + iTopLeftPoint.iY + iItemList.Count() * (iItemHorizontalMargin + + iItemSize.iHeight)),iItemSize), aItem); + iItemList.AppendL(item); + + RecalculateCtrlRect(); + } + +EXPORT_C void CPenInputSelectionList::RemoveItem(TInt aItemIndex) + { + if (aItemIndex < 0 || aItemIndex >= iItemList.Count()) + { + return; + } + + iItemList.Remove(aItemIndex); + + for (TInt i = aItemIndex; i < iItemList.Count(); i++) + { + iItemList[i].iRect.Move(-iItemHorizontalMargin, 0); + } + + RecalculateCtrlRect(); + } + +EXPORT_C void CPenInputSelectionList::RemoveAllItems() + { + iItemList.Reset(); + RecalculateCtrlRect(); + } + +EXPORT_C void CPenInputSelectionList::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + User::Leave(KErrArgument); + } + + iBmpList.ResetAndDestroy(); + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + TPtrC bmpFileName = reader.ReadTPtrC(); + TInt imgMajorSkinId = reader.ReadInt32(); + + TAknsItemID id; + + for (TInt i = 0; i < EBmpLastType + 1; i+=2) + { + TInt bmpid = reader.ReadInt16(); + TInt maskid = reader.ReadInt16(); + TInt minorskinid = reader.ReadInt16(); + + id.Set(imgMajorSkinId, minorskinid); + + CFbsBitmap* bmp = NULL; + CFbsBitmap* maskbmp = NULL; + + if (bmpid != KInvalidBmp) + { + if (maskid != KInvalidBmp) + { + AknsUtils::CreateIconL(AknsUtils::SkinInstance(), + id, + bmp, + maskbmp, + bmpFileName, + bmpid, + maskid); + + AknIconUtils::SetSize(maskbmp, iItemSize, EAspectRatioNotPreserved); + } + else + { + AknsUtils::CreateIconL(AknsUtils::SkinInstance(), + id, + bmp, + bmpFileName, + bmpid); + } + + AknIconUtils::SetSize(bmp, iItemSize, EAspectRatioNotPreserved); + } + + iBmpList.AppendL(bmp); + iBmpList.AppendL(maskbmp); + } + + CleanupStack::PopAndDestroy(); // reader + } + +EXPORT_C void CPenInputSelectionList::SetTextProperty(const CFont* aFont, + TRgb aFontColor) + { + iFont = aFont; + iFontColor = aFontColor; + + iBaselineOffset = iItemSize.iHeight/2 + aFont->AscentInPixels()/2; + } + +TInt CPenInputSelectionList::HitTest(const TPoint& aPoint) + { + if (!Rect().Contains(aPoint)) + { + return KErrGeneral; + } + + for (TInt i = 0; i < iItemList.Count(); i++) + { + if (iItemList[i].iRect.Contains(aPoint)) + { + return i; + } + } + + return KErrNotFound; + } + +EXPORT_C CFepUiBaseCtrl* CPenInputSelectionList::HandlePointerDownEventL(const TPoint& aPoint) + { + CFepUiBaseCtrl::HandlePointerDownEventL(aPoint); + + TInt index = HitTest(aPoint); + + if (index >= 0) + { + if (index != iFocusItemIndex) + { + TInt prev = iFocusItemIndex; + iFocusItemIndex = index; + + if (prev != KInvalidItemIndex) + { + DrawItem(prev); + } + + DrawItem(iFocusItemIndex); + } + } + else if (index == KErrGeneral) + { + SetPointerDown(EFalse); + CloseWindow(); + } + + return this; + } + +EXPORT_C CFepUiBaseCtrl* CPenInputSelectionList::HandlePointerUpEventL(const TPoint& aPoint) + { + CFepUiBaseCtrl::HandlePointerUpEventL(aPoint); + + TInt index = HitTest(aPoint); + + if (index >= 0) + { + CloseWindow(); + + if (iFocusItemIndex != KInvalidItemIndex) + { + TPtrC ptr; + ptr.Set(reinterpret_cast(&iFocusItemIndex), sizeof(TInt)/sizeof(TText)); + ReportEvent(iEventId, ptr); + } + } + + iFocusItemIndex = KInvalidItemIndex; + + return this; + } + +EXPORT_C CFepUiBaseCtrl* CPenInputSelectionList::HandlePointerMoveEventL(const TPoint& aPoint) + { + CFepUiBaseCtrl::HandlePointerMoveEventL(aPoint); + + if (PointerDown()) + { + TInt index = HitTest(aPoint); + + if (index != iFocusItemIndex && index != KInvalidItemIndex) + { + TInt prev = iFocusItemIndex; + iFocusItemIndex = index; + + if( prev != -1 ) + { + DrawItem(prev); + } + + DrawItem(iFocusItemIndex); + } + } + + return this; + } + +EXPORT_C void CPenInputSelectionList::Display() + { + //Hide(EFalse); + BringToTop(); + Draw(); + } + +EXPORT_C void CPenInputSelectionList::CloseWindow() + { + Hide(ETrue); + RemoveAllItems(); + } + +CPenInputSelectionList::CPenInputSelectionList(CFepUiLayout* aUiLayout, + TInt aControlId, + TPoint aTopLeftPoint, + TSize aItemSize, + TInt aItemHorizontalMargin) + :CFepUiBaseCtrl(TRect(0, 0, 0, 0), aUiLayout, aControlId), + iTopLeftPoint(aTopLeftPoint), + iItemSize(aItemSize), + iItemHorizontalMargin(aItemHorizontalMargin), + iFocusItemIndex(KInvalidItemIndex), + iFrId(KAknsIIDQsnFrPopupSub), + iCenterFrId(KAknsIIDQsnFrPopupCenterSubmenu) + { + SetControlType(EUserCtrlBase | ECtrlBaseCtrl); + } + +void CPenInputSelectionList::ConstructL() + { + BaseConstructL(); + Hide(ETrue); + } + +void CPenInputSelectionList::Draw() + { + if(!AbleToDraw()) + return; + + for (TInt i = 0; i < iItemList.Count(); i++) + { + DrawItem(i); + } + + UiLayout()->UpdateArea(this, this->Rect(), EFalse); + } + +void CPenInputSelectionList::DrawItem(TInt aItemIndex) + { + CFbsBitGc* gc = static_cast(BitGc()); + + //mask bitmaps + gc->Activate( MaskBitmapDevice() ); + + gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc->SetBrushColor(TRgb(KOpaqueColor));//Non transparent at all + gc->SetPenStyle(CGraphicsContext::ESolidPen ); + gc->SetPenSize(PenSize()); + gc->SetPenColor(TRgb(KOpaqueColor) ); + gc->DrawRect(iItemList[aItemIndex].iRect); + + // ----- draw bitmaps ----- + gc->Activate(BitmapDevice()); + + // draw frame + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TRect outerRect; + TRect innerRect; + CalculateFrameRects( iItemList[aItemIndex].iRect, outerRect, innerRect); + + AknsDrawUtils::DrawFrame( + skin, *gc, + outerRect, innerRect, + iFrId, iCenterFrId); + + // draw text + if (iTextLineSet) + { + TAknLayoutText textLayout; + textLayout.LayoutText(iItemList[aItemIndex].iRect, + iTextLine); + textLayout.DrawText(*gc, iItemList[aItemIndex].iText); + } + else if (iFont) + { + gc->UseFont(iFont); + + gc->SetBrushStyle(CGraphicsContext::ENullBrush); + gc->SetBrushColor(KRgbBlack); + gc->SetPenColor(iFontColor); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetPenSize(PenSize()); + + gc->DrawText(iItemList[aItemIndex].iText, + iItemList[aItemIndex].iRect, + iBaselineOffset, + CGraphicsContext::ECenter); + + gc->DiscardFont(); + } + } +void CPenInputSelectionList::CalculateFrameRects( const TRect aRect, + TRect& aOuterRect, + TRect& aInnerRect ) const + { + TRect windowRect = aRect; + + TAknLayoutRect topLeft; + topLeft.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_2()); + + TAknLayoutRect bottomRight; + bottomRight.LayoutRect(windowRect, SkinLayout::Submenu_skin_placing_Line_5()); + + aOuterRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr); + aInnerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + } +// End Of File