--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutchoicelist.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,660 @@
+/*
+* 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 choice list control
+*
+*/
+
+
+
+#include <AknsDrawUtils.h>
+#include "peninputlayoutrootctrl.h"
+#include "peninputlayoutpopupwnd.h"
+#include "peninputlayout.h"
+#include "peninputlayoutchoicelist.h"
+#include <coecntrl.h>
+#include <eiklbx.h>
+
+//after display, freeze some time
+const TInt KFreezePerioid = 400000; // 400ms
+// ---------------------------------------------------------------------------
+// CFepLayoutChoiceList::NewL
+// Factory function
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepLayoutChoiceList* CFepLayoutChoiceList::NewL(CFepUiLayout* aUiLayout,
+ TInt aControlId)
+ {
+ CFepLayoutChoiceList* self = new(ELeave) CFepLayoutChoiceList(aUiLayout, aControlId);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutChoiceList::~CFepLayoutChoiceList
+// Destructor
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepLayoutChoiceList::~CFepLayoutChoiceList()
+ {
+ delete iFreezeTimer;
+ delete iItemFocusBmp;
+ delete iItemFocusBmpMask;
+ iItemList.ResetAndDestroy();
+ iItemList.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutChoiceList::SetItemRect
+// Set choice list item rectangle.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetItemRect(const TRect& aItemRect, const TRect& aFocusRect)
+ {
+ iItemRect = aItemRect;
+ iItemFocusRect = aFocusRect;
+ ReCalcLayout();
+ }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutChoiceList::SetFocusBmp
+// Set bitmap for focus.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetFocusBmp(CFbsBitmap *aItemFocusBmp)
+ {
+ delete iItemFocusBmp;
+ iItemFocusBmp = aItemFocusBmp;
+ }
+
+// CFepLayoutChoiceList::SetFocusBmpMask
+// Set mask bitmap for focus.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetFocusBmpMask(CFbsBitmap *aItemFocusBmpMask)
+ {
+ delete iItemFocusBmpMask;
+ iItemFocusBmpMask = aItemFocusBmpMask;
+ }
+
+// CFepLayoutChoiceList::SetItemsL
+// Set choice list items.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetItemsL(
+ const RPointerArray<CFepLayoutChoiceList::SItem>& aItemList)
+ {
+ //remove all items
+ iItemList.ResetAndDestroy();
+ for(int ii = 0; ii < aItemList.Count(); ++ii)
+ {
+ AddItemL(*aItemList[ii]);
+ }
+ }
+
+// CFepLayoutChoiceList::AddItemL
+// Append a choice list item.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::AddItemL(const CFepLayoutChoiceList::SItem& aItem)
+ {
+ CFepLayoutChoiceList::SItem* item;
+ item = new(ELeave)CFepLayoutChoiceList::SItem;
+ item->iCommand = aItem.iCommand;
+ item->iText.Copy( aItem.iText );
+ CleanupStack::PushL(item);
+ iItemList.AppendL(item);
+ CleanupStack::Pop(item);
+ //ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::InsertItemL
+// Append a choice list item.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::InsertItemL(TInt aPostion,
+ const CFepLayoutChoiceList::SItem& aItem)
+ {
+ CFepLayoutChoiceList::SItem* item;
+ item = new(ELeave)CFepLayoutChoiceList::SItem;
+ item->iCommand = aItem.iCommand;
+ item->iText.Copy( aItem.iText );
+ CleanupStack::PushL(item);
+ iItemList.InsertL(item, aPostion);
+ CleanupStack::Pop(item);
+ //ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::RemoveItemByCommand
+// Remove a choice list item by command.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::RemoveItemByCommand(TInt aCommand)
+ {
+ for(int ii = 0; ii < iItemList.Count(); ++ii)
+ {
+ if( iItemList[ii]->iCommand == aCommand )
+ {
+ RemoveItemByIndex(ii);
+ }
+ }
+ //ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::RemoveItemByIndex
+// Remove a choice list item by index.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::RemoveItemByIndex(TInt aIndex)
+ {
+ CFepLayoutChoiceList::SItem* item;
+ item = iItemList[aIndex];
+ iItemList.Remove(aIndex);
+ delete item;
+ //ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::RemoveItemByIndex
+// Clear all choice list items.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::ClearItemsL()
+ {
+ iItemList.ResetAndDestroy();
+ //ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::RemoveItemByIndex
+// Clear all choice list items.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFepLayoutChoiceList::ItemsCount()
+ {
+ return iItemList.Count();
+ }
+
+// CFepLayoutChoiceList::ItemByIndex
+// Retrieve a choice list item by index.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const CFepLayoutChoiceList::SItem* CFepLayoutChoiceList::ItemByIndex(TInt aIndex)
+ {
+ return iItemList[aIndex];
+ }
+
+// CFepLayoutChoiceList::ItemByCommand
+// Retrieve a choice list item by item's command.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFepLayoutChoiceList::FindCommand(TInt aCommand)
+ {
+ TInt ret = -1;
+ for(int ii = 0; ii < iItemList.Count(); ++ii)
+ {
+ if( iItemList[ii]->iCommand == aCommand )
+ {
+ ret = ii;
+ break;
+ }
+ }
+ return ret;
+ }
+
+// Constructor
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepLayoutChoiceList::CFepLayoutChoiceList(CFepUiLayout* aUiLayout,
+ TInt aControlId)
+ :CFepLayoutPopupWnd(TSize(0,0), aUiLayout, aControlId)
+ {
+ SetControlType(ECtrlPopupChoiceList);
+ iSubItemSkinID = KAknsIIDNone;
+ iBackgroundSkinID = KAknsIIDNone;
+ }
+
+// CFepLayoutChoiceList::HitTest
+// Get item whose region contains the point.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFepLayoutChoiceList::HitTest(const TPoint& aPoint)
+ {
+ if( !Rect().Contains(aPoint) )
+ {
+ return EListOutside;
+ }
+ if(iWndControl)
+ {
+ return static_cast<CEikListBox*>(iWndControl)->CurrentItemIndex();
+ }
+ TInt index = (aPoint.iY - Rect().iTl.iY)/iItemRect.Height();
+ if( index >= iItemList.Count() )
+ {
+ return EListOutside;
+ }
+ else
+ {
+ return index;
+ }
+ }
+
+// CFepLayoutChoiceList::HandlePointerDownEventL
+// Handle pointer down event.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepLayoutChoiceList::HandlePointerDownEventL(const TPoint& aPoint)
+ {
+ if( iFreezeTimer && iFreezeTimer->IsActive() )
+ {
+ return this;
+ }
+ CFepUiBaseCtrl* ctrl = CFepLayoutPopupWnd::HandlePointerDownEventL(aPoint);
+ if( ctrl )
+ {
+ return ctrl;
+ }
+ TInt index = HitTest(aPoint);
+ if( index == EListOutside )
+ {
+ SetPointerDown(EFalse);
+ CloseWindow();
+ CFepLayoutChoiceList::SEvent event;
+ event.iIndex = -1;
+ event.iCommand = 0;
+ ReportChoiceEvent(event);
+ #ifdef RD_TACTILE_FEEDBACK
+ if (UiLayout()->SupportTactileFeedback())
+ {
+ UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse);
+ }
+ #endif //RD_TACTILE_FEEDBACK
+ }
+ else
+ {
+ SetPointerDown( ETrue );
+ if( index >= EListItemFirst && index != iCurFocusItem )
+ {
+ //TInt prev = iCurFocusItem;
+ iCurFocusItem = index;
+ Draw();
+ UpdateArea(Rect(),EFalse);
+ #ifdef RD_TACTILE_FEEDBACK
+ if (UiLayout()->SupportTactileFeedback())
+ {
+ UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput);
+ }
+ #endif //RD_TACTILE_FEEDBACK
+ }
+ }
+ return this;
+ }
+
+// CFepLayoutChoiceList::HandlePointerMoveEventL
+// Handle pointer move event.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepLayoutChoiceList::HandlePointerMoveEventL(const TPoint& aPoint)
+ {
+ if( iFreezeTimer && iFreezeTimer->IsActive() )
+ {
+ return this;
+ }
+ CFepLayoutPopupWnd::HandlePointerMoveEventL(aPoint);
+ if( PointerDown() )
+ {
+ TInt index = HitTest(aPoint);
+ if( index != iCurFocusItem && index >= 0)
+ {
+ //TInt prev = iCurFocusItem;
+ iCurFocusItem = index;
+/*
+ if( prev != -1 )
+ {
+ DrawItem(prev, ETrue);
+ }
+
+ if( iCurFocusItem != -1 )
+ {
+ DrawItem(iCurFocusItem, ETrue);
+ }
+ */
+ #ifdef RD_TACTILE_FEEDBACK
+ if (UiLayout()->SupportTactileFeedback())
+ {
+ if ( iLastSelIndex != iCurFocusItem)
+ {
+ UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput);
+ iLastSelIndex = iCurFocusItem;
+ }
+ }
+ #endif //RD_TACTILE_FEEDBACK
+
+ Draw();
+ UpdateArea(Rect(),EFalse);
+ }
+ }
+ return this;
+ }
+
+// CFepLayoutChoiceList::HandlePointerUpEventL
+// Handle pointer up event.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CFepLayoutChoiceList::HandlePointerUpEventL(const TPoint& aPoint)
+ {
+ if( iFreezeTimer && iFreezeTimer->IsActive() || !PointerDown())
+ {
+ return this;
+ }
+ CFepUiBaseCtrl* ctrl = CFepLayoutPopupWnd::HandlePointerUpEventL(aPoint);
+
+ TInt index = HitTest(aPoint);
+ if( index >= EListItemFirst )
+ {
+ CFepLayoutChoiceList::SEvent event;
+ event.iIndex = index;
+ event.iCommand = iItemList[index]->iCommand;
+ CloseWindow();
+ ReportChoiceEvent(event);
+
+ #ifdef RD_TACTILE_FEEDBACK
+ if (UiLayout()->SupportTactileFeedback())
+ {
+ UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse);
+ }
+ #endif //RD_TACTILE_FEEDBACK
+ }
+ else if( index == EListOutside )
+ {
+ SetPointerDown( EFalse );
+ }
+ return this;
+ }
+
+// CFepLayoutChoiceList::DrawItem
+// Draw a choice list item.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutChoiceList::DrawItem(TInt aIndex, TBool aErase)
+ {
+ //
+ if(iWndControl)
+ return;
+ TRect rtItem;
+ rtItem.iTl.iY = aIndex * iItemRect.Height();
+ rtItem.iBr.iX = iItemRect.Width();
+ rtItem.iBr.iY = rtItem.iTl.iY + iItemRect.Height();
+ rtItem.Move(Rect().iTl);
+ DrawItem(rtItem, *iItemList[aIndex], aErase, aIndex == iCurFocusItem );
+ }
+
+// CFepLayoutChoiceList::DrawItem
+// Draw a choice list item.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutChoiceList::DrawItem(const TRect& aRect, const CFepLayoutChoiceList::SItem& aItem,
+ TBool aErase, TBool aFocus)
+ {
+ if(iWndControl)
+ return;
+
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ if( aErase )
+ {
+ SetBorderColor( BkColor() );
+ //DrawChoiceListBackground( aRect );//, EFalse);
+ }
+ if( aFocus )
+ {
+ //draw focus bitmap
+ TRect rtFocusRect(iItemFocusRect);
+ TRect rtFocusInBmp(TPoint(0,0), iItemFocusRect.Size());
+
+ rtFocusRect.Move(aRect.iTl);
+ TRect rtInnerRect( rtFocusRect );
+ rtInnerRect.Shrink( 5, 5 );
+
+ if( iSubItemSkinID.iMajor != EAknsMajorNone &&
+ iSubItemSkinID.iMinor != EAknsMinorNone)
+ {
+ gc->Activate( BitmapDevice() );
+ AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(),
+ *gc,
+ rtFocusRect,
+ rtInnerRect,
+ iSubItemSkinID,
+ KAknsIIDDefault );
+ }
+ else
+ {
+ //mask bitmaps-------
+ gc->Activate( MaskBitmapDevice() );
+ if( iItemFocusBmpMask )
+ {
+ DrawBitmap(rtFocusRect, rtFocusInBmp, iItemFocusBmpMask,
+ iItemFocusBmpMask->SizeInPixels() == rtFocusInBmp.Size());
+ }
+
+ //front bitmaps-------
+ gc->Activate( BitmapDevice() );
+
+ if( iItemFocusBmp )
+ {
+ DrawBitmap(rtFocusRect, rtFocusInBmp, iItemFocusBmp,
+ iItemFocusBmp->SizeInPixels() == rtFocusInBmp.Size());
+ }
+ }
+ }
+ //draw text
+ if (iFont)
+ {
+ gc->UseFont(iFont);
+
+ gc->SetBrushStyle( CGraphicsContext::ENullBrush );
+ gc->SetPenColor(iFontColor);
+ gc->SetPenStyle(CGraphicsContext::ESolidPen);
+
+ gc->DrawText(aItem.iText, aRect, iBaseline, CGraphicsContext::ELeft, iMargin);
+
+ gc->DiscardFont();
+ }
+ }
+
+// CFepLayoutChoiceList::DrawChoiceListBackground
+// Draw choice list background.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutChoiceList::DrawChoiceListBackground(const TRect& aRect)//, TBool aDrawBorder)
+ {
+ if( iBackgroundSkinID.iMajor != EAknsMajorNone &&
+ iBackgroundSkinID.iMinor != EAknsMinorNone )
+ {
+ //draw bitmap
+ DrawOpaqueMaskBackground( aRect );
+ TRect rtInnerRect( aRect );
+ rtInnerRect.Shrink( 1, 1 );
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+
+ gc->Activate( BitmapDevice() );
+ AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(),
+ *gc,
+ aRect,
+ rtInnerRect,
+ iBackgroundSkinID,
+ KAknsIIDDefault );
+ }
+ else
+ {
+ //draw bitmap
+ DrawOpaqueMaskBackground();
+ //front bitmaps-------
+ DrawBackground();
+ }
+ }
+
+// CFepLayoutChoiceList::DrawBitmap
+// Draw bitmap helper function.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutChoiceList::DrawBitmap(const TRect& aDestRect, const TRect& aSrcRect,
+ CFbsBitmap* aBmp, TBool aFast)
+ {
+ CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+ if( aFast )
+ {
+ gc->BitBlt(aDestRect.iTl, aBmp, aSrcRect);
+ }
+ else
+ {
+ gc->DrawBitmap(aDestRect, aBmp, aSrcRect);
+ }
+ }
+
+EXPORT_C void CFepLayoutChoiceList::ReportChoiceEvent(CFepLayoutChoiceList::SEvent& aEvent)
+ {
+ TPtrC ptr;
+ ptr.Set(reinterpret_cast<TText*>(&aEvent), sizeof(aEvent));
+ ReportEvent(EEventChoiceSelected, ptr);
+ }
+
+// CFepLayoutChoiceList::Draw
+// Draw a choice list.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::Draw()
+ {
+ if(!AbleToDraw())
+ return;
+
+ SetBorderColor( PenColor() );
+
+ DrawChoiceListBackground(Rect()); //draw with border
+
+ if(iWndControl)
+ {
+ iWndControl->DrawNow();
+ return;
+ }
+ //draw background
+ for(int ii = 0; ii < iItemList.Count(); ++ii)
+ {
+ DrawItem(ii, EFalse);
+ }
+ }
+
+// CFepLayoutChoiceList::OnDisplay
+// Prepare display.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::OnDisplay()
+ {
+ ReCalcLayout();
+ }
+
+// CFepLayoutChoiceList::ReCalcLayout
+// Calculates the displaying rect.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::ReCalcLayout()
+ {
+ TRect poprect;
+ poprect.iBr.iX = iItemRect.Width();
+ poprect.iBr.iY = iItemRect.Height() * iItemList.Count();
+ SetRect(poprect);
+ }
+
+// CFepLayoutChoiceList::SetSkinID
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetSkinID( TAknsItemID aSubItemID,
+ TAknsItemID aBackgroundID )
+ {
+ iSubItemSkinID = aSubItemID;
+ iBackgroundSkinID = aBackgroundID;
+ }
+
+// CFepLayoutChoiceList::CurrentSelectedIndex
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFepLayoutChoiceList::CurrentFocusedIndex( ) const
+ {
+ return iCurFocusItem;
+ }
+
+// CFepLayoutChoiceList::SetCurrentSelectedIndex
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CFepLayoutChoiceList::SetCurrentFocusedIndex(const TInt aIndex)
+ {
+ iCurFocusItem = aIndex;
+ }
+TInt CFepLayoutChoiceList::FreezeCallBack( TAny *aPtr )
+ {
+ CFepLayoutChoiceList* pThis = (CFepLayoutChoiceList*)aPtr;
+ pThis->iFreezeTimer->Cancel();
+ return 0;
+ }
+
+void CFepLayoutChoiceList::AfterDisplayedL()
+ {
+ if( !iFreezeTimer )
+ {
+ iFreezeTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+ }
+ if( !iFreezeTimer->IsActive() )
+ {
+ iFreezeTimer->Start(KFreezePerioid,
+ KFreezePerioid,
+ TCallBack(FreezeCallBack, this));
+ }
+ }
+
+EXPORT_C void CFepLayoutChoiceList::AfterDisplayed()
+ {
+ TRAP_IGNORE(AfterDisplayedL());
+ }
+//End Of File