// EIKCAL.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__EIKCAL_H__)
#define __EIKCAL_H__

#if !defined(__EIKBCTRL_H__)
#include <eikbctrl.h>
#endif

#if !defined(__EIKSCBUT_H__)
#include <eikscbut.h>
#endif

#if !defined(__EIKCMBUT_H__)
#include <eikcmbut.h>
#endif

#if !defined(__EIKDIALG_H__)
#include <eikdialg.h>
#endif

//

class MEikCalendarObserver
	{
public:
	virtual void GetMinimumAndMaximumAndInitialDatesForCalendarL(TTime& aMinimumDate, TTime& aMaximumDate, TTime& aInitialDate) const=0;
	virtual void SetDateFromCalendarAndDrawNow(const TTime& aDate)=0;
	};

class CEikCalendar : public CEikBorderedControl, public MCoeControlObserver
	{
public:
	IMPORT_C CEikCalendar();
	IMPORT_C void SetCalendarObserver(MEikCalendarObserver* aObserver);
	IMPORT_C void ExecuteLD(TInt aResourceId);
	//
	IMPORT_C virtual ~CEikCalendar();
	IMPORT_C void SetMinimumAndMaximum(const TTime& aMinimumDate, const TTime& aMaximumDate, TBool* aMonthsWereReshuffled=NULL);
	IMPORT_C void GetMinimumAndMaximum(TTime& aMinimumDate, TTime& aMaximumDate) const;
	IMPORT_C void SetDateL(const TTime& aDate, TBool aDoNotReshuffleMonthsUnlessNecessary, TBool* aMonthsWereReshuffled=NULL);
	IMPORT_C TTime Date() const;
	// framework
	IMPORT_C virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
	IMPORT_C virtual TSize MinimumSize();
private:
	enum TRule
		{
		ERuleAdjustRow,
		ERuleAdjustColumn
		};
	enum {
		EExtraHeightForHighlightSquare=3,
		ENumberOfButtons=3,
		EWidthOfButton=32
		};
private:
	// framework
	IMPORT_C virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
	IMPORT_C virtual void SizeChangedL();
	IMPORT_C virtual TInt CountComponentControls() const;
	IMPORT_C virtual CCoeControl* ComponentControl(TInt aIndex) const;
	IMPORT_C virtual void Draw(const TRect& aRect) const;
	IMPORT_C virtual void HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType);
	// other functions
	void BaseConstructL();
	void ReadResourceL(TInt aResourceId);
	void ConstructMonthViewL(TInt aResourceId,const TTime& aInitialDate);
	//
	void CheckDateIsWithinCalendarRangeL(const TTime& aDate);
	TTime Date(TInt aOffsetFromStartMonthToThisMonth, TInt aThisDay) const;
	TInt DayAtRowAndColumn(TInt aOffsetFromStartMonthToThisMonth, TInt aRow, TInt aColumn, TRule aRule) const;
	void IncrementStartMonth(TInt aIncrement);
	void MoveOneMonthToLeft(TInt& aOffsetFromOldStartMonthToNewCurrentMonth);
	void MoveOneMonthToRight(TInt& aOffsetFromOldStartMonthToNewCurrentMonth);
	void MoveOneMonthUp(TInt& aOffsetFromOldStartMonthToNewCurrentMonth);
	void MoveOneMonthDown(TInt& aOffsetFromOldStartMonthToNewCurrentMonth);
	void DrawCursor(CWindowGc& aGc) const;
	void UpdateDisplayWithInfoMsgL(TBool aFullDraw, TInt aResourceId, const TTime& aTimeDate) const;
	void DrawNewSquare(CWindowGc& aGc) const;
	void ClearOldSquare(CWindowGc& aGc,TInt aPreviousMonth) const;
	void GetHighlightSquarePositionAndSize(TInt aMonth,TPoint& aPos,TSize& aSize) const;
	TPoint CalendarPosition() const;
	void DrawYear(CWindowGc& aGc, TInt& aAscentInPixelsOfFontBeingUsed, const CFont*& aFontBeingUsed) const;
	void DrawEmptyAreas(CWindowGc& aGc) const;
	void DrawMonths(CWindowGc& aGc, TInt& aAscentInPixelsOfFontBeingUsed, const CFont*& aFontBeingUsed) const;
	static void UseFontIfNotBeingUsed(CWindowGc& aGc, TInt& aAscentInPixelsOfFontBeingUsed, const CFont*& aFontBeingUsed, const CFont* aFontToUse);
	TInt WidthOfRangeOfColumnsOfDays(TInt aFirstColumn, TInt aLastColumn) const;
	void GetMonthData(TInt aOffsetFromStartMonthToThisMonth, TInt* aNumColumnsBlankAtStartOfTopRowOfDays, TInt* aNumDaysInThisMonth) const;
	void GetNearestDateFromPosition(const TPoint& aPosition, TInt& aOffsetFromStartMonthToThisMonth, TInt& aThisDay) const;
	TBool IsLeftDogEarPressed(const TPoint aPos) const;
	TBool IsRightDogEarPressed(const TPoint aPos) const;
	static void Divide(TInt aDividend, TInt aDivisor, TInt* aResult, TInt* aRemainder);
private: // from CCoeControl
	IMPORT_C void Reserved_1();
	IMPORT_C void Reserved_2();
private:
	TDay iStartOfWeek;
	TUint32 iWorkDays;
	TText iDayNameInitials[__Align(7)];
	TInt iDayOfToday;
	TInt iMonthOfToday;
	TInt iYearOfToday;
	TUint32 iFlags;
	TInt iNumMonths;
	TInt iNumMonthsPerRowOfMonths;
	TInt iVerticalSpaceAboveYear;
	TInt iVerticalSpaceBetweenYearAndTopRowOfMonths;
	TInt iVerticalSpaceBetweenEachRowOfMonths;
	TInt iVerticalSpaceBeneathBottomRowOfMonths;
	TInt iHorizontalSpaceOnEachSideOfMonthMatrix;
	TInt iHorizontalSpaceBetweenEachColumnOfMonths;
	TInt iVerticalSpaceBetweenMonthNameAndDayNameInitials;
	TInt iVerticalSpaceBetweenDayNameInitialsAndTopRowOfDays;
	TInt iVerticalSpaceBetweenEachRowOfDays;
	TInt iHorizontalSpaceBetweenEachColumnOfDays;
	TTime iMinimumDate;
	TTime iMaximumDate;
	TInt iCurrentDay;
	TInt iOffsetFromStartMonthToCurrentMonth;
	TMonth iStartMonth;
	TInt iStartYear;
	CFbsFont* iYearFont;
	CFbsFont* iMonthFont;
	CFbsFont* iWeekDayInitialFont;
	CFbsFont* iNumeralFont;
	HBufC* iTextSeparatingYearRange;
	// generated from above and stored for convenience
	TInt iHeightOfWeekDayInitials;
	TSize iSizeOfSingleDay; 
	TSize iSizeOfSingleMonth; 
	TSize iSizeOfYearText;
	TSize iCalendarSize;
	//
	CWsBitmap* iBitmap;
	//
	CEikCommandButton* iCommandButtonOneMonth;
	CEikCommandButton* iCommandButtonThreeMonth;
	CEikCommandButton* iCommandButtonTwelveMonth;
	//
	CFbsBitmap* iLeftDogEarBitmap;
	CFbsBitmap* iLeftDogEarBitmapMask;
	CFbsBitmap* iRightDogEarBitmap;
	CFbsBitmap* iRightDogEarBitmapMask;
	//
	CFbsBitmap* iOneMonthCommandButtonBitmap;
	CFbsBitmap* iOneMonthCommandButtonBitmapMask;
	CFbsBitmap* iThreeMonthCommandButtonBitmap;
	CFbsBitmap* iThreeMonthCommandButtonBitmapMask;
	CFbsBitmap* iTwelveMonthCommandButtonBitmap;
	CFbsBitmap* iTwelveMonthCommandButtonBitmapMask;
	TEikButtonCoordinator iButCoord;
	// Mixin 
	MEikCalendarObserver* iCalendarObserver;
	TTime* iInitialDate;
	};

#endif

