uifw/EikStd/coctlsrc/EIKCMBUT.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/EIKCMBUT.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1506 @@
+/*
+* Copyright (c) 1997-1999 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <eikcmbut.h>
+#include <barsread.h>
+#include <gulbordr.h>
+#include <eikenv.h>
+#include <eiklabel.h>
+#include <eikimage.h>
+#include <eikpanic.h>
+#include <LAFCMBUT.H>
+
+#include "gulcolor.h"
+#include <AknIconUtils.h>
+
+const TInt KLayoutMask				=0x0007;
+const TInt KLayoutAndFontMask		=0x000f;
+const TInt KExcessMask				=0x00f0;
+const TInt KDisplayContentMask		=0x0f00;
+
+//
+// class CEikCommandStack
+//
+
+NONSHARABLE_CLASS(CEikCommandStack) : public CBase
+	{
+public:
+	class TStackableCommand
+		{
+	public:
+		TStackableCommand();
+		TStackableCommand(TInt aCommandId,HBufC* aText,CFbsBitmap* aBitmap,CFbsBitmap* aMask);
+	public:
+		void SetBitmapOwner(TBool aOwner);
+		void SetDimmed(TBool aDimmed);
+		void SetVisible(TBool aVisible);
+		inline TBool IsBitmapOwner() const;
+		inline TBool IsDimmed() const;
+		inline TBool IsVisible() const;
+	public:
+		TInt iCommandId;
+		HBufC* iText;
+		CFbsBitmap* iBitmap;
+		CFbsBitmap* iMask;
+	private:
+		enum TFlags
+			{
+			EBitmapOwner	=0x04,
+			EDimmed			=0x08,
+			EInvisible		=0x10,
+			};
+	private:
+		TInt iFlags;
+		};
+public:
+	static CEikCommandStack* NewL();
+	~CEikCommandStack();
+public:
+	void AddL(TInt aCommandId,const TDesC* aText,CFbsBitmap* aBitmap,CFbsBitmap* aMask);
+	TBool Remove(TInt aCommandId);
+	TStackableCommand Pop();
+	TInt Level() const;
+	TStackableCommand& StackableCommand(TInt aCommandId) const;
+	TStackableCommand& StackableCommandByPos(TInt aPos) const;
+private:
+	TInt Find(TInt aCommandId) const;
+	void Delete(TInt aIndex);
+private:
+	CArrayFix<TStackableCommand>* iCommands;
+	};
+
+CEikCommandStack::TStackableCommand::TStackableCommand()
+	: iCommandId(0), iText(NULL), iBitmap(NULL), iMask(NULL), iFlags(0)
+	{}
+
+CEikCommandStack::TStackableCommand::TStackableCommand(TInt aCommandId,HBufC* aText,
+													   CFbsBitmap* aBitmap,CFbsBitmap* aMask)
+	: iCommandId(aCommandId), iText(aText), iBitmap(aBitmap), iMask(aMask), iFlags(0)
+	{}
+
+void CEikCommandStack::TStackableCommand::SetBitmapOwner(TBool aOwner)
+	{
+	if (aOwner)
+		iFlags|=EBitmapOwner;
+	else
+		iFlags&=~EBitmapOwner;
+	}
+
+void CEikCommandStack::TStackableCommand::SetDimmed(TBool aDimmed)
+	{
+	if (aDimmed)
+		iFlags|=EDimmed;
+	else
+		iFlags&=~EDimmed;
+	}
+
+void CEikCommandStack::TStackableCommand::SetVisible(TBool aVisible)
+	{
+	if (!aVisible)
+		iFlags|=EInvisible;
+	else
+		iFlags&=~EInvisible;
+	}
+
+inline TBool CEikCommandStack::TStackableCommand::IsBitmapOwner() const
+	{return iFlags&EBitmapOwner;}
+inline TBool CEikCommandStack::TStackableCommand::IsDimmed() const
+	{return iFlags&EDimmed;}
+inline TBool CEikCommandStack::TStackableCommand::IsVisible() const
+	{return !(iFlags&EInvisible);}
+
+
+CEikCommandStack* CEikCommandStack::NewL()
+	{ // static
+	CEikCommandStack* self=new(ELeave) CEikCommandStack;
+	return self;
+	}
+
+CEikCommandStack::~CEikCommandStack()
+	{
+	if (iCommands)
+		{
+		for (TInt ii=iCommands->Count()-1;ii>=0;ii--)
+			{
+			Delete(ii);
+			}
+		}
+	}
+
+void CEikCommandStack::AddL(TInt aCommandId,const TDesC* aText,CFbsBitmap* aBitmap,CFbsBitmap* aMask)
+	{
+	CArrayFix<TStackableCommand>* commands=NULL;
+	if (iCommands)
+		{
+		commands=iCommands;
+		}
+	else
+		{
+		commands=new(ELeave) CArrayFixFlat<TStackableCommand>(1);
+		CleanupStack::PushL(commands);
+		}
+	HBufC* text=NULL;
+	if (aText)
+		text=aText->AllocLC();
+	TStackableCommand cmd(aCommandId,text,aBitmap,aMask);
+	commands->AppendL(cmd);
+	if (aText)
+		CleanupStack::Pop(); // text
+	if (!iCommands)
+		{
+		iCommands=commands;
+		CleanupStack::Pop(); // commands
+		}
+	}
+
+TBool CEikCommandStack::Remove(TInt aCommandId)
+	{
+	TBool removed=EFalse;
+	if (iCommands)
+		{
+		const TInt index=Find(aCommandId);
+		if (index!=KErrNotFound)
+			{
+			Delete(index);
+			removed=ETrue;
+			}
+		}
+	return removed;
+	}
+
+TInt CEikCommandStack::Level() const
+	{
+	return (iCommands? iCommands->Count() : 0);
+	}
+
+CEikCommandStack::TStackableCommand& CEikCommandStack::StackableCommand(TInt aCommandId) const
+	{
+	// __ASSERT_ALWAYS(iCommands,..........
+	// search backwards through the array in case there are two commands with the same id
+	TInt loop=iCommands->Count();
+	TInt index=KErrNotFound;
+	while (--loop>=0)
+		{
+		if ((*iCommands)[loop].iCommandId==aCommandId)
+			{
+			index=loop;
+			break;
+			}
+		}
+	// __ASSERT_ALWAYS(index!=KErrNotFound...
+	return (*iCommands)[index];
+	}
+
+CEikCommandStack::TStackableCommand& CEikCommandStack::StackableCommandByPos(TInt aPos) const
+	{
+	// __ASSERT_ALWAYS(iCommands,..........
+	// __ASSERT_ALWAYS(aPos>=0 && aPos<iCommands->Count(),...
+	return (*iCommands)[aPos];
+	}
+
+TInt CEikCommandStack::Find(TInt aCommandId) const
+	{
+	// __ASSERT_DEBUG(iCommands...
+	const TInt count=iCommands->Count();
+	for (TInt ii=0;ii<count;ii++)
+		{
+		TInt command=(*iCommands)[ii].iCommandId;
+		if (command==aCommandId)
+			return ii;
+		}
+	return KErrNotFound;
+	}
+
+CEikCommandStack::TStackableCommand CEikCommandStack::Pop()
+	// Relinquishes ownership of text and bitmap resources.
+	{
+	ASSERT(iCommands);
+	ASSERT(iCommands->Count());
+
+	TInt top=iCommands->Count()-1;
+	TStackableCommand poppedCommand=(*iCommands)[top];
+	iCommands->Delete(top);
+	if (iCommands->Count()==0)
+		{
+		delete iCommands;
+		iCommands=NULL;
+		}
+
+	return poppedCommand;
+	}
+
+void CEikCommandStack::Delete(TInt aIndex)
+	{
+	ASSERT(iCommands);
+	
+	TStackableCommand cmd=(*iCommands)[aIndex];
+	delete cmd.iText;
+	if (cmd.IsBitmapOwner())
+		{
+		delete cmd.iBitmap;
+		delete cmd.iMask;
+		}
+	iCommands->Delete(aIndex);
+	if (iCommands->Count()==0)
+		{
+		delete iCommands;
+		iCommands=NULL;
+		}
+	}
+
+//
+// class CEikCommandButtonBase
+//
+
+EXPORT_C CEikCommandButtonBase::~CEikCommandButtonBase()
+	{
+	delete iComponents[0];
+	delete iComponents[1];
+	delete iCommandStack;
+	}
+
+EXPORT_C CEikCommandButtonBase::CEikCommandButtonBase()
+	{
+	__DECLARE_NAME(_S("CEikCommandButton"));
+	LafCommandButtonBase::GetDefaultBorder(iBorder);
+    iContext = this;
+	SetBehavior(EEikButtonStaysClear);
+	SetDisplayContent(EBoth); // default if button contains both
+	SetExcessSpace(EShare); // default if button contains both
+	SetButtonLayout(EFirstRightSecondLeft); // default if button contains both
+	SetNonFocusing();
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetTextL(const TDesC& aText,CEikAlignedControl*& aComponent)
+	{
+	if (aComponent==NULL)
+		{
+		CEikLabel* label=new(ELeave) CEikLabel;
+		CleanupStack::PushL(label);
+		label->SetContainerWindowL(*this);
+		CleanupStack::Pop(); // label
+		label->SetFont(iCmdFlags&EDenseFont? iEikonEnv->DenseFont() : iEikonEnv->LegendFont());
+		label->SetAllMarginsTo(LafCommandButtonBase::LabelMargin());
+		aComponent=label;
+		}
+	STATIC_CAST(CEikLabel*,aComponent)->SetTextL(aText);
+	}
+
+
+EXPORT_C void CEikCommandButtonBase::SetPictureL(const CFbsBitmap* aMain,const CFbsBitmap* aMask,CEikAlignedControl*& aComponent)
+	{
+	if (aMain)
+		{
+		CEikImage* image=new(ELeave) CEikImage;
+		CleanupStack::PushL(image);
+		image->SetContainerWindowL(*this);
+		image->SetPicture(aMain,aMask);
+		SetImageAttributes(image);
+		if (IsReadyToDraw())
+			image->ActivateL(); // won't leave
+		if (aComponent)
+			{
+			const TRect rect(aComponent->Rect());
+			if (rect.Width())
+				image->SetRect(rect);
+			delete aComponent;
+			}
+		CleanupStack::Pop(); // image
+		aComponent=image;
+		}
+	else if (aComponent)
+		{
+		delete aComponent;
+		aComponent=NULL;
+		SetNewComponentExtentL();
+		}
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetPictureFromFileL(const TDesC& aFilename,TInt aMain,TInt aMask,CEikAlignedControl*& aComponent)
+	{
+	CEikImage* image=new(ELeave) CEikImage;
+	CleanupStack::PushL(image);
+	image->SetContainerWindowL(*this);
+	image->CreatePictureFromFileL(aFilename,aMain,aMask);
+	SetImageAttributes(image);
+	if (IsReadyToDraw())
+		image->ActivateL(); // won't leave
+	if (aComponent)
+		{
+		const TRect rect(aComponent->Rect());
+		if (rect.Width())
+			image->SetRect(rect); // won't leave
+		delete aComponent;
+		}
+	CleanupStack::Pop(); // image
+	aComponent=image;
+	}
+
+EXPORT_C void CEikCommandButtonBase::StartConstructFromResourceL(TResourceReader& aReader)
+	{
+	if (!iCommandStack)
+		{
+		iCommandStack=CEikCommandStack::NewL();
+		}
+
+	aReader.ReadInt8();
+	const TInt behavior=aReader.ReadInt16();
+	SetBehavior(STATIC_CAST(TButtonBehavior,behavior));
+	if(behavior==EEikButtonStaysClear)
+		{
+		SetState(EClear);
+		}
+	else if(behavior==EEikButtonStaysSet)
+		{
+		SetState(ESet);
+		}
+	const TInt layout=aReader.ReadInt16();
+	SetButtonLayout(STATIC_CAST(TLayout,(layout&KLayoutAndFontMask)));
+	SetExcessSpace(STATIC_CAST(TExcess,(layout&KExcessMask)));
+	aReader.ReadTPtrC();  // bubble help text 
+	aReader.ReadInt32(); // extension link
+	}
+
+EXPORT_C void CEikCommandButtonBase::ConstructLabelFromResourceL(TResourceReader& aReader,TWhichComponent aWhich)
+	{
+	if (!iCommandStack)
+		{
+		iCommandStack=CEikCommandStack::NewL();
+		}
+
+	TPtrC text=aReader.ReadTPtrC();
+	if (text.Length())
+		{
+		SetTextL(text,((CEikAlignedControl*&)(aWhich==EFirst? iComponents[0] : iComponents[1])));
+		CEikLabel* label=STATIC_CAST(CEikLabel*,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+		label->SetAllMarginsTo(LafCommandButtonBase::LabelMargin());
+		label->SetContainerWindowL(*this);
+		}
+	}
+
+EXPORT_C void CEikCommandButtonBase::ConstructImageFromResourceL(TResourceReader& aReader,TWhichComponent aWhich)
+	{
+	if (!iCommandStack)
+		{
+		iCommandStack=CEikCommandStack::NewL();
+		}
+
+	TPtrC bitmapFile=aReader.ReadTPtrC();
+
+	const TInt bitmapId=aReader.ReadInt16();
+	const TInt bitmapMask=aReader.ReadInt16();
+
+	if (bitmapId!=-1)
+		SetPictureFromFileL(bitmapFile,bitmapId,bitmapMask,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+TInt CEikCommandButtonBase::ButFlags() const	
+	{
+	return iCmdFlags;
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetDefault(TBool aDefaultButton)
+	{
+	iDefault = aDefaultButton;
+	}
+
+TBool CEikCommandButtonBase::IsDefault() const
+	{
+	return iDefault;
+	}
+
+
+EXPORT_C TSize CEikCommandButtonBase::MinimumSize()
+	{
+	TSize size;
+	const TSize comp1Size=(iComponents[0] ? iComponents[0]->MinimumSize() : size);
+	const TSize comp2Size=(iComponents[1] ? iComponents[1]->MinimumSize() : size);
+	size=TSize(iMargins.iLeft + iMargins.iRight,iMargins.iTop + iMargins.iBottom);
+    size+=iBorder.SizeDelta();
+	if (iComponents[1]==NULL || ((iCmdFlags&KDisplayContentMask)==EFirstOnly))
+		size+=comp1Size;
+	else if (iComponents[0]==NULL || ((iCmdFlags&KDisplayContentMask)==ESecondOnly))
+		size+=comp2Size;
+	else if (LayoutIsVertical())
+		{
+		size.iHeight+=comp1Size.iHeight+comp2Size.iHeight+LafCommandButtonBase::IntraComponentMargin();
+		size.iWidth+=Max(comp1Size.iWidth,comp2Size.iWidth);
+		}
+	else
+		{
+		size.iWidth+=comp1Size.iWidth+comp2Size.iWidth+LafCommandButtonBase::IntraComponentMargin();
+		size.iHeight+=Max(comp1Size.iHeight,comp2Size.iHeight);
+		}
+	return size;
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetDimmed(TBool aDimmed)
+	{
+	CCoeControl::SetDimmed(aDimmed);
+	if (iComponents[0])
+		iComponents[0]->SetDimmed(aDimmed);
+	if (iComponents[1])
+		iComponents[1]->SetDimmed(aDimmed);
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetContainerWindowL(const CCoeControl& aContainer)
+	{
+	CCoeControl::SetContainerWindowL(aContainer);
+	if (iComponents[0])
+		iComponents[0]->SetContainerWindowL(aContainer);
+	if (iComponents[1])
+		iComponents[1]->SetContainerWindowL(aContainer);
+	}
+
+CEikCommandStack* CEikCommandButtonBase::CommandStack() const
+	{
+	return iCommandStack;
+	}
+
+
+EXPORT_C void CEikCommandButtonBase::ActivateL()
+	{
+	iContext=this;
+	if (iComponents[0])
+		iComponents[0]->CopyControlContextFrom(this);
+	if (iComponents[1])
+		iComponents[1]->CopyControlContextFrom(this);
+	LafCommandButtonBase::GetBorder(iBorder, DrawState(), iButFlags,*this,IsDefault());
+	UpdateComponentAlignment();
+	CCoeControl::ActivateL();
+	}
+
+EXPORT_C void CEikCommandButtonBase::UpdateComponentAlignment()
+	{
+	const TInt layout=iCmdFlags&KLayoutAndFontMask;
+	if (layout==EFirstBottomSecondTop || layout==EFirstTopSecondBottom)
+		{
+		if (iComponents[0])
+			iComponents[0]->SetAlignment(EHCenterVCenter);
+		if (iComponents[1])
+			iComponents[1]->SetAlignment(EHCenterVCenter);
+		}
+	else
+		{
+		if (iComponents[0])
+			{
+			if (iComponents[1])
+				{
+				iComponents[0]->SetAlignment(layout==EFirstLeftSecondRight? EHLeftVCenter : EHRightVCenter);
+				iComponents[1]->SetAlignment(layout==EFirstLeftSecondRight? EHRightVCenter : EHLeftVCenter);
+				}
+			else
+				iComponents[0]->SetAlignment(EHCenterVCenter);
+			}
+		else
+			iComponents[1]->SetAlignment(EHCenterVCenter);
+		}
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetButtonLayout(TLayout aLayout)
+	{
+    iCmdFlags &= (~KLayoutAndFontMask);
+	iCmdFlags |= aLayout;
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetExcessSpace(TExcess aExcess)
+	{
+	iCmdFlags&=~KExcessMask;
+	iCmdFlags|=aExcess;
+	}
+
+EXPORT_C void CEikCommandButtonBase::SetDisplayContent(TDisplayContent aContent)
+	{
+	iCmdFlags &= (~KDisplayContentMask);
+	iCmdFlags |= aContent;
+	}
+
+EXPORT_C TInt CEikCommandButtonBase::CountComponentControls() const
+	{
+	__ASSERT_DEBUG((iComponents[0]||iComponents[1]),Panic(EEikPanicButtonHasNoComponent));
+	if (iComponents[0] && iComponents[1] && ((iCmdFlags&KDisplayContentMask)==EBoth))
+		return 2;
+	return 1;
+	}
+
+EXPORT_C CCoeControl* CEikCommandButtonBase::ComponentControl(TInt aIndex) const
+	{
+	__ASSERT_DEBUG((iComponents[0]||iComponents[1]),Panic(EEikPanicButtonHasNoComponent));
+	if (iComponents[1]==NULL || ((iCmdFlags&KDisplayContentMask)==EFirstOnly))
+		return iComponents[0];
+	if (iComponents[0]==NULL || ((iCmdFlags&KDisplayContentMask)==ESecondOnly))
+		return iComponents[1];
+	if (aIndex==0)
+		return iComponents[0];
+	return iComponents[1];
+	}
+
+EXPORT_C void CEikCommandButtonBase::SizeChanged()
+	{
+	__ASSERT_DEBUG((iComponents[0]||iComponents[1]),Panic(EEikPanicButtonHasNoComponent));
+    TRect innerRect=iBorder.InnerRect(Rect());
+	innerRect.SetRect(innerRect.iTl.iX+iMargins.iLeft,innerRect.iTl.iY+iMargins.iTop,
+						innerRect.iBr.iX-iMargins.iRight,innerRect.iBr.iY-iMargins.iBottom);
+	innerRect.Move(iDrawOffset,iDrawOffset);
+	if (iComponents[1]==NULL || ((iCmdFlags&KDisplayContentMask)==EFirstOnly))
+		iComponents[0]->SetRect(innerRect);
+	else if (iComponents[0]==NULL || ((iCmdFlags&KDisplayContentMask)==ESecondOnly))
+		iComponents[1]->SetRect(innerRect);
+	else
+		SetComponentExtents(innerRect);
+	}
+
+EXPORT_C void CEikCommandButtonBase::LayoutComponents()
+	{
+	SizeChanged();
+	}
+
+EXPORT_C void CEikCommandButtonBase::StateChanged()
+	{
+	TInt drawState = DrawState();
+	if (iBorder.HasBorder())
+		LafCommandButtonBase::GetBorder(iBorder, drawState, iButFlags,*this,IsDefault());
+	const TInt offset=LafCommandButtonBase::ComponentOffset(drawState, iButFlags);
+
+	if (offset==iDrawOffset)
+		return;
+
+	const TInt deltaOffset = offset-iDrawOffset;
+	const TPoint delta(deltaOffset,deltaOffset);
+	
+	if (iComponents[0])
+		iComponents[0]->SetPosition(iComponents[0]->Position()+delta);
+	
+	if (iComponents[1])
+		iComponents[1]->SetPosition(iComponents[1]->Position()+delta);
+	
+	iDrawOffset=offset;
+	}
+
+/**
+ * Prepares the basic graphic contents according to the the type of command
+ * button, e.g. pen and brush colors.
+ *
+ * @since ER5U 
+ */
+EXPORT_C void CEikCommandButtonBase::PrepareContext(CWindowGc& aGc) const
+	{
+	LafCommandButtonBase::PrepareContext(aGc,DrawState(),iEikonEnv->LafEnv(),*this);
+	}
+
+EXPORT_C void CEikCommandButtonBase::Draw(const TRect& /*aRect*/) const
+	{
+	LafCommandButtonBase::Draw(iEikonEnv->LafEnv(),*this,SystemGc(),
+								iBorder,iDrawOffset,DrawState(),
+								iMargins,IsDefault());
+    }
+
+
+EXPORT_C TKeyResponse CEikCommandButtonBase::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	if(aKeyEvent.iCode==EKeyEnter && aType==EEventKey)
+		{
+		Animate();
+		return EKeyWasConsumed;
+		}
+	else
+		return EKeyWasNotConsumed;
+	}
+
+EXPORT_C void CEikCommandButtonBase::FocusChanged(TDrawNow aDrawNow)
+	{
+	if(aDrawNow && !IsNonFocusing())
+		DrawNow();
+	}
+
+void CEikCommandButtonBase::SetComponentExtents(const TRect& aRect)
+	{
+	TInt8 margin = (TInt8)(LafCommandButtonBase::IntraComponentMargin()>>1);
+	TSize comp1Size=iComponents[0]->MinimumSize();
+	TSize comp2Size=iComponents[1]->MinimumSize();
+
+	const TInt excess=(LayoutIsVertical()? 
+								aRect.Size().iHeight-(comp1Size+comp2Size).iHeight - LafCommandButtonBase::IntraComponentMargin():
+								aRect.Size().iWidth-(comp1Size+comp2Size).iWidth - LafCommandButtonBase::IntraComponentMargin());
+	switch (iCmdFlags&KExcessMask)
+		{
+	case EToFirst:
+		if (LayoutIsVertical())
+			comp1Size.iHeight+=excess;
+		else
+			comp1Size.iWidth+=excess;
+		break;
+	case EToSecond:
+		if (LayoutIsVertical())
+			comp2Size.iHeight+=excess;
+		else
+			comp2Size.iWidth+=excess;
+		break;
+	case EShare:
+		if (LayoutIsVertical())
+			{
+			comp2Size.iHeight+=excess>>1;
+			comp1Size.iHeight+=excess-(excess>>1);
+			}
+		else
+			{
+			comp2Size.iWidth+=excess>>1;
+			comp1Size.iWidth+=excess-(excess>>1);
+			}
+		break;
+		}
+	if (LayoutIsVertical())
+		{
+		comp2Size.iHeight+=margin;
+		comp1Size.iHeight+=margin;
+		}
+	else
+		{
+		comp2Size.iWidth+=margin;
+		comp1Size.iWidth+=margin;
+		}
+	TRect comp1Rect=aRect;
+	TRect comp2Rect=aRect;
+    switch (iCmdFlags&KLayoutMask)
+        {
+    case EFirstTopSecondBottom:
+		comp2Rect.iTl.iY+=comp1Size.iHeight;
+		comp1Rect.iBr.iY=comp2Rect.iTl.iY;
+		iComponents[0]->iMargin.iBottom=margin;
+		iComponents[1]->iMargin.iTop=margin;
+        break;
+    case EFirstBottomSecondTop:
+		comp1Rect.iTl.iY+=comp2Size.iHeight;
+		comp2Rect.iBr.iY=comp1Rect.iTl.iY;
+		iComponents[0]->iMargin.iTop=margin;
+		iComponents[1]->iMargin.iBottom=margin;
+        break;
+    case EFirstLeftSecondRight:
+		comp2Rect.iTl.iX+=comp1Size.iWidth;
+		comp1Rect.iBr.iX=comp2Rect.iTl.iX;
+		iComponents[0]->iMargin.iRight=margin;
+		iComponents[1]->iMargin.iLeft=margin;
+        break;
+    case EFirstRightSecondLeft:
+		comp1Rect.iTl.iX+=comp2Size.iWidth;
+		comp2Rect.iBr.iX=comp1Rect.iTl.iX;
+		iComponents[0]->iMargin.iLeft=margin;
+		iComponents[1]->iMargin.iRight=margin;
+        break;
+		}
+	iComponents[0]->SetRect(comp1Rect); // won't leave
+	iComponents[1]->SetRect(comp2Rect); // won't leave
+	}
+
+void CEikCommandButtonBase::SetImageAttributes(CEikImage* aImage)
+	{
+//	aImage->SetAlignment(EHCenterVCenter);
+	aImage->SetAllMarginsTo(LafCommandButtonBase::ImageMargin());
+	}
+
+void CEikCommandButtonBase::SetNewComponentExtentL()
+// only ever called when the image changes
+	{
+    TRect innerRect=iBorder.InnerRect(Rect());
+	innerRect.SetRect(innerRect.iTl.iX+iMargins.iLeft,innerRect.iTl.iY+iMargins.iTop,
+					innerRect.iBr.iX-iMargins.iRight,innerRect.iBr.iY-iMargins.iBottom);
+	innerRect.Move(iDrawOffset,iDrawOffset);
+	if (!iComponents[1] || (iCmdFlags&KDisplayContentMask==EFirstOnly))
+		iComponents[0]->SetRect(innerRect);
+	else if (!iComponents[0] || (iCmdFlags&KDisplayContentMask==ESecondOnly))
+		iComponents[1]->SetRect(innerRect);
+	else
+		SetComponentExtents(innerRect);
+	}
+
+TBool CEikCommandButtonBase::LayoutIsVertical() const
+	{ // !! change back to TLayout values to simplify this routine again
+	TInt layout=iCmdFlags&KLayoutMask;
+	return (layout==EFirstBottomSecondTop || layout==EFirstTopSecondBottom);
+	}
+
+inline TInt CEikCommandButtonBase::Behavior() const
+	{return iButFlags&(EEikButtonStaysClear|EEikButtonStaysSet|EEikButtonLatches|EEikButtonReportsOnPointerDown);}
+
+inline void CEikCommandButtonBase::CheckCreateCommandStackL()
+	{
+	if (!iCommandStack)
+		{
+		iCommandStack=CEikCommandStack::NewL();
+		}
+	}
+
+/**
+ * Gets the list of logical colors employed in the drawing of the control,
+ * paired with an explanation of how they are used. Appends the list to aColorUseList.
+ *
+ * @since ER5U 
+ */
+EXPORT_C void CEikCommandButtonBase::GetColorUseListL(CArrayFix<TCoeColorUse>& aColorUseList) const
+	{
+	CEikButtonBase::GetColorUseListL(aColorUseList);
+	LafCommandButtonBase::GetColorUseListL(aColorUseList);
+	}
+
+/**
+ * Handles a change to the control's resources of type aType
+ * which are shared across the environment, e.g. colors or fonts.
+ *
+ * @since ER5U 
+ */
+EXPORT_C void CEikCommandButtonBase::HandleResourceChange(TInt aType)
+	{
+	CEikButtonBase::HandleResourceChange(aType);
+	}
+
+/**
+ * Writes the internal state of the control and its components to aStream.
+ * Does nothing in release mode.
+ * Designed to be overidden and base called by subclasses.
+ *
+ * @internal
+ * @since App-Framework_6.1
+ */
+#ifndef _DEBUG
+EXPORT_C void CEikCommandButtonBase::WriteInternalStateL(RWriteStream&) const
+	{}
+#else
+EXPORT_C void CEikCommandButtonBase::WriteInternalStateL(RWriteStream& aWriteStream) const
+	{
+	_LIT(KLitEikCmdButBsCtlStart, "<CEikCommandButtonBase>");
+	_LIT(KLitEikCmdButBsCtlEnd, "<\\CEikCommandButtonBase>");
+	_LIT(KLitEikCmdButBsMrg,"<iMargins>");
+	_LIT(KLitEikCmdButBsMrgEnd,"<\\iMargins>");
+    _LIT(KLitEikCmdButBsCmdFls,"<iCmdFlags>");
+	_LIT(KLitEikCmdButBsCmdFlsEnd,"<\\iCmdFlags>");
+	_LIT(KLitEikCmdButBsDrwOff,"<iDrawOffset>");
+	_LIT(KLitEikCmdButBsDrwOffEnd,"<\\iDrawOffset>");
+	_LIT(KLitEikCmdButBsCmdStck,"<iCommandStack>");
+	_LIT(KLitEikCmdButBsCmdStckEnd,"<\\iCommandStack>");
+	_LIT(KLitEikCmdButBsDef,"<iDefault>");
+	_LIT(KLitEikCmdButBsDefEnd,"<\\iDefault>");
+
+	aWriteStream << KLitEikCmdButBsCtlStart;
+	aWriteStream << KLitEikCmdButBsMrg;
+	aWriteStream.WriteInt8L(iMargins.iLeft);
+	aWriteStream.WriteInt8L(iMargins.iRight);
+	aWriteStream.WriteInt8L(iMargins.iTop);
+	aWriteStream.WriteInt8L(iMargins.iBottom);
+	aWriteStream << KLitEikCmdButBsMrgEnd;
+    aWriteStream << KLitEikCmdButBsCmdFls;
+	aWriteStream.WriteInt32L(iCmdFlags);
+	aWriteStream << KLitEikCmdButBsCmdFlsEnd;
+	aWriteStream << KLitEikCmdButBsDrwOff;
+	aWriteStream.WriteInt32L(iDrawOffset);
+	aWriteStream << KLitEikCmdButBsDrwOffEnd;
+	aWriteStream << KLitEikCmdButBsCmdStck;
+	const TInt top=(iCommandStack ? iCommandStack->Level() : 0);
+	for(TInt level=0; level<top ; level++)
+		{
+		const CEikCommandStack::TStackableCommand& cmd=iCommandStack->StackableCommandByPos(level);
+		aWriteStream.WriteInt32L(cmd.iCommandId);
+		if(cmd.iText)
+			aWriteStream << cmd.iText;
+		if(cmd.iBitmap)
+			aWriteStream << cmd.iBitmap;
+		if(cmd.iMask)
+			aWriteStream << cmd.iBitmap;
+		}
+	aWriteStream << KLitEikCmdButBsCmdStckEnd;
+	aWriteStream << KLitEikCmdButBsDef;
+	aWriteStream.WriteInt32L(iDefault);
+	aWriteStream << KLitEikCmdButBsDefEnd;
+	CEikButtonBase::WriteInternalStateL(aWriteStream);
+	aWriteStream << KLitEikCmdButBsCtlEnd;	
+	}
+#endif
+
+EXPORT_C void CEikCommandButtonBase::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikButtonBase::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikCommandButtonBase::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikCommandButtonBase::Reserved_2()
+	{}
+EXPORT_C void CEikCommandButtonBase::Reserved_3()
+	{}
+EXPORT_C void CEikCommandButtonBase::Reserved_4()
+	{}
+
+//
+// class CEikCommandButton
+//
+
+
+EXPORT_C CEikCommandButton::CEikCommandButton()
+	{
+	iMargins = LafCommandButton::Margins();
+	}
+
+EXPORT_C CEikCommandButton::~CEikCommandButton()
+	{}
+
+EXPORT_C void CEikCommandButton::SetTextL(const TDesC& aText)
+	{
+	CEikCommandButtonBase::SetTextL(aText,iComponents[0]);
+	}
+
+EXPORT_C void CEikCommandButton::SetPictureL(const CFbsBitmap* aMain,const CFbsBitmap* aMask)
+	{
+	CEikCommandButtonBase::SetPictureL(aMain,aMask,iComponents[1]);
+	}
+
+EXPORT_C void CEikCommandButton::SetPictureFromFileL(const TDesC& aFilename,TInt aMain,TInt aMask)
+	{
+	CEikCommandButtonBase::SetPictureFromFileL(aFilename,aMain,aMask,iComponents[1]);
+	}
+
+EXPORT_C CEikLabel* CEikCommandButton::Label() const
+	{
+	return STATIC_CAST(CEikLabel*,iComponents[0]);
+	}
+
+EXPORT_C CEikImage* CEikCommandButton::Picture() const
+	{
+	return STATIC_CAST(CEikImage*,iComponents[1]);
+	}
+
+EXPORT_C void CEikCommandButton::SetButtonLayout(TLayout aLayout)
+	{
+	CEikCommandButtonBase::SetButtonLayout(((CEikCommandButtonBase::TLayout)aLayout));
+	}
+
+EXPORT_C void CEikCommandButton::SetExcessSpace(TExcess aExcess)
+	{
+	CEikCommandButtonBase::SetExcessSpace(((CEikCommandButtonBase::TExcess)aExcess));
+	}
+
+EXPORT_C void CEikCommandButton::SetDisplayContent(TDisplayContent aContent)
+	{
+	CEikCommandButtonBase::SetDisplayContent(((CEikCommandButtonBase::TDisplayContent)aContent));
+	}
+
+EXPORT_C void CEikCommandButton::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	StartConstructFromResourceL(aReader);
+	ConstructLabelFromResourceL(aReader,EFirst);
+	ConstructImageFromResourceL(aReader,ESecond);
+	if (!(iComponents[0] || iComponents[1]))
+		{
+		SetTextL(KNullDesC);
+		CEikLabel* label=static_cast<CEikLabel*>(iComponents[0]);
+		label->SetAllMarginsTo(LafCommandButtonBase::LabelMargin());
+		label->SetContainerWindowL(*this);
+		}
+	}
+
+EXPORT_C void CEikCommandButton::UpdateComponentAlignment()
+	{
+	const TInt layout=iCmdFlags&KLayoutAndFontMask;
+	if (layout==EFirstBottomSecondTop || layout==EFirstTopSecondBottom)
+		{
+		if (iComponents[0])
+			iComponents[0]->SetAlignment(EHCenterVCenter);
+		if (iComponents[1])
+			iComponents[1]->SetAlignment(EHCenterVCenter);
+		}
+	else
+		{
+		if (iComponents[0])
+			{
+			if (iComponents[1])
+				{
+				iComponents[0]->SetAlignment(EHLeftVCenter); // always align text on the left
+				iComponents[1]->SetAlignment(layout==EFirstLeftSecondRight? EHRightVCenter : EHLeftVCenter);
+				}
+			else
+				iComponents[0]->SetAlignment(EHCenterVCenter);
+			}
+		else
+			iComponents[1]->SetAlignment(EHCenterVCenter);
+		}
+	}
+
+/**
+ * Sets aText as the text in the command button.  Sets aBitmap and aMask as the bitmap and mask of the command button.
+ *
+ * @since App-Framework_6.1
+ */
+EXPORT_C void CEikCommandButton::SetCommandL(TInt /*aCommandId*/,const TDesC* aText,const CFbsBitmap* aBitmap,const CFbsBitmap* aMask)
+	{
+	// !!! no rollback
+	if (aText && Label()->BufferReserveLength())
+		UpdateLabelReserveLengthL(aText);
+	SetTextL(*aText);
+	SetPictureL(aBitmap,aMask);
+	}
+
+void CEikCommandButton::UpdateLabelReserveLengthL(const TDesC* aText)
+	{
+	TInt length=(aText? aText->Length() : 0);
+	CEikLabel* label=Label();
+	length=Max(length,label->Text()->Length());
+	if (length>label->BufferReserveLength())
+		label->SetBufferReserveLengthL(length);
+	}
+	
+EXPORT_C void CEikCommandButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikCommandButtonBase::HandlePointerEventL(aPointerEvent); 
+    }	
+
+EXPORT_C void* CEikCommandButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+struct SLabelCleanup
+	{
+	CEikLabel* iLabel;
+	TDesC* iText;
+	};
+LOCAL_C void CleanupLabel(TAny* aPtr)
+	{
+	SLabelCleanup& temp=*(SLabelCleanup*)aPtr;
+	temp.iLabel->SetTextL(*(temp.iText)); // won't leave as SetBufferReserveLengthL has been called
+	}
+
+struct SStackCleanup
+	{
+	CEikCommandStack* iStack;
+	TInt iCommandId;
+	};
+LOCAL_C void CleanupCommandStack(TAny* aPtr)
+	{
+	SStackCleanup& temp=*(SStackCleanup*)aPtr;
+	temp.iStack->Remove(temp.iCommandId);
+	}
+
+/**
+ * Sets the command button to respond to aCommandId.  Sets aText as the text in the command button.
+ * Sets aBitmap and aMask as the bitmap and mask of the command button.  The previous command can be
+ * restored on the command button by a subsequent call to PopCommandFromStack(). 
+ *
+ * @since App-Framework_6.1
+ */
+EXPORT_C void CEikCommandButton::AddCommandToStackL(TInt aCommandId,const TDesC* aText,const CFbsBitmap* aBitmap,const CFbsBitmap* aMask)
+	{
+	//if (Extension()==NULL)
+	//	InitExtensionL();
+	CEikImage* image=Picture();
+	CFbsBitmap* bitmap=(image? CONST_CAST(CFbsBitmap*,image->Bitmap()) : NULL);
+	CFbsBitmap* mask=(image? CONST_CAST(CFbsBitmap*,image->Mask()) : NULL);
+	CheckCreateCommandStackL();
+	CEikCommandStack* stack=CommandStack();
+	stack->AddL(aCommandId,Label()->Text(),bitmap,mask);
+	SStackCleanup stackCleanup;
+	stackCleanup.iStack=stack;
+	stackCleanup.iCommandId=aCommandId;
+	CleanupStack::PushL(TCleanupItem(CleanupCommandStack,&stackCleanup));
+	CEikLabel* label=Label();
+	SLabelCleanup labelCleanup;
+	labelCleanup.iLabel=label;
+	labelCleanup.iText=stack->StackableCommand(aCommandId).iText;
+	UpdateLabelReserveLengthL(aText);
+	TPtrC text;
+	if (aText)
+		text.Set(*aText);
+	SetTextL(text); // won't leave as SetBufferReserveLengthL has been called
+	CleanupStack::PushL(TCleanupItem(CleanupLabel,&labelCleanup));
+	if (image)
+		image->SetPictureOwnedExternally(ETrue);
+	SetPictureL(aBitmap,aMask); // !!! may delete a CEikImage => rollback impossible
+	if (aBitmap)
+		Picture()->SetPictureOwnedExternally(EFalse);
+	CleanupStack::Pop(2); // imageCleanup, stackCleanup
+	CEikCommandStack::TStackableCommand& cmd=stack->StackableCommand(aCommandId);
+	cmd.SetBitmapOwner(ETrue);
+	cmd.SetDimmed(IsDimmed());
+	cmd.SetVisible(IsVisible());
+	SetDimmed(EFalse);
+	MakeVisible(ETrue);
+	}
+
+/**
+ * Removes the command which has aCommandId from the stack of commmands.
+ *
+ * @since App-Framework_6.1
+ */
+EXPORT_C TBool CEikCommandButton::RemoveCommandFromStack(TInt aCommandId)
+	{
+	// __ASSERT_DEBUG(Extension()==NULL,.....
+	CEikCommandStack* stack=CommandStack();
+	return stack->Remove(aCommandId);
+	}
+
+/**
+ * Pops the current command from the stack, if there is one.  Restores the command button to
+ * respond to the previous commandId before the last push to the stack.  The text, bitmap and mask
+ * are also restored to the previous values (before the last push was made).
+ *
+ * @since App-Framework_6.1
+ */
+EXPORT_C TInt CEikCommandButton::PopCommandFromStack()
+	{
+	CEikCommandStack* stack=CommandStack();
+	__ASSERT_DEBUG(stack,Panic(EEikPanicCommandStackIsNull));
+	CEikCommandStack::TStackableCommand cmd=stack->Pop();
+
+	TPtrC text;
+	if (cmd.iText)
+		{
+		text.Set(*(cmd.iText));
+		}
+	SetTextL(text); // won't leave as SetBufferReserveLengthL has been called
+	delete cmd.iText;
+	TRAP_IGNORE(SetPictureL(cmd.iBitmap,cmd.iMask));
+	SetDimmed(cmd.IsDimmed());
+	MakeVisible(cmd.IsVisible());
+
+	return cmd.iCommandId;
+	}
+
+
+//
+// class CEikTwoPictureCommandButton
+//
+
+const TInt KPictureOwnedExternally	=0x10;
+
+
+EXPORT_C CEikTwoPictureCommandButton::CEikTwoPictureCommandButton()
+	{
+	LafTwoPictureCommandButton::GetDefaultBorder(iBorder);
+	iMargins = LafTwoPictureCommandButton::Margins();
+	}
+
+EXPORT_C CEikTwoPictureCommandButton::~CEikTwoPictureCommandButton()
+	{
+	if(IsSecondPictureOwnedExternally())
+		return;
+    if (iSecondBitmap != iSecondMaskBitmap)
+    	delete CONST_CAST(CFbsBitmap*,iSecondBitmap);
+	delete CONST_CAST(CFbsBitmap*,iSecondMaskBitmap);
+	}
+
+/**
+ * Sets the text for the button label to aText.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetTextL(const TDesC& aText)
+	{
+	CEikCommandButtonBase::SetTextL(aText,iComponents[0]);
+	}
+
+/**
+ * Sets both the pictures for the command button. The first picture is created from the image bitmap aMain
+ * and the mask bitmap aMask. The optional second picture is created from the image bitmap aSecondMain and mask
+ * bitmap aSecondMask.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetTwoPicturesL(const CFbsBitmap* aMain,const CFbsBitmap* aMask,const CFbsBitmap* aSecondMain,const CFbsBitmap* aSecondMask)
+	{
+	CEikCommandButtonBase::SetPictureL(aMain,aMask,iComponents[1]);
+	SetSecondPicture(aSecondMain,aSecondMask);
+	}
+
+/**
+ * Sets the first picture for the button by loading the image bitmap identified by aMain and the mask bitmap
+ * identified by aMask from the bitmap file named aFilename.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetPictureFromFileL(const TDesC& aFilename,TInt aMain,TInt aMask)
+	{
+	CEikCommandButtonBase::SetPictureFromFileL(aFilename,aMain,aMask,iComponents[1]);
+	}
+
+/**
+ * Sets the second picture for the button by loading the image bitmap identified by aMain and the mask bitmap
+ * identified by aMask from the bitmap file named aFilename.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetSecondPictureFromFileL(const TDesC& aFilename,TInt aMain,TInt aMask)
+	{
+	CFbsBitmap* secondBitmap = iEikonEnv->CreateBitmapL(aFilename, aMain);
+	//CFbsBitmap* secondBitmap = AknIconUtils::CreateIconL( aFilename, aMain );
+	CFbsBitmap* secondMask = NULL;
+	if(aMask!=-1)
+		secondMask = iEikonEnv->CreateBitmapL(aFilename, aMask);
+		//secondMask = AknIconUtils::CreateIconL( aFileName, aMask );
+	SetSecondPicture(secondBitmap, secondMask);
+	}
+
+/**
+ * Returns a pointer to the image control component of the button which displays the button pictures.
+ */
+EXPORT_C CEikImage* CEikTwoPictureCommandButton::Picture() const
+	{
+	return STATIC_CAST(CEikImage*,iComponents[1]);
+	}
+
+/**
+ * Sets the second picture for the button using aSecondMain as the image bitmap and aSecondMask as the mask bitmap.
+ * Takes ownership of the bitmaps unless the second picture has been set to be owned externally.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetSecondPicture(const CFbsBitmap* aSecondMain,const CFbsBitmap* aSecondMask)
+	{
+	if (!IsSecondPictureOwnedExternally())
+		{
+		if (iSecondBitmap!=iSecondMaskBitmap)
+    		delete const_cast<CFbsBitmap*>(iSecondBitmap);
+		delete const_cast<CFbsBitmap*>(iSecondMaskBitmap);
+		}
+	iSecondBitmap=aSecondMain;
+	iSecondMaskBitmap=aSecondMask;
+	}
+
+void CEikTwoPictureCommandButton::SwapPictures(CEikImage* aImage)
+	{
+	if(iSecondBitmap)	// only swap if the second bitmap exists
+		{
+		const CFbsBitmap* tempBitmap = aImage->Bitmap();
+		const CFbsBitmap* tempMaskBitmap = aImage->Mask();
+		TBool oldImageOwnership = aImage->IsPictureOwnedExternally();
+
+		aImage->SetPictureOwnedExternally(ETrue);
+		aImage->SetPicture(iSecondBitmap,iSecondMaskBitmap);
+		aImage->SetPictureOwnedExternally(IsSecondPictureOwnedExternally());
+
+		SetSecondPictureOwnedExternally(oldImageOwnership);
+		iSecondBitmap=tempBitmap;
+		iSecondMaskBitmap=tempMaskBitmap;
+
+		SetImageAttributes(aImage);
+		if (IsReadyToDraw())
+			{
+			TRAP_IGNORE(aImage->ActivateL());
+			}
+		}
+	}
+
+EXPORT_C void CEikTwoPictureCommandButton::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	StartConstructFromResourceL(aReader);
+	ConstructLabelFromResourceL(aReader,EFirst);
+	ConstructImagesFromResourceL(aReader,ESecond);
+	}
+
+EXPORT_C void CEikTwoPictureCommandButton::ConstructImagesFromResourceL(TResourceReader& aReader,TWhichComponent /*aWhich*/)
+	{
+	CheckCreateCommandStackL();
+	TPtrC bitmapFile=aReader.ReadTPtrC();
+
+	const TInt bitmapId=aReader.ReadInt16();
+	const TInt bitmapMask=aReader.ReadInt16();
+	if (bitmapId!=-1)
+		SetPictureFromFileL(bitmapFile,bitmapId,bitmapMask);
+
+	const TInt bitmapSecondId=aReader.ReadInt16();
+	const TInt bitmapSecondMask=aReader.ReadInt16();
+	if (bitmapSecondId!=-1)
+		SetSecondPictureFromFileL(bitmapFile,bitmapSecondId,bitmapSecondMask);
+	}
+
+EXPORT_C void CEikTwoPictureCommandButton::Draw(const TRect& /*aRect*/) const
+	{
+	CWindowGc& gc=SystemGc();
+	PrepareContext(gc);
+	CEikCommandButtonBase::Draw(Rect());
+    }
+
+EXPORT_C void CEikTwoPictureCommandButton::StateChanged()
+	{
+	CEikImage* component = STATIC_CAST(CEikImage*, iComponents[1]);
+	if (component == NULL)
+		return;
+	TInt state = DrawState();
+	if ( (Behavior() == EEikButtonLatches) )
+		{
+		switch (state)
+			{
+		case EDrawClearPressed:
+		case EDrawSetPressed:
+			SwapPictures(component);
+			break;
+		default:
+			break;
+			}
+		}
+	else
+		{
+		switch (state)
+			{
+		case EDrawClearPressed:
+		case EDrawClear:
+			SwapPictures(component);
+			break;
+		default:
+			break;
+			}
+		}
+	if( iBorder.HasBorder() )
+		CEikCommandButtonBase::StateChanged();
+    }
+    
+EXPORT_C void CEikTwoPictureCommandButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikCommandButtonBase::HandlePointerEventL(aPointerEvent); 
+    }    
+
+EXPORT_C void* CEikTwoPictureCommandButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikTwoPictureCommandButton::PrepareContext(CWindowGc& aGc) const
+	{
+	if (iBorder.HasBorder())
+		LafCommandButtonBase::PrepareContext(aGc,DrawState(),iEikonEnv->LafEnv(),*this);
+	else
+		aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	}
+
+/**
+ * Sets the bitmaps used for the second button picture to be owned externally if aOwnership is ETrue.
+ */
+EXPORT_C void CEikTwoPictureCommandButton::SetSecondPictureOwnedExternally(TBool aOwnership)
+	{
+	if (aOwnership)
+		iPictureFlags|=KPictureOwnedExternally;
+	else
+		iPictureFlags&=~KPictureOwnedExternally;
+	}
+
+/**
+ * Returns ETrue if the bitmaps for the second button picture are owned externally.
+ */
+EXPORT_C TBool CEikTwoPictureCommandButton::IsSecondPictureOwnedExternally()
+	{
+    if (iPictureFlags&KPictureOwnedExternally)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+EXPORT_C void CEikTwoPictureCommandButton::ActivateL()
+	{
+	__ASSERT_DEBUG(iSecondBitmap, Panic(EEikPanicButtonHasNoComponent));
+	if (iBorder.HasBorder())
+		CEikCommandButtonBase::ActivateL();
+	else
+		{
+		if (iComponents[0])
+			iComponents[0]->CopyControlContextFrom(this);
+		if (iComponents[1])
+			iComponents[1]->CopyControlContextFrom(this);
+		UpdateComponentAlignment();
+		CCoeControl::ActivateL();
+		}
+	}
+
+/**
+ * Writes the internal state of the control and its components to aStream.
+ * Does nothing in release mode.
+ * Designed to be overidden and base called by subclasses.
+ *
+ * @internal
+ * @since App-Framework_6.1
+ */
+#ifndef _DEBUG
+EXPORT_C void CEikTwoPictureCommandButton::WriteInternalStateL(RWriteStream&) const
+	{}
+#else
+EXPORT_C void CEikTwoPictureCommandButton::WriteInternalStateL(RWriteStream& aWriteStream) const
+	{
+	_LIT(KLitEikTwPcCmdButCtlStart, "<CEikTwoPictureCommandButton>");
+	_LIT(KLitEikTwPcCmdButCtlEnd, "<\\CEikTwoPictureCommandButton>");
+	_LIT(KLitEikTwPcCmdButScndBmp,"<iSecondBitmap>");
+	_LIT(KLitEikTwPcCmdButScndBmpEnd,"<\\iSecondBitmap>");
+	_LIT(KLitEikTwPcCmdButScndMsk,"<iSecondMaskBitmap>");
+	_LIT(KLitEikTwPcCmdButScndMskEnd,"<\\iSecondMaskBitmap>");
+	_LIT(KLitEikTwPcCmdButPcFlgs,"<iPictureFlags>");
+	_LIT(KLitEikTwPcCmdButPcFlgsEnd,"<\\iPictureFlags>");
+	
+	aWriteStream << KLitEikTwPcCmdButCtlStart;
+	aWriteStream << KLitEikTwPcCmdButScndBmp;
+	aWriteStream << *iSecondBitmap;
+	aWriteStream << KLitEikTwPcCmdButScndBmpEnd;
+	aWriteStream << KLitEikTwPcCmdButScndMsk;
+	aWriteStream << *iSecondMaskBitmap;
+	aWriteStream << KLitEikTwPcCmdButScndMskEnd;
+	aWriteStream << KLitEikTwPcCmdButPcFlgs;
+	aWriteStream.WriteInt32L(iPictureFlags);
+	aWriteStream << KLitEikTwPcCmdButPcFlgsEnd;
+	CEikCommandButtonBase::WriteInternalStateL(aWriteStream);
+	aWriteStream << KLitEikTwPcCmdButCtlEnd;
+	}
+#endif
+
+//
+// class CEikInverterCommandButton
+//
+
+#define KBaseColor		KRgbDarkGray
+#define KInverterColor	KRgbBlack
+
+
+EXPORT_C CEikInverterCommandButton::CEikInverterCommandButton()
+	{
+	iMargins = LafInverterCommandButton::Margins();
+	}
+
+EXPORT_C CEikInverterCommandButton::~CEikInverterCommandButton()
+	{}
+
+EXPORT_C void CEikInverterCommandButton::PrepareContext(CWindowGc& aGc) const
+	{
+	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	TRgb penColor;
+	TRgb brushColor;
+	switch (DrawState())
+		{
+	case EDrawSet:
+		penColor = KBaseColor;
+		brushColor= KInverterColor;
+		break;
+	case EDrawClearPressed:
+		penColor= KBaseColor;
+		brushColor= KInverterColor;
+		break;
+	case EDrawClear:
+		penColor= KInverterColor;
+		brushColor=KBaseColor;
+		break;
+	case EDrawSetPressed:
+		penColor= KInverterColor;
+		brushColor= KBaseColor;
+		break;
+	default:
+		break;
+		}
+	aGc.SetPenColor(penColor);
+	aGc.SetBrushColor(brushColor);
+	}
+	
+EXPORT_C void CEikInverterCommandButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikCommandButton::HandlePointerEventL(aPointerEvent); 
+    }	
+
+EXPORT_C void* CEikInverterCommandButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+EXPORT_C void CEikInverterCommandButton::WriteInternalStateL(RWriteStream& aWriteStream) const
+	{
+	_LIT(KLitEikInvCmdButCtlStart, "<CEikTwoPictureCommandButton>");
+	_LIT(KLitEikInvCmdButCtlEnd, "<\\CEikTwoPictureCommandButton>");
+	_LIT(KLitEikInvCmdButFlg,"<iFlag>");
+	_LIT(KLitEikInvCmdButFlgEnd,"<\\iFlag>");
+	aWriteStream << KLitEikInvCmdButCtlStart;
+	aWriteStream << KLitEikInvCmdButFlg;
+	aWriteStream.WriteInt32L(iFlag);
+	aWriteStream << KLitEikInvCmdButFlgEnd;
+	CEikCommandButton::WriteInternalStateL(aWriteStream);
+	aWriteStream << KLitEikInvCmdButCtlEnd;
+	}
+
+//
+// class CEikTextButton
+//
+
+EXPORT_C CEikTextButton::CEikTextButton()
+	{
+	iMargins = LafTextButton::Margins();
+	}
+
+EXPORT_C CEikTextButton::~CEikTextButton()
+	{}
+
+EXPORT_C void CEikTextButton::SetTextL(const TDesC& aText,TWhichComponent aWhich)
+	{
+	CEikCommandButtonBase::SetTextL(aText,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+EXPORT_C CEikLabel* CEikTextButton::Label(TWhichComponent aWhich) const
+	{
+	return STATIC_CAST(CEikLabel*,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+EXPORT_C void CEikTextButton::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	StartConstructFromResourceL(aReader);
+	ConstructLabelFromResourceL(aReader,EFirst);
+	ConstructLabelFromResourceL(aReader,ESecond);
+	}
+
+EXPORT_C void CEikTextButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikCommandButtonBase::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikTextButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+//
+// class CEikBitmapButton
+//
+
+EXPORT_C CEikBitmapButton::CEikBitmapButton()
+	{
+	iMargins = LafBitmapButton::Margins();
+	}
+
+EXPORT_C CEikBitmapButton::~CEikBitmapButton()
+	{}
+
+EXPORT_C void CEikBitmapButton::SetPictureL(const CFbsBitmap* aMain,const CFbsBitmap* aMask,TWhichComponent aWhich)
+	{
+	CEikCommandButtonBase::SetPictureL(aMain,aMask,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+EXPORT_C void CEikBitmapButton::SetPictureFromFileL(const TDesC& aFilename,TInt aMain,TInt aMask,TWhichComponent aWhich)
+	{
+	CEikCommandButtonBase::SetPictureFromFileL(aFilename,aMain,aMask,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+EXPORT_C CEikImage* CEikBitmapButton::Picture(TWhichComponent aWhich) const
+	{
+	return STATIC_CAST(CEikImage*,(aWhich==EFirst? iComponents[0] : iComponents[1]));
+	}
+
+EXPORT_C void CEikBitmapButton::ConstructFromResourceL(TResourceReader& aReader)
+	{
+	StartConstructFromResourceL(aReader);
+	ConstructImageFromResourceL(aReader,EFirst);
+	ConstructImageFromResourceL(aReader,ESecond);
+	}
+
+EXPORT_C void CEikBitmapButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CEikCommandButtonBase::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikBitmapButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }