/* included from Unit1.cpp */
#include <windows.h>
#include "AnsiString.h"

typedef void TObject;	/* この型のポインタは決して使用しない */

enum TMouseButton { mbLeft, mbRight, mbMiddle };

typedef int TShiftState; /* C++Builderの実装とは異なる */
#define ssShift		MK_SHIFT
#define ssCtrl		MK_CONTROL
#define ssLeft		MK_LBUTTON
#define ssMiddle	MK_MBUTTON
#define ssRight		MK_RBUTTON

typedef COLORREF TColor;	/* 32ビット */
enum {
    clAqua=0x00FFFF00,		clBlack=0x00000000,
    clBlue=0x00FF0000,		clDkGray=0x00808080,
    clFuchsia=0x00FF00FF,	clGray=0x00808080,
    clGreen=0x00008000,		clLime=0x0000FF00,
    clLtGray=0x00C0C0C0,	clMaroon=0x00000080,
    clNavy=0x00800000,		clOlive=0x00008080,
    clPurple=0x00800080,	clRed=0x000000FF,
    clSilver=0x00C0C0C0,	clTeal=0x00808000,
    clWhite=0x00FFFFFF, 	clYellow=0x0000FFFF,
    clBackground=0x80000001,  	clActiveCaption=0x80000002,
    clInactiveCaption=0x80000003,	clMenu=0x80000004,
    clWindow=0x80000005 , 	clWindowFrame=0x80000006, 
    clMenuText=0x80000007, 	clWindowText=0x80000008,
    clCaptionText=0x80000009, 	clActiveBorder=0x8000000A,
    clInactiveBorder=0x8000000B, 	clAppWorkSpace=0x8000000C,
    clHighlight=0x8000000D, 	clHighlightText=0x8000000E,
    clBtnFace=0x8000000F, 	clBtnShadow=0x80000010,
    clGrayText=0x80000011, 	clBtnText=0x80000012,
    clInactiveCaptionText=0x80000013, 	clBtnHighlight=0x80000014,
    cl3DDkShadow=0x80000015, 	cl3DLight=0x80000016,
    clInfoText=0x80000017, 	clInfoBk=0x80000018};

static int ColorTable[] =
{ COLOR_BACKGROUND, COLOR_ACTIVECAPTION,
  COLOR_INACTIVECAPTION, COLOR_MENU, COLOR_WINDOW, COLOR_WINDOWFRAME,
  COLOR_MENUTEXT, COLOR_WINDOWTEXT, COLOR_CAPTIONTEXT,
  COLOR_ACTIVEBORDER, COLOR_INACTIVEBORDER, COLOR_APPWORKSPACE,
  COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT, COLOR_BTNFACE, COLOR_BTNSHADOW,
  COLOR_GRAYTEXT, COLOR_BTNTEXT, COLOR_INACTIVECAPTIONTEXT,
  COLOR_BTNHIGHLIGHT, COLOR_3DDKSHADOW, COLOR_3DLIGHT, COLOR_INFOTEXT,
  COLOR_INFOBK};

enum TPenStyle { psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear,
		 psInsideFrame };
static int PenStyleTable[] = { PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT,
			       PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME };

enum TPenMode { pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy,
		pmMergePenNot, pmMaskPenNot, pmMergeNotPen, pmMaskNotPen,
		pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor };
static int PenModeTable[] = { R2_BLACK, R2_WHITE, R2_NOP, R2_NOT, R2_COPYPEN,
		R2_NOTCOPYPEN, R2_MERGEPENNOT, R2_MASKPENNOT, R2_MERGENOTPEN,
		R2_MASKNOTPEN, R2_MERGEPEN, R2_NOTMERGEPEN, R2_MASKPEN, 
		R2_NOTMASKPEN, R2_XORPEN, R2_NOTXORPEN};

class TPen {
public:
    TColor Color;
    TPenStyle Style;
    TPenMode Mode;
    int Width;
    HPEN Handle;
    void Update(HDC);
    TPen () {
	Color=clBlack;
	Style=psSolid;
	Mode=pmCopy;
	Width=0;
	Handle = (HPEN)GetStockObject(BLACK_PEN);
    }
};

typedef int TFontStyles; /* C++Builderの実装とは異なる。*/
#define fsBold 	(1)
#define fsItalic 	(1<<1)
#define fsUnderline	(1<<2)
#define fsStrikeOut	(1<<3)

class TFont {
public:
    TColor Color;
    int Size;
    TFontStyles Style;
    HFONT Handle;
    void Update(HDC);
    TFont() {
	Color = clBlack;
	Size = 18;
	Style = 0; /* 何もない Style */
	Handle = (HFONT)GetStockObject(SYSTEM_FONT);
    }
};

enum TBrushStyle {bsSolid, bsCross, bsClear, bsDiagCross, bsBDiagonal, bsHorizontal,
		  bsFDiagonal, bsVertical};
static int BrushStyleTable[] =
{ 0, HS_CROSS, 0, HS_DIAGCROSS, HS_BDIAGONAL, HS_HORIZONTAL,
  HS_FDIAGONAL, HS_VERTICAL};

class TBrush {
public:
    TColor Color;
    TBrushStyle Style;
    HBRUSH Handle;
    void Update(HDC);
    TBrush() {
	Color = clBlack;
	Style = bsSolid;
	Handle = (HBRUSH)(GetStockObject(BLACK_BRUSH));
    }
};

struct TRect  {
    int Left;
    int Top;
    int Right;
    int Bottom;
};

class TCanvas {
public:
    TFont* Font;
    TPen* Pen;
    TBrush* Brush;
    HDC Handle;
    void Update();
    void TextOut(int x, int y, AnsiString str);
    void LineTo(int x, int y);
    void MoveTo(int x, int y);    
    void Rectangle(int x1, int y1, int x2, int y2);
    void FrameRect(TRect rect);
    void FillRect(TRect rect);
    void Ellipse(int x1, int y1, int x2, int y2);
    void Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
    void Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
    void Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
    void Polyline(const POINT *Points, const int n);
    void Polygon(const POINT *Points, const int n);
    void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3);
    void PolyBezier(const POINT *Points, const int n);
    void PolyBezierTo(const POINT *Points, const int n);
};

class TTimer {
private:
    UINT id;
    UINT Interval;		/* 符号なし 32ビット、単位ミリ秒 */
    bool Enabled;
public:
    void SetEnabled(bool b);
    bool GetEnabled() {
	return Enabled;
    }
    void SetInterval(UINT i);
    UINT GetInterval() {
	return Interval;
    }
    TTimer() {
      Interval=1000;
      Enabled=false;	
    }
};

class TForm {
public:
    TColor Color;
    TCanvas* Canvas;
    TTimer* Timer;
    HWND Handle;
    int Width;
    int Height;

    TForm();
    /* virtual */ void Close();
    /* virtual */ void Repaint();
    /* virtual */ void FormCreate(TObject* sender);
    /* virtual */ void FormPaint(TObject* sender);
    /* virtual */ void FormKeyDown(TObject* sender, WORD key,
				   TShiftState shift);
    /* virtual */ void FormMouseDown(TObject* sender, TMouseButton which,
				     TShiftState shift, int x, int y);
    /* virtual */ void TimerTimer(TObject* sender);
};

AnsiString InputBox(AnsiString title, AnsiString message, AnsiString init);
void  ShowMessage(AnsiString message);
TRect Rect(int ALeft, int ATop, int ARight, int ABottom);
POINT Point(int lx, int ly);

int _argc;
char** _argv;
