// EIKTBAR.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <barsread.h>
#include <coemain.h>
#include <eiktbar.h>
#include <eikbutb.h>
#include <eikcmobs.h>
#include <eikfctry.h>
#include <eikpanic.h>
#include <eiktbar.hrh>
#include <eikenv.h>

#include <eikcolor.h>

EXPORT_C CEikToolBar::~CEikToolBar()
	{
	}	

EXPORT_C CEikToolBar::CEikToolBar()
	{
	__DECLARE_NAME(_S("CEikToolBar"));
	iContext=&iBrushContext;
	iBrushContext.iBrushStyle=CGraphicsContext::ESolidBrush;
	iBrushContext.iBrushColor=iEikonEnv->ControlColor(EEikColorToolbarBackground,*this);
	iBorder=TEikBorder(TEikBorder::ESingleBlack);
	}

void CEikToolBar::BaseConstructL()
	{
	CreateWindowL();
	RWindow& window=Window();
	window.SetBackgroundColor(iEikonEnv->ControlColor(EEikColorToolbarBackground,*this));
	window.SetPointerGrab(ETrue);
	window.SetShadowDisabled(ETrue);
	EnableDragEvents();
	}

EXPORT_C void CEikToolBar::ConstructFromResourceL(TResourceReader& aReader)
	{
	const TInt length=aReader.ReadInt16();
	const TInt breadth=aReader.ReadInt16();
	const TInt lines=aReader.ReadInt8();
	iToolBarFlags=aReader.ReadInt32();
	if (iToolBarFlags&EEikToolBarHorizontal)
		CEikControlGroup::ConstructL(CEikControlGroup::EFromTopLeft,CEikControlGroup::ELayHorizontally);
	else
		CEikControlGroup::ConstructL(CEikControlGroup::EFromTopRight,CEikControlGroup::ELayVertically);
	if (length)
		SetLengthInPixels(length);
	if (breadth)
		SetBreadthInPixels(breadth);
	SetNumberOfLines(lines,iToolBarFlags&EEikToolBarDistributeControlsEvenlyBetweenLines);
	if (iToolBarFlags&EEikToolBarAllControlsSameSize)
		SetControlsAllSameSize();

	const TInt count=aReader.ReadInt16();
	for (TInt ii=0;ii<count;++ii)
		{
		const TInt ctrlType=aReader.ReadInt16();
		CCoeControl* ctrl=EikControlFactory::CreateByTypeL(ctrlType).iControl;
		if (!ctrl)
			ctrl=iCommandObserver->CreateCustomCommandControlL(ctrlType);
		__ASSERT_DEBUG(ctrl, Panic(EEikPanicToolBarNullControl));
		ctrl->SetNonFocusing();
		CleanupStack::PushL(ctrl);
		const TInt id=aReader.ReadInt16();
		const TInt flags=aReader.ReadInt16();
		TEikGroupControl groupCtrl(ctrl,id,aReader.ReadInt16(),flags);
		AddControlL(groupCtrl); // ownership now taken by array
		CleanupStack::Pop();
		ctrl->ConstructFromResourceL(aReader);
		}
	}

EXPORT_C void CEikToolBar::SetDimmed(TBool aDimmed)
	{
	const TInt count=iControlArray->Count();
	for (TInt ii=0;ii<count;ii++)
		(*iControlArray)[ii].iControl->SetDimmed(aDimmed);
	}

EXPORT_C void CEikToolBar::ReduceRect(TRect& aBoundingRect) const
	{
	if (!IsVisible())
		return;
	if (iToolBarFlags&EEikToolBarHorizontal)
		aBoundingRect.iTl.iY+=iSize.iHeight;
	else
		aBoundingRect.iBr.iX-=iSize.iWidth;
	}

EXPORT_C void CEikToolBar::SetBoundingRectL(const TRect& aRect)
	{
	TSize size=aRect.Size();
	SetLengthInPixels(iToolBarFlags&EEikToolBarHorizontal? size.iWidth: size.iHeight);
	TSize thisSize=MinimumSize();
	TPoint thisPos=aRect.iTl;
	if (iToolBarFlags&EEikToolBarHorizontal)
		iSize.iHeight=thisSize.iHeight;
	else
		{
		thisPos.iX=aRect.iBr.iX-thisSize.iWidth;
		iSize.iWidth=thisSize.iWidth;
		}
	CCoeControl::SetExtentL(thisPos,iSize);
	}

EXPORT_C void CEikToolBar::StaticConstructL(MEikCommandObserver* aCommandObserver,TInt aResourceId)
	{
	BaseConstructL();
	iCommandObserver=aCommandObserver;
	TResourceReader reader;
	iCoeEnv->CreateResourceReaderLC(reader,aResourceId);
	ConstructFromResourceL(reader);
	CleanupStack::PopAndDestroy();
	}

EXPORT_C void CEikToolBar::ConstructL(MEikCommandObserver* aCommandObserver,TInt aResourceId,const TRect& aBoundingRect)
	{
	StaticConstructL(aCommandObserver,aResourceId);
	SetBoundingRectL(aBoundingRect);
	if (!(iToolBarFlags&EEikToolBarDelayActivation))
		ActivateL();
	}

EXPORT_C void CEikToolBar::SetCommandObserver(MEikCommandObserver* aCommandObserver)
	{
	iCommandObserver=aCommandObserver;
	}

EXPORT_C void CEikToolBar::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEvent)
	{
	__ASSERT_DEBUG(iCommandObserver, Panic(EEikPanicToolBarHasNoObserver));
	if (aEvent==EEventStateChanged)
		{
		TInt aCommand=ControlId(aControl);
		iCommandObserver->ProcessCommandL(aCommand);
		}
	}

EXPORT_C void CEikToolBar::AddControlL(CCoeControl* aControl,TInt aId)
	{
	CEikControlGroup::AddControlL(aControl,aId);
	aControl->SetObserver(this);
	}

EXPORT_C void CEikToolBar::AddControlL(TEikGroupControl& aGroupControl)
	{
	CEikControlGroup::AddControlL(aGroupControl);
	aGroupControl.iControl->SetObserver(this);
	}

EXPORT_C void CEikToolBar::CoordinateButtons(TInt aId,TInt aCount,TEikButtonCoordinator* aCoordinator)
	{
	TInt index=IndexById(aId);
	while (aCount--)
		((CEikButtonBase*)Control(index++))->SetCoordinator(aCoordinator);
	}

EXPORT_C TBool CEikToolBar::DelayActivation() const
	{
	return (iToolBarFlags&EEikToolBarDelayActivation);
	}

EXPORT_C void CEikToolBar::SetButtonStateOn(TInt aId,TBool aState)
	{
	CEikButtonBase* button=(CEikButtonBase*)ControlById(aId);
	CEikButtonBase::TState bState=aState? CEikButtonBase::ESet: CEikButtonBase::EClear;
	if (button->State()==bState)
		return;
	button->SetState(bState);
	button->DrawDeferred();
	}
