// BOSS.H
//
// Copyright (c) 1998 Symbian Ltd.  All rights reserved.
//

#ifndef __BOSS_H
#define __BOSS_H

#include <coecntrl.h>
#include <coeccntx.h>

#include <eikappui.h>
#include <eikapp.h>
#include <eikdoc.h>

#include "bossview.h"
#include "bosseng.h"

// UID of app, also of game state
const TUid KUidBossApp= { 0x10000253 } ;
// UID of print setup information
const TUid KUidBossPrintSetupStream= { 0x10000254 } ;

//
// class CBossAppView
//

class CBossAppView : public CCoeControl, public MCoeControlBrushContext, public MBossControlObserver
    {
public:
    void ConstructL(const TRect& aRect, TBossPuzzle* aModel);
    ~CBossAppView();
	// changing view
	void ConstructViewL();
	// various types of update
	void Move(TBossPuzzle::TMoveType aMoveType);
	void SetFullyOrdered();
	void SetBossOrdered();
public:
	void NotifyStatus(const TDesC& aMessage);
private: // from MBossControlObserver
	void BCOMove(TInt aRow, TInt aCol);
	void BCOMove(TBossPuzzle::TMoveType aMoveType);
private: // from CCoeControl
	void Draw(const TRect& /*aRect*/) const;
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
    TInt CountComponentControls() const;
    CCoeControl* ComponentControl(TInt aIndex) const;
private: // new function
	void CreateLabelL();
	void MoveChecked(TBossPuzzle::TMoveType aMoveType); // do a checked move
private: // data
	TBossPuzzle* iModel; // model we're working with
	CBossView* iView; // view of boss puzzle
	CBossControl* iControl; // control
    };

//
//	class CBossBandPrinter
//

class CBossBandPrinter : public CBase, public MPageRegionPrinter
    {
public:
	CBossBandPrinter(TBossPuzzle* aModel,CPrintSetup* aPrintSetup);
	void ConstructL();
	~CBossBandPrinter();
private: // from MPageRegionPrinter
	void PrintBandL(CGraphicsDevice* aLayoutDevice,TInt aPageNo,const TBandAttributes& aBand);
private:
	TBossPuzzle* iModel;
	CPrintSetup* iPrintSetup; // Print setup information - owned by document
	CBossView* iView; // view of boss puzzle - drawn to printer
    };

//
// CBossAppUi
//

class CBossDocument;

class CBossAppUi : public CEikAppUi, public MPrintPreviewDialogObserver
    {
public:
    void ConstructL();
	~CBossAppUi();
private: // from CEikAppUi
	void HandleCommandL(TInt aCommand);
	TBool ProcessCommandParametersL(TApaCommand aCommand,TFileName& aDocumentName,const TDesC& aTail);
	void HandleModelChangeL();
private: // new
	CBossDocument* BossDocument() {return (CBossDocument*) Document();}
	TFileName MainDocPath() const;
private: // from MPrintPreviewDialogObserver
	TBool PageSetupChangedL(CPrintSetup* aPrintSetup, TInt &aNumOfPages);
	TBool RunPrintRangeDialogL(CPrintSetup* aPrintSetup, TInt& aNumPagesInDoc);
private: // print commands
	void HandleCmdPageSetupL();
	void HandleCmdPrintPreviewL();
	void HandleCmdPrintL();
	void HandleCmdPrintSetupL();
	void DoPrintL(const TPrintParameters& aPrintParameters);
	TBool DoPrintSetup(CPrintSetup* aPrintSetup, TBool aPrintWanted);
private:
    CBossAppView* iAppView;
	TBossPuzzle* iModel;
    };

//
// CBossDocument
//

class CBossDocument : public CEikDocument
	{
public:
	// construct/destruct
	CBossDocument(CEikApplication& aApp): CEikDocument(aApp) { }
	void ConstructL();
	~CBossDocument();
	// model
	TBossPuzzle* Model() { return(&iModel); }
	// printing
	CBossBandPrinter* BossBandPrinter() {return iBossPrinter;}
	CPrintSetup* PrintSetup() {return iPrintSetup;}
	TInt NumPages()	{return iNumPages;}
private: // from CEikDocument
	CEikAppUi* CreateAppUiL();
private: // from CApaDocument
	void StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDic) const;
	void RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic);
	TCapability Capability() const;
	CPicture* GlassPictureL();
	void InitializePrintSetupL();
public:
	TPrintParameters iPrintParameters; // number of copies etc; not persisted
private:
	TInt iNumPages;
	CBossBandPrinter* iBossPrinter;
	// persisted data
	TBossPuzzle iModel; // under KUidBossApp stream
	CPrintSetup* iPrintSetup; // under KUidBossPrintSetupStream stream
	};

class CBossGlassDoor : public CPicture
	{
public:
	// construct/destruct
	CBossGlassDoor(TBossPuzzle* aModel);
	void ConstructL();
	~CBossGlassDoor();
private:	// from CPicture
	void Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,MGraphicsDeviceMap* aMap) const;
	inline void ExternalizeL(RWriteStream& ) const {};
	void GetOriginalSizeInTwips(TSize& aSize) const;
	TPictureCapability Capability() const;
	void SetScaleFactor(TInt aScaleFactorWidth,TInt aScaleFactorHeight);
	TInt ScaleFactorWidth() const;
	TInt ScaleFactorHeight() const;
private:
	TBossPuzzle* iModel;
	CBossView* iView;
	TInt iScaleFactorWidth;
	TInt iScaleFactorHeight;
	};

//
// CBossApplication
//

class CBossApplication : public CEikApplication
	{
private: // from CApaApplication
	CApaDocument* CreateDocumentL();
	TUid AppDllUid() const;
	};

#endif
