textinput/peninputcommonctrls/src/peninputselectionlist/peninputselectionlist.cpp
branchRCL_3
changeset 21 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputcommonctrls/src/peninputselectionlist/peninputselectionlist.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -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 <barsread.h>
+#include <coemain.h>
+#include <AknsItemID.h>
+#include <AknsUtils.h>
+#include <AknUtils.h>
+#include <peninputlayout.h>
+#include <skinlayout.cdl.h>
+#include <AknsDrawUtils.h>
+
+#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<HBufC>& 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(UiLayout()->SkinInstance(),
+        		                       id,
+        		                       bmp,
+        		                       maskbmp,
+        		                       bmpFileName,
+        		                       bmpid,
+        		                       maskid);
+
+                AknIconUtils::SetSize(maskbmp, iItemSize, EAspectRatioNotPreserved);
+                }
+            else
+                {
+        	    AknsUtils::CreateIconL(UiLayout()->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<TText*>(&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<CFbsBitGc*>(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 = UiLayout()->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