// EIKMSG.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <w32std.h>
#include <coecntrl.h>
#include <eikenv.h>
#include <eikcolor.h>
#include <eikmsg.h>
#include <eikmsg.pan>

// various constants

enum
	{
	EGapAboveText=3,
	EGapBelowText=2,
	EGapLeftOfText=3,
	EGapRightOfText=3
	};

enum
	{
	EWindowOffsetVertical=6,
	EWindowOffsetHorizontal=6
	};

enum
	{
	EInfoMsgWinDuration=25*100000,
	EBusyMsgWinInitialDelay=10*100000
	};

// global functions

GLDEF_C void Panic(TEikMsgWinPanic aPanic)
	{
	User::Panic(_L("EIKON-MSG-WIN"), aPanic);
	}

// CEikMsgWin

CEikMsgWin::CEikMsgWin(CEikonEnv& aEikonEnv)
	:iEikonEnv_(aEikonEnv)
	{
	__DECLARE_NAME(_S("CEikMsgWin"));
	}

EXPORT_C void CEikMsgWin::ConstructL(RWindowGroup& aWindowGroup)
	{
	iDummy=new(ELeave) CCoeControl;
	iDummy->SetNonFocusing();
	iBlankWindow=new(ELeave) RBlankWindow(iEikonEnv_.WsSession());
	User::LeaveIfError(iBlankWindow->Construct(aWindowGroup, (TUint32)iDummy));
	iBlankWindow->SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
	iBlankWindow->SetShadowHeight(0);
	iBlankWindow->SetShadowDisabled(ETrue);
	const CFbsFont& font=*(CFbsFont*)iEikonEnv_.NormalFont();
	iMessageWindow=new(ELeave) RMessageWindow(iEikonEnv_.ClockDllL(), *iBlankWindow);
//	iMessageWindow->ConstructL(EGapAboveText+font.AscentInPixels(), font.Handle(), KEikBusyMsgWinBackgroundColor, KEikBusyMsgWinForegroundColor);
	iMessageWindow->ConstructL(EGapAboveText+font.AscentInPixels(), font.Handle(), iEikonEnv_.Color(EEikColorMsgWinBackground), iEikonEnv_.Color(EEikColorMsgWinForeground));
	iBlankWindow->Activate();
	}

EXPORT_C CEikMsgWin::~CEikMsgWin()
	{
	if (iMessageWindow)
		iMessageWindow->Destroy();
	if (iBlankWindow)
		iBlankWindow->Destroy();
	delete iDummy;
	}

EXPORT_C void CEikMsgWin::StartDisplay(const TDesC& aText, TCoeAlignment aCorner)
	{
	TPtrC text=aText.Left(Min(aText.Length(), (TInt)RMessageWindow::EMaxTextLength));
	const CFont& font=*iEikonEnv_.NormalFont();
	TMargins borders;
	iMessageWindow->GetBorders(borders);
	TSize size(borders.iLeft+borders.iRight+EGapLeftOfText+EGapRightOfText+font.TextWidthInPixels(text),
				borders.iTop+borders.iBottom+EGapAboveText+EGapBelowText+font.HeightInPixels());
	TPoint position=aCorner.InnerTopLeft(iEikonEnv_.ScreenDevice()->SizeInPixels(), size);
	switch (aCorner.HAlignment())
		{
	case EHLeft:
		position.iX+=EWindowOffsetHorizontal;
		break;
	case EHCenter:
		break;
	case EHRight:
		position.iX-=EWindowOffsetHorizontal;
		break;
#if defined(_DEBUG)
	default:
		Panic(EEikPanicMsgWinBadHorizontalAlignment);
		break;
#endif
		}
	switch (aCorner.VAlignment())
		{
	case EVTop:
		position.iY+=EWindowOffsetVertical;
		break;
	case EVCenter:
		break;
	case EVBottom:
		position.iY-=EWindowOffsetVertical;
		break;
#if defined(_DEBUG)
	default:
		Panic(EEikPanicMsgWinBadVerticalAlignment);
		break;
#endif
		}
	iBlankWindow->SetExtent(position, size);
	iBlankWindow->SetOrdinalPosition(0);
	DoStartDisplay(text);
	}

EXPORT_C void CEikMsgWin::CancelDisplay()
	{
	iMessageWindow->CancelDisplay();
	}

// CEikInfoMsgWin

EXPORT_C CEikInfoMsgWin::CEikInfoMsgWin(CEikonEnv& aEikonEnv)
	:CEikMsgWin(aEikonEnv)
	{
	__DECLARE_NAME(_S("CEikInfoMsgWin"));
	}

void CEikInfoMsgWin::DoStartDisplay(const TDesC& aText)
	{
	iMessageWindow->StartDisplay(EFalse, 0, EInfoMsgWinDuration, aText);
	}

// CEikBusyMsgWin

EXPORT_C CEikBusyMsgWin::CEikBusyMsgWin(CEikonEnv& aEikonEnv)
	:CEikMsgWin(aEikonEnv),
	 iInitialDelay(EBusyMsgWinInitialDelay)
	{
	__DECLARE_NAME(_S("CEikBusyMsgWin"));
	}

EXPORT_C void CEikBusyMsgWin::StartDisplaySpecifyingInitialDelay(const TDesC& aText, TCoeAlignment aCorner, TTimeIntervalMicroSeconds32 aInitialDelay)
	{
	__ASSERT_DEBUG(iInitialDelay==TTimeIntervalMicroSeconds32(EBusyMsgWinInitialDelay), Panic(EEikPanicMsgWinBadInitialDelay));
	iInitialDelay=aInitialDelay;
	CEikMsgWin::StartDisplay(aText, aCorner);
	iInitialDelay=EBusyMsgWinInitialDelay;
	}

void CEikBusyMsgWin::DoStartDisplay(const TDesC& aText)
	{
	iMessageWindow->StartDisplay(ETrue, iInitialDelay, aText);
	}

