uifw/EikStd/coctlsrc/EIKLBBUT.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/EIKLBBUT.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,350 @@
+/*
+* 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 <barsread.h>
+#include <eiklbbut.h>
+#include <eikcmbut.h>
+#include <eikmnbut.h>
+#include <eiklabel.h>
+#include <eikenv.h>
+#include <eikpanic.h>
+#include <uikon.hrh>
+#include "laflbbut.h"
+
+/**
+ * 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 CEikLabeledButton::WriteInternalStateL(RWriteStream&) const
+	{}
+#else
+EXPORT_C void CEikLabeledButton::WriteInternalStateL(RWriteStream& aWriteStream) const
+	{
+	_LIT(KEikLitLbButCtlSt,"<CEikLabeledButton>");
+	_LIT(KEikLitLbButCtlEnd,"<\\CEikLabeledButton>");
+	_LIT(KEikLitLbButCtlHkey, "<iHotKeyCode>");
+	_LIT(KEikLitLbButCtlHkeyEnd, "<\\iHotKeyCode>");
+	_LIT(KEikLitLbButCtlFlags, "<iLButFlags>");
+	_LIT(KEikLitLbButCtlFlagsEnd, "<\\iLButFlags>");
+
+	aWriteStream << KEikLitLbButCtlSt;
+	aWriteStream << KEikLitLbButCtlHkey;
+	aWriteStream.WriteInt32L(iHotKeyCode);
+	aWriteStream << KEikLitLbButCtlHkeyEnd;
+	aWriteStream << KEikLitLbButCtlFlags;
+	aWriteStream.WriteInt32L(iLButFlags);
+	aWriteStream << KEikLitLbButCtlFlagsEnd;
+	CCoeControl::WriteInternalStateL(aWriteStream);
+	aWriteStream << KEikLitLbButCtlEnd;
+	}
+#endif
+
+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();
+	if(iLButFlags&EEikLabeledButtonIsDefault)
+		iButton->SetDefault(ETrue);
+	}
+
+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();
+	if(iLButFlags&EEikLabeledButtonIsDefault)
+		iButton->SetDefault(ETrue);
+	}
+
+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 (LafLabeledButton::ShowHotKey() ? iLButFlags&EShowHotKey: EFalse);
+	}
+
+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;
+// AKNLAF start
+			case EEikBidSelect:
+				consumed=(aKeyEvent.iCode==EKeyEnter);
+				break;
+// AKNLAF end
+			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);
+	size.iHeight=Max(LafLabeledButton::MinimumButtonHeight(),size.iHeight);
+	const TSize labelSize=(ShowsHotKey()? iLabel->MinimumSize()+TSize(LafLabeledButton::HorizontalLabelMargin(),LafLabeledButton::VerticalLabelMargin()) : 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 TCoeInputCapabilities CEikLabeledButton::InputCapabilities() const
+	{
+	return TCoeInputCapabilities(LafLabeledButton::InputCapabilities());
+	}
+
+EXPORT_C void CEikLabeledButton::Animate()
+	{
+	if (iButton)
+		iButton->Animate();
+	}
+
+EXPORT_C void CEikLabeledButton::UpdateHotKey(TInt aKeyCode,TFlags aFlags)
+	{
+	iHotKeyCode=aKeyCode;
+	iLButFlags=aFlags;
+	TRAPD(err,UpdateHotKeyL());
+	if (err)
+		{
+		TPtrC text(KNullDesC);
+		__ASSERT_DEBUG_NO_LEAVE(iLabel->SetTextL(text)); // won't leave as we've already called SetBufferReserveLength during construction
+		}
+	}
+
+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::SizeChanged()
+	{
+	//const TSize butSize(iSize.iWidth,Max(KMinButtonHeight,iButton->MinimumSize().iHeight));
+	const TSize butSize(iSize.iWidth,Max(LafLabeledButton::MinimumButtonHeight(),iButton->MinimumSize().iHeight));
+	iButton->SetExtent(iPosition,butSize);
+	iLabel->SetExtent(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);
+	iLabel->SetBufferReserveLengthL(LafLabeledButton::MaxLabelTextLengthInChars());
+	UpdateHotKeyL();
+	iLabel->SetFont(iEikonEnv->AnnotationFont());
+	iLabel->SetAlignment(LafLabeledButton::LabelAlignment());
+	}
+
+void CEikLabeledButton::UpdateHotKeyL()
+	{
+	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->SetTextL(text);
+	}
+
+/**
+ * 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 CEikLabeledButton::GetColorUseListL(CArrayFix<TCoeColorUse>& aColorUseList) const
+	{
+	CCoeControl::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 CEikLabeledButton::HandleResourceChange(TInt aType)
+	{
+	CCoeControl::HandleResourceChange(aType);
+	}
+
+EXPORT_C void CEikLabeledButton::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
+    { 
+    CAknControl::HandlePointerEventL(aPointerEvent); 
+    }
+
+EXPORT_C void* CEikLabeledButton::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+void CEikLabeledButton::Reserved_2()
+	{}