// TCAL.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <e32keys.h>
#include <basched.h>
#include <barsread.h>
#include <coecntrl.h>
#include <eikdef.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikdialg.h>
#include <eikcmds.hrh>
#include <eikcal.h>
#include <eikcal.hrh>
#include <eikapp.h>
#include <eikdoc.h>
#include <eikon.rsg>
#include <tcal.rsg>
#include "tcal.hrh"

enum TTCalendarPanic
	{
	ETCalendarPanicBadCommand,
	ETCalendarPanicCalendarsHaveAlreadyBeenCreated
	};

LOCAL_C void Panic(TTCalendarPanic aPanic)
	{
	User::Panic(_L("TCal"), aPanic);
	}

//
// CTstContainer
//

class CTstContainer : public CCoeControl, public MCoeControlContext, public MEikCalendarObserver
	{
public:
	CTstContainer();
	void ConstructL(const TRect& aRect);
	virtual ~CTstContainer();
	void HandleCommandL(TInt aCommand);
	// framework
	virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
private:
	// framework
	virtual void Draw(const TRect& aRect) const;
	virtual void PrepareContext(CWindowGc& aGc) const;
	virtual void GetMinimumAndMaximumAndInitialDatesForCalendarL(TTime& aMinimumDate, TTime& aMaximumDate, TTime& aInitialDate) const;
	virtual void SetDateFromCalendarAndDrawNow(const TTime& aDate);
	// other functions
	void CreateCalendarL();
	};

CTstContainer::CTstContainer()
	{
	__DECLARE_NAME(_S("CTstContainer"));
	}

void CTstContainer::ConstructL(const TRect& aRect)
	{
	TLocale locale;
	locale.SetStartOfWeek(ESunday);
	locale.Set();
	CreateWindowL();
	EnableDragEvents();
	SetControlContext(this);
	Window().SetBackgroundColor(TRgb(170, 0, 0));
	SetRectL(aRect);
	ActivateL();
	CreateCalendarL();
	}

CTstContainer::~CTstContainer()
	{}

void CTstContainer::HandleCommandL(TInt aCommand)
	{
	switch (aCommand)
		{
	case EEikCmdExit:
		CBaActiveScheduler::Exit();
		break;
	default:
		Panic(ETCalendarPanicBadCommand);
		break;
		}
	}

TKeyResponse CTstContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aCode)
	{
	if (aCode==EEventKey && aKeyEvent.iCode==EKeyTab)
        {
		CreateCalendarL();
		return EKeyWasConsumed;
		}
	return EKeyWasNotConsumed;
	}

void CTstContainer::Draw(const TRect&) const
	{
	CWindowGc& gc=SystemGc();
	gc.SetPenStyle(CGraphicsContext::ENullPen);
	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	gc.SetBrushColor(KRgbDarkGray);
	gc.DrawRect(Rect());
	gc.SetPenStyle(CGraphicsContext::ESolidPen);
	}

void CTstContainer::PrepareContext(CWindowGc& aGc) const
	{
	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc.SetBrushColor(TRgb(170, 0, 0));
	}

void CTstContainer::GetMinimumAndMaximumAndInitialDatesForCalendarL(TTime& aMinimumDate, TTime& aMaximumDate, TTime& aInitialDate) const
	{
	aMinimumDate=TDateTime(1980, EJanuary, 0, 0, 0, 0, 0);
	aMaximumDate=TDateTime(2000, EDecember, 30, 0, 0, 0, 0);
	aInitialDate=TDateTime(1996, EJanuary, 11-1, 0, 0, 0, 0);
	}

void CTstContainer::SetDateFromCalendarAndDrawNow(const TTime&)
	{}

void CTstContainer::CreateCalendarL()
	{
	CEikCalendar* calendar=new(ELeave) CEikCalendar;
	calendar->SetCalendarObserver(this);
	calendar->ExecuteLD(R_EIK_THREE_MONTH_CALENDAR);
	}

//
// CTstAppUi
//

class CTstAppUi : public CEikAppUi
	{
public:
	void ConstructL();
	virtual ~CTstAppUi();
private: // framework
	virtual void HandleCommandL(TInt aCommand);
private:
	CTstContainer* iContainer;
	};

void CTstAppUi::ConstructL()
	{
	CEikAppUi::ConstructL();
	//CreateHotKeyControlL(R_TCAL_HOTKEYS);
	iContainer=new(ELeave) CTstContainer;
	iContainer->ConstructL(ClientRect());
	AddToStackL(iContainer);
	}

CTstAppUi::~CTstAppUi()
	{
	delete iContainer;
	}

void CTstAppUi::HandleCommandL(TInt aCommand)
	{
	iContainer->HandleCommandL(aCommand);
	}

//
// CTstDocument
//

class CTstDocument : public CEikDocument
	{
public:
	CTstDocument(CEikApplication& aApp): CEikDocument(aApp) { }
private: // from CApaDocument
	CEikAppUi* CreateAppUiL();
	};

CEikAppUi* CTstDocument::CreateAppUiL()
	{
    return(new(ELeave) CTstAppUi);
	}

//
// CTstApplication
//

class CTstApplication : public CEikApplication
	{
private: // from CApaApplication
	CApaDocument* CreateDocumentL();
	TUid AppDllUid() const;
	};

const TUid KUidTstApp={238};

TUid CTstApplication::AppDllUid() const
	{
	return(KUidTstApp);
	}

CApaDocument* CTstApplication::CreateDocumentL()
	{
	return(new(ELeave) CTstDocument(*this));
	}

//
// EXPORTed functions
//

EXPORT_C CApaApplication* NewApplication()
	{
	return(new CTstApplication);
	}

GLDEF_C TInt E32Dll(TDllReason)
	{
	return(KErrNone);
	}
