textinput/peninputcommonctrls/src/peninputdropdownlist/peninputlist.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputcommonctrls/src/peninputdropdownlist/peninputlist.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,984 @@
+/*
+* Copyright (c) 2002-2005 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:  Abstract base class for drop-down list objects
+*
+*/
+
+#include <fbs.h>
+
+#include "peninputlist.h"
+#include "peninputcandidate.h"
+#include "peninputpluginutils.h"
+#include <AknsDrawUtils.h> 
+#include "peninputdropdownlist.h"
+#include "peninputlayout.h"
+
+const TInt KInvalidCandIndex = -1;
+
+// ======== MEMBER FUNCTIONS ========
+
+// Implementation of Class CList 
+
+// -----------------------------------------------------------------------------
+// CList::CList
+// construtor function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CList::CList(CListManager* aManager, MFepCtrlDropdownListContext *aOwner) 
+: iOwner(aOwner), iManager(aManager), iNextButtonDisable(ETrue),
+  iPreviousButtonDisable(ETrue)
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CList::~CList
+// desstrutor function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CList::~CList()
+    {     
+    }
+
+// -----------------------------------------------------------------------------
+// CList::ConstructL
+// 2nd construtor function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::ConstructL()
+    {
+    // Pre calculate all areas
+    CalculateAreas();
+    }
+    
+// -----------------------------------------------------------------------------
+// CList::HandlePointerDownL
+// handle pointer down 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::HandlePointerDownL(const TPoint& aPoint)
+    {
+    // position where the tap occurred
+
+    // set clicked rect as empty rect
+    iClickedRect = KEmptyRect;
+
+    // Check if content rect tapped
+    if ( iContentRect.Contains(aPoint) )
+        {
+        CCandidate* candidate = FindCandidate(aPoint, iClickedCandidateIndex);
+        
+        if ( candidate )
+            {
+			#ifdef RD_TACTILE_FEEDBACK
+	        static_cast<CFepCtrlDropdownList*>(iOwner)->UiLayout()->
+	            DoTactileFeedback(ETouchFeedbackBasic);
+			#endif //RD_TACTILE_FEEDBACK
+            TRect rect = candidate->GetRect();
+            iClickedRect.SetRect(rect.iTl,rect.iBr);
+
+            // Set the flag to indicate that candidate button has been pressed down
+            // so that we know to draw correctly
+            iIndicateButtonClicked = ETrue ;
+            DrawSelection(iClickedRect,ETrue);
+            DrawHighightCell(iClickedRect,EFalse);
+            }
+        else
+            {
+            iClickedRect = KDummyRect;
+            // This is a dummy value so that we know
+            // in HandlePointerUpL that iClickedRect is
+            // is not empty but the pointer down event did
+            // not occure inside any valid rect such as
+            // candidate rect or any of the navigation rects
+            }
+        }
+    } 
+
+// -----------------------------------------------------------------------------
+// CList::HandlePointerDragL
+// handle pointer drag function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::HandlePointerDragL(const TPoint& /*aPoint*/)
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CList::HandlePointerUpL
+// handle pointer up function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::HandlePointerUpL( const TPoint& /*aPoint*/)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CList::HandlePointerLeave
+// handle pointer leave function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::HandlePointerLeave(const TPoint& /*aPoint*/)
+    {
+    DrawSelection( iClickedRect, EFalse );
+    DrawHighightCell(iClickedRect, ETrue);
+    }
+    
+// -----------------------------------------------------------------------------
+// CList::Draw
+// draw the list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::Draw()
+    {
+    // Draw mask
+    iOwner->DrawMask(iRect);
+    
+    // Active bitmap context
+    iOwner->ActivateBitmapContext();
+
+    iOwner->Gc()->SetBrushStyle(CGraphicsContext::ESolidBrush);
+    iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());
+    iOwner->Gc()->SetPenSize(iOwner->GetPenSize());       
+    iOwner->Gc()->SetPenStyle(CGraphicsContext::ESolidPen);
+    iOwner->Gc()->SetPenColor( iOwner->GetBorderColor() );          
+    iOwner->Gc()->DrawRect(iRect); 
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CList::Rect
+// get the rect of list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TRect& CList::Rect()
+    {
+    return iRect;
+    }
+
+// -----------------------------------------------------------------------------
+// CList::UpdateList
+// update the list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::UpdateListL(TBool /*aDrawFlag*/, TBool /*aRecalculate*/)
+    {
+    // Do nothing, every derived class will have its action
+    }
+
+
+// -----------------------------------------------------------------------------
+// CList::ResetStatus
+// update the list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::ResetStatus()
+    {
+    iPenDownInCandidate = EFalse;
+    iClickedRect = KEmptyRect;
+    }
+    
+// -----------------------------------------------------------------------------
+// CList::FindCandidate
+// find candidate according to the assigned position
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+CCandidate* CList::FindCandidate(const TPoint& aPosition, TInt& aIndex)
+    {
+    CCandidate* candidate = NULL;
+    
+    aIndex = KErrNotFound;
+
+    if ( iOwner->CandidateCount() > 0 )
+        {
+        // Loop through the candidates and find the one that contains
+        // the TPoint aPosition
+        for (TInt i = iOwner->GetFirstCandidateIndex(); i < iOwner->GetLastCandidateIndex(); i++)
+            {
+            candidate = iOwner->GetCandidate(i); 
+            
+            if ( !candidate )
+                {
+                continue;
+                }
+                
+            TRect rect = candidate->GetRect();
+            
+            if ( rect.Contains(aPosition) )
+                {
+                // We found the candidate
+                aIndex = i;
+                return candidate;
+                }
+            }
+        }
+        
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CList::CalculatePositionsL
+// calculate the position of all visible cells in the list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CList::CalculatePositionsL()
+    {
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CList::SetHighlightCell
+// Set cell to highlight or not
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::SetHighlightCell(const TInt aCellIndex, TBool aHighlight, TBool aForceDraw)
+    {
+    if ( !aForceDraw && iPenDownInCandidate ) 
+        {
+        return;        
+        }
+        
+    if ( ( aCellIndex<0 ) || ( aCellIndex > iOwner->CandidateCount() ) )
+        {
+        return;
+        }
+
+    CCandidate* candidate = iOwner->GetCandidate(aCellIndex);
+    
+    if ( ! candidate )
+        {
+        return;
+        }
+
+    TRect rect = candidate->GetRect();
+    
+    iOwner->DrawMask(rect);
+    iOwner->ActivateBitmapContext();
+
+	if (!iDropdownListDrawInfo.iSupportSkin)
+		{
+	    iOwner->Gc()->SetBrushStyle(CGraphicsContext::ENullBrush); 
+	    iOwner->Gc()->SetPenSize(iOwner->GetPenSize());
+	    iOwner->Gc()->SetPenStyle(CGraphicsContext::ESolidPen);
+	    iOwner->Gc()->SetPenColor(iOwner->GetBorderColor());
+
+	    // Draw the bottom and right line
+	    iOwner->Gc()->DrawLine( TPoint(rect.iTl.iX, rect.iBr.iY),rect.iBr);
+	    iOwner->Gc()->DrawLine( TPoint(rect.iBr.iX, rect.iTl.iY),rect.iBr);
+	    
+	    // also draw left and top line
+	    if (iOwner->GetCellHorizontalMargin() != 0)
+	        {
+	        iOwner->Gc()->DrawLine(rect.iTl, TPoint(rect.iTl.iX, rect.iBr.iY));
+	        }
+	        
+	    if (iOwner->GetCellVerticalMargin() != 0)
+	        {
+	        iOwner->Gc()->DrawLine(rect.iTl, TPoint(rect.iBr.iX, rect.iTl.iY));
+	        }
+
+	    rect.Shrink(TSize(1,1));
+	    
+	    if ((iIsMultiRows) && (iOwner->GetCellVerticalMargin() == 0))
+	        {        
+	        if ( ( rect.iTl.iY - 1 - Rect().iTl.iY ) != ( iOwner->GetRowNum() - 1 ) * 
+                                                      iOwner->GetCellHeight() )
+	            {
+	            //If it isn't the last row
+	            rect.iBr.iY = rect.iBr.iY + 1;
+	            }
+	        }
+		}
+
+    const CFbsBitmap* bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapHighlight);
+    if ( bmp )
+        {
+        if (aHighlight)
+            {
+            CFbsBitmap* bmpTemp = const_cast<CFbsBitmap*>(bmp);
+            AknIconUtils::SetSize(bmpTemp, rect.Size(), EAspectRatioNotPreserved);
+            
+            if (iDropdownListDrawInfo.iSupportSkin)
+                {
+                CBitmapDb::TBitmapType bmpID = CBitmapDb::EBitmapHighlight;
+                CBitmapDb::TBitmapType maskBmpID = CBitmapDb::EBitmapHighlightMask;             
+                bmp = iOwner->GetBitmapDb()->GetBitMap(bmpID);
+                bmpTemp = const_cast<CFbsBitmap*>(bmp);
+                iOwner->Gc()->DrawBitmapMasked(rect, 
+                                               bmp, 
+                                               bmp->SizeInPixels(), 
+                                               iOwner->GetBitmapDb()->GetBitMap(maskBmpID),
+                                               ETrue);
+                }
+            else
+            	{
+	            iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                           bmp, 
+	                                           bmp->SizeInPixels(), 
+	                                           iOwner->GetBitmapDb()->GetBitMap(
+                                                                  CBitmapDb::EBitmapHighlightMask),
+	                                           ETrue);
+            	}
+            }
+        else
+            {
+            // Draw bitmap
+            if (iDropdownListDrawInfo.iSupportSkin)
+            	{
+			    TRect innerRect = rect;
+			    innerRect.Shrink( 4, 0 );
+			    
+				AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+										   *iOwner->Gc(),
+										   rect,
+										   innerRect,
+										   iDropdownListDrawInfo.iCandidateLeftImgID,
+										   iDropdownListDrawInfo.iCandidateMiddleImgID,
+										   iDropdownListDrawInfo.iCandidateRightImgID);
+            	}
+        	else
+        		{
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPrimary);
+	            iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                           bmp, 
+	                                           bmp->SizeInPixels(), 
+	                                           iOwner->GetBitmapDb()->GetBitMap(
+                                                                    CBitmapDb::EBitmapPrimaryMask),
+	                                           ETrue);
+        		}
+            }
+        }
+    else
+        {
+        if (aHighlight)
+            {
+            iOwner->Gc()->SetBrushColor(iOwner->GetHighLightBgColor());
+            }
+        else
+            {
+            iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());        
+            }
+
+        iOwner->Gc()->SetPenStyle(CGraphicsContext::ENullPen);
+        iOwner->Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );
+
+        rect.Shrink(TSize(1,1));
+
+        iOwner->Gc()->DrawRect(rect);
+
+        rect.Shrink(TSize(-1,-1));
+        }       
+    
+    // draw canditate's text
+    iOwner->Gc()->UseFont(iOwner->GetFont());
+
+    candidate->DrawText(*iOwner->Gc(),iOwner->GetAlignment(),
+                        iOwner->GetTextMargin(),
+                        iOwner->GetTextColor(),
+                        iOwner->GetSpecialTextColor(),
+                        iOwner->GetFixedText());
+    
+    iOwner->Gc()->DiscardFont();      
+    iOwner->Invalidate(candidate->GetRect());
+    }
+
+// -----------------------------------------------------------------------------
+// CList::DrawSelection
+// Draw selection cell just selected
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//        
+void CList::DrawSelection(const TRect& aRect, TBool aIndicate)
+    {
+    // Check whether the rect that should be redrawn is in content rect   
+    TRect tmpRect = iContentRect;
+    tmpRect.Intersection(aRect);
+    
+    if ( tmpRect == aRect )
+        {
+        // rect is inside content rect thus we
+        // should be drawing candidate press
+        DrawCandidatePress(aRect, aIndicate);
+        }
+    else
+        {
+        // rect is inside navigation rect thus we
+        // should be drawing navigation press
+        DrawNavigationPress(aRect, aIndicate);     
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CList::DrawCandidatePress
+// draw candidate when pressed or un-pressed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::DrawCandidatePress(const TRect& aRect, TBool aIndicate)
+    {
+    // We are dealing with the candidates
+    TInt index = 0;
+    // Get the candidate
+    CCandidate* candidate = FindCandidate(aRect.Center(), index);
+    
+    if (!candidate)
+        {
+        return;
+        }
+        
+    iOwner->DrawMask(aRect);
+    
+    iOwner->ActivateBitmapContext();
+    
+    iPenDownInCandidate = EFalse;
+    
+    TBool isDrawBmp = ETrue;
+    CBitmapDb::TBitmapType bmpID = CBitmapDb::EBitmapPrimary;
+    CBitmapDb::TBitmapType maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+    const CFbsBitmap* bmp = NULL;
+    // set bg color
+    if ( aIndicate )
+        {
+        bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPenDown);
+        if ( bmp )
+            {
+            // Draw bitmap
+            bmpID = CBitmapDb::EBitmapPenDown;
+            maskBmpID = CBitmapDb::EBitmapPenDownMask;
+            isDrawBmp = ETrue;                       
+            iPenDownInCandidate = ETrue;           
+            }
+        else
+            {
+            iOwner->Gc()->SetBrushColor(iOwner->GetButtonDownBgColor());
+            }                
+        }
+    else
+        {
+        const RArray<TInt>& secondaryList = iOwner->GetSecondaryList();
+        
+        if ( iOwner->IsEnableSecondary() && (secondaryList.Find(index) != KErrNotFound) )
+            {
+            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapSecondary);
+            if ( bmp )
+                {
+                // Draw bitmap
+                bmpID = CBitmapDb::EBitmapSecondary;
+                maskBmpID = CBitmapDb::EBitmapSecondaryMask;
+                isDrawBmp = ETrue;                                           
+                }
+            else            
+                {
+                bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPrimary);
+                if ( bmp )
+                    {
+                    // Draw bitmap
+                    bmpID = CBitmapDb::EBitmapPrimary;
+                    maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+                    isDrawBmp = ETrue;                                           
+                    }
+                else            
+                    {
+                    // If enable multi color and the color has been set, then use the color
+                    iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());                    
+                    }
+                }                            
+            }
+        else
+            {
+            // Else use background color
+            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPrimary);
+            if ( bmp )
+                {
+                bmpID = CBitmapDb::EBitmapPrimary;
+                maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+                isDrawBmp = ETrue;                   
+                }
+            else
+                {
+                iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());
+                }            
+            }
+        }
+    
+    // Get the candidate rect
+    TRect rect = candidate->GetRect();
+    
+    if (!iDropdownListDrawInfo.iSupportSkin)
+    	{
+	    iOwner->Gc()->SetBrushStyle( CGraphicsContext::ENullBrush ); 
+	    iOwner->Gc()->SetPenSize(iOwner->GetPenSize());
+	    iOwner->Gc()->SetPenStyle(CGraphicsContext::ESolidPen);
+	    iOwner->Gc()->SetPenColor(iOwner->GetBorderColor());
+
+	    // Draw the bottom line
+	    iOwner->Gc()->DrawLine( TPoint(rect.iTl.iX, rect.iBr.iY),rect.iBr );
+	    iOwner->Gc()->DrawLine( TPoint(rect.iBr.iX, rect.iTl.iY),rect.iBr );
+	    
+	    if (iOwner->GetCellHorizontalMargin() != 0)
+	        {
+	        iOwner->Gc()->DrawLine(rect.iTl, TPoint(rect.iTl.iX, rect.iBr.iY));
+	        }
+	        
+	    if (iOwner->GetCellVerticalMargin() != 0)
+	        {
+	        iOwner->Gc()->DrawLine(rect.iTl, TPoint(rect.iBr.iX, rect.iTl.iY));
+	        }
+
+	    rect.Shrink(TSize(1,1));
+	    
+	    if ((iIsMultiRows) && (iOwner->GetCellVerticalMargin() == 0))
+	        {        
+	        if ( ( rect.iTl.iY - 1 - Rect().iTl.iY ) != ( iOwner->GetRowNum() - 1 ) * 
+                                                      iOwner->GetCellHeight() )
+	            {
+	            //If it isn't the last row
+	            rect.iBr.iY = rect.iBr.iY + 1;
+	            }
+	        }
+    	}
+        
+    if ( isDrawBmp )
+        {
+        if (iDropdownListDrawInfo.iSupportSkin)
+        	{
+			if ( aIndicate )
+				{
+/*				
+				iOwner->Gc()->SetPenStyle(CGraphicsContext::ENullPen);
+		        iOwner->Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );    
+		        iOwner->Gc()->SetBrushColor(iDropdownListDrawInfo.iCandidatesHighlightColor);
+		        
+		        // Draw the whole rect without border
+		        iOwner->Gc()->DrawRect( rect );  	*/
+		        
+                /*bmpID = CBitmapDb::EBitmapHighlight;
+                maskBmpID = CBitmapDb::EBitmapHighlightMask;		        
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(bmpID);
+	            iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                           bmp, 
+	                                           bmp->SizeInPixels(), 
+	                                           iOwner->GetBitmapDb()->GetBitMap(maskBmpID),
+	                                           ETrue); 		*/
+                TRect innerRect = rect;
+                innerRect.Shrink( 4, 0 );
+                
+                // ----- draw bitmaps -----
+                iOwner->ActivateBitmapContext();
+                iOwner->Gc()->Clear(rect);
+                    
+                
+                
+                AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+                                           *iOwner->Gc(),
+                                           rect,
+                                           innerRect,
+                                           iDropdownListDrawInfo.iCandidatePressedLeftImgID,
+                                           iDropdownListDrawInfo.iCandidatePressedMiddleImgID,
+                                           iDropdownListDrawInfo.iCandidatePressedRightImgID);				
+				}
+			else
+				{
+			    TRect innerRect = rect;
+			    innerRect.Shrink( 4, 0 );
+			    
+			    // ----- draw bitmaps -----
+			    iOwner->ActivateBitmapContext();
+			    iOwner->Gc()->Clear(rect);
+			    	
+				
+				
+				AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+										   *iOwner->Gc(),
+										   rect,
+										   innerRect,
+										   iDropdownListDrawInfo.iCandidateLeftImgID,
+										   iDropdownListDrawInfo.iCandidateMiddleImgID,
+										   iDropdownListDrawInfo.iCandidateRightImgID);
+				}
+        	}
+        else
+        	{
+	        bmp = iOwner->GetBitmapDb()->GetBitMap(bmpID);
+	        iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                       bmp, 
+	                                       bmp->SizeInPixels(), 
+	                                       iOwner->GetBitmapDb()->GetBitMap(maskBmpID), 
+	                                       ETrue);
+        	}
+        }
+    else
+        {
+        iOwner->Gc()->SetPenStyle(CGraphicsContext::ENullPen);
+        iOwner->Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );    
+        // Draw the whole rect without border
+        iOwner->Gc()->DrawRect( rect );      
+        }
+        
+    // draw canditate's text
+    iOwner->Gc()->UseFont(iOwner->GetFont());
+    TRgb textColor;
+    if (aIndicate)
+        {
+        textColor = iOwner->GetHighLightTextColor();
+        }
+    else
+        {
+        textColor = iOwner->GetTextColor();
+        }
+        
+    candidate->DrawText(*iOwner->Gc(),iOwner->GetAlignment(),
+                        iOwner->GetTextMargin(),        
+                        textColor,
+                        iOwner->GetSpecialTextColor(),
+                        iOwner->GetFixedText());      
+                        
+    iOwner->Gc()->DiscardFont();
+    
+    // Invalidate the rect
+    iOwner->Invalidate(aRect);
+    }
+
+// -----------------------------------------------------------------------------
+// CList::DrawNavigationPress
+// draw navigation button when pressed or un-pressed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CList::DrawNavigationPress(const TRect& /*aRect*/, TBool /*aIndicate*/)
+    {
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CList::CalculateAreas
+// Calculate all kinds of rectangles
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CList::CalculateAreas()
+    {
+    //
+    }
+
+// -----------------------------------------------------------------------------
+// CList::SizeChanged
+// size changed function
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::SizeChanged()
+    {
+    CalculateAreas();
+    }
+
+// -----------------------------------------------------------------------------
+// CList::DrawCandidates
+// draw all visible candidates to the list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CList::DrawCandidates()
+    {    
+    const RArray<TInt>& secondaryList = iOwner->GetSecondaryList();
+    
+    TBool isDrawBmp = EFalse;
+    CBitmapDb::TBitmapType bmpID = CBitmapDb::EBitmapPrimary;
+    CBitmapDb::TBitmapType maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+    const CFbsBitmap* bmp = NULL;         
+    for(TInt i = iOwner->GetFirstCandidateIndex(); i < iOwner->GetLastCandidateIndex(); i++)
+        {
+        CCandidate* candidate = iOwner->GetCandidate(i);
+        if ( !candidate )
+            {
+            continue;
+            }
+            
+        TRect rect = candidate->GetRect();
+ 
+        if (iDropdownListDrawInfo.iSupportSkin)
+        	{
+        	
+        	if (iOwner->GetHighlightList().Find(i) != KErrNotFound)
+        		{
+				/*iOwner->Gc()->SetPenStyle(CGraphicsContext::ENullPen);
+		        iOwner->Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );    
+		        iOwner->Gc()->SetBrushColor(iDropdownListDrawInfo.iCandidatesHighlightColor);
+		        // Draw the whole rect without border
+		        iOwner->Gc()->DrawRect( rect );*/
+                bmpID = CBitmapDb::EBitmapHighlight;
+                maskBmpID = CBitmapDb::EBitmapHighlightMask;		        
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(bmpID);
+	            iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                           bmp, 
+	                                           bmp->SizeInPixels(), 
+	                                           iOwner->GetBitmapDb()->GetBitMap(maskBmpID),
+	                                           ETrue);
+        		}
+        	else
+        		{
+			    TRect innerRect = rect;
+			    innerRect.Shrink( 4, 0 );
+			    
+			    // ----- draw bitmaps -----
+			 	iOwner->ActivateBitmapContext();                
+			    	
+				
+				AknPenInputDrawUtils::Draw3PiecesFrame(AknsUtils::SkinInstance(),
+													   *iOwner->Gc(),
+													   rect,
+													   innerRect,
+													   iDropdownListDrawInfo.iCandidateLeftImgID,
+													   iDropdownListDrawInfo.iCandidateMiddleImgID,
+													   iDropdownListDrawInfo.iCandidateRightImgID);
+        		}
+        	}
+        else
+        	{
+	        if ( iOwner->IsEnableSecondary() && ( secondaryList.Find(i) != KErrNotFound) )
+	            {
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapSecondary);
+	            if ( bmp )
+	                {
+	                // Draw bitmap
+	                bmpID = CBitmapDb::EBitmapSecondary;
+	                maskBmpID = CBitmapDb::EBitmapSecondaryMask;
+	                isDrawBmp = ETrue;                                           
+	                }
+	            else            
+	                {
+	                bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPrimary);
+	                if ( bmp )
+	                    {
+	                    // Draw bitmap
+	                    bmpID = CBitmapDb::EBitmapPrimary;
+	                    maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+	                    isDrawBmp = ETrue;                                           
+	                    }
+	                else            
+	                    {
+	                    // If enable multi color and the color has been set, then use the color
+	                    iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());                    
+	                    }
+	                }                            
+	            }
+	        else if (iOwner->GetHighlightList().Find(i) != KErrNotFound)
+	            {
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapHighlight);
+	            if ( bmp )
+	                {
+	                // Draw bitmap
+	                bmpID = CBitmapDb::EBitmapHighlight;
+	                maskBmpID = CBitmapDb::EBitmapHighlightMask;
+	                isDrawBmp = ETrue;                                           
+	                }
+	            else            
+	                {
+	                // If the cell is set to highlight, use high light color
+	                iOwner->Gc()->SetBrushColor(iOwner->GetHighLightBgColor());
+	                }                                        
+	            }
+	        else
+	            {
+	            // Else use background color
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(CBitmapDb::EBitmapPrimary);
+	            if ( bmp )
+	                {
+	                bmpID = CBitmapDb::EBitmapPrimary;
+	                maskBmpID = CBitmapDb::EBitmapPrimaryMask;
+	                isDrawBmp = ETrue;                   
+	                }
+	            else
+	                {
+	                iOwner->Gc()->SetBrushColor(iOwner->GetBgColor());
+	                }            
+	            }         
+
+	        iOwner->Gc()->SetBrushStyle( CGraphicsContext::ENullBrush ); 
+	        iOwner->Gc()->SetPenSize(iOwner->GetPenSize());
+	        iOwner->Gc()->SetPenStyle(CGraphicsContext::ESolidPen);
+	        iOwner->Gc()->SetPenColor(iOwner->GetBorderColor());
+	        // Draw the bottom line
+	        iOwner->Gc()->DrawLine( rect.iTl, TPoint(rect.iBr.iX, rect.iTl.iY) );
+	        iOwner->Gc()->DrawLine( TPoint(rect.iTl.iX, rect.iBr.iY),rect.iBr );
+	        iOwner->Gc()->DrawLine( TPoint(rect.iBr.iX, rect.iTl.iY),rect.iBr );
+	        
+	        if (iOwner->GetCellHorizontalMargin() != 0)
+	            {
+	            iOwner->Gc()->DrawLine(rect.iTl, TPoint(rect.iTl.iX, rect.iBr.iY));
+	            }
+
+	        rect.Shrink(TSize(1,1));
+
+	        if ( isDrawBmp )
+	            {
+                bmpID = CBitmapDb::EBitmapSecondary;
+                maskBmpID = CBitmapDb::EBitmapSecondaryMask;	            
+	            bmp = iOwner->GetBitmapDb()->GetBitMap(bmpID);
+	            iOwner->Gc()->DrawBitmapMasked(rect, 
+	                                           bmp, 
+	                                           bmp->SizeInPixels(), 
+	                                           iOwner->GetBitmapDb()->GetBitMap(maskBmpID),
+	                                           ETrue);                        
+	            }
+	        else
+	            {            
+	            iOwner->Gc()->SetPenStyle(CGraphicsContext::ENullPen);
+	            iOwner->Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );    
+	            iOwner->Gc()->DrawRect(rect);
+	            }
+        	}
+        
+        // Draw the text of the candidate
+        iOwner->Gc()->UseFont(iOwner->GetFont());
+        candidate->DrawText(*iOwner->Gc(),iOwner->GetAlignment(),
+                                          iOwner->GetTextMargin(),        
+                                          iOwner->GetTextColor(),
+                                          iOwner->GetSpecialTextColor(),
+                                          iOwner->GetFixedText());
+        }
+    iOwner->Gc()->DiscardFont();
+    }
+
+// -----------------------------------------------------------------------------
+// CList::CompareRect
+// Compare two rect is equal or not
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CList::CompareRect(const TRect& aSrcRect, const TRect& aDesRect)
+    {
+    
+    if (aSrcRect == aDesRect)
+        {
+        DrawSelection(iClickedRect, ETrue);
+        DrawHighightCell(iClickedRect, EFalse);
+        return ETrue;        
+        }
+    else
+        {
+        TBool hasDraw = EFalse;
+        const RArray<TInt>& highLightList = iOwner->GetHighlightList();        
+        for (TInt i=0; i < highLightList.Count(); i++ )
+            {
+            CCandidate* candidate = iOwner->GetCandidate(i);        
+            if ( candidate )
+                {
+                if ( iClickedRect == candidate->GetRect() )
+                    {
+                    DrawHighightCell(iClickedRect, ETrue);
+                    hasDraw = ETrue;
+                    break;
+                    }
+                }
+            }        
+      
+        if ( !hasDraw )
+            {
+            DrawSelection(iClickedRect, EFalse);
+            DrawHighightCell(iClickedRect, ETrue);
+            }
+
+        return EFalse;        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CList::Move
+// when the drop down list is moved, the function will be called.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CList::Move(const TPoint& aOffsetPoint)
+    {
+    // Move the iRect
+    iRect.Move(aOffsetPoint);
+    
+    // Move the content rect
+    iContentRect.Move(aOffsetPoint);
+    
+    // Move the navigation rect
+    iNavigationRect.Move(aOffsetPoint);
+    
+    // Move the close button rect
+    iNavigationCloseRect.Move(aOffsetPoint);
+    
+    // Move the up button rect
+    iNavigationPreviousRect.Move(aOffsetPoint);
+    
+    // Move the down button rect
+    iNavigationNextRect.Move(aOffsetPoint);
+    
+    }
+
+void CList::DrawHighightCell(const TRect& aSrcRect, const TBool aIndidate)
+    {
+    const RArray<TInt>& highLightList = iOwner->GetHighlightList();
+
+    TInt candIdx;
+    for (TInt i = 0; i < highLightList.Count(); i++)
+        {
+        candIdx = highLightList[i];
+
+        // if highlight candidate are not in current page, then do not draw it
+        if ((candIdx >= iOwner->GetFirstCandidateIndex()) &&
+            (candIdx <= iOwner->GetLastCandidateIndex()))
+            {
+            CCandidate* candidate = iOwner->GetCandidate(candIdx);
+            
+            if (candidate)
+                {
+                if (aSrcRect == candidate->GetRect())
+                    {
+                    if (aIndidate)
+                        {
+                        SetHighlightCell(candIdx, ETrue);
+                        }
+
+                    continue;    
+                    }
+                }
+            }
+        }
+    }
+    
+TInt CList::StartCandIdxOfLine(TInt /*aCandIndex*/)
+    {
+    return KInvalidCandIndex;
+    }
+    
+void CList::SetNextPageHighlightCellAfterOnePageL(const TInt /*aCellIndex*/)
+    {
+    }
+
+void CList::SetDropdownListImgID(TDropdownListDrawInfo aDropdownListDrawInfo)
+	{
+	iDropdownListDrawInfo = aDropdownListDrawInfo;
+	}
+	
+
+// End Of File