//---------------------------------------------------------------------------

#ifndef MainFormH
#define MainFormH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <ComCtrls.hpp>
#include <ToolWin.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include <ImgList.hpp>
#include <ActnList.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <ExtDlgs.hpp>
#include <Graphics.hpp>
#include <System.Actions.hpp>
//---------------------------------------------------------------------------

enum CELL_TYPE {ctEMPTY, ctOBSTACLE, ctCHARACTER, ctENEMY, ctPRIZE};

struct ColorID
{
	CELL_TYPE type;
	TColor color;
};

class TfrmMain : public TForm
{
__published:	// IDE-managed Components
	TStatusBar *barStatus;
	TPageControl *pgeWorld;
	TTabSheet *shtPier;
	TPanel *pnlWorld;
	TDrawGrid *gridWorld;
	TPanel *pnlBottom;
	TSplitter *splitHorizontal;
	TMemo *mmoStatus;
	TToolBar *barColors;
	TToolButton *btnEmpty;
	TToolButton *btnObstacle;
	TToolButton *btnCharacter;
	TToolButton *btnEnemy;
	TToolButton *btnPrize;
	TImageList *lstImages;
	TActionList *lstActions;
	TMainMenu *mnuMain;
	TAction *actFileOpen;
	TAction *actFileSave;
	TAction *actFileNew;
	TAction *actFileExit;
	TAction *actFileSaveAs;
	TMenuItem *mnuFile;
	TMenuItem *mnuFileNew;
	TMenuItem *mnuFileOpen;
	TMenuItem *mnuFileSave;
	TMenuItem *mnuFileSaveAs;
	TMenuItem *N1;
	TMenuItem *mnuFileExit;
	TLabel *lblRows;
	TEdit *edtRows;
	TUpDown *spnRows;
	TLabel *lblColumns;
	TEdit *edtColumns;
	TUpDown *spnColumns;
	TOpenDialog *dlgFileOpen;
	TSaveTextFileDialog *dlgFileSaveText;
	TToolBar *barMainTools;
	TToolButton *btnFileNew;
	TToolButton *btnFileOpen;
	TToolButton *btnFileSave;
	TToolButton *btnFileSaveAs;
	TToolButton *btnSep1;
	TImageList *lstColors;
	TToolButton *btnTest;
	TAction *actTest;
	TAction *actShowGrid;
	TToolButton *btnDUMMY;
	TToolButton *btnGrid;
	TImage *imgPrize;
	TAction *actHelpAbout;
	TMenuItem *mnuHelp;
	TMenuItem *mnuHelpAbout;
	void __fastcall FormCreate(TObject *Sender);
	void __fastcall shtPierResize(TObject *Sender);
	void __fastcall OnCellCountChange(TObject *Sender);
	void __fastcall gridWorldDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State);
	void __fastcall gridWorldSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect);
	void __fastcall splitHorizontalMoved(TObject *Sender);
	void __fastcall gridWorldMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
	void __fastcall gridWorldMouseLeave(TObject *Sender);
	void __fastcall gridWorldMouseEnter(TObject *Sender);
	void __fastcall ColorChange(TObject *Sender);
	void __fastcall actFileOpenExecute(TObject *Sender);
	void __fastcall actFileSaveExecute(TObject *Sender);
	void __fastcall actTestExecute(TObject *Sender);
	void __fastcall actFileNewExecute(TObject *Sender);
	void __fastcall actShowGridExecute(TObject *Sender);
	void __fastcall gridWorldMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
	void __fastcall actHelpAboutExecute(TObject *Sender);
private:
		// Some limitations (for now)
	static const int FMaxRows = 201;
	static const int FMaxColumns = 201;

	int FDataMap[FMaxRows][FMaxColumns];  // Hold the values of the cells

	int FCellWidth;  // Width of a grid cell
	int FCellHeight; // Heigth of a grid cell
	short FRows;     // Number of rows in the grid
	short FColumns;  // Number of columns in the grid
	int FCurrRow;    // Currently selected row
	int FCurrColumn; // Currently selected column
	int FPrevRow;    // Previously selected row
	int FPrevColumn; // Previously selected column

	bool FOffGrid;        // mouse on/off the grid
	bool FShowGrid;       // Grid lines on/off
	TColor FGridColor;    // Color of the grid lines
	ColorID FCurrColorID; // Currently selected color (type)

	AnsiString FCurrFileName; // The filename to save the data to

	void Init(void);
	void AdjustGrid(void);
	void UpdateCurrentCellDisplay(void);
	void AddStatus(const char *text);
	void HighlightCell(bool Force = false);
	void ChangeGrid(bool Show);

	bool ImportMapData(const AnsiString &FileName);
	bool ExportMapData(const AnsiString &FileName);

	void __fastcall WMDropFiles(TWMDropFiles &Message);

public:
	__fastcall TfrmMain(TComponent* Owner);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmMain *frmMain;
//---------------------------------------------------------------------------
#endif

