textinput/peninputcommonctrls/src/peninputbuttons/peninputbutton.cpp
branchRCL_3
changeset 44 ecbabf52600f
child 50 5a1685599b76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputcommonctrls/src/peninputbuttons/peninputbutton.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,4293 @@
+/*
+* 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:  Implementation of button
+*
+*/
+
+
+// system includes
+#include <barsread.h>
+#include <peninputlayout.h>
+#include <AknIconUtils.h>
+#include <coemain.h>
+#include <AknsUtils.h>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h> 
+// user includes
+#include <peninputbutton.h>
+#include <peninputdragbutton.h>
+#include <peninputeventbutton.h>
+#include <peninputmultimodebutton.h>
+#include <peninputrepeatbutton.h>
+#include <peninputrawkeybutton.h>
+#include <peninputcommonbutton.h>
+#include <peninputmultiimagebutton.h>
+#include <peninputcommonctrls.hrh>
+#include <peninputcommonlayoutglobalenum.h>
+#include <peninputlongpressbutton.h>
+
+const TInt KInvalidBmp = -1 ;
+
+//default value for long press timer
+const TInt KLongPressInterval = 600000;
+
+//default value for repeat timer
+const TInt KRepeatInterval = 100000;
+
+//default text color and shadow text color
+const TUint32 KDefaultTextColor = 0x000000;
+const TUint32 KDefaultShadowTextColor = 0xffffff;
+const TInt32 KInvalidResId = -1;
+const TInt KInvalidEventId = 0xffff;
+//const TInt KFadingParamBlack = 255;
+//const TInt KFadingParamWhite = 0;
+
+const TInt KTransparency[256] =
+    { 
+    0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7,
+    8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13,
+    14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19,
+    19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 24,
+    24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29,
+    30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35,
+    35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40,
+    41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46,
+    46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51,
+    51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56,
+    57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62,
+    62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67,
+    68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 73,
+    73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77 
+    };
+// Invalid function icon color group
+const TInt KInvalidColorGroup = -1;
+
+// ======== MEMBER FUNCTIONS ========
+   
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::CAknFepCtrlButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlButton::CAknFepCtrlButton(CFepUiLayout* aUiLayout, TInt aControlId)
+: CButtonBase(TRect(), aUiLayout, aControlId), iFirstTimeConstruct(ETrue), iHighlight(EFalse) 
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::NewL
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlButton* CAknFepCtrlButton::NewL(CFepUiLayout* aUiLayout, TInt aControlId)
+    {
+    CAknFepCtrlButton* self = NewLC(aUiLayout, aControlId);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::NewLC
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlButton* CAknFepCtrlButton::NewLC(CFepUiLayout* aUiLayout, TInt aControlId)
+    {
+    CAknFepCtrlButton* self = new (ELeave) CAknFepCtrlButton(aUiLayout, aControlId);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+
+    return self;
+    }    
+    
+// -----------------------------------------------------------------------------
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlButton::~CAknFepCtrlButton()
+    {
+    iBmpList.Close();
+    iMaskBmpList.Close();
+    }
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::ConstructFromResourceL
+// The order of the image ids in the CButtonBase class must not be changed
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+	if (!iFirstTimeConstruct)
+		{
+        iBmpList.Close();
+        iMaskBmpList.Close();
+        ResetBmpPool();
+		}
+    
+    TPtrC bmpFileName = aReader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = aReader.ReadInt32();
+   	TInt colorgroup = aReader.ReadInt16();
+    TAknsItemID id;
+
+    for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii)
+        {
+        // Get the image ids and mask ids from resource
+        TInt bmpId = aReader.ReadInt16(); 
+        TInt bmpMskId = aReader.ReadInt16();
+        
+        // read skin item id
+        const TInt skinitemid = aReader.ReadInt16();
+        id.Set(TInt(imgMajorSkinId), skinitemid);
+        
+        if (bmpId != KInvalidBmp)
+            {
+        	CFbsBitmap* bmp = NULL;
+        	CFbsBitmap* maskbmp = NULL;
+
+        	if (bmpMskId != KInvalidBmp)
+        		{
+        		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        		                       id,
+        		                       bmp,
+        		                       maskbmp,
+        		                       bmpFileName,
+        		                       bmpId,
+        		                       bmpMskId);
+        		
+       		    // set maskbmp and size
+                SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii));
+                iMaskBmpList.Append(maskbmp);
+                }
+            else
+                {
+        	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        	                           id,
+        	                           bmp,
+        	                           bmpFileName,
+        	                           bmpId);
+                }
+
+            // set bmp and size
+            SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii));
+            iBmpList.Append(bmp);
+            }
+        }
+
+    if (!iFirstTimeConstruct)
+    	{
+        ResizeBitmaps(Rect().Size());
+    	Draw();
+    	}
+    
+    iFirstTimeConstruct = EFalse;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::ConstructFromResourceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlButton::ConstructFromResourceL()
+	{
+	if (iResourceId == KInvalidResId)
+		{
+        User::Leave(KErrArgument);
+		}
+	
+	if (!iFirstTimeConstruct)
+		{
+		// need to remove original bmp and maskbmp
+        iBmpList.Close();
+        iMaskBmpList.Close();
+        ResetBmpPool();
+		}
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+
+    TPtrC bmpFileName = reader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TInt colorgroup = reader.ReadInt16();
+    TAknsItemID id;
+
+    for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii)
+        {
+        // Get the image ids and mask ids from resource
+        TInt bmpId = reader.ReadInt16(); 
+        TInt bmpMskId = reader.ReadInt16();
+        
+        // read skin item id
+        const TInt skinitemid = reader.ReadInt16();
+        id.Set(TInt(imgMajorSkinId), skinitemid);
+        
+        if (bmpId != KInvalidBmp)
+            {
+        	CFbsBitmap* bmp = NULL;
+        	CFbsBitmap* maskbmp = NULL;
+
+        	if (bmpMskId != KInvalidBmp)
+        		{
+        		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        		                       id,
+        		                       bmp,
+        		                       maskbmp,
+        		                       bmpFileName,
+        		                       bmpId,
+        		                       bmpMskId);
+        		
+       		    // set maskbmp and size
+                SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii));
+                iMaskBmpList.Append(maskbmp);
+                }
+            else
+                {
+        	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        	                           id,
+        	                           bmp,
+        	                           bmpFileName,
+        	                           bmpId);
+                }
+
+            // set bmp and size
+            SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii));
+            iBmpList.Append(bmp);
+            }
+        }
+        
+    CleanupStack::PopAndDestroy(); // reader
+    
+    if (!iFirstTimeConstruct)
+    	{
+        ResizeBitmaps(Rect().Size());
+    	Draw();
+    	}
+
+    iFirstTimeConstruct = EFalse;    	
+	}
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::Draw
+// Draws UI
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlButton::Draw()
+    {
+	if(!AbleToDraw())
+        return;
+    
+    if ( !BackgroundBmp() )
+        {
+        CButtonBase::Draw();
+        }
+
+    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(Rect());   
+
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );   
+    if ( BackgroundBmp() )
+        {
+        TSize size=BackgroundBmp()->SizeInPixels();
+    
+        gc->DrawBitmap(Rect(), BackgroundBmp(),size);
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::SetActive
+// Set active for the button
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlButton::SetActive(TBool aActiveFlag)
+    {
+    if( IsDimmed() )
+        {
+        return;
+        }
+        
+    if(IsActive() != aActiveFlag)
+        {
+        CFepUiBaseCtrl::SetActive(aActiveFlag);
+        if(aActiveFlag || iHighlight)
+            {               
+            SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse));
+            SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue));
+            //Hide(EFalse);   //active button won't be Hiden ???
+            }
+        else
+            {
+            SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse));
+            SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue));
+            }
+        if(BitGc())
+            {       
+            Draw();
+            UpdateArea(Rect(),EFalse);
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::SetHighlight
+// Set highlight for the button
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlButton::SetHighlight(TBool aIsHighlight)
+    {
+    iHighlight = aIsHighlight;
+
+    if ( iHighlight )
+        {
+        SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse));
+        SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue));            
+        }
+    else
+        {
+        SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse));
+        SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue));
+        }
+    Draw();
+    UpdateArea(Rect(), EFalse);         
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::ResizeBitmaps
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlButton::ResizeBitmaps(TSize aSize)
+    {
+    if (iMaskBmpList.Count() >= 1 && 
+        iMaskBmpList[0]->SizeInPixels() != aSize)
+        {
+        for( int ii = 0; ii < iMaskBmpList.Count(); ++ii )
+            {
+          	AknIconUtils::SetSize(iMaskBmpList[ii], aSize, EAspectRatioNotPreserved);
+            }
+        }
+
+    if (iBmpList.Count() >= 1 &&
+        iBmpList[0]->SizeInPixels() != aSize)
+        {
+        for( int ii = 0; ii < iBmpList.Count(); ++ii )
+            {
+       	    AknIconUtils::SetSize(iBmpList[ii], aSize, EAspectRatioNotPreserved);
+            }
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::SizeChanged
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlButton::SizeChanged(TRect aNewRect, TBool aIsReloadImages)
+    {
+    if ((aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0) &&
+        (ControlId() != EPeninupWindowCtrlIdArrowLeftBtn && 
+         ControlId() != EPeninupWindowCtrlIdArrowRightBtn))
+        {
+   	    return;
+        }
+    
+    SetRect(aNewRect);
+
+    //if (aIsReloadImages)
+        {
+        ResizeBitmaps(aNewRect.Size());	
+        }
+
+    Draw();
+    UpdateArea(Rect(), EFalse);
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlButton::HandlePointerLeave
+// Handle pointer leave event
+// ---------------------------------------------------------------------------
+//           
+void CAknFepCtrlButton::HandlePointerLeave(const TPoint& aPt)
+    {
+    if( IsDimmed() )
+        return;
+    if( iHighlight )
+        {
+        SetBackgroundBmp(iActiveBmp);
+        SetBackgroundMaskBmp(iActiveMaskBmp);
+        }
+        
+    else
+        {
+        SetBackgroundBmp(iNonActiveBkBmp);
+        SetBackgroundMaskBmp(iNonActiveBkMaskBmp);
+        }
+    Draw();
+    UpdateArea(Rect(), EFalse);   
+    CFepUiBaseCtrl::HandlePointerLeave(aPt);
+    return ;
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::CAknFepCtrlDragButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlDragButton::CAknFepCtrlDragButton(CFepUiLayout* aUiLayout, TInt aControlId)
+: CDragBar(TRect(), aUiLayout, aControlId), iFirstTimeConstruct(ETrue)
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlDragButton::~CAknFepCtrlDragButton()
+    {
+    iBmpList.Close();
+    iMaskBmpList.Close();
+    
+	DeleteForgroundRes();
+    delete iText;    
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlDragButton* CAknFepCtrlDragButton::NewL(CFepUiLayout* aUiLayout, 
+                                                            TInt aControlId)
+    {
+    CAknFepCtrlDragButton* self = NewLC(aUiLayout, aControlId);
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlDragButton* CAknFepCtrlDragButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                             TInt aControlId)
+    {
+    CAknFepCtrlDragButton* self = new (ELeave) CAknFepCtrlDragButton(aUiLayout, aControlId);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+    }    
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::ConstructFromResourceL
+// The order of the image ids in the CButtonBase class must not be changed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlDragButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    /*
+	if (!iFirstTimeConstruct)
+		{
+        iBmpList.Close();
+        iMaskBmpList.Close();
+        ResetBmpPool();
+		}
+    
+    TPtrC bmpFileName = aReader.ReadTPtrC();
+    TInt32 imgMajorSkinId = aReader.ReadInt32();
+    TAknsItemID id;
+
+    for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii)
+        {
+        const TInt16 bmpId = aReader.ReadInt16();
+        const TInt16 bmpMskId = aReader.ReadInt16();
+        
+        // read skin item id
+        const TInt skinitemid = aReader.ReadInt16();
+        id.Set(TInt(imgMajorSkinId), skinitemid);
+        
+        if (bmpId != KInvalidBmp)
+            {
+        	CFbsBitmap* bmp = NULL;
+        	CFbsBitmap* maskbmp = NULL;
+
+        	if (bmpMskId != KInvalidBmp)
+        		{
+        		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        		                       id,
+        		                       bmp,
+        		                       maskbmp,
+        		                       bmpFileName,
+        		                       bmpId,
+        		                       bmpMskId);
+        		
+                SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii));
+                iMaskBmpList.Append(maskbmp);
+                }
+            else
+                {
+        	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        	                           id,
+        	                           bmp,
+        	                           bmpFileName,
+        	                           bmpId);
+                }
+
+            SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii));
+            iBmpList.Append(bmp);
+            }
+        }
+    
+    if (!iFirstTimeConstruct)
+    	{
+        ResizeBitmaps(Rect().Size());
+    	Draw();
+    	}
+    
+    iFirstTimeConstruct = EFalse;*/
+	if (!iFirstTimeConstruct)
+		{
+        DeleteForgroundRes();
+		}
+    
+    TPtrC bmpFileName = aReader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = aReader.ReadInt32();
+    TInt colorGroup = aReader.ReadInt16();
+    TAknsItemID id;
+	
+    // Get the image ids and mask ids from resource
+    TInt bmpId = aReader.ReadInt16(); 
+    TInt bmpMskId = aReader.ReadInt16();
+    
+    // read skin item id
+    const TInt skinitemid = aReader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+    
+    if (bmpId != KInvalidBmp)
+        {
+    	if (bmpMskId != KInvalidBmp)
+    		{
+    		if( colorGroup == KInvalidColorGroup )
+    			{
+	    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                       id,
+                       iForgroundBmp,
+                       iForgroundBmpMask,
+                       bmpFileName,
+                       bmpId,
+                       bmpMskId);	
+    			}
+			else
+				{
+			    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                             id,
+                             KAknsIIDQsnIconColors,
+                             colorGroup,
+                             iForgroundBmp,
+                             iForgroundBmpMask,
+                             bmpFileName,
+                             bmpId,
+                             bmpMskId,
+                             AKN_LAF_COLOR( 0 ) );   	
+				}
+
+        AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+        AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), 
+                              EAspectRatioNotPreserved);
+    		                       
+    		/*CreateDimmedMaskL( iForgroundDimBmpMask, 
+    						   iForgroundBmpMask );
+   			AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), 
+                              EAspectRatioNotPreserved);*/
+    		}
+    		else
+	        {
+		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+		                           id,
+		                           iForgroundBmp,
+		                           bmpFileName,
+		                           bmpId);
+		    AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+	        }
+        }
+	
+    if (!iFirstTimeConstruct)
+    	{
+        //ResizeBitmaps(iForgroundBmpRect.Size());
+    	Draw();
+    	}
+    
+    iFirstTimeConstruct = EFalse;    
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::ConstructFromResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlDragButton::ConstructFromResourceL()
+	{
+	/*
+	if (iResourceId == KInvalidResId)
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	if (!iFirstTimeConstruct)
+		{
+        iBmpList.Close();
+        iMaskBmpList.Close();
+        ResetBmpPool();
+		}
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+
+    TPtrC bmpFileName = reader.ReadTPtrC();
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TAknsItemID id;
+
+    for (TInt ii = 0; ii < EBtnBmpLastType + 1; ++ii)
+        {
+        const TInt16 bmpId = reader.ReadInt16();
+        const TInt16 bmpMskId = reader.ReadInt16();
+        
+        // read skin item id
+        const TInt skinitemid = reader.ReadInt16();
+        id.Set(TInt(imgMajorSkinId), skinitemid);
+        
+        if (bmpId != KInvalidBmp)
+            {
+        	CFbsBitmap* bmp = NULL;
+        	CFbsBitmap* maskbmp = NULL;
+
+        	if (bmpMskId != KInvalidBmp)
+        		{
+        		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        		                       id,
+        		                       bmp,
+        		                       maskbmp,
+        		                       bmpFileName,
+        		                       bmpId,
+        		                       bmpMskId);
+        		
+                SetMaskBitmapL(maskbmp, TButtonBmpType(EBtnBmpNonActive + ii));
+                iMaskBmpList.Append(maskbmp);
+                }
+            else
+                {
+        	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        	                           id,
+        	                           bmp,
+        	                           bmpFileName,
+        	                           bmpId);
+                }
+
+            SetBitmapL(bmp, TButtonBmpType(EBtnBmpNonActive + ii));
+            iBmpList.Append(bmp);
+            }
+        }
+        
+    CleanupStack::PopAndDestroy(); // reader
+    
+    if (!iFirstTimeConstruct)
+    	{
+        ResizeBitmaps(Rect().Size());
+        Draw();
+    	}
+    	
+    iFirstTimeConstruct = EFalse;*/
+	if (iResourceId == KInvalidResId)
+		{
+        return;
+		}
+	
+	if (!iFirstTimeConstruct)
+		{
+		// need to remove original bmp and maskbmp
+        DeleteForgroundRes();
+		}
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+
+    TPtrC bmpFileName = reader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TInt colorGroup = reader.ReadInt16();
+    TAknsItemID id;
+	
+	// Get the image ids and mask ids from resource
+    TInt bmpId = reader.ReadInt16(); 
+    TInt bmpMskId = reader.ReadInt16();
+    
+    // Read skin item id
+    const TInt skinitemid = reader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+
+    if (bmpId != KInvalidBmp)
+        {
+    	if (bmpMskId != KInvalidBmp)
+    		{
+    		if( colorGroup == KInvalidColorGroup )
+    			{
+	    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                       id,
+                       iForgroundBmp,
+                       iForgroundBmpMask,
+                       bmpFileName,
+                       bmpId,
+                       bmpMskId);	
+    			}
+			else
+				{
+			    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                             id,
+                             KAknsIIDQsnIconColors,
+                             colorGroup,
+                             iForgroundBmp,
+                             iForgroundBmpMask,
+                             bmpFileName,
+                             bmpId,
+                             bmpMskId,
+                             AKN_LAF_COLOR( 0 ) );   	
+				}
+
+    		AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+    		AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), 
+    		                      EAspectRatioNotPreserved);
+    		                       
+    		/*CreateDimmedMaskL( iForgroundDimBmpMask, iForgroundBmpMask );
+   			AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), 
+   			                      EAspectRatioNotPreserved);*/
+    		}
+    		else
+	        {
+		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+		                           id,
+		                           iForgroundBmp,
+		                           bmpFileName,
+		                           bmpId);
+		    AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+	        }
+        }
+
+    CleanupStack::PopAndDestroy(); // reader
+    
+    if (!iFirstTimeConstruct)
+    	{
+        //ResizeBitmaps(iForgroundBmpRect.Size());
+    	Draw();
+    	}
+
+    iFirstTimeConstruct = EFalse;    	
+    
+	}
+    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::DeleteForgroundRes
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlDragButton::DeleteForgroundRes()
+	{
+    if( iForgroundBmp )
+		{
+		delete iForgroundBmp;
+		iForgroundBmp = NULL;
+		}
+	if( iForgroundBmpMask )
+		{
+		delete iForgroundBmpMask;
+		iForgroundBmpMask = NULL;
+		}
+	if( iForgroundDimBmpMask )
+		{
+		delete iForgroundDimBmpMask;
+		iForgroundDimBmpMask = NULL;
+		}
+	}    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::CreateDimmedMaskL
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//	
+void CAknFepCtrlDragButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask,
+                                        		 const CFbsBitmap* aMask
+                                        		 /*TScaleMode aScaleMode*/ )
+	{
+	    if (aMask && aMask->DisplayMode() == EGray256)
+	        {
+	        delete aDimmedMask;
+	        aDimmedMask = NULL;
+
+	        aDimmedMask = new (ELeave) CFbsBitmap;
+
+	        User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); 
+	        CleanupStack::PushL(aDimmedMask);
+
+	        CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask);
+	        CleanupStack::PushL(bitmapDevice);
+
+	        CFbsBitGc* bitGc(NULL);
+	        User::LeaveIfError(bitmapDevice->CreateContext(bitGc));
+	        CleanupStack::PushL(bitGc);
+
+	        bitGc->SetPenStyle(CGraphicsContext::ESolidPen);
+	        bitGc->BitBlt(TPoint(0, 0), aMask);
+
+	        aDimmedMask->LockHeap();
+	        TInt w = aMask->SizeInPixels().iWidth; 
+	        TInt h = aMask->SizeInPixels().iHeight;
+	        TInt dataStride = aMask->DataStride() - w; 
+	        unsigned char* address = (unsigned char *)aDimmedMask->DataAddress();  
+
+	        for ( TInt i = 0; i < h; ++i )
+	            {
+	            for ( TInt j = 0; j < w; ++j )
+	                {
+	                *address = KTransparency[*address];
+	                ++address;
+	                }
+	            address += dataStride;         
+	            }
+
+	        aDimmedMask->UnlockHeap();
+
+	        //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode);
+
+	        CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc
+	        CleanupStack::Pop(1); // aDimmedMask
+	        }
+
+	}
+    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::SetForgroundBmpRect
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlDragButton::SetForgroundBmpRect(const TRect& aRect)
+	{
+	iForgroundBmpRect = aRect;	
+	}    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::SetForegroundBmpL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CAknFepCtrlDragButton::SetForegroundBmpL(CFbsBitmap* aBmp,
+                                                         CFbsBitmap* aMaskBmp)
+    {
+    DeleteForgroundRes();
+
+    iForgroundBmp = aBmp;
+    iForgroundBmpMask = aMaskBmp;
+
+    ResizeBitmaps(iForgroundBmpRect.Size());
+    }
+
+EXPORT_C void CAknFepCtrlDragButton::Move(const TPoint& aOffset)
+    {
+    CButtonBase::Move(aOffset);
+    iForgroundBmpRect.Move( aOffset );
+    }    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::HandlePointerDownEventL
+// Handle button down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//   
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlDragButton::HandlePointerDownEventL(const TPoint& aPt)
+	{
+    if( IsDimmed() )
+    	return NULL;
+    
+    CDragBar::HandlePointerDownEventL(aPt);
+		
+	SetReady(ETrue);
+    Draw();
+    UpdateArea(Rect(),EFalse);
+    ReportEvent(EEventButtonDown);
+    return this;
+	}    
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlDragButton::Draw
+// Draws UI
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlDragButton::Draw()
+    {
+	if(!AbleToDraw())
+        return;
+    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    
+    //mask bitmaps
+  	DrawOpaqueMaskBackground();  
+    TRect rect = Rect();        
+    TRect innerRect = rect;
+    innerRect.Shrink( 10, 10 );
+    
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );                
+    //gc->Clear(rect);
+    	
+	CFbsBitmap* bmpMask = NULL;
+	
+	// Draw background    
+ 	if( IsDimmed() ) // Dimmed state
+    	{
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+		                         *gc, 
+		                         rect, 
+		                         innerRect,
+		                         iInactiveImgID,
+		                         KAknsIIDDefault );
+    	if( iForgroundDimBmpMask )
+    		{
+    		delete iForgroundDimBmpMask;
+    		iForgroundDimBmpMask = NULL;
+    		}		                         
+    	TRAP_IGNORE(CreateDimmedMaskL( iForgroundDimBmpMask, 
+    					   iForgroundBmpMask ));
+		AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), 
+                              EAspectRatioNotPreserved);		                         
+		bmpMask = iForgroundDimBmpMask;    
+    	}
+    else
+    	{
+		// Normal state or pressed state
+		TAknsItemID ImgID = (IsDragging() | PointerDown()) ? iPressedImgID : iNormalImgID;
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+	                     *gc, 
+	                     rect, 
+	                     innerRect,
+	                     ImgID,
+	                     KAknsIIDDefault ); 
+	    bmpMask = iForgroundBmpMask;            	    		
+    	}
+    
+    // Draw forground
+	if( iForgroundBmp )
+		{
+		TRect srcRect( TPoint( 0, 0 ), iForgroundBmp->SizeInPixels() );
+		if( bmpMask )
+			{
+			gc->BitBltMasked( iForgroundBmpRect.iTl, 
+							  iForgroundBmp, 
+							  srcRect,
+							  bmpMask,
+							  EFalse);
+			}
+		else
+			{
+			gc->BitBlt( iForgroundBmpRect.iTl,
+						iForgroundBmp,
+						srcRect );	
+			}
+		}
+
+    if (iText)
+        {
+        TAknLayoutText textLayout;
+        textLayout.LayoutText(Rect(), iTextFormat);
+        textLayout.DrawText(*gc, *iText);
+        }
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::ResizeBitmaps
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAknFepCtrlDragButton::ResizeBitmaps(TSize aInnerSize)
+    {
+    /*
+    if (iMaskBmpList.Count() >= 1 &&
+        iMaskBmpList[0]->SizeInPixels() != aSize)
+        {
+        for( TInt ii = 0; ii < iMaskBmpList.Count(); ++ii )
+            {
+       	    AknIconUtils::SetSize(iMaskBmpList[ii], aSize, EAspectRatioNotPreserved);
+            }
+        }
+        
+    if (iBmpList.Count() >= 1 &&
+        iBmpList[0]->SizeInPixels() != aSize)
+        {
+        for( TInt ii = 0; ii < iBmpList.Count(); ++ii )
+            {
+            AknIconUtils::SetSize(iBmpList[ii], aSize, EAspectRatioNotPreserved);
+            }
+        }*/
+    if( iForgroundBmp && ( iForgroundBmp->SizeInPixels() != aInnerSize ) )
+    	{
+    	AknIconUtils::SetSize( iForgroundBmp, aInnerSize, EAspectRatioNotPreserved );
+    	}
+    if( iForgroundBmpMask && ( iForgroundBmpMask->SizeInPixels() != aInnerSize ) )
+    	{
+    	AknIconUtils::SetSize( iForgroundBmpMask, aInnerSize, EAspectRatioNotPreserved );
+    	}    
+    	
+    /*TRAP_IGNORE(CreateDimmedMaskL(iForgroundDimBmpMask, 
+                                  iForgroundBmpMask));   */     
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlDragButton::SizeChanged
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlDragButton::SizeChanged(TRect aNewRect, 
+												 TRect aInnerRect, 
+												 TBool aIsReloadImages)
+    {
+    // Reset the position and the extent of the button aera
+    /*if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0)
+        {
+   	    return;
+        }
+        
+    SetRect(aNewRect);
+
+    if (aIsReloadImages)
+        {
+        ResizeBitmaps(aNewRect.Size());
+        }
+
+    Draw();
+    UpdateArea(Rect(), ETrue);*/
+    
+    if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0)
+        {
+   	    return;
+        }
+    
+    TRect oriRect = Rect();
+    SetRect(aNewRect);
+	iForgroundBmpRect = aInnerRect;
+	
+    if (aIsReloadImages)
+        {
+        ResizeBitmaps(aInnerRect.Size() );	
+        }
+	RootControl()->ReDrawRect( oriRect );
+    UpdateArea(oriRect, EFalse);
+    Draw();
+    UpdateArea(Rect(), EFalse);    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::CAknFepCtrlMultiModeButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiModeButton::CAknFepCtrlMultiModeButton(CFepUiLayout* aUiLayout, 
+                                     TInt aControlId,TAknsItemID aNormalID,
+                                     TAknsItemID aPressedID,TAknsItemID aInactiveID)
+         : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID)
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::NewL
+// Two-phased constructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiModeButton* CAknFepCtrlMultiModeButton::NewL(CFepUiLayout* aUiLayout, 
+                                                    TInt aControlId,TAknsItemID aNormalID,
+                                                    TAknsItemID aPressedID,TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlMultiModeButton* self = NewLC(aUiLayout, aControlId, 
+                                             aNormalID, aPressedID, aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::NewLC
+// Two-phased constructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiModeButton* CAknFepCtrlMultiModeButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                    TInt aControlId,TAknsItemID aNormalID,
+                                                    TAknsItemID aPressedID,TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlMultiModeButton* self = new (ELeave) CAknFepCtrlMultiModeButton(aUiLayout, 
+                                                                               aControlId, 
+                                                                               aNormalID, 
+                                                                               aPressedID,
+                                                                               aInactiveID);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiModeButton::~CAknFepCtrlMultiModeButton()
+    {
+    iImageResIdList.Close();
+    iForegroundBmpList.ResetAndDestroy();
+    iForegroundBmpList.Close();
+    iForegroundMaskBmpList.ResetAndDestroy();
+    iForegroundMaskBmpList.Close();
+        
+    iModeTextList.ResetAndDestroy();
+    iModeTextList.Close();  
+    
+    iModesList.ResetAndDestroy();
+    iModesList.Close();
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::ConstructFromResourceL
+// The order of the image ids in the CButtonBase class must not be changed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void CAknFepCtrlMultiModeButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    if (!iFirstTimeConstruct)
+    	{
+        iImageResIdList.Close();
+        iForegroundBmpList.ResetAndDestroy();
+        iForegroundBmpList.Close();
+        iForegroundMaskBmpList.ResetAndDestroy();
+        iForegroundMaskBmpList.Close();
+             
+        iModeTextList.ResetAndDestroy();
+        iModeTextList.Close();  
+
+
+        iModesList.ResetAndDestroy();
+        iModesList.Close();
+    	
+        ResetBmpPool();
+    	}
+    
+    // read text color and shadow text color	
+    TInt32 colorMajorSkinId = aReader.ReadInt32();
+    const TInt skinitemid = aReader.ReadInt16();
+    TInt textcoloridx = aReader.ReadInt16();
+    TInt shadowtextcoloridx = aReader.ReadInt16();
+    
+    TAknsItemID id;
+    
+    id.Set(TInt(colorMajorSkinId), skinitemid);
+    TInt error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(),
+                                           iFontColor,
+                                           id,
+                                           textcoloridx);
+
+    if (error != KErrNone)
+        {
+    	iFontColor = TRgb(KDefaultTextColor);
+        }
+    
+    SetFontColor(iFontColor);    
+    
+    error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(),
+                                      iShadowFontColor,
+                                      id,
+                                      shadowtextcoloridx);
+                                      
+    if (error != KErrNone)
+        {
+    	iShadowFontColor = TRgb(KDefaultShadowTextColor);
+        }
+    
+    SetShadowFontColor(iShadowFontColor);    
+    
+    const TInt16 countModes = aReader.ReadInt16();      // Read the count of different cases
+    
+    if (countModes <= 0)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    iNumberOfModes = 0;
+
+    for (TInt ii = 0; ii < countModes; ii++)
+        {
+        AddModeL(aReader);
+        iNumberOfModes++;
+        }
+        
+    if (iFirstTimeConstruct)
+    	{
+        if (iImageResIdList.Count() == 1)
+            {
+            // set background bimap for button    
+            SetButtonBmpL(EBtnBmpNonActive, 0);
+            iCurrentBmpType = EBtnBmpNonActive;
+            }
+
+        const TInt16 defaultModeIndex = aReader.ReadInt16();
+        SetCurrentModeL(EBtnBmpNonActive, defaultModeIndex);
+    	}
+    else
+    	{
+        SetButtonBmpL(iCurrentBmpType, iCurrentMode);
+        Draw();
+    	}
+
+    iFirstTimeConstruct = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::ConstructFromResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void CAknFepCtrlMultiModeButton::ConstructFromResourceL()
+	{
+    if (iResourceId == KInvalidResId)
+    	{
+    	return;
+    	}
+ 
+    if (!iFirstTimeConstruct)
+    	{
+        iImageResIdList.Close();
+        iForegroundBmpList.ResetAndDestroy();
+        iForegroundBmpList.Close();
+        iForegroundMaskBmpList.ResetAndDestroy();
+        iForegroundMaskBmpList.Close();
+        
+        iModeTextList.ResetAndDestroy();
+        iModeTextList.Close();  
+
+
+        iModesList.ResetAndDestroy();
+        iModesList.Close();
+    	
+        ResetBmpPool();
+    	}
+    	
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+	
+    // read text color and shadow text color	
+    TInt32 colorMajorSkinId = reader.ReadInt32();
+    const TInt skinitemid = reader.ReadInt16();
+    TInt textcoloridx = reader.ReadInt16();
+    TInt shadowtextcoloridx = reader.ReadInt16();
+    
+    TAknsItemID id;
+    
+    id.Set(TInt(colorMajorSkinId), skinitemid);
+    TInt error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(),
+                                           iFontColor,
+                                           id,
+                                           textcoloridx);
+
+    if (error != KErrNone)
+        {
+    	iFontColor = TRgb(KDefaultTextColor);
+        }
+    
+    SetFontColor(iFontColor);    
+    
+    error = AknsUtils::GetCachedColor(UiLayout()->SkinInstance(),
+                                      iShadowFontColor,
+                                      id,
+                                      shadowtextcoloridx);
+                                      
+    if (error != KErrNone)
+        {
+    	iShadowFontColor = TRgb(KDefaultShadowTextColor);
+        }
+    
+    SetShadowFontColor(iShadowFontColor);    
+
+    const TInt16 countModes = reader.ReadInt16();
+    
+    if (countModes <= 0)
+        {
+        User::Leave(KErrArgument);
+        }
+
+   	iNumberOfModes = 0;
+    
+    for (TInt ii = 0; ii < countModes; ii++)
+        {
+        AddModeL(reader);
+       	iNumberOfModes++;
+        }
+
+	
+    if (iFirstTimeConstruct)
+    	{
+        if (iImageResIdList.Count() == 1)
+            {
+            // set background bimap for button    
+            SetButtonBmpL(EBtnBmpNonActive, 0);
+            iCurrentBmpType = EBtnBmpNonActive;
+            }
+
+        const TInt16 defaultModeIndex = reader.ReadInt16();
+        SetCurrentModeL(EBtnBmpNonActive, defaultModeIndex);
+    	}
+    else
+    	{
+    	ResizeBitmaps(iForgroundBmpRect.Size());
+        SetButtonBmpL(iCurrentBmpType, iCurrentMode);
+        Draw();
+    	}	
+    	
+    CleanupStack::PopAndDestroy(); // reader
+    
+    iFirstTimeConstruct = EFalse;
+
+	}
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::AddModeL
+// Add new display mode from resource reader
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::AddModeL(TResourceReader& aReader)
+    {
+    const TInt32 imageResId = aReader.ReadInt32();
+    iModeTextList.Append(aReader.ReadHBufCL());
+    const TInt rangeId = aReader.ReadInt16();
+    const TInt modeId = aReader.ReadInt16();
+
+    TAknFepModeIndicator* modeIndicator = new (ELeave) TAknFepModeIndicator;
+    CleanupStack::PushL(modeIndicator);
+
+    modeIndicator->iRangeId = rangeId;
+    modeIndicator->iModeId = modeId;
+    modeIndicator->iPermitted = ETrue;
+
+    iModesList.AppendL(modeIndicator);
+    CleanupStack::Pop(modeIndicator); // indicator        
+
+    if ( imageResId != KInvalidBmp )
+        {
+        // switch mode means change image    
+        TResourceReader reader;
+        CCoeEnv::Static()->CreateResourceReaderLC(reader, imageResId);
+        
+        TPtrC bmpFileName = reader.ReadTPtrC();
+        TInt32 imgMajorSkinId = reader.ReadInt32();
+        TInt colorGroup = reader.ReadInt16();
+        TAknsItemID id;
+
+        for (TInt jj = 0; jj < /*EBtnBmpLastType +*/ 1; jj++)
+            {
+            const TInt16 bmpId = reader.ReadInt16();
+            const TInt16 bmpMskId = reader.ReadInt16();
+            const TInt16 skinitemid = reader.ReadInt16();
+            id.Set(TInt(imgMajorSkinId), skinitemid);
+
+            if (bmpId != KInvalidBmp)
+            	{
+            	CFbsBitmap* bmp = NULL;
+            	CFbsBitmap* maskbmp = NULL;
+            	
+        	    if (bmpMskId != KInvalidBmp)
+        	        {
+        	        if( colorGroup == KInvalidColorGroup )
+	        	    	{
+	        		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+	        		                           id,
+	        		                           bmp,
+	        		                           maskbmp,
+	        		                           bmpFileName,
+	        		                           bmpId,
+	        		                           bmpMskId);
+	        	    	}
+        	    	else
+	        	    	{
+	        	    	AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+				                             id,
+				                             KAknsIIDQsnIconColors,
+				                             colorGroup,
+				                             bmp,
+				                             maskbmp,
+				                             bmpFileName,
+				                             bmpId,
+				                             bmpMskId,
+				                             AKN_LAF_COLOR( 0 ) );   	
+	
+	        	    	}
+                    CleanupStack::PushL(maskbmp);
+                    AknIconUtils::SetSize(maskbmp, iForgroundBmpRect.Size(),
+                                          EAspectRatioNotPreserved);                    
+                    iForegroundMaskBmpList.AppendL(maskbmp);            
+                    CleanupStack::Pop(maskbmp);    
+                    
+        	        }
+        	    else
+        	        {
+        	        AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+        	                               id,
+        	                               bmp,
+        	                               bmpFileName,
+        	                               bmpId);
+
+        	        }
+        	    
+        	    CleanupStack::PushL(bmp);
+        	    AknIconUtils::SetSize(bmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+        	    iForegroundBmpList.AppendL(bmp);        	    
+        	    CleanupStack::Pop(bmp);    
+                
+            	}
+            }
+        
+        CleanupStack::PopAndDestroy(); //reader
+        
+        iImageResIdList.Append(imageResId);
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetButtonBmp
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::SetButtonBmpL(const TButtonBmpType aType , 
+                                                        const TInt aMode)
+    {
+    if ( !ForgroundBmp() || 
+         ForgroundBmp()->Handle() != iForegroundBmpList[aMode]->Handle() ||
+         !ForgroundBmpMask() || 
+         ForgroundBmpMask()->Handle() != iForegroundMaskBmpList[aMode]->Handle() )
+        {
+        CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+        if(iForegroundMaskBmpList.Count() > 0 && iForegroundBmpList[aMode])
+            {
+            CleanupStack::PushL( bmp );
+            
+            User::LeaveIfError(bmp->Duplicate(iForegroundBmpList[aMode]->Handle()));
+            
+            CleanupStack::Pop( bmp );            
+            }
+        else
+            {
+            delete bmp;
+            bmp = NULL;
+            }
+        CFbsBitmap* maskbmp = new (ELeave) CFbsBitmap;
+        
+        if(iForegroundMaskBmpList.Count() > 0 && iForegroundMaskBmpList[aMode])
+            {    
+            CleanupStack::PushL( maskbmp );
+            User::LeaveIfError(maskbmp->Duplicate(iForegroundMaskBmpList[aMode]->Handle()));    
+            CleanupStack::Pop( maskbmp );     
+            }
+        else
+            {
+            delete maskbmp;
+            maskbmp = NULL;
+            }
+        SetForegroundBmpL(bmp,maskbmp);
+        }
+    else if ( ForgroundBmp()->SizeInPixels() != iForegroundBmpList[aMode]->SizeInPixels() ||
+              ForgroundBmpMask()->SizeInPixels() != iForegroundMaskBmpList[aMode]->SizeInPixels())
+        {
+        ResizeBitmaps(iForegroundBmpList[aMode]->SizeInPixels());
+        }
+        
+    if(aType == EBtnBmpActivePressed
+      || aType == EBtnBmpNonActivePressed)
+        {
+        SetHighlight(ETrue);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetCurrentModeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::SetCurrentModeL(const TButtonBmpType aType, 
+                                                          const TInt aModeIndex)
+    {
+    if ((aModeIndex >= 0) && 
+        (aModeIndex <= NumberOfModes()-1) && 
+        (iModesList[aModeIndex]->iPermitted))
+        {
+        iCurrentMode = aModeIndex;
+
+        if (iImageResIdList.Count() > 1)
+            {
+            // change mode means change image
+            SetButtonBmpL(aType, iCurrentMode);
+            iCurrentBmpType = aType;
+            }
+
+        Draw();
+        UpdateArea(Rect());
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::NextMode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::NextMode() const
+    {
+    TInt startIndex = 0;
+
+    if (iCurrentMode < (NumberOfModes() -1))
+        {
+        startIndex = iCurrentMode + 1;
+        }
+
+    TBool find = EFalse;
+    
+    while (!find && (startIndex != iCurrentMode))
+        {
+        if (iModesList[startIndex]->iPermitted)
+            {
+            find = ETrue;
+            }
+        else
+            {
+            startIndex++;
+            
+            if (startIndex > (NumberOfModes()-1))
+                {
+                startIndex = 0;
+                }
+            }
+        }        
+
+    if (find)
+        {
+        return startIndex;
+        }
+    else
+        {
+        return iCurrentMode;
+        }    
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::ImageAlreadyExist
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CAknFepCtrlMultiModeButton::ImageAlreadyExist(const TInt32 aResId)
+    {
+    TBool findResId = EFalse;
+
+    for (TInt i=0; i<iImageResIdList.Count(); i++)
+        {
+        if (aResId == iImageResIdList[i])
+            {
+            findResId = ETrue;
+
+            break;
+            }
+        }
+
+    return findResId;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::DisplayText
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::DisplayText()
+    {
+    if ((iFont) && (iShadowFont))
+        {
+        // draw shadow text
+        BitGc()->UseFont(iShadowFont);
+
+        BitGc()->SetBrushStyle( CGraphicsContext::ENullBrush );
+        BitGc()->SetBrushColor( KRgbBlack);//Non transparent at all
+        BitGc()->SetPenColor(iShadowFontColor);
+        BitGc()->SetPenStyle(CGraphicsContext::ESolidPen);
+        BitGc()->SetPenSize( PenSize());
+
+        TPoint pointText;
+        TPoint pointShadowText;
+
+        TInt leftMarginOfText = 
+                     (Rect().Width() - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode])))/2;
+
+        pointText.iX = Rect().iTl.iX + leftMarginOfText;
+        pointText.iY = Rect().iTl.iY + Rect().Height()*3/4;
+
+        pointShadowText.iX = pointText.iX + 1;
+        pointShadowText.iY = pointText.iY + 1;
+
+        //BitGc()->DrawText(*(iModeTextList[iCurrentMode]), Rect(), Rect().Height()*3/4, CGraphicsContext::ECenter, Rect().Width()/2 - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode]))/2);
+        BitGc()->DrawText(*(iModeTextList[iCurrentMode]), pointShadowText);
+
+        BitGc()->DiscardFont();
+
+        // draw text
+        BitGc()->UseFont(iFont);
+
+        BitGc()->SetBrushStyle( CGraphicsContext::ENullBrush );
+        BitGc()->SetBrushColor( KRgbBlack);//Non transparent at all
+        BitGc()->SetPenColor(iFontColor);
+        BitGc()->SetPenStyle(CGraphicsContext::ESolidPen);
+        BitGc()->SetPenSize( PenSize());
+
+        //BitGc()->DrawText(*(iModeTextList[iCurrentMode]), Rect(), Rect().Height()*3/4+1, CGraphicsContext::ECenter, Rect().Width()/2 - iFont->TextWidthInPixels(*(iModeTextList[iCurrentMode]))/2-1);
+        BitGc()->DrawText(*(iModeTextList[iCurrentMode]), pointText);
+
+        BitGc()->DiscardFont();
+
+        //BitGc()->SetPenStyle(CGraphicsContext::ENullPen);        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::Draw
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::Draw()
+    {
+	if(!AbleToDraw())
+        return;
+    
+    CAknFepCtrlCommonButton::Draw();
+    //CButtonBase::Draw();  
+    if ( iModeTextList.Count() )
+        {
+        if ((iModeTextList[iCurrentMode]) && (iModeTextList[iCurrentMode]->Length() > 0)) 
+            {
+            DisplayText();
+            }        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetFontColor
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::SetFontColor(const TRgb aFontColor)
+    {
+    iFontColor = aFontColor;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetShadowFontColor
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::SetShadowFontColor(const TRgb aShadowFontColor)
+    {
+    iShadowFontColor = aShadowFontColor;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetPermittedModes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::SetPermittedModes(const TInt aRangeId,
+                                                            const TInt aRealCaseId,
+                                                            TBool aPermit)
+    {
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+    	if ((iModesList[i]->iRangeId == aRangeId) && (iModesList[i]->iModeId == aRealCaseId))
+    	    {
+          	iModesList[i]->iPermitted = aPermit;
+            
+            return KErrNone;    
+    	    }
+        }
+    
+    return KErrNotSupported;    
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetPermittedRange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::SetPermittedRange(const TInt aRangeId, TBool aPermit)
+    {
+    TBool findRangeId = EFalse;
+    
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+        if ((iModesList[i]->iRangeId == aRangeId) && (iModesList[i]->iPermitted != aPermit))
+            {
+            iModesList[i]->iPermitted = aPermit;
+            findRangeId = ETrue;
+            }
+        }
+    
+    if (!findRangeId)
+        {
+        return KErrNotSupported;
+        }
+    else
+        {
+        return KErrNone;
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::EnableAllModes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::EnableAllModes()
+    {
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+        iModesList[i]->iPermitted = ETrue;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::DisableAllModes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::DisableAllModes()
+    {
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+        iModesList[i]->iPermitted = EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::DisableAllModes
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::DisableOneModes(const TInt aRangeId)
+    {
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+        if(iModesList[i]->iRangeId == aRangeId)
+            {
+            iModesList[i]->iPermitted = EFalse;
+            TRAP_IGNORE(SetCurrentModeL(EBtnBmpNonActive, NextMode()));
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::IsGivenRangeSupported
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CAknFepCtrlMultiModeButton::IsGivenRangeSupported(const TInt aRange)
+    {
+    for (TInt i = 0; i < iModesList.Count(); i++)
+        {
+        // judge if aRange is supported by at least 1 mode
+        if ((iModesList[i]->iRangeId == aRange) && (iModesList[i]->iPermitted))
+            {
+            return ETrue;
+            }
+        }
+    
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SetRange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::SetRange(const TInt aRange)
+    {
+    if (CurrentRange() != aRange)
+        {
+        for (TInt i = 0; i < iModesList.Count(); i++)
+            {
+    	    if ((iModesList[i]->iRangeId == aRange) && 
+    	        (iModesList[i]->iPermitted))
+    	        {
+                TRAP_IGNORE(SetCurrentModeL(EBtnBmpActive, i));
+                return KErrNone;
+    	        }
+            }
+        }
+    
+    return KErrNotSupported;    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::CurrentRange
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::CurrentRange() const
+    {
+    if ((iCurrentMode >= 0) && (iCurrentMode <= (NumberOfModes()-1)))
+        {
+        return iModesList[iCurrentMode]->iRangeId;
+        }
+    else
+        {
+        return KErrNotFound;
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::RangeOfGivenMode()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::RangeOfGivenMode(TInt aModeIndex) const
+    {
+    if ((aModeIndex >= 0) && (aModeIndex <= NumberOfModes()-1))
+        {
+        return iModesList[aModeIndex]->iRangeId; 
+        }
+    
+    return KErrNotSupported;    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::GetRealCaseByMode()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlMultiModeButton::GetRealCaseByMode(TInt aModeIndex) const
+    {
+    if ((aModeIndex >= 0) && (aModeIndex <= NumberOfModes() -1))	
+        {
+        return iModesList[aModeIndex]->iModeId;
+        }
+    
+    return KErrNotFound;    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::GetRangeListL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAknFepCtrlMultiModeButton::GetRangeListL(RArray<TInt>& aList)
+    {
+	CleanupClosePushL( aList );
+    for (TInt i = 0; i < NumberOfModes(); i++)
+        {
+        if (aList.Find(iModesList[i]->iRangeId) == KErrNotFound)
+            {
+            aList.AppendL(iModesList[i]->iRangeId);
+            }
+        }
+    CleanupStack::Pop();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::DuplicateBitmapL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CFbsBitmap* CAknFepCtrlMultiModeButton::DuplicateBitmapL(CFbsBitmap* aSourceBmp)
+    {
+    CFbsBitmap* bmp = new (ELeave) CFbsBitmap;
+    CleanupStack::PushL( bmp );
+    
+    User::LeaveIfError(bmp->Duplicate(aSourceBmp->Handle()));
+    
+    CleanupStack::Pop( bmp );
+    //iOwnedBitmaps.InsertInAddressOrder(bmp);
+    return bmp;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::ResizeBitmaps
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAknFepCtrlMultiModeButton::ResizeBitmaps(TSize aSize)
+    {
+    if(iForegroundBmpList.Count() >= 1 && iForegroundBmpList[0]->SizeInPixels() != aSize
+    || iForegroundMaskBmpList.Count() >= 1 && iForegroundMaskBmpList[0]->SizeInPixels() != aSize)
+        {
+        for (TInt i=0; i<iForegroundBmpList.Count(); i++)
+            {
+          	AknIconUtils::SetSize(iForegroundBmpList[i], aSize, EAspectRatioNotPreserved);
+            }        
+        for (TInt i=0; i<iForegroundMaskBmpList.Count(); i++)
+            {
+          	AknIconUtils::SetSize(iForegroundMaskBmpList[i], aSize, EAspectRatioNotPreserved);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::SizeChanged
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiModeButton::SizeChanged(TRect aRect, TRect aInnerRect,
+                                                      TBool aIsReloadImages)
+    {
+    if (aRect.Size().iWidth == 0 || aRect.Size().iHeight == 0)
+        {
+    	  return;
+        }
+    SetRect(aRect);
+    
+    iForgroundBmpRect = aInnerRect;
+    
+    if (aIsReloadImages)
+        {
+        ResizeBitmaps(aInnerRect.Size());
+        }
+
+    TRAP_IGNORE(SetButtonBmpL(iCurrentBmpType, iCurrentMode));
+
+    CAknFepCtrlCommonButton::SizeChanged(aRect,aInnerRect,aIsReloadImages);
+/*    
+    Draw();
+    UpdateArea(Rect(), ETrue);
+*/    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlMultiModeButton::TransferOwnership
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CAknFepCtrlMultiModeButton::TransferOwnership(CFbsBitmap* aRemoved)
+    {
+/*    
+    TInt index = iOwnedBitmaps.FindInAddressOrder(aRemoved);
+    if( index != KErrNotFound )
+        {
+        iOwnedBitmaps.Remove(index);
+        }
+*/        
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::NewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlEventButton* CAknFepCtrlEventButton::NewL(CFepUiLayout* aUiLayout, 
+                                                              TInt aControlId, 
+                                                              TInt aEvent,
+                                                              TInt aUnicode,
+                                                              TAknsItemID aNormalID,
+                                                              TAknsItemID aPressedID,
+                                                              TAknsItemID aInactiveID)
+    { 
+    CAknFepCtrlEventButton* self = NewLC(aUiLayout, aControlId, aEvent, aUnicode, 
+    									 aNormalID, aPressedID, aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;                        
+    }
+    
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::NewLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlEventButton* CAknFepCtrlEventButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                               TInt aControlId, 
+                                                               TInt aEvent,
+                                                               TInt aUnicode,
+                                                               TAknsItemID aNormalID,
+                                                               TAknsItemID aPressedID,
+                                                               TAknsItemID aInactiveID)
+    { 
+    CAknFepCtrlEventButton* self = new (ELeave) CAknFepCtrlEventButton(aUiLayout, 
+                                                                       aControlId,
+                                                                       aEvent,
+                                                                       aUnicode,
+                                                                       aNormalID,
+                                                                       aPressedID,
+                                                                       aInactiveID);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+
+    return self;                      
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::CAknFepCtrlEventButton
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlEventButton::CAknFepCtrlEventButton(CFepUiLayout* aUiLayout, 
+                                                        TInt aControlId, 
+                                                        TInt aEvent,
+                                                        TInt aUnicode,
+                                                        TAknsItemID aNormalID,
+                                                        TAknsItemID aPressedID,
+                                                        TAknsItemID aInactiveID)
+    : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID),
+	  iEvent(aEvent),iUnicode(aUnicode),iText(NULL) 
+    {        
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::~CAknFepCtrlEventButton
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//                                    
+EXPORT_C CAknFepCtrlEventButton::~CAknFepCtrlEventButton()
+    {
+    delete iText;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::HandlePointerUpEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlEventButton::HandlePointerUpEventL(const TPoint& aPoint)
+    {
+    if (iEvent == 0xFFFF)
+        {
+        return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint);
+        }
+    else
+        {
+        CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint);
+        if(IsDimmed())
+            {
+            return NULL;
+            }
+        
+        if(IsActive())
+            {
+            SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse));
+            SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue));
+            }
+        else
+            {
+            SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse));
+            SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue));
+            }
+            
+        SetActive(ETrue);
+        Draw();
+        UpdateArea(Rect(),EFalse);         
+        
+        TPtrC ptr = (TUint16*)(&iUnicode);
+        ReportEvent(iEvent,ptr);     
+        
+        return this;                                      
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::DisplayText
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::DisplayText()
+    {
+    if ((iFont) && (iShadowFont))
+        {
+        CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+
+        gc->Activate(BitmapDevice());
+
+        // draw shadow text
+        gc->UseFont(iShadowFont);
+
+        gc->SetBrushStyle( CGraphicsContext::ENullBrush );
+        gc->SetBrushColor( KRgbBlack);//Non transparent at all
+        gc->SetPenColor(iShadowFontColor);
+        gc->SetPenStyle(CGraphicsContext::ESolidPen);
+        gc->SetPenSize( PenSize());
+
+        TPoint pointText;
+        TPoint pointShadowText;
+
+        TInt leftMarginOfText = (Rect().Width() - iFont->TextWidthInPixels(*iText))/2;
+
+        pointText.iX = Rect().iTl.iX + leftMarginOfText;
+        pointText.iY = Rect().iTl.iY + Rect().Height()*3/4;
+
+        pointShadowText.iX = pointText.iX + 1;
+        pointShadowText.iY = pointText.iY + 1;
+
+        gc->DrawText(*iText, pointShadowText);
+
+        gc->DiscardFont();
+
+        // draw text
+        gc->UseFont(iFont);
+
+        gc->SetBrushStyle( CGraphicsContext::ENullBrush );
+        gc->SetBrushColor( KRgbBlack);//Non transparent at all
+        gc->SetPenColor(iFontColor);
+        gc->SetPenStyle(CGraphicsContext::ESolidPen);
+        gc->SetPenSize( PenSize());
+
+        gc->DrawText(*iText, pointText);
+
+        gc->DiscardFont();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetFontColor
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::SetFontColor(const TRgb aColor)
+    {
+    iFontColor = aColor;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetShadowFontColor
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::SetShadowFontColor(const TRgb aColor)
+    {
+    iShadowFontColor = aColor;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::Draw
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::Draw()
+    {
+	if(!AbleToDraw())
+        return;
+    
+    CAknFepCtrlCommonButton::Draw();
+
+    if ( iText && (iText->Length() > 0 ) ) 
+        {
+        DisplayText();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetText
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::SetText(const TDesC& aText)
+    {
+    if ( iText )
+        {
+        delete iText;
+        iText = NULL;
+        }
+    TRAPD(err, iText = aText.AllocL());
+    if (err != KErrNone)
+        {
+        iText = NULL;
+        }
+    Draw();
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetFont
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::SetFont(const CFont* aFont)
+    {
+    iFont = aFont;
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetShadowFont
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlEventButton::SetShadowFont(const CFont* aFont)
+    {
+    iShadowFont = aFont;
+    }
+        
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::Event
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknFepCtrlEventButton::Event() const
+    {                           
+    return iEvent;                       
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::Unicode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C TInt CAknFepCtrlEventButton::Unicode() const
+    {             
+    return iUnicode;                                     
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetEvent
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlEventButton::SetEvent(TInt aEvent)
+    {               
+    iEvent = aEvent;                                   
+    }
+
+// -----------------------------------------------------------------------------
+// CAknFepCtrlEventButton::SetUnicode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlEventButton::SetUnicode(TInt aUnicode)
+    {                                                
+    iUnicode = aUnicode;  
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlRepeatButton* CAknFepCtrlRepeatButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                                 TInt aCtrlId,
+                                                                 TInt aEvent,
+                                                                 TInt aUnicode,
+                                                                 TAknsItemID aNormalID,
+                                                                 TAknsItemID aPressedID,
+                                                                 TAknsItemID aInactiveID)
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::NewLC(), aCtrlId = %d\n"), aCtrlId));
+    CAknFepCtrlRepeatButton *self = new(ELeave) CAknFepCtrlRepeatButton(aUiLayout, 
+                                                                        aCtrlId, 
+                                                                        aEvent, 
+                                                                        aUnicode,
+                                                                        aNormalID,
+                                                                        aPressedID,
+                                                                        aInactiveID);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlRepeatButton* CAknFepCtrlRepeatButton::NewL(CFepUiLayout* aUiLayout, 
+                                                                TInt aCtrlId,
+                                                                TInt aEvent,
+                                                                TInt aUnicode,
+                                                                TAknsItemID aNormalID,
+                                                                TAknsItemID aPressedID,
+                                                                TAknsItemID aInactiveID)
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::NewL(), aCtrlId = %d\n"), aCtrlId));
+    CAknFepCtrlRepeatButton *self = NewLC(aUiLayout, aCtrlId, aEvent, aUnicode,
+                                          aNormalID, aPressedID, aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+        
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlRepeatButton::~CAknFepCtrlRepeatButton()
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::~CAknFepCtrlRepeatButton()\n")));
+    CancelRepeat();
+
+    delete iLongPressTimer;
+    delete iRepeatTimer;
+    }
+    
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlRepeatButton::CAknFepCtrlRepeatButton(CFepUiLayout* aUiLayout, 
+                                                          TInt aCtrlId,
+                                                          TInt aEvent,
+                                                          TInt aUnicode,
+                                                          TAknsItemID aNormalID,
+                                                          TAknsItemID aPressedID,
+                                                          TAknsItemID aInactiveID)
+    :CAknFepCtrlEventButton(aUiLayout, aCtrlId, aEvent, aUnicode,
+														aNormalID,
+														aPressedID,
+														aInactiveID)
+    {
+    iLongPressInterval = KLongPressInterval;
+    iRepeatInterval = KRepeatInterval;
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlRepeatButton::ConstructL()
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::ConstructL()\n")));
+    BaseConstructL();
+    
+    iLongPressTimer = CAknFepTimer::NewL(this);
+    iRepeatTimer = CAknFepTimer::NewL(this);
+    }
+    
+// ---------------------------------------------------------
+// Time out event handler of both long press timer & repeat timer
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlRepeatButton::HandleTimerOut(const CAknFepTimer* aTimer)
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::HandleTimerOut()--")));
+    if (aTimer == iLongPressTimer)
+        {
+        //PRINTF((_L("long press timer timeout\n")));
+        iRepeatTimer->SetTimer(iRepeatInterval);
+        }
+    else
+        {
+        if (aTimer == iRepeatTimer)
+            {
+            //PRINTF((_L("repeat timer timeout: EEventButtonUp reported\n")));
+            if ( Unicode() )
+                {
+                TInt unicode = Unicode();
+                TPtrC ptr = (TUint16*)(&unicode ) ;
+                ReportEvent(Event(),ptr);   
+#ifdef RD_TACTILE_FEEDBACK
+			    if (UiLayout()->SupportTactileFeedback())
+			        {
+			        UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput);
+			        }
+#endif //RD_TACTILE_FEEDBACK                
+                }
+            else
+                {
+                ReportEvent(EEventButtonUp);
+                }
+            iRepeatTimer->SetTimer(iRepeatInterval);
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// Handle button down start long press timer 
+// ---------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRepeatButton::HandlePointerDownEventL(const TPoint& aPt)
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::HandleButtonDown()\n")));
+    
+    //PRINTF((_L("Set long press Timer\n")));
+    if( IsDimmed() )
+    	{
+    	return NULL;
+    	}
+    iLongPressTimer->SetTimer(iLongPressInterval);
+    TInt unicode = Unicode();
+    TPtrC ptr = (TUint16*)(&unicode);
+    ReportEvent(Event(), ptr);  
+    return CAknFepCtrlCommonButton::HandlePointerDownEventL(aPt);
+    }
+                                                          
+// ---------------------------------------------------------
+// Handle button up cancel timers 
+// ---------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRepeatButton::HandlePointerUpEventL(const TPoint& aPt)
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::HandleButtonUp()\n")));
+    
+    CancelRepeat();
+    
+    return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPt);
+    }
+
+// ---------------------------------------------------------
+// Handle pointer levae event cancel timers 
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlRepeatButton::HandlePointerLeave(const TPoint& aPoint)
+    {
+    CAknFepCtrlCommonButton::HandlePointerLeave(aPoint);
+
+    CancelRepeat();
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlRepeatButton::CancelPointerDownL
+// Cancel pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlRepeatButton::CancelPointerDownL()
+    {
+    CAknFepCtrlCommonButton::CancelPointerDownL();     
+    
+    CancelRepeat();
+    }
+
+// ---------------------------------------------------------
+// Set the repeat interval of repeat timer
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlRepeatButton::SetRepeatInterval(const TTimeIntervalMicroSeconds32& aTime)
+    {
+    iRepeatInterval = aTime;
+    }
+
+// ---------------------------------------------------------
+// Cancel timers 
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlRepeatButton::CancelRepeat()
+    {
+    //PRINTF((_L("CAknFepCtrlRepeatButton::CancelRepeat()\n")));
+    iLongPressTimer->Cancel();
+    iRepeatTimer->Cancel();
+    }
+    
+EXPORT_C CAknFepCtrlRawKeyButton* CAknFepCtrlRawKeyButton::NewL(CFepUiLayout* aUiLayout, 
+                                                                TInt aControlId,
+                                                                TAknsItemID aNormalID,
+                                                                TAknsItemID aPressedID,
+                                                                TAknsItemID aInactiveID, 
+                                                                TInt aDownEvent,
+                                                                TInt aUpEvent,
+                                                                TInt aScanCode)
+    { 
+    CAknFepCtrlRawKeyButton* self = NewLC(aUiLayout, 
+                                          aControlId,
+                                          aNormalID,
+                                          aPressedID,
+                                          aInactiveID, 
+                                          aDownEvent, 
+                                          aUpEvent,
+                                          aScanCode);
+    CleanupStack::Pop(self);
+    
+    return self;                        
+    }
+    
+EXPORT_C CAknFepCtrlRawKeyButton* CAknFepCtrlRawKeyButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                                 TInt aControlId, 
+                                                                 TAknsItemID aNormalID,
+                                                                 TAknsItemID aPressedID,
+                                                                 TAknsItemID aInactiveID,
+                                                                 TInt aDownEvent,
+                                                                 TInt aUpEvent,
+                                                                 TInt aScanCode)
+    { 
+    CAknFepCtrlRawKeyButton* self = new (ELeave) CAknFepCtrlRawKeyButton(aUiLayout, 
+                                                                         aControlId,
+                                                                         aNormalID,
+                                                                         aPressedID,
+                                                                         aInactiveID,
+                                                                         aDownEvent,
+                                                                         aUpEvent,
+                                                                         aScanCode);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+    return self;                      
+    }
+
+EXPORT_C CAknFepCtrlRawKeyButton::CAknFepCtrlRawKeyButton(CFepUiLayout* aUiLayout, 
+                                                          TInt aControlId,
+                                                          TAknsItemID aNormalID,
+                                                          TAknsItemID aPressedID,
+                                                          TAknsItemID aInactiveID, 
+                                                          TInt aDownEvent,
+                                                          TInt aUpEvent,
+                                                          TInt aScanCode)
+    : CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID),
+      iDownEvent(aDownEvent),
+      iUpEvent(aUpEvent),
+      iScanCode(aScanCode),
+      iLastPntDownEvent(EFalse)
+    {        
+    }
+
+EXPORT_C CAknFepCtrlRawKeyButton::~CAknFepCtrlRawKeyButton()
+    {
+    }
+
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRawKeyButton::HandlePointerDownEventL(const TPoint& aPoint)
+    {
+/*    if (iDownEvent == KInvalidEventId)
+        {
+        return CButtonBase::HandlePointerDownEventL(aPoint);
+        }
+    
+    if(IsDimmed())
+        {
+        return NULL;
+        }
+    
+    CAknFepCtrlButton::HandlePointerDownEventL(aPoint);
+    if(IsActive())
+        {
+        SetBackgroundBmp(iActiveBmpPressed);
+        SetBackgroundMaskBmp(iActiveMaskBmpPressed);
+        }        
+    else
+        {
+        SetBackgroundBmp(iNonActiveBkBmpPressed);
+        SetBackgroundMaskBmp(iNonActiveBkMaskBmpPressed);
+        }        
+
+    Draw();
+    UpdateArea(Rect(),ETrue);
+*/
+    if(IsDimmed())
+        {
+        return NULL;
+        }
+
+    CAknFepCtrlCommonButton::HandlePointerDownEventL(aPoint);
+    TKeyEvent event= {0,0,0,0};
+    TPtrC eventDataPtr;
+    event.iScanCode = iScanCode;
+    eventDataPtr.Set(reinterpret_cast<TUint16*>(&event),sizeof(event));
+        
+    ReportEvent(iDownEvent,eventDataPtr);
+    
+    iLastPntDownEvent = ETrue;
+
+    return this;
+    }
+
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlRawKeyButton::HandlePointerUpEventL(const TPoint& aPoint)
+    {
+    if (iUpEvent == KInvalidEventId)
+        {
+        return CButtonBase::HandlePointerUpEventL(aPoint);
+        }
+    
+/*    if(IsDimmed())
+        {
+        return NULL;
+        }
+        
+    if(IsActive())
+        {
+        SetBackgroundBmp(Bitmap(EBtnBmpActive,EFalse));
+        SetBackgroundMaskBmp(Bitmap(EBtnBmpActive,ETrue));
+        }
+    else
+        {
+        SetBackgroundBmp(Bitmap(EBtnBmpNonActive,EFalse));
+        SetBackgroundMaskBmp(Bitmap(EBtnBmpNonActive,ETrue));
+        }
+
+    SetActive(ETrue);
+    Draw();
+    UpdateArea(Rect(),ETrue);    
+*/
+    if(IsDimmed())
+        {
+        return NULL;
+        }
+        
+    CAknFepCtrlCommonButton::HandlePointerUpEventL(aPoint);
+    if (iLastPntDownEvent)
+        {
+        // only when last event is pointer down event, there is need to simulate
+        // pointer up event
+    	TKeyEvent event= {0,0,0,0};
+        TPtrC eventDataPtr;
+        event.iScanCode = iScanCode;
+        eventDataPtr.Set(reinterpret_cast<TUint16*>(&event),sizeof(event));
+
+        ReportEvent(iUpEvent,eventDataPtr);
+
+        iLastPntDownEvent = EFalse;
+        }
+
+    return this;
+    }
+
+EXPORT_C void CAknFepCtrlRawKeyButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    TInt scancode = aReader.ReadInt16();
+    SetScanCode(scancode);
+    
+    TInt32 btnimgResId = aReader.ReadInt32();
+    TResourceReader imgreader;
+    CCoeEnv::Static()->CreateResourceReaderLC(imgreader, btnimgResId);
+    CAknFepCtrlCommonButton::ConstructFromResourceL(imgreader);
+    CleanupStack::PopAndDestroy(); // imgreader
+    
+    //ResizeBitmaps(Rect().Size());
+    iFirstTimeConstruct = EFalse;
+    }
+
+EXPORT_C void CAknFepCtrlRawKeyButton::ConstructFromResourceL()
+    {
+	if (iResourceId == KInvalidResId)
+	    {
+	    return;
+	    }
+	
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+    
+    TInt scancode = reader.ReadInt16();
+    SetScanCode(scancode);
+    
+    TInt32 btnimgResId = reader.ReadInt32();
+    TResourceReader imgreader;
+    CCoeEnv::Static()->CreateResourceReaderLC(imgreader, btnimgResId);
+    CAknFepCtrlCommonButton::ConstructFromResourceL(imgreader);
+    CleanupStack::PopAndDestroy(2); // reader, imgreader
+    
+    //ResizeBitmaps(Rect().Size());
+    iFirstTimeConstruct = EFalse;
+    }
+
+EXPORT_C void CAknFepCtrlRawKeyButton::HandlePointerLeave(const TPoint& aPoint)
+    {
+    if (!Rect().Contains(aPoint))
+        {
+        TRAP_IGNORE(HandlePointerUpEventL(Rect().Center()));
+        }
+    }
+    
+EXPORT_C void CAknFepCtrlRawKeyButton::OnDeActivate()
+    {
+    CButtonBase::OnDeActivate();
+    
+    if (iLastPntDownEvent)
+        {
+        TRAP_IGNORE(HandlePointerUpEventL(Rect().Center()));
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::CAknFepCtrlCommonButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlCommonButton::CAknFepCtrlCommonButton(CFepUiLayout* aUiLayout, 
+                                                          TInt aControlId,
+                                                          TAknsItemID aNormalID,
+                                                          TAknsItemID aPressedID,
+                                                          TAknsItemID aInactiveID)
+: CButtonBase(TRect(), aUiLayout, aControlId),
+  iFirstTimeConstruct(ETrue),
+  iHighlight(EFalse),
+  iPressed(EFalse),
+  iTextColorIndex( KInvalidColorGroup )
+    {
+    iNormalImgID 	= aNormalID;
+    iPressedImgID	= aPressedID;
+    iInactiveImgID	= aInactiveID;
+    CFepUiBaseCtrl::SetActive( ETrue );
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::NewL
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlCommonButton* CAknFepCtrlCommonButton::NewL(CFepUiLayout* aUiLayout, 
+                                                                TInt aControlId,
+                                                                TAknsItemID aNormalID,
+                                                                TAknsItemID aPressedID,
+                                                                TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlCommonButton* self = NewLC(aUiLayout, 
+    									  aControlId,
+    									  aNormalID,
+    									  aPressedID,
+    									  aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::NewLC
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlCommonButton* CAknFepCtrlCommonButton::NewLC(CFepUiLayout* aUiLayout,
+                                                                 TInt aControlId,
+                                                                 TAknsItemID aNormalID,
+                                                                 TAknsItemID aPressedID,
+                                                                 TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlCommonButton* self = new (ELeave) CAknFepCtrlCommonButton(aUiLayout, 
+    									aControlId,
+    									aNormalID,
+    									aPressedID,
+    									aInactiveID);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+
+    return self;
+    }    
+    
+// -----------------------------------------------------------------------------
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlCommonButton::~CAknFepCtrlCommonButton()
+    {
+    DeleteForgroundRes();
+    delete iColorIcons;
+    delete iText;
+    }
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::ConstructFromResourceL
+// The order of the image ids in the CButtonBase class must not be changed
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+    if (!iFirstTimeConstruct)
+		{
+        DeleteForgroundRes();
+        if( iColorIcons )
+        	iColorIcons->ReConstructL();
+		}
+    
+    TPtrC bmpFileName = aReader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = aReader.ReadInt32();
+    TInt colorGroup = aReader.ReadInt16();    
+    TAknsItemID id;
+	
+    // Get the image ids and mask ids from resource
+    TInt bmpId = aReader.ReadInt16(); 
+    TInt bmpMskId = aReader.ReadInt16();
+    
+    // read skin item id
+    const TInt skinitemid = aReader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+    
+    if (bmpId != KInvalidBmp)
+        {
+    	if (bmpMskId != KInvalidBmp)
+    		{
+    		if( colorGroup == KInvalidColorGroup )
+    			{
+	    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                       id,
+                       iForgroundBmp,
+                       iForgroundBmpMask,
+                       bmpFileName,
+                       bmpId,
+                       bmpMskId);	
+    			}
+			else
+				{
+			    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                             id,
+                             KAknsIIDQsnIconColors,
+                             colorGroup,
+                             iForgroundBmp,
+                             iForgroundBmpMask,
+                             bmpFileName,
+                             bmpId,
+                             bmpMskId,
+                             AKN_LAF_COLOR( 0 ) );   	
+				}
+
+    		AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+    		AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), 
+    		                      EAspectRatioNotPreserved);
+    		                       
+    		/*CreateDimmedMaskL( iForgroundDimBmpMask, iForgroundBmpMask );
+    		AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), 
+    		                      EAspectRatioNotPreserved);*/
+    		}
+    	else
+	        {
+		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+		                           id,
+		                           iForgroundBmp,
+		                           bmpFileName,
+		                           bmpId);
+		    AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+	        }
+        }
+	
+    if (!iFirstTimeConstruct)
+    	{
+        //ResizeBitmaps(iForgroundBmpRect.Size());
+    	Draw();
+    	}
+    
+    iFirstTimeConstruct = EFalse;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::ConstructFromResourceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::ConstructFromResourceL()
+	{
+	if (iResourceId == KInvalidResId)
+		{
+        return;
+		}
+	
+	if (!iFirstTimeConstruct)
+		{
+		// need to remove original bmp and maskbmp
+        DeleteForgroundRes();
+        if( iColorIcons )
+        	iColorIcons->ReConstructL();
+		}
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+
+    TPtrC bmpFileName = reader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TInt colorGroup = reader.ReadInt16();
+    TAknsItemID id;
+	
+	// Get the image ids and mask ids from resource
+    TInt bmpId = reader.ReadInt16(); 
+    TInt bmpMskId = reader.ReadInt16();
+    
+    // Read skin item id
+    const TInt skinitemid = reader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+
+    if (bmpId != KInvalidBmp)
+    {
+	if (bmpMskId != KInvalidBmp)
+		{
+		if( colorGroup == KInvalidColorGroup )
+			{
+    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                   id,
+                   iForgroundBmp,
+                   iForgroundBmpMask,
+                   bmpFileName,
+                   bmpId,
+                   bmpMskId);	
+			}
+		else
+			{
+		    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                         id,
+                         KAknsIIDQsnIconColors,
+                         colorGroup,
+                         iForgroundBmp,
+                         iForgroundBmpMask,
+                         bmpFileName,
+                         bmpId,
+                         bmpMskId,
+                         AKN_LAF_COLOR( 0 ) );   	
+			}
+
+        AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+        AknIconUtils::SetSize(iForgroundBmpMask, iForgroundBmpRect.Size(), 
+                              EAspectRatioNotPreserved);
+
+		/*CreateDimmedMaskL( iForgroundDimBmpMask, 
+    					   iForgroundBmpMask );   
+ 		AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);*/
+		}
+    else
+        {
+	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+	                           id,
+	                           iForgroundBmp,
+	                           bmpFileName,
+	                           bmpId);
+	    AknIconUtils::SetSize(iForgroundBmp, iForgroundBmpRect.Size(), EAspectRatioNotPreserved);
+        }
+    }
+
+    CleanupStack::PopAndDestroy(); // reader
+    
+    if (!iFirstTimeConstruct)
+    	{
+        //ResizeBitmaps(iForgroundBmpRect.Size());
+    	Draw();
+    	}
+
+    iFirstTimeConstruct = EFalse;    	
+	}
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::Draw
+// Draws UI
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::Draw()
+    {
+    if(!AbleToDraw())
+        return;
+    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    
+    //mask bitmaps
+  	DrawOpaqueMaskBackground();  
+    TRect rect = Rect();        
+    TRect innerRect = rect;
+    innerRect.Shrink( 10, 10 );
+    
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );     
+   // gc->SetClippingRegion( &ValidClipRegion() );           
+    //gc->Clear(rect);
+    	
+    CFbsBitmap* bmpMask = NULL;
+	
+    // Draw background    
+    if( IsDimmed() ) // Dimmed state
+    	{
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+		                         *gc, 
+		                         rect, 
+		                         innerRect,
+		                         iInactiveImgID,
+		                         KAknsIIDDefault );
+    	if( iForgroundDimBmpMask )
+    		{
+    		delete iForgroundDimBmpMask;
+    		iForgroundDimBmpMask = NULL;
+    		}		                         
+    	TRAP_IGNORE(CreateDimmedMaskL( iForgroundDimBmpMask, 
+    					   iForgroundBmpMask ));
+		AknIconUtils::SetSize(iForgroundDimBmpMask, iForgroundBmpRect.Size(), 
+                              EAspectRatioNotPreserved);
+                              		                         
+		bmpMask = iForgroundDimBmpMask;    
+    	}
+    else
+    	{
+		// Normal state or pressed state
+		TAknsItemID ImgID;
+		if (iHighlight)
+			{
+			ImgID = iPressedImgID;
+			}
+		else 
+			{
+			ImgID = /*iPressed*/PointerDown()? iPressedImgID : iNormalImgID;
+			}
+		
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+	                     *gc, 
+	                     rect, 
+	                     innerRect,
+	                     ImgID,
+	                     KAknsIIDDefault ); 
+	    bmpMask = iForgroundBmpMask;            	    		
+    	}
+    
+    // Draw forground
+    if ( iColorIcons ) // 3-pieces color icon
+    	{
+    	AknPenInputDrawUtils::Draw3PiecesColorIcon( iColorIcons, 
+    												*gc, 
+    												iForgroundBmpRect, 
+    												iDraw3PiecesInfo.iInnerRect );
+    	}
+	else if( iForgroundBmp )
+		{
+		TRect srcRect( TPoint( 0, 0 ), iForgroundBmp->SizeInPixels() );
+		if( bmpMask )
+			{
+			gc->BitBltMasked( iForgroundBmpRect.iTl, 
+							  iForgroundBmp, 
+							  srcRect,
+							  bmpMask,
+							  EFalse);
+			}
+		else
+			{
+			gc->BitBlt( iForgroundBmpRect.iTl,
+						iForgroundBmp,
+						srcRect );	
+			}
+		}
+	
+    if (iText)
+        {
+		//if( IsDimmed() )
+		//	{
+		//	gc->SetFadingParameters( KFadingParamBlack, KFadingParamWhite );
+        //	gc->SetFaded( ETrue );		
+		//	}
+        
+        TAknLayoutText textLayout;
+        textLayout.LayoutText(Rect(), iTextFormat);
+        if( iTextColorIndex == KInvalidColorGroup )
+        	textLayout.DrawText(*gc, *iText);
+        else
+        	{
+			TRgb color( KRgbBlack );  // sane default for nonskinned case
+			if ( AknsUtils::AvkonSkinEnabled() )
+				{
+				AknsUtils::GetCachedColor( UiLayout()->SkinInstance(),
+				               color, KAknsIIDQsnTextColors, iTextColorIndex );
+				}	
+			if( IsDimmed() )
+				{			
+				color = KRgbGray;	
+				}	
+			textLayout.DrawText(*gc, *iText, ETrue, color);	
+        	}
+        //if( IsDimmed() )
+        //	gc->SetFaded( EFalse );
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::SetActive
+// Set active for the button
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::SetActive(TBool aActiveFlag)
+    {
+    if( IsDimmed() )
+        {
+        return;
+        }
+        
+    if(IsActive() != aActiveFlag)
+        {
+        CFepUiBaseCtrl::SetActive(aActiveFlag);
+/*       if(BitGc())
+            {       
+            Draw();
+            UpdateArea(Rect(),EFalse);
+            }*/
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::SetHighlight
+// Set highlight for the button
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlCommonButton::SetHighlight(TBool aIsHighlight)
+    {
+    iHighlight = aIsHighlight;
+
+    Draw();
+    UpdateArea(Rect(),EFalse);         
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::ResizeBitmaps
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlCommonButton::ResizeBitmaps(TSize aInnerSize)
+    {
+    if( iForgroundBmp && ( iForgroundBmp->SizeInPixels() != aInnerSize ) )
+        {
+        AknIconUtils::SetSize( iForgroundBmp, aInnerSize, EAspectRatioNotPreserved );
+        }
+    if( iForgroundBmpMask && ( iForgroundBmpMask->SizeInPixels() != aInnerSize ) )
+        {
+        AknIconUtils::SetSize( iForgroundBmpMask, aInnerSize, EAspectRatioNotPreserved );
+        }
+    
+        /*TRAP_IGNORE(CreateDimmedMaskL(iForgroundDimBmpMask, 
+                                      iForgroundBmpMask));*/
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::SizeChanged
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::SizeChanged(TRect aNewRect, 
+												   TRect aInnerRect, 
+												   TBool aIsReloadImages)
+    {
+    if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0)
+        {
+   	    return;
+        }
+    
+    TRect oriRect = Rect();
+    
+    if( oriRect == aNewRect && iForgroundBmpRect == aInnerRect )
+        {
+        return;
+        }
+    
+    SetRect(aNewRect);
+
+    if (aIsReloadImages)
+        {
+        iForgroundBmpRect = aInnerRect;
+        ResizeBitmaps(aInnerRect.Size() );	
+        }
+    RootControl()->ReDrawRect( Rect() );
+    UpdateArea(Rect(), EFalse);
+    Draw();
+    UpdateArea(Rect(), EFalse);
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::SetForgroundBmpRect
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlCommonButton::SetForgroundBmpRect(const TRect& aRect)
+	{
+	iForgroundBmpRect = aRect;	
+	}
+
+EXPORT_C void CAknFepCtrlCommonButton::SetDraw3PieceFrameInfo(TDraw3PiecesFrame a3PiecesFrameInfo)
+	{
+	iDraw3PiecesInfo = a3PiecesFrameInfo;
+	}
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::DeleteForgroundRes
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlCommonButton::DeleteForgroundRes()
+	{
+    if( iForgroundBmp )
+		{
+		delete iForgroundBmp;
+		iForgroundBmp = NULL;
+		}
+	if( iForgroundBmpMask )
+		{
+		delete iForgroundBmpMask;
+		iForgroundBmpMask = NULL;
+		}
+	if( iForgroundDimBmpMask )
+		{
+		delete iForgroundDimBmpMask;
+		iForgroundDimBmpMask = NULL;
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::CreateDimmedMaskL
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//	
+void CAknFepCtrlCommonButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask,
+                                                 const CFbsBitmap* aMask
+                                        		 /*TScaleMode aScaleMode*/ )
+	{
+	    if (aMask && aMask->DisplayMode() == EGray256)
+	        {
+	        delete aDimmedMask;
+	        aDimmedMask = NULL;
+
+	        aDimmedMask = new (ELeave) CFbsBitmap;
+
+	        User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); 
+	        CleanupStack::PushL(aDimmedMask);
+
+	        CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask);
+	        CleanupStack::PushL(bitmapDevice);
+
+	        CFbsBitGc* bitGc(NULL);
+	        User::LeaveIfError(bitmapDevice->CreateContext(bitGc));
+	        CleanupStack::PushL(bitGc);
+
+	        bitGc->SetPenStyle(CGraphicsContext::ESolidPen);
+	        bitGc->BitBlt(TPoint(0, 0), aMask);
+
+	        aDimmedMask->LockHeap();
+	        TInt w = aMask->SizeInPixels().iWidth; 
+	        TInt h = aMask->SizeInPixels().iHeight;
+	        TInt dataStride = aMask->DataStride() - w; 
+	        unsigned char* address = (unsigned char *)aDimmedMask->DataAddress();  
+
+	        for ( TInt i = 0; i < h; ++i )
+	            {
+	            for ( TInt j = 0; j < w; ++j )
+	                {
+	                *address = KTransparency[*address];
+	                ++address;
+	                }
+	            address += dataStride;         
+	            }
+
+	        aDimmedMask->UnlockHeap();
+
+	        //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode);
+
+	        CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc
+	        CleanupStack::Pop(1); // aDimmedMask
+	        }
+
+	}
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::HandlePointerDownEventL
+// Handle button down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//   
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlCommonButton::HandlePointerDownEventL(const TPoint& aPt)
+	{
+    if( IsDimmed() )
+    	return NULL;
+    
+    CFepUiBaseCtrl::HandlePointerDownEventL(aPt);
+    iPressed =  ETrue;
+	
+    Draw();
+    UpdateArea(Rect(),EFalse);
+    ReportEvent(EEventButtonDown);
+    return this;
+	}
+	
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::HandlePointerLeave
+// Handle pointer leave event
+// ---------------------------------------------------------------------------
+//           
+EXPORT_C void CAknFepCtrlCommonButton::HandlePointerLeave(const TPoint& aPt)
+    {
+    if( IsDimmed() )
+        return;
+    
+    CFepUiBaseCtrl::HandlePointerLeave(aPt);    
+    iPressed = EFalse; 
+	
+    RootControl()->ReDrawRect( Rect() );
+    UpdateArea(Rect(),EFalse);   
+
+    return ;
+    }
+	
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::HandleButtonUpEventL
+// Handle button up event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlCommonButton::HandlePointerUpEventL(const TPoint& aPt)        
+    {
+    CFepUiBaseCtrl::HandlePointerUpEventL(aPt);    
+    if( IsDimmed() )
+        return NULL;
+	
+    iPressed = EFalse;
+    SetActive(ETrue);
+   	RootControl()->ReDrawRect( Rect() );
+    //Draw();
+    UpdateArea(Rect(),EFalse);    
+    
+    ReportEvent(EEventButtonUp);
+    
+#ifdef RD_TACTILE_FEEDBACK   
+    {
+    UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput, ETrue, EFalse);
+    }
+#endif // RD_TACTILE_FEEDBACK    
+    
+    return this;
+    }
+
+EXPORT_C void CAknFepCtrlCommonButton::HandlePointerEnter(const TPoint& aPt)
+    {
+    if( IsDimmed() )
+        return;
+    
+    CFepUiBaseCtrl::HandlePointerEnter(aPt);    
+    iPressed = ETrue; 
+    Draw();
+    UpdateArea(Rect(),EFalse);   
+
+    return ;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::CancelPointerDownL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CAknFepCtrlCommonButton::CancelPointerDownL()
+    {
+    CFepUiBaseCtrl::CancelPointerDownL();
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlCommonButton::SetForegroundBmpL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void CAknFepCtrlCommonButton::SetForegroundBmpL(CFbsBitmap* aBmp,
+                                                         CFbsBitmap* aMaskBmp)
+    {
+    DeleteForgroundRes();
+    
+    iForgroundBmp = aBmp;
+    iForgroundBmpMask = aMaskBmp;
+
+    ResizeBitmaps(iForgroundBmpRect.Size());
+    }
+
+EXPORT_C void CAknFepCtrlCommonButton::Move(const TPoint& aOffset)
+    {
+    CButtonBase::Move(aOffset);
+    iForgroundBmpRect.Move( aOffset );
+    
+    if ( iColorIcons ) 
+        {
+        iDraw3PiecesInfo.iInnerRect.Move( aOffset );
+        }
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::CAknFepCtrlMultiImageButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiImageButton::CAknFepCtrlMultiImageButton(CFepUiLayout* aUiLayout, 
+                                                                  TInt aControlId,
+                                                                  TAknsItemID aNormalID,
+                                                                  TAknsItemID aPressedID,
+                                                                  TAknsItemID aInactiveID)
+	: CAknFepCtrlCommonButton(aUiLayout, aControlId, aNormalID, aPressedID, aInactiveID)    								
+    {
+    iNormalImgID = aNormalID;
+    iPressedImgID = aPressedID;
+    iInactiveImgID = aInactiveID;       
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::NewL
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiImageButton* CAknFepCtrlMultiImageButton::NewL(CFepUiLayout* aUiLayout, 
+                                                                        TInt aControlId,
+                                                                        TAknsItemID aNormalID,
+                                                                        TAknsItemID aPressedID,
+                                                                        TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlMultiImageButton* self = NewLC(aUiLayout, 
+    									  aControlId,
+    									  aNormalID,
+    									  aPressedID,
+    									  aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::NewLC
+// Two-phased constructor.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiImageButton* CAknFepCtrlMultiImageButton::NewLC(CFepUiLayout* aUiLayout,
+                                                                         TInt aControlId,
+                                                                         TAknsItemID aNormalID,
+                                                                         TAknsItemID aPressedID,
+                                                                         TAknsItemID aInactiveID)
+    {
+    CAknFepCtrlMultiImageButton* self = new (ELeave) CAknFepCtrlMultiImageButton(aUiLayout, 
+    									aControlId,
+    									aNormalID,
+    									aPressedID,
+    									aInactiveID);
+    CleanupStack::PushL(self);
+    self->BaseConstructL();
+
+    return self;
+    }    
+    
+// -----------------------------------------------------------------------------
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlMultiImageButton::~CAknFepCtrlMultiImageButton()
+    {
+    DeleteForgroundRes();
+    delete iText;
+    }
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::ConstructFromResourceL
+// The order of the image ids in the CButtonBase class must not be changed
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiImageButton::ConstructFromResourceL(TResourceReader& aReader)
+    {
+		if (!iFirstTimeConstruct)
+		{
+        DeleteForgroundRes();
+		}
+    
+    TPtrC bmpFileName = aReader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = aReader.ReadInt32();
+    TInt colorGroup = aReader.ReadInt16();    
+    TAknsItemID id;
+	
+    // Get the image ids and mask ids from resource
+    TInt bmpId = aReader.ReadInt16(); 
+    TInt bmpMskId = aReader.ReadInt16();
+    
+    // read skin item id
+    const TInt skinitemid = aReader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+    
+    if (bmpId != KInvalidBmp)
+        {
+    	if (bmpMskId != KInvalidBmp)
+    		{
+    		if( colorGroup == KInvalidColorGroup )
+    			{
+	    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                       id,
+                       iForground1Bmp,
+                       iForground1BmpMask,
+                       bmpFileName,
+                       bmpId,
+                       bmpMskId);	
+    			}
+			else
+				{
+			    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                             id,
+                             KAknsIIDQsnIconColors,
+                             colorGroup,
+                             iForground1Bmp,
+                             iForground1BmpMask,
+                             bmpFileName,
+                             bmpId,
+                             bmpMskId,
+                             AKN_LAF_COLOR( 0 ) );   	
+				}
+
+    		AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved);
+    		AknIconUtils::SetSize(iForground1BmpMask, iForground1BmpRect.Size(), 
+    		                      EAspectRatioNotPreserved);
+    		                       
+    		/*CreateDimmedMaskL( iForground1DimBmpMask, iForground1BmpMask );
+    		AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), 
+    		                      EAspectRatioNotPreserved);*/
+    		}
+    	else
+	        {
+		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+		                           id,
+		                           iForground1Bmp,
+		                           bmpFileName,
+		                           bmpId);
+		    AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved);
+	        }
+        }
+	
+	
+	
+    TAknsItemID id2;
+	
+    // Get the image ids and mask ids from resource
+    TInt bmp2Id = aReader.ReadInt16(); 
+    TInt bmp2MskId = aReader.ReadInt16();
+    
+    // read skin item id
+    const TInt skinitem2id = aReader.ReadInt16();
+    id2.Set(TInt(imgMajorSkinId), skinitem2id);
+    
+    if (bmp2Id != KInvalidBmp)
+        {
+    	if (bmp2MskId != KInvalidBmp)
+    		{
+    		if( colorGroup == KInvalidColorGroup )
+    			{
+	    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                       id2,
+                       iForground2Bmp,
+                       iForground2BmpMask,
+                       bmpFileName,
+                       bmp2Id,
+                       bmp2MskId);	
+    			}
+			else
+				{
+			    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                             id2,
+                             KAknsIIDQsnIconColors,
+                             colorGroup,
+                             iForground2Bmp,
+                             iForground2BmpMask,
+                             bmpFileName,
+                             bmp2Id,
+                             bmp2MskId,
+                             AKN_LAF_COLOR( 0 ) );   	
+				}
+
+    		AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioNotPreserved);
+    		AknIconUtils::SetSize(iForground2BmpMask, iForground2BmpRect.Size(), 
+                              EAspectRatioNotPreserved);
+    		                       
+    		/*CreateDimmedMaskL( iForground2DimBmpMask, iForground2BmpMask );
+    		AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), 
+                              EAspectRatioNotPreserved);*/
+    		}
+    	else
+	        {
+		    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+		                           id2,
+		                           iForground2Bmp,
+		                           bmpFileName,
+		                           bmp2Id);
+		    AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioNotPreserved);
+	        }
+        }	
+	
+    if (!iFirstTimeConstruct)
+    	{
+    	Draw();
+    	}
+    
+    iFirstTimeConstruct = EFalse;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::ConstructFromResourceL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiImageButton::ConstructFromResourceL()
+	{
+	if (iResourceId == KInvalidResId)
+		{
+        User::Leave(KErrArgument);
+		}
+	
+	if (!iFirstTimeConstruct)
+		{
+		// need to remove original bmp and maskbmp
+        DeleteForgroundRes();
+		}
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId);
+
+    TPtrC bmpFileName = reader.ReadTPtrC();    // Read the file name of the bmps
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TInt colorGroup = reader.ReadInt16();
+    TAknsItemID id;
+	
+	// Get the image ids and mask ids from resource
+    TInt bmpId = reader.ReadInt16(); 
+    TInt bmpMskId = reader.ReadInt16();
+    
+    // Read skin item id
+    const TInt skinitemid = reader.ReadInt16();
+    id.Set(TInt(imgMajorSkinId), skinitemid);
+
+    if (bmpId != KInvalidBmp)
+    {
+	if (bmpMskId != KInvalidBmp)
+		{
+		if( colorGroup == KInvalidColorGroup )
+			{
+    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                   id,
+                   iForground1Bmp,
+                   iForground1BmpMask,
+                   bmpFileName,
+                   bmpId,
+                   bmpMskId);	
+			}
+		else
+			{
+		    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                         id,
+                         KAknsIIDQsnIconColors,
+                         colorGroup,
+                         iForground1Bmp,
+                         iForground1BmpMask,
+                         bmpFileName,
+                         bmpId,
+                         bmpMskId,
+                         AKN_LAF_COLOR( 0 ) );   	
+			}
+
+    AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved);
+    AknIconUtils::SetSize(iForground1BmpMask, iForground1BmpRect.Size(), EAspectRatioNotPreserved);
+
+		/*CreateDimmedMaskL( iForground1DimBmpMask, 
+    					   iForground1BmpMask );   
+ 		AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), EAspectRatioNotPreserved);*/
+		}
+    else
+        {
+	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+	                           id,
+	                           iForground1Bmp,
+	                           bmpFileName,
+	                           bmpId);
+	    AknIconUtils::SetSize(iForground1Bmp, iForground1BmpRect.Size(), EAspectRatioNotPreserved);
+        }
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+    TAknsItemID id2;
+	
+	// Get the image ids and mask ids from resource
+    TInt bmp2Id = reader.ReadInt16(); 
+    TInt bmp2MskId = reader.ReadInt16();
+    
+    // Read skin item id
+    const TInt skinitem2id = reader.ReadInt16();
+    id2.Set(TInt(imgMajorSkinId), skinitem2id);
+
+    if (bmp2Id != KInvalidBmp)
+    {
+	if (bmp2MskId != KInvalidBmp)
+		{
+		if( colorGroup == KInvalidColorGroup )
+			{
+    		AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+                   id2,
+                   iForground2Bmp,
+                   iForground2BmpMask,
+                   bmpFileName,
+                   bmp2Id,
+                   bmp2MskId);	
+			}
+		else
+			{
+		    AknsUtils::CreateColorIconL( UiLayout()->SkinInstance(),
+                         id,
+                         KAknsIIDQsnIconColors,
+                         colorGroup,
+                         iForground2Bmp,
+                         iForground2BmpMask,
+                         bmpFileName,
+                         bmp2Id,
+                         bmp2MskId,
+                         AKN_LAF_COLOR( 0 ) );   	
+			}
+
+		AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioPreserved);
+		AknIconUtils::SetSize(iForground2BmpMask, iForground2BmpRect.Size(), EAspectRatioPreserved);
+
+		/*CreateDimmedMaskL( iForground2DimBmpMask, iForground2BmpMask );   
+ 		AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), 
+                          EAspectRatioNotPreserved);*/
+		}
+    else
+        {
+	    AknsUtils::CreateIconL(UiLayout()->SkinInstance(),
+	                           id,
+	                           iForground2Bmp,
+	                           bmpFileName,
+	                           bmp2Id);
+	    AknIconUtils::SetSize(iForground2Bmp, iForground2BmpRect.Size(), EAspectRatioPreserved);
+        }
+    }
+
+
+
+
+
+
+    CleanupStack::PopAndDestroy(); // reader
+    
+    if (!iFirstTimeConstruct)
+    	{
+        //ResizeBitmaps(iForgroundBmpRect.Size());
+    	Draw();
+    	}
+
+    iFirstTimeConstruct = EFalse;    	
+	}
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::Draw
+// Draws UI
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiImageButton::Draw()
+    {
+	if(!AbleToDraw())
+        return;
+    
+    CFbsBitGc* gc = static_cast<CFbsBitGc*>(BitGc());
+    
+    //mask bitmaps
+  	DrawOpaqueMaskBackground();  
+    TRect rect = Rect();        
+    TRect innerRect = rect;
+    innerRect.Shrink( 10, 10 );
+    
+    // ----- draw bitmaps -----
+    gc->Activate( BitmapDevice() );     
+   // gc->SetClippingRegion( &ValidClipRegion() );           
+    //gc->Clear(rect);
+    	
+		CFbsBitmap* bmpMask1 = NULL;
+		CFbsBitmap* bmpMask2 = NULL;
+	
+		// Draw background    
+		if( IsDimmed() ) // Dimmed state
+    	{
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+		                         *gc, 
+		                         rect, 
+		                         innerRect,
+		                         iInactiveImgID,
+		                         KAknsIIDDefault );
+        if( iForground1DimBmpMask )
+    		{
+    		delete iForground1DimBmpMask;
+    		iForground1DimBmpMask = NULL;
+    		}		                         
+        TRAP_IGNORE(CreateDimmedMaskL( iForground1DimBmpMask, 
+    					   iForground1BmpMask ));
+		AknIconUtils::SetSize(iForground1DimBmpMask, iForground1BmpRect.Size(), 
+                              EAspectRatioNotPreserved);		                         
+		bmpMask1 = iForground1DimBmpMask;
+		
+		if( iForground2DimBmpMask )
+    		{
+    		delete iForground2DimBmpMask;
+    		iForground2DimBmpMask = NULL;
+    		}		                         
+		TRAP_IGNORE(CreateDimmedMaskL( iForground2DimBmpMask, 
+    					   iForground2BmpMask ));
+		AknIconUtils::SetSize(iForground2DimBmpMask, iForground2BmpRect.Size(), 
+                              EAspectRatioNotPreserved);
+		bmpMask2 = iForground2DimBmpMask;  
+    	}
+    else
+    	{
+		// Normal state or pressed state
+		TAknsItemID ImgID;
+		if (iHighlight)
+			{
+			ImgID = iPressedImgID;
+			}
+		else 
+			{
+			ImgID = /*iPressed*/PointerDown()? iPressedImgID : iNormalImgID;
+			}
+		
+		AknsDrawUtils::DrawFrame( UiLayout()->SkinInstance(), 
+	                     *gc, 
+	                     rect, 
+	                     innerRect,
+	                     ImgID,
+	                     KAknsIIDDefault ); 
+	    bmpMask1 = iForground1BmpMask;
+	    bmpMask2 = iForground2BmpMask;
+    	}
+    
+    // Draw forground
+		if( iForground1Bmp && iForground2Bmp)
+		{
+		TRect srcRect( TPoint( 0, 0 ), iForground1Bmp->SizeInPixels() );
+		if( bmpMask1 )
+			{
+			gc->BitBltMasked( iForground1BmpRect.iTl, 
+							  iForground1Bmp, 
+							  srcRect,
+							  bmpMask1,
+							  EFalse);
+			}
+		else
+			{
+			gc->BitBlt( iForground1BmpRect.iTl,
+						iForground1Bmp,
+						srcRect );	
+			}
+			
+		TRect src2Rect( TPoint( 0, 0 ), iForground2Bmp->SizeInPixels() );	
+		if( bmpMask2 )
+			{
+			gc->BitBltMasked( rect.iTl, // layout of 2nd foreground is determined by image itself, but not hard code.   
+							  iForground2Bmp, 
+							  src2Rect,
+							  bmpMask2,
+							  EFalse);
+			}
+		else
+			{
+			gc->BitBlt( rect.iTl, 
+						iForground2Bmp,
+						src2Rect );	
+			}		
+		}
+	
+    if (iText)
+        {
+        TAknLayoutText textLayout;
+        textLayout.LayoutText(Rect(), iTextFormat);
+        textLayout.DrawText(*gc, *iText);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::ResizeBitmaps
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlMultiImageButton::ResizeBitmaps(TSize aInnerSize)
+    {
+    if( iForground1Bmp && ( iForground1Bmp->SizeInPixels() != aInnerSize ) )
+    	{
+    	AknIconUtils::SetSize( iForground1Bmp, aInnerSize, EAspectRatioNotPreserved );
+    	}
+    if( iForground1BmpMask && ( iForground1BmpMask->SizeInPixels() != aInnerSize ) )
+    	{
+    	AknIconUtils::SetSize( iForground1BmpMask, aInnerSize, EAspectRatioNotPreserved );
+    	}    
+    	
+    //TRAP_IGNORE(CreateDimmedMaskL(iForground1DimBmpMask, iForground1BmpMask));
+    				  
+    				  
+    				  
+    				  
+    if( iForground2Bmp && ( iForground2Bmp->SizeInPixels() != Rect().Size() ) )
+    	{
+    	AknIconUtils::SetSize( iForground2Bmp, Rect().Size(), EAspectRatioNotPreserved );
+    	}
+    if( iForground2BmpMask && ( iForground2BmpMask->SizeInPixels() != Rect().Size() ) )
+    	{
+    	AknIconUtils::SetSize( iForground2BmpMask, Rect().Size(), EAspectRatioNotPreserved );
+    	}    
+    	
+    //TRAP_IGNORE(CreateDimmedMaskL(iForground2DimBmpMask, iForground2BmpMask));    				  
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::SizeChanged
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlMultiImageButton::SizeChanged(TRect aNewRect, 
+												   TRect aInnerRect, 
+												   TBool aIsReloadImages)
+    {
+    if (aNewRect.Size().iWidth == 0 || aNewRect.Size().iHeight == 0)
+        {
+   	    return;
+        }
+    
+    TRect oriRect = Rect();
+    SetRect(aNewRect);
+    iForground1BmpRect = aInnerRect;
+    iForground2BmpRect = aInnerRect;
+	
+    if (aIsReloadImages)
+        {
+        ResizeBitmaps(aInnerRect.Size() );	
+        }
+    RootControl()->ReDrawRect( oriRect );
+    UpdateArea(oriRect, EFalse);
+    Draw();
+    UpdateArea(Rect(), EFalse);
+    }
+    
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::DeleteForgroundRes
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CAknFepCtrlMultiImageButton::DeleteForgroundRes()
+	{
+    if( iForground1Bmp )
+		{
+		delete iForground1Bmp;
+		iForground1Bmp = NULL;
+		}
+	if( iForground1BmpMask )
+		{
+		delete iForground1BmpMask;
+		iForground1BmpMask = NULL;
+		}
+	if( iForground1DimBmpMask )
+		{
+		delete iForground1DimBmpMask;
+		iForground1DimBmpMask = NULL;
+		}
+	
+	
+    if( iForground2Bmp )
+		{
+		delete iForground2Bmp;
+		iForground2Bmp = NULL;
+		}
+	if( iForground2BmpMask )
+		{
+		delete iForground2BmpMask;
+		iForground2BmpMask = NULL;
+		}
+	if( iForground2DimBmpMask )
+		{
+		delete iForground2DimBmpMask;
+		iForground2DimBmpMask = NULL;
+		}	
+
+	}
+	
+// ---------------------------------------------------------------------------
+// CAknFepCtrlMultiImageButton::CreateDimmedMaskL
+// This methods shall be called by the container's SizeChanged handler
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//	
+void CAknFepCtrlMultiImageButton::CreateDimmedMaskL( CFbsBitmap*& aDimmedMask,
+                                        		 const CFbsBitmap* aMask
+                                        		 /*TScaleMode aScaleMode*/ )
+	{
+	    if (aMask && aMask->DisplayMode() == EGray256)
+	        {
+	        delete aDimmedMask;
+	        aDimmedMask = NULL;
+
+	        aDimmedMask = new (ELeave) CFbsBitmap;
+
+	        User::LeaveIfError(aDimmedMask->Create(aMask->SizeInPixels(), EGray256)); 
+	        CleanupStack::PushL(aDimmedMask);
+
+	        CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDimmedMask);
+	        CleanupStack::PushL(bitmapDevice);
+
+	        CFbsBitGc* bitGc(NULL);
+	        User::LeaveIfError(bitmapDevice->CreateContext(bitGc));
+	        CleanupStack::PushL(bitGc);
+
+	        bitGc->SetPenStyle(CGraphicsContext::ESolidPen);
+	        bitGc->BitBlt(TPoint(0, 0), aMask);
+
+	        aDimmedMask->LockHeap();
+	        TInt w = aMask->SizeInPixels().iWidth; 
+	        TInt h = aMask->SizeInPixels().iHeight;
+	        TInt dataStride = aMask->DataStride() - w; 
+	        unsigned char* address = (unsigned char *)aDimmedMask->DataAddress();  
+
+	        for ( TInt i = 0; i < h; ++i )
+	            {
+	            for ( TInt j = 0; j < w; ++j )
+	                {
+	                *address = KTransparency[*address];
+	                ++address;
+	                }
+	            address += dataStride;         
+	            }
+
+	        aDimmedMask->UnlockHeap();
+
+	        //AknIconUtils::SetSize(aDimmedMask, aMask->SizeInPixels(), aScaleMode);
+
+	        CleanupStack::PopAndDestroy(2); // bitmapDevice, bitGc
+	        CleanupStack::Pop(1); // aDimmedMask
+	        }
+
+	}
+
+EXPORT_C void CAknFepCtrlMultiImageButton::Move(const TPoint& aOffset)
+    {
+    CButtonBase::Move(aOffset);
+    iForground1BmpRect.Move( aOffset );
+    iForground2BmpRect.Move( aOffset );
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlLongPressButton* CAknFepCtrlLongPressButton::NewLC(CFepUiLayout* aUiLayout, 
+                                                                 TInt aCtrlId,
+                                                                 TInt aEvent,
+                                                                 TInt aUnicode,
+                                                                 TAknsItemID aNormalID,
+                                                                 TAknsItemID aPressedID,
+                                                                 TAknsItemID aInactiveID)
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::NewLC(), aCtrlId = %d\n"), aCtrlId));
+    CAknFepCtrlLongPressButton *self = new(ELeave) CAknFepCtrlLongPressButton(aUiLayout, 
+                                                                        aCtrlId, 
+                                                                        aEvent, 
+                                                                        aUnicode,
+                                                                        aNormalID,
+                                                                        aPressedID,
+                                                                        aInactiveID);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlLongPressButton* CAknFepCtrlLongPressButton::NewL(CFepUiLayout* aUiLayout, 
+                                                                TInt aCtrlId,
+                                                                TInt aEvent,
+                                                                TInt aUnicode,
+                                                                TAknsItemID aNormalID,
+                                                                TAknsItemID aPressedID,
+                                                                TAknsItemID aInactiveID)
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::NewL(), aCtrlId = %d\n"), aCtrlId));
+    CAknFepCtrlLongPressButton *self = NewLC(aUiLayout, aCtrlId, aEvent, aUnicode,
+                                          aNormalID, aPressedID, aInactiveID);
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+        
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlLongPressButton::~CAknFepCtrlLongPressButton()
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::~CAknFepCtrlLongPressButton()\n")));
+    CancelTimer();
+
+    delete iLongPressTimer;
+    }
+    
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CAknFepCtrlLongPressButton::CAknFepCtrlLongPressButton(CFepUiLayout* aUiLayout, 
+                                                          TInt aCtrlId,
+                                                          TInt aEvent,
+                                                          TInt aUnicode,
+                                                          TAknsItemID aNormalID,
+                                                          TAknsItemID aPressedID,
+                                                          TAknsItemID aInactiveID)
+    :CAknFepCtrlEventButton(aUiLayout, aCtrlId, aEvent, aUnicode,
+                                                        aNormalID,
+                                                        aPressedID,
+                                                        aInactiveID)
+    {
+    iLongPressInterval = KLongPressInterval;
+    }
+
+// ---------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlLongPressButton::ConstructL()
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::ConstructL()\n")));
+    BaseConstructL();
+    iIsLongPress = EFalse;
+    iLongPressTimer = CAknFepTimer::NewL(this);
+    }
+    
+// ---------------------------------------------------------
+// Time out event handler of long press timer
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlLongPressButton::HandleTimerOut(const CAknFepTimer* aTimer)
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::HandleTimerOut()--")));
+    if (aTimer == iLongPressTimer)
+        {
+        iIsLongPress = ETrue;
+        CancelTimer();
+        TInt unicode = Unicode();
+        TPtrC ptr = (TUint16*)(&unicode);
+        ReportEvent(EPeninputLayoutEventMultiRangeLongPress, ptr);
+        }
+    }
+
+// ---------------------------------------------------------
+// Handle button down start long press timer 
+// ---------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlLongPressButton::HandlePointerDownEventL(const TPoint& aPt)
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::HandleButtonDown()\n")));
+    //PRINTF((_L("Set long press Timer\n")));
+    if ( IsDimmed() )
+        {
+        return NULL;
+        }
+    
+    iLongPressTimer->SetTimer(iLongPressInterval);
+    iIsLongPress = EFalse;
+
+    return CAknFepCtrlCommonButton::HandlePointerDownEventL(aPt);
+    }
+                                                          
+// ---------------------------------------------------------
+// Handle button up cancel timer
+// ---------------------------------------------------------
+//
+EXPORT_C CFepUiBaseCtrl* CAknFepCtrlLongPressButton::HandlePointerUpEventL(const TPoint& aPt)
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::HandleButtonUp()\n")));
+
+    if ( IsDimmed() )
+        {
+        return NULL;
+        }
+
+    CancelTimer();
+    
+    if (!iIsLongPress)
+        {
+        TInt unicode = Unicode();
+        TPtrC ptr = (TUint16*)(&unicode);
+        ReportEvent(EPeninputLayoutEventMultiRange, ptr);   
+        }
+
+    iIsLongPress = EFalse;
+    
+    
+    return CAknFepCtrlCommonButton::HandlePointerUpEventL(aPt);
+    }
+
+// ---------------------------------------------------------
+// Handle pointer leave event cancel timer 
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlLongPressButton::HandlePointerLeave(const TPoint& aPoint)
+    {
+    CAknFepCtrlCommonButton::HandlePointerLeave(aPoint);
+
+    CancelTimer();
+    }
+
+// ---------------------------------------------------------------------------
+// CAknFepCtrlLongPressButton::CancelPointerDownL
+// Cancel pointer down event
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CAknFepCtrlLongPressButton::CancelPointerDownL()
+    {
+    // No implementation needed
+	CAknFepCtrlCommonButton::CancelPointerDownL();
+    }
+
+// ---------------------------------------------------------
+// Cancel timer
+// ---------------------------------------------------------
+//
+EXPORT_C void CAknFepCtrlLongPressButton::CancelTimer()
+    {
+    //PRINTF((_L("CAknFepCtrlLongPressButton::CancelTimer()\n")));
+    iLongPressTimer->Cancel();
+    }
+//  End Of File