// CLOCK.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

// public clock header
//
// $Workfile:   CLOCK.H  $
// $Revision:   1.4  $
// $Author:   chrisd  $
// $Date:   14 Dec 1998 11:42:10  $

#if !defined(__CLOCK_H__)
#define __CLOCK_H__

#if !defined(__E32STD_H__)
#include <e32std.h>
#endif

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__W32STD_H__)
#include <w32std.h>
#endif

//
// miscellaneous typedefs
//

typedef TBuf8<1024> TConstructorBuf8; // implementation class

//
// miscellaneous enums
//

enum TDisplayType // implementation class
	{
	EDisplayDigital,
	EDisplayAnalog
	};

//

enum TAnalogDisplayHandFeatureType // implementation class
	{
	EAnalogDisplayHandFeatureLine,
	EAnalogDisplayHandFeaturePolyLine,
	EAnalogDisplayHandFeatureCircle
	};

//

enum TDigitalDisplayHorizontalTextAlignment
	{
	EDigitalDisplayHorizontalTextAlignmentLeft,
	EDigitalDisplayHorizontalTextAlignmentCenter,
	EDigitalDisplayHorizontalTextAlignmentRight
	};

//

enum TDigitalDisplayVerticalTextAlignment
	{
	EDigitalDisplayVerticalTextAlignmentTop,
	EDigitalDisplayVerticalTextAlignmentCenterInclDescent,
	EDigitalDisplayVerticalTextAlignmentCenterExclDescent,
	EDigitalDisplayVerticalTextAlignmentBottomInclDescent,
	EDigitalDisplayVerticalTextAlignmentBottomExclDescent
	};

//

enum TDigitalDisplayLayoutChar
	{
	EDigitalDisplayLayoutCharFlashingBlockDelimiter=1
	};

//

enum TAnalogDisplayHandType
	{
	EAnalogDisplayHandOneRevPer12Hours,
	EAnalogDisplayHandOneRevPerHour,
	EAnalogDisplayHandOneRevPerMinute
	};

//
// miscellaneous structs
//

struct STimeDeviceShadow
	{
	TBool iIsOn;
	TRgb iColor;
	TPoint iOffset;
	};

//

struct SAnalogDisplayAmPm
	{
	TPoint iPositionRelativeToFace;
	TSize iSize;
	STimeDeviceShadow iShadow;
	TRgb iBackgroundColor;
	TInt iFontHandle;
	TRgb iTextColor;
	};

//
// display-addition classes
//

class TDisplayAddition
	{
public:
	const TDesC8& Buf() const;
protected:
	TConstructorBuf8 iBuf;
	};

//

class TDigitalDisplayTextSection : public TDisplayAddition
	{
public:
	IMPORT_C TDigitalDisplayTextSection(TInt aFontHandle, TRgb aTextColor, TDigitalDisplayHorizontalTextAlignment aHorizontalAlignment,
																TDigitalDisplayVerticalTextAlignment aVerticalAlignment,
																TInt aHorizontalMargin, TInt aVerticalMargin, const TDesC& aFormat);
																// N.B. the font passed in to aFontHandle cannot be destroyed until the
																// RDigitalClock has been completely constructed, including all necessary
																// calls to RDigitalClock::AddTextSectionL()
	};

//

class TAnalogDisplayHand : public TDisplayAddition
	{
public:
	IMPORT_C TAnalogDisplayHand(TAnalogDisplayHandType aType);
	IMPORT_C void AddLine(CGraphicsContext::TPenStyle aPenStyle, TRgb aPenColor, const TSize& aPenSize,
																const TPoint& aStartPoint, const TPoint& aEndPoint);
	IMPORT_C void AddPolyLine(CGraphicsContext::TPenStyle aPenStyle, TRgb aPenColor, const TSize& aPenSize,
																CGraphicsContext::TBrushStyle aBrushStyle, TRgb aBrushColor,
																TBool aClosed, const CArrayFix<TPoint>* aPointList); // aPointList is not destroyed
	IMPORT_C void AddCircle(CGraphicsContext::TPenStyle aPenStyle, TRgb aPenColor, const TSize& aPenSize,
																CGraphicsContext::TBrushStyle aBrushStyle, TRgb aBrushColor,
																const TPoint& aCircleCenter, TInt aRadius);
	inline TInt NumFeatures() const {return *iNumFeaturesPtr;}
private:
	void AppendType(TAnalogDisplayHandFeatureType aType);
private:
	TInt* iNumFeaturesPtr;
	};

//
// utility class
//

class RAnimWithUtils : public RAnim
	{
protected:
	RAnimWithUtils(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	void AppendToConstructorBufL(const TDesC8& aData);
	void SendConstructorBufIfCompleteL(TInt aAnimatedObjectType);
	void SendConstructorBufL(TInt aAnimatedObjectType);
	TBool ConstructorBufExists() const;
	TBool ConstructorBufAlreadySent() const;
	TConstructorBuf8& ConstructorBuf() const;
	void SetNumAdditionsStillExpected(TInt aNumAdditionsStillExpected);
public:
	IMPORT_C virtual void Close();
private:
	TConstructorBuf8* iConstructorBuf; // on the heap as it is only required for construction
	TBool iConstructorBufAlreadySent;
	const RWindowBase& iWindow;
	TInt iNumAdditionsStillExpected;
	};

//
// time-device abstract classes
//

class RTimeDevice : public RAnimWithUtils
	{
protected:
	RTimeDevice(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	void AppendDisplayType(TDisplayType aType);
	void AppendDigitalDisplayConstructorArgs(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow,
																TRgb aBackgroundColor, TInt aNumTextSections);
	void AppendAnalogDisplayConstructorArgs(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow,
																TInt aFaceHandle, TInt aFaceMaskHandle, TInt aNumHands, const SAnalogDisplayAmPm* aAmPm);
public:
	IMPORT_C void SetVisible(TBool aVisible); // can only be called after full construction - by default clocks are invisible
	IMPORT_C void SetPositionAndSize(const TPoint& aPosition, const TSize& aSize); // can only be called after full construction
	IMPORT_C void SetPosition(const TPoint& aPosition); // can only be called after full construction
	IMPORT_C void SetSize(const TSize& aSize); // can only be called after full construction
	IMPORT_C void UpdateDisplay(); // can only be called after full construction
	IMPORT_C void Draw(); // can only be called after full construction
	};

//

class RClock : public RTimeDevice
	{
protected:
	RClock(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	void AppendClockConstructorArgs(TTimeIntervalSeconds aUniversalTimeOffset);
public:
	IMPORT_C void SetUniversalTimeOffset(TTimeIntervalSeconds aUniversalTimeOffset); // can only be called after full construction
	};

//
// time-device concrete classes
//

class RDigitalClock : public RClock
	{
public:
	IMPORT_C RDigitalClock(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	IMPORT_C void ConstructL(TTimeIntervalSeconds aUniversalTimeOffset, const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins,
																const STimeDeviceShadow& aShadow, TRgb aBackgroundColor, TInt aNumTextSections);
	IMPORT_C void AddTextSectionL(const TDigitalDisplayTextSection& aTextSection);
	IMPORT_C void SetBackgroundColor(TRgb aBackgroundColor, TRgb aShadowColor); // can only be called after full construction
	};

//

class RAnalogClock : public RClock
	{
public:
	IMPORT_C RAnalogClock(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	IMPORT_C void ConstructL(TTimeIntervalSeconds aUniversalTimeOffset, const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins,
																const STimeDeviceShadow& aShadow, TInt aFaceHandle, TInt aFaceMaskHandle, TInt aNumHands, const SAnalogDisplayAmPm* aAmPm=NULL);
																// N.B. the bitmap(s) passed in to aFaceHandle and aFaceMaskHandle in these
																// ConstructL functions cannot be destroyed until the RAnalogClock has been
																// completely constructed, including all necessary calls to
																// RAnalogClock::AddHandL() - aFaceMaskHandle may be 0
	IMPORT_C void AddHandL(const TAnalogDisplayHand& aHand);
	};

//
// message-window class
//

class RMessageWindow : public RAnimWithUtils
	{
public:
	enum
		{
		EMaxTextLength=80
		};
public:
	IMPORT_C RMessageWindow(RAnimDll& aAnimDll, const RWindowBase& aWindow);
	IMPORT_C void ConstructL(TInt aBaselineOffset, TInt aFontHandle, TRgb aBackgroundColor, TRgb aTextColor);
	IMPORT_C void StartDisplay(TBool aFlash, TTimeIntervalMicroSeconds32 aInitialDelay, const TDesC& aText);
	IMPORT_C void StartDisplay(TBool aFlash, TTimeIntervalMicroSeconds32 aInitialDelay, TTimeIntervalMicroSeconds32 aDuration, const TDesC& aText);
	IMPORT_C void CancelDisplay();
	IMPORT_C void GetBorders(TMargins& aBorders);
	};

#endif

