// EIKENV.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__EIKENV_H__)
#define __EIKENV_H__

#if !defined(__COEMAIN_H__)
#include <coemain.h>
#endif

#if !defined(__COEDEF_H__)
#include <coedef.h>
#endif

#if !defined(__EIKDEF_H__)
#include <eikdef.h>
#endif

#if !defined(__COEALIGN_H__)
#include <coealign.h>
#endif

#if !defined(__APAFLREC_H__)
#include <apaflrec.h>
#endif

#if !defined(__APACMDLN_H__)
#include <apacmdln.h>
#endif

#if !defined(__BADESCA_H__)
#include <badesca.h>
#endif

#if !defined(__BAERRHAN_H__)
#include <baerrhan.h>
#endif

#if !defined(__EIKCOLOR_H__)
#include <eikcolor.h>
#endif

class CEikProcess;
class CEikInfoMsgWin;
class CEikBusyMsgWin;
class CEikAppUi;
class CEikHotKeyTable;
class CCoeControl;
class CParaFormatLayer;
class CCharFormatLayer;
class MCoeControlBrushContext;
class CEikCommandButton;
class CEikAlert;
class CPrintSetup;
class CDictionaryStore;
class CApaWindowGroupName;
class CEikErrorIdler;
class CEikExtension;
class CEikApplication;

const TInt KEikDefaultCursorWidth=2;
const TInt KEikDefaultLineSpacingInTwips=240;

const KTimeBetweenClicks=1000000;	 // in Microseconds			 
const TInt KDoubleClickDistance=10;

const KKeyboardRepeatRate=50000;
const KKeyboardRepeatInitialDelay=800000;

const TUid KSystemIniFileUid = {0x1000010C};

class CEikonEnv : public CCoeEnv, public MApaAppStarter
	{
public:
	IMPORT_C ~CEikonEnv();
	IMPORT_C CEikonEnv();
	IMPORT_C void ConstructL();
	IMPORT_C void ConstructAppFromCommandLineL(const CApaCommandLine& aCommandLine);
	IMPORT_C void ControlStackReadyL();
	IMPORT_C static TVersion Version();
	//
	inline static CEikonEnv* CEikonEnv::Static();
	inline const CFont* AnnotationFont() const;
	inline const CFont* TitleFont() const;
	inline const CFont* LegendFont() const;
	inline const CFont* SymbolFont() const;
	inline const CFont* DenseFont() const;
	inline const CFbsBitmap* TexturedBitmap() const;
	inline const CFbsBitmap* GrayBitmap() const;
	inline const CFbsBitmap* OptionBitmap() const;
	inline const CFbsBitmap* HighlightedOptionBitmap() const;
	inline const CFbsBitmap* OptionMaskBitmap() const;
	inline TInt EditableControlStandardHeight() const;
	inline CEikProcess* Process() const { return(iProcess); }
	inline const CEikAlert* Alert() const;
	IMPORT_C MPictureFactory* PictureFactory()const;
    //
	IMPORT_C void AlertWin(const TDesC& aMsg);
    IMPORT_C void AlertWin(const TDesC& aMsg1,const TDesC& aMsg2);
	IMPORT_C void LeaveWithInfoMsg(TInt aResourceId,...);
	IMPORT_C void LeaveWithErrorContext(TInt aError,const TDesC& aContextText);
	IMPORT_C void GetErrorText(TDes& aDes,TInt aError) const;
	IMPORT_C void InfoMsg(const TDesC& aDes);
	IMPORT_C void InfoMsgWithAlignment(TCoeAlignment aCorner,const TDesC& aDes);
	IMPORT_C void InfoMsg(TInt aResourceId,...);
	IMPORT_C void InfoMsg(TInt aResourceId,VA_LIST aList);
	IMPORT_C void InfoMsgWithAlignment(TCoeAlignment aCorner,TInt aResourceId,...);
	IMPORT_C void InfoMsgWithAlignment(TCoeAlignment aCorner,TInt aResourceId,VA_LIST aList);
	IMPORT_C void InfoMsgCancel();
	IMPORT_C void VerboseInfoMsg(const TDesC& aDes);
	IMPORT_C void SetVerboseInfoReporting(TBool aVerbose);
	IMPORT_C void BusyMsgL(const TDesC& aDes);
	IMPORT_C void BusyMsgL(const TDesC& aDes,TCoeAlignment aCorner);
	IMPORT_C void BusyMsgL(TInt aResourceId);
	IMPORT_C void BusyMsgL(const TDesC& aDes,TTimeIntervalMicroSeconds32 aInitialDelay);
	IMPORT_C void BusyMsgL(const TDesC& aDes,TCoeAlignment aCorner,TTimeIntervalMicroSeconds32 aInitialDelay);
	IMPORT_C void BusyMsgL(TInt aResourceId,TTimeIntervalMicroSeconds32 aInitialDelay);
	IMPORT_C void BusyMsgCancel();
	//
	IMPORT_C TBool ConfirmLossOfAllChangesL() const;
    IMPORT_C static TBool QueryWinL(const TDesC& aFirstLine,const TDesC& aSecondLine);
    IMPORT_C TBool QueryWinL(TInt aFirstLineId,TInt aSecondLineId=0) const;
    IMPORT_C static void InfoWinL(const TDesC& aFirstLine,const TDesC& aSecondLine);
    IMPORT_C void InfoWinL(TInt aFirstLineId,TInt aSecondLineId=0) const;
	//
	IMPORT_C void AllocInfoMsg();
	IMPORT_C void WservAllocInfoMsg();
	IMPORT_C void FservAllocInfoMsg();
	//
	IMPORT_C static void Beep();
	IMPORT_C CWsBitmap* CreateBitmapL(const TDesC& aFileName,TInt aId);
	IMPORT_C void LaunchPopupMenuL(TInt aResourceId,const TPoint& aTargetPos,TPopupTargetPosType aTargetType=EPopupTargetTopLeft,const CEikHotKeyTable* aHotKeyTable=NULL);
	IMPORT_C static void AddWindowShadow(CCoeControl* aWinArea);
	IMPORT_C RAnimDll& ClockDllL();
	//
	IMPORT_C CParaFormatLayer* SystemSingleLineParaFormatLayerL();
	IMPORT_C CParaFormatLayer* SystemParaFormatLayerL();
	IMPORT_C CCharFormatLayer* SystemCharFormatLayerL();
	IMPORT_C static CParaFormatLayer* NewDefaultSingleLineParaFormatLayerL();
	IMPORT_C static CParaFormatLayer* NewDefaultParaFormatLayerL();
	IMPORT_C static CCharFormatLayer* NewDefaultCharFormatLayerL();
	IMPORT_C static void GetPrinterNamesL(CPrinterModelList* aModelNameList,CDesCArray& aPrinterNameList);
  	//
	inline CEikAppUi* EikAppUi() const;
	IMPORT_C void AddDialogLikeControlToStackL(CCoeControl* aControl);
	IMPORT_C void AddAlertDialogLikeControlToStackL(CCoeControl* aControl);
	IMPORT_C void RemoveFromStack(CCoeControl* aControl);
	IMPORT_C void AddSleepingDialogToStackL(CCoeControl* aControl);
	IMPORT_C void AddSleepingAlertDialogToStackL(CCoeControl* aControl);
	IMPORT_C void RouseSleepingDialog(CCoeControl* aControl,TBool aRoused);
	//
	IMPORT_C void DrawCursor(const CCoeControl* aControl,const TPoint& aPosition,TInt aWidth);
	IMPORT_C void DrawCursor(const CCoeControl* aControl,const TPoint& aPosition,TInt aWidth,TInt aAscent,TInt aHeight);
	IMPORT_C void HideCursor(const CCoeControl* aControl);
	//
	IMPORT_C void UpdateTaskNameL();
	//
	IMPORT_C void FillTexturedRect(const TRect& aRect) const;
	IMPORT_C void SetTexturedBrush(CGraphicsContext& aGc) const;
	IMPORT_C void SetContextTextured(MCoeControlBrushContext* aContext) const;
	//
	IMPORT_C CEikCommandButton* CreateStandardTabButtonL() const;
	//
	IMPORT_C void BringForwards(TBool aForwards,TInt aPriority=ECoeWinPriorityAlwaysAtFront);
	IMPORT_C void SetAutoForwarding(TBool aForwarding);
	IMPORT_C TPtrC KeyPressLabel(TInt aIndex) const;
	//
	IMPORT_C CPrintSetup* NewDefaultPrintSetupL();
	IMPORT_C void DisplayTaskList();
	IMPORT_C void SendEventToEikonServer(TInt aEvent,const TAny* aPtr,TInt aLength);
//
	IMPORT_C void SetBusy(TBool aBusy);
	IMPORT_C TBool IsBusy() const;
	IMPORT_C void SetSystem(TBool aSystem);
	IMPORT_C TBool IsSystem() const;
	IMPORT_C void SetDocNameIsAFile(TBool aDocNameIsAFile);
	IMPORT_C TBool DocNameIsAFile() const;
	IMPORT_C void SetRespondsToShutdownEvent(TBool aRespondsToShutdownEvent);
	IMPORT_C TBool RespondsToShutdownEvent() const;
	IMPORT_C void SetRespondsToSwitchFilesEvent(TBool aRespondsToSwitchFilesEvent);
	IMPORT_C TBool RespondsToSwitchFilesEvent() const;

	IMPORT_C void NotifyIdleErrorWhileRedrawing(TInt aError);
	IMPORT_C void NotifyIdleError(TInt aError,TInt aContextRid);
	IMPORT_C void HandleErrorWithContext(TInt aError,TInt aContextRid);

	inline TChar NudgeCharMinus() const;
	inline TChar NudgeCharPlus() const;

	// not available before Release 005
	inline CEikColorList& ColorList() const;
	inline TRgb Color(TEikLogicalColor aLogicalColor) const;
	inline void SetColor(TEikLogicalColor aLogicalColor, TRgb aColor);
	IMPORT_C TRgb ControlColor(TEikLogicalColor aLogicalColor,const CCoeControl& aControl) const;
	//
public: // framework functions
	IMPORT_C void HandleError(TInt aError);
protected: // framework functions
	IMPORT_C void DestroyEnvironment();
private: // framework functions
	IMPORT_C void DestroyScreen();
	IMPORT_C void InitSystemFontsL();
	IMPORT_C TInt ResourceFileVersionNumber() const;
	IMPORT_C void Reserved_1();
	IMPORT_C void Reserved_2();
private: // from MApaAppStarter
	IMPORT_C TThreadId StartAppL(const CApaCommandLine& aCommandLine);
protected:
	friend class CEikServAppUi;
private: // new functions
	void InitSystemResourceFileL();
	void InitPrivateResourceFileL();
	void InitInfoMsgL();
	void PrepareBusyMsgL();
	void InitAlertWinL();
	void SetUpFepL(const CEikApplication& aApplication);
	TErrorHandlerResponse PrepareToHandleError(TInt aError);
	void DoHandleError(TErrorHandlerResponse aType);
	static TInt IdleErrorCallBack(TAny* aThis);
	void InitColorsL();
private:
	TInt iEikonEnvFlags;
	TInt iForwardsCount;
	TInt iBusyCount;
	CEikProcess* iProcess;
	RAnimDll* iClockDll;
	const CFont* iAnnotationFont;
	const CFont* iTitleFont;
	const CFont* iLegendFont;
	const CFont* iSymbolFont;
	const CFont* iDenseFont;
	CEikInfoMsgWin* iInfoMsgWin;
	CEikBusyMsgWin* iBusyMsgWin;
	CEikAlert* iAlertWin;
	const CFbsBitmap* iTexturedBitmap;
	const CFbsBitmap* iGrayBitmap;
	const CFbsBitmap* iOptionBitmap;
	const CFbsBitmap* iHighlightedOptionBitmap;
	const CFbsBitmap* iOptionMaskBitmap;
	TInt iSystemResourceFileOffset;
	HBufC8* iKeyPressLabels;
	CParaFormatLayer* iSingleLineParaFormatLayer;
	CParaFormatLayer* iParaFormatLayer;
	CCharFormatLayer* iCharFormatLayer;
	const CCoeControl* iCursorWindow;
	TInt iEditableControlStandardHeight;
	CApaWindowGroupName* iWgName;
	CEikErrorIdler* iErrorIdler;
	TInt iSpare1;
	TInt iPrivateResourceFileOffset; // used to be iSpare2
	CEikColorList* iColorList; // used to be iSpare3;
	MPictureFactory* iPictureFactory; // used to be iSpare4
	TBuf<2> iNudgeChars;
	CEikExtension* iExtension;
	};

inline CEikonEnv* CEikonEnv::Static()
	{ return((CEikonEnv*)(CCoeEnv::Static())); }
inline const CFont* CEikonEnv::AnnotationFont() const
	{ return(iAnnotationFont); }
inline const CFont* CEikonEnv::TitleFont() const
	{ return(iTitleFont); }
inline const CFont* CEikonEnv::LegendFont() const
	{ return(iLegendFont); }
inline const CFont* CEikonEnv::SymbolFont() const
	{ return(iSymbolFont); }
inline const CFont* CEikonEnv::DenseFont() const
	{ return(iDenseFont); }
inline const CFbsBitmap* CEikonEnv::TexturedBitmap() const
	{ return(iTexturedBitmap); }
inline const CFbsBitmap* CEikonEnv::GrayBitmap() const
	{ return(iGrayBitmap); }
inline const CFbsBitmap* CEikonEnv::OptionBitmap() const
	{ return(iOptionBitmap); }
inline const CFbsBitmap* CEikonEnv::HighlightedOptionBitmap() const
	{ return(iHighlightedOptionBitmap); }
inline const CFbsBitmap* CEikonEnv::OptionMaskBitmap() const
	{ return(iOptionMaskBitmap); }
inline TInt CEikonEnv::EditableControlStandardHeight() const
	{ return(iEditableControlStandardHeight); }
inline CEikAppUi* CEikonEnv::EikAppUi() const
	{ return((CEikAppUi*)iAppUi); }
inline const CEikAlert* CEikonEnv::Alert() const
	{ return(iAlertWin); }
inline TChar CEikonEnv::NudgeCharMinus() const
	{return(iNudgeChars[0]);}
inline TChar CEikonEnv::NudgeCharPlus() const
	{return(iNudgeChars[1]);}
inline TRgb CEikonEnv::Color(TEikLogicalColor aLogicalColor) const
	{return ColorList().Color(aLogicalColor); }
inline CEikColorList& CEikonEnv::ColorList() const
	{__ASSERT_DEBUG(iColorList,User::Invariant()); return *iColorList; }
inline void CEikonEnv::SetColor(TEikLogicalColor aLogicalColor, TRgb aColor)
	{ ColorList().SetColor(aLogicalColor, aColor); }


//this is to save the printer port in inifile.  This is used by eikon print dialogs and shell's default printer dialog
enum TEikPortFlag
	{
	ESerialPort =0x01,
	EParallelPort =0x02,
	EIrdaPort= 0x04,
	EFilePort=0x08
	};

IMPORT_C void InternalizeL(TEikPortFlag& aThing,RReadStream& aStream);
inline RWriteStream& operator<<(RWriteStream& aStream,const TEikPortFlag& aThing)
	{aStream.WriteUint8L(aThing);return aStream;}
inline RReadStream& operator>>(RReadStream& aStream,TEikPortFlag& aThing)
	{InternalizeL(aThing,aStream);return aStream;}

#endif
