// EIKLBBUT.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <barsread.h>
#include <eiklbbut.h>
#include <eikcmbut.h>
#include <eikmnbut.h>
#include <eiklabel.h>
#include <eikenv.h>
#include <eikpanic.h>
#include <eikctrls.hrh>
#include <eikdialg.hrh>

const KLabelMargins=2;
const KMinButtonHeight=23;

EXPORT_C CEikLabeledButton::CEikLabeledButton()
	{
	SetComponentsToInheritVisibility(ETrue);
	}

EXPORT_C CEikLabeledButton::~CEikLabeledButton()
	{
	delete iButton;
	delete iLabel;
	}

EXPORT_C void CEikLabeledButton::ConstructL(CEikCommandButtonBase* aButton,TInt aHotKeyCode,TInt aFlags)
	{
	__ASSERT_DEBUG(aButton,Panic(EEikPanicNullPointer));
	iButton=aButton;
	iButton->SetObserver(this);
	iHotKeyCode=aHotKeyCode;
	iLButFlags=aFlags;
	CreateLabelL();
	}

EXPORT_C void CEikLabeledButton::ConstructFromResourceL(TResourceReader& aReader)
	{
	const TInt type=aReader.ReadInt16();
	switch (type)
		{
	case EEikCtCommandButton:
		iButton=new(ELeave) CEikCommandButton;
		break;
	case EEikCtMenuButton:
		iButton=new(ELeave) CEikMenuButton;
		break;
	case EEikCtTextButton:
		iButton=new(ELeave) CEikTextButton;
		break;
	case EEikCtBitmapButton:
		iButton=new(ELeave) CEikBitmapButton;
		break;
	default:
		Panic(EEikPanicLabeledButtonInvalidButtonType);
		}
	iButton->SetContainerWindowL(*this);
	iButton->ConstructFromResourceL(aReader);
	iButton->SetObserver(this);
	iHotKeyCode=aReader.ReadInt32();
	iLButFlags=aReader.ReadInt8();
	CreateLabelL();
	}

EXPORT_C CEikCommandButtonBase* CEikLabeledButton::Button() const
	{
	return iButton;
	}

EXPORT_C CEikLabel* CEikLabeledButton::Label() const
	{
	return iLabel;
	}

EXPORT_C TInt CEikLabeledButton::HotKeyCode() const
	{
	return iHotKeyCode;
	}

EXPORT_C TBool CEikLabeledButton::ShowsHotKey() const
	{
	return iLButFlags&EShowHotKey;
	}

EXPORT_C TBool CEikLabeledButton::PlainHotKey() const
	{
	return iLButFlags&EPlainHotKey;
	}

EXPORT_C TKeyResponse CEikLabeledButton::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
	{
	if (!IsDimmed() && aType==EEventKey)
		{
		TBool consumed=EFalse;
		if ((aKeyEvent.iModifiers & EAllStdModifiers) == EModifierCtrl)
			consumed=(aKeyEvent.iCode==(TUint)iHotKeyCode && !(aKeyEvent.iModifiers&EModifierPureKeycode));
		else
			{
			switch (iHotKeyCode)
				{
			case EEikBidCancel:
				consumed=(aKeyEvent.iCode==EKeyEscape);
				break;
			case EEikBidOk:
				consumed=(aKeyEvent.iCode==EKeyEnter);
				break;
			case EEikBidTab:
				consumed=(aKeyEvent.iCode==EKeyTab);
				break;
			case EEikBidDelete:
				consumed=(aKeyEvent.iCode==EKeyBackspace);
				break;
			case EEikBidSpace:
				consumed=(aKeyEvent.iCode==EKeySpace);
				break;
			default:
				{
				consumed=(iLButFlags&EPlainHotKey && TCharF(aKeyEvent.iCode)==TCharF((TUint)iHotKeyCode));
				break;
				}
				}
			}
		if (consumed)
			{
			iButton->Animate();
			ReportEventL(MCoeControlObserver::EEventStateChanged);
			return EKeyWasConsumed;
			}
		}
	return EKeyWasNotConsumed;
	}

EXPORT_C TSize CEikLabeledButton::MinimumSize()
	{
	TSize size=iButton->MinimumSize();
	size.iHeight=Max(KMinButtonHeight,size.iHeight);
	const TSize labelSize=(ShowsHotKey()? iLabel->MinimumSize()+TSize(KLabelMargins,KLabelMargins) : TSize());
	size.iWidth=Max(size.iWidth,labelSize.iWidth);
	size.iHeight+=labelSize.iHeight;
	return size;
	}

EXPORT_C void CEikLabeledButton::SetContainerWindowL(const CCoeControl& aContainer)
	{
	CCoeControl::SetContainerWindowL(aContainer);
	if (iButton)
		iButton->SetContainerWindowL(aContainer);
	if (iLabel)
		iLabel->SetContainerWindowL(aContainer);
	CopyControlContextFrom(&aContainer);
	}

EXPORT_C void CEikLabeledButton::SetDimmed(TBool aDimmed)
	{
	CCoeControl::SetDimmed(aDimmed);
	if (iButton)
		iButton->SetDimmed(aDimmed);
	if (iLabel)
		iLabel->SetDimmed(aDimmed);
	}

EXPORT_C void CEikLabeledButton::Animate()
	{
	if (iButton)
		iButton->Animate();
	}

TInt CEikLabeledButton::CountComponentControls() const
	{
	return 2;
	}

CCoeControl* CEikLabeledButton::ComponentControl(TInt aIndex) const
	{
	if (aIndex==0)
		return iButton;
	else if (aIndex==1)
		return iLabel;
	return NULL;
	}

void CEikLabeledButton::SizeChangedL()
	{ // should KMinButtonHeight be settable ??
	const TSize butSize(iSize.iWidth,Max(KMinButtonHeight,iButton->MinimumSize().iHeight));
	iButton->SetExtentL(iPosition,butSize);
	iLabel->SetExtentL(TPoint(iPosition.iX,iPosition.iY+butSize.iHeight),
						TSize(iSize.iWidth,iSize.iHeight-butSize.iHeight));
	}

void CEikLabeledButton::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
	{
	ReportEventL(aEventType);
	}

void CEikLabeledButton::CreateLabelL()
	{
	iLabel=new(ELeave) CEikLabel;
	iLabel->SetContainerWindowL(*this);
	iLabel->CopyControlContextFrom(this);
	TPtrC text;
	if (iHotKeyCode<=EEikBidCancel && iHotKeyCode>=EEikBidSpace)
		{
		if (ShowsHotKey())
			text.Set(iEikonEnv->KeyPressLabel(EEikBidCancel-iHotKeyCode));
		}
	else
		{
		if (/*iHotKeyCode && */ShowsHotKey())
			{
			if (PlainHotKey())
				{
				TBuf<1> buf;
				buf.Append(TChar(iHotKeyCode));
				text.Set(buf);
				}
			else
				{
				TBuf<10> defaultText=iEikonEnv->KeyPressLabel(EEikBidCancel-EEikBidSpace+1);
				const TInt len=defaultText.Length();
				defaultText[len-1]=(TInt8)iHotKeyCode;
				text.Set(defaultText);
				}
			}
		if (!PlainHotKey())
			{
			if (iHotKeyCode>='A' && iHotKeyCode<='Z')
				iHotKeyCode-='A'-1;
			else
				iHotKeyCode-='a'-1;
			}
		}
	iLabel->iMargin.iTop=KLabelMargins;
	iLabel->iMargin.iRight=iLabel->iMargin.iLeft=KLabelMargins;
	iLabel->SetTextL(text);
	iLabel->SetFont(iEikonEnv->AnnotationFont());
	iLabel->SetAlignment(EHCenterVCenter);
	}

void CEikLabeledButton::Reserved_1()
	{}
void CEikLabeledButton::Reserved_2()
	{}
