// ---------------------------------------------------------------------------
//  M88 - PC-8801 emulator
//	Copyright (C) cisc 1998, 2000.
// ---------------------------------------------------------------------------
//	$Id: winmon.h,v 1.4 2002/04/07 05:40:11 cisc Exp $

#pragma once

//	概要：
//	デバッグ表示のために使用するテキストウィンドウの管理用基本クラス
//	機能：
//	テキストバッファ，差分更新，スクロールバーサポート

#include "types.h"

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

class WinMonitor
{
public:
	WinMonitor();
	~WinMonitor();

	// inisection を渡すと、ウインドウ位置・サイズ・フォントサイズを
	// M88.ini の [inisection] に保存/復元するようになる(NULL なら保存しない)
	// defcols/defrows は INI に保存位置が無いときの初期サイズを
	// 「文字数×行数」で指定する(0 ならダイアログテンプレートの寸法のまま)
	bool Init(LPCTSTR tmpl, const char* inisection = 0,
			  int defcols = 0, int defrows = 0);
	void Show(HINSTANCE, HWND, bool show);

	bool IsOpen() { return !!hwnd; }

	void Update();

protected:
	// 派生クラスでオーバーライドして独自の保存項目を足せるように virtual にしてある
	// (例: CodeMonitor が PCFollow の ON/OFF を足す)
	virtual void LoadMonitorConfig();
	virtual void SaveMonitorConfig();

	void Locate(int x, int y);
	void Puts(const char*);
	void Putf(const char*, ...);

	void SetTxCol(COLORREF col) { txcol = col; }
	void SetBkCol(COLORREF col) { bkcol = col; }

	int  GetWidth() { return width; }
	int  GetHeight() { return height; }
	int  GetLine() { return line; }
	void SetLine(int l);
	void SetLines(int nlines);
	bool GetTextPos(POINT*);
	bool EnableStatus(bool);
	bool PutStatus(const char* text, ...);

	bool SetFont(HWND hwnd, int fh);

	void ClearText();

	int  GetScrPos(bool tracking);
	void ScrollUp();
	void ScrollDown();

	void SetUpdateTimer(int t);

	// ホイール入力の処理。処理したら true
	bool ProcMouseWheel(WPARAM wp);

	virtual void DrawMain(HDC, bool = false);
	virtual BOOL DlgProc(HWND, UINT, WPARAM, LPARAM);

	HWND GetHWnd() { return hwnd; }
	HWND GetHWndStatus() { return hwndstatus; }
	HINSTANCE GetHInst() { return hinst; }

private:
	virtual void UpdateText();
	virtual int VerticalScroll(int msg);
	virtual void Start() {}
	virtual void Stop() {}

	static BOOL CALLBACK DlgProcGate(HWND, UINT, WPARAM, LPARAM);

	void Draw(HWND, HDC);
	void ResizeWindow(HWND);
	void ApplyDefaultSize();

	// Ctrl+ホイールでのフォントサイズ変更(fontsizetable 上で dir 段階動かす)
	void ChangeFontSize(int dir);

	HWND hwnd;
	HWND hwndowner;			// Show() で受け取った親(メインウインドウ)
	HINSTANCE hinst;
	LPCTSTR lptemplate;

	HWND hwndstatus;
	char statusbuf[128];

	int clientwidth;
	int clientheight;

	HDC hdc;
	HFONT hfont;
	int fontwidth;
	int fontheight;		// メニュー・INI 用の論理フォント高さ(DPIスケール前)
	int fontheightpx;	// 描画に使う実測ピクセル高さ(DPIスケール後)

	HBITMAP hbitmap;

	struct TXCHAR
	{
		char ch;
		COLORREF txcol;
		COLORREF bkcol;
	};

	TXCHAR* txtbuf;
	TXCHAR* txpbuf;
	TXCHAR* txtbufptr;
	POINT txp;
	int width;
	int height;

	COLORREF txcol, txcolprev;
	COLORREF bkcol, bkcolprev;

	RECT wndrect;

	int line;
	int nlines;

	UINT_PTR timer;
	int timerinterval;

	int wheeldelta;      // ホイールの端数累積（120未満の delta を貯める）

	const char* inisection;	// 位置・サイズ・フォントの保存先セクション名(NULLなら保存しない)

	int defcols;		// 初期サイズ(文字数)。0 ならテンプレート任せ
	int defrows;		// 初期サイズ(行数)
};

