//////////////////////////////////////////
// User.h for EZImage
// Copyright (c) 03/01/2021 by BCCSkelton
//////////////////////////////////////////

//定数定義
#define	MAX_UNDO	2048	//Undoの回数限度

/////////////////////
//グローバル変数
/////////////////////

//システム関連
bool g_ByFile = FALSE;				//ファイルドロップによる起動フラグ
char g_IniFile[MAX_PATH];			//iniファイルのファイル、パス名
char g_FileName[MAX_PATH];			//ファイル名
char g_HelpFile[MAX_PATH];			//ヘルプファイルのファイル、パス名
HMENU g_hDisplayMenu;				//「表示」メニューのハンドル
//ウィンドウ表示関連
int g_ClientW = 0;					//クライアント領域幅
int	g_ClientH = 0;					//クライアント領域高
int g_HMargin = 0;					//ウィンドウ−クライアント領域差
int	g_VMargin = 0;					//ウィンドウ−クライアント領域差
int g_DrawX = 0;					//拡大表示領域の左上x座標
int g_DrawY = 0;					//拡大表示領域の左上y座標
int g_DrawW = 0;					//拡大表示領域の幅
int g_DrawH = 0;					//拡大表示領域の高さ
int g_DUnit = 0;					//升目の幅
int g_BmpX = 0, g_BmpY = 0;			//原寸ビットマップ表示領域のx、y座標
int g_CpX = 0, g_CpY = 0;			//カラーパレット描画位置
//イメージ管理関連
CBMPEX g_Bmp;						//CBMPクラスのインスタンス(メインのビットマップ管理用）
int g_ImageType = 0;				//イメージタイプ（ビットマップ−0、アイコン−1、カーソル−2）
int g_BmpCol = 32;					//ビットマップの色数またはビット数（通常1,4,8,24で後に16,32が追加−BITMAP.bmBitsPixel、BITMAPINFOHEADER.biBitCount）
int g_Size = 32;					//ビットマップのサイズ（16又は32）
int g_hsx = 0;						//アイコンのホットスポットx座標
int g_hsy = 0;						//アイコンのホットスポットy座標
//操作モード関連
bool g_GetCol = FALSE;				//色取得フラグ
bool g_On = FALSE;					//DrawFocusRect用の描画フラグ
POINT g_Drag;						//範囲指定開始位置
int g_sx, g_sy;						//ビットマップ領域の描画開始位置
int g_ex, g_ey;						//ビットマップ領域の描画終了位置
//イメージの一部のコピー、ペースト関連（多重コピペを許す場合、g_CopPasを配列にする）
CBMP g_CopPas;						//Copy and Paste用のビットマップ
//描画管理関連
int g_Cmd = IDM_DOT;				//描画コマンドのID
int g_OldCmd = 0;					//描画コマンドの退避場所
//Undo関連
HBITMAP g_Undo[MAX_UNDO] = {0};		//Undoビットマップハンドル
int g_UndoPtr = 0;					//Undoビットマップハンドルポインター
int g_FnPtr = 0;					//Undo用ファイル名記録ポインター
int g_NumUndo[MAX_UNDO / 4];		//g_UndoPtr用配列
char g_FName[MAX_UNDO / 4][MAX_PATH];	//Undo用ファイル名配列
//カーソル関連
HCURSOR g_hSpoit;

//////////////////////////////////
//仮想ウィンドウ既定16色を選択する
//////////////////////////////////
COLORREF Set16Col(int Col) {

	COLORREF Color;
	switch(Col) {
	case 0:	//黒
		Color = RGB(0, 0, 0);
		break;
	case 1:	//青
		Color = RGB(0, 0, 128);
		break;
	case 2:	//赤
		Color = RGB(128, 0, 0);
		break;
	case 3:	//マゼンダ
		Color = RGB(128, 0, 128);
		break;
	case 4:	//緑
		Color = RGB(0, 128, 0);
		break;
	case 5:	//シアン
		Color = RGB(0, 128, 128);
		break;
	case 6:	//黄色
		Color = RGB(128, 128, 0);
		break;
	case 7:	//明るい灰色
		Color = RGB(192, 192, 192);
		break;
	case 8:	//暗い灰色
		Color = RGB(128, 128, 128);
		break;
	case 9:	//明るい青
		Color = RGB(0, 0, 255);
		break;
	case 10:	//明るい赤
		Color = RGB(255, 0, 0);
		break;
	case 11:	//明るいマゼンダ
		Color = RGB(255, 0, 255);
		break;
	case 12:	//明るい緑
		Color = RGB(0, 255, 0);
		break;
	case 13:	//明るいシアン
		Color = RGB(0, 255, 255);
		break;
	case 14:	//明るい黄色
		Color = RGB(255, 255, 0);
		break;
	case 15:	//白
		Color = RGB(255, 255, 255);
		break;
	}
	return Color;
}

/////////////////////////////////////
//ウィンドウにWM_SIZEメッセージを送る
/////////////////////////////////////
void SetSize(HWND hWnd) {

	RECT rect;				//WM_SIZEを呼ぶ
	GetClientRect(hWnd, &rect);
	SendMessage(hWnd, WM_SIZE, SIZE_RESTORED, MAKELONG(rect.right - rect.left, rect.bottom - rect.top));
}

//////////////////////////////////
//ツールバーボタンの状態を変更する
//////////////////////////////////
void ChangeTBState(bool flag) {

	UINT state;
	if(flag) {
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_GETCOL, (LPARAM)TBSTATE_ENABLED);
		state= TBSTATE_ENABLED;
	}
	else {
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_GETCOL, (LPARAM)TBSTATE_PRESSED);
		state= TBSTATE_INDETERMINATE;
	}
	if(g_UndoPtr > 0)
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_UNDO, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_COPY, (LPARAM)state);
    if(g_CopPas.Handle())
		SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PASTE, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_DOT, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_LINE, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_BOX, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_ELLIPSE, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_BOXF, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_ELLIPSEF, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_PAINT, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_COLDLG, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SHIFTR, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SHIFTL, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SHIFTU, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_SHIFTD, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_LANDR, (LPARAM)state);
	SendMessage(TBar.GetHandle(), TB_SETSTATE, IDM_UANDD, (LPARAM)state);
}

///////////////////////
//選択コマンド変更処理
///////////////////////
void ChangeCmdCheck(HWND hWnd, UINT newCmd) {

	//ツールバーとメニューの既選択コマンドを解除し、新しい選択状態にする
	SendMessage(TBar.GetHandle(), TB_SETSTATE, g_Cmd, MAKELONG(TBSTATE_ENABLED, 0));
	CheckMenuItem(GetSubMenu(GetSubMenu(GetMenu(hWnd), 1), 4), g_Cmd, MF_BYCOMMAND | MF_UNCHECKED);
	g_Cmd = newCmd;
	SendMessage(TBar.GetHandle(), TB_SETSTATE, g_Cmd, MAKELONG(TBSTATE_ENABLED | TBSTATE_PRESSED, 0));
	CheckMenuItem(GetSubMenu(GetSubMenu(GetMenu(hWnd), 1), 4), g_Cmd, MF_BYCOMMAND | MF_CHECKED);
}

void SetFileName(int Ptr, char* FileName) {

	if(g_FnPtr < MAX_UNDO / 4) {
		g_NumUndo[g_FnPtr] = Ptr;
		lstrcpy(g_FName[g_FnPtr], FileName);
    	g_FnPtr++;
	}
	else
		MessageBox(EZImage.GetHandle(), "これ以上ファイル名の記録はできません", "警告", MB_OK | MB_ICONSTOP);
}

bool CheckandGetFileName(int Ptr, char* FileName) {

	//今のファイル名登録よりも前になった場合
	if(Ptr < g_NumUndo[g_FnPtr - 1]) {
		if(g_FnPtr > 1) {
			*g_FName[g_FnPtr - 1] = 0;			//最後の登録ファイル名を破棄
			g_FnPtr--;							//ポインターひとつを戻す
			lstrcpy(FileName, g_FName[g_FnPtr - 1]);	//その前のファイル名を返す
			return TRUE;
		}
    	else //g_FnPtr == 1（g_FName[0] == "新規ファイル"）の場合
			return FALSE;
	}
}

#include	"IconView_DLL.h"
