//
//	ToolLib.cpp
//
//	エディター共通処理 - ツールのGUI処理の統括部分
//
//	* Tue Apr 18 21:46:46 JST 2017 Naoyuki Sawa
//	- 1st リリース。
//	* Wed Apr 19 22:11:14 JST 2017 Naoyuki Sawa
//	- 「①DxLibに依存しないようにする」と「②C言語でコンパイル出来るようにする」を対応しました。
//	  詳細は、/clip/ToolLib/README.TXT の、同日のコメントを参照して下さい。
//	* Thu Apr 20 21:31:57 JST 2017 Naoyuki Sawa
//	- 当ライブラリが生成するオブジェクトの識別子を、整数ハンドル⇒ポインタに変更しました。
//	  オリジナル版では生成したオブジェクトを固定長配列に格納して管理していたのですが、メモリ節約のためにリストで管理するように変更し、そのためには整数ハンドルよりもポインタの方が都合が良いからです。
//	  尚、フォントハンドルと文字列入力ハンドルは、当ライブラリが生成するオブジェクトではなくバックエンドのオブジェクトなので、今回の変更には関係無く整数ハンドルのままです。
//	- GetMouseInputLog()の使用をやめて、マウスのボタンが押された瞬間の情報もGetMouseInput()とGetMousePoint()から求めるようにしました。
//	  そうした理由は、以下の通りです。
//	  ・GetMouseInputLog()はDxLibに依存し過ぎていて、DxLib以外の環境でバックエンドを作成するのが難しいからです。
//	  ・DxLib環境であっても、アプリケーション側のメインループでGetMouseInputLog()を使用していると、そこでイベントが消費されてしまい、当モジュールがGetMouseInputLog()を呼び出してもイベントが取得出来ない問題が発生し易いからです。
//	  ・アプリケーションが30FPS以上ぐらいで回っていれば、GetMouseInputLog()を使わなくても、GetMouseInput()とGetMousePoint()から求める方法でも充分な精度が得られるからです。
//	  ・元々オリジナル版のToolLibでも、実際にGetMouseInputLog()に依存する動作となっていたのはToolLib_Listだけで、他のウィジットはGetMouseInputLog()に依存しない動作だったので、今回の変更による影響はほとんど無いと思ったからです。
//	* Fri Apr 21 21:38:57 JST 2017 Naoyuki Sawa
//	- アプリケーション定義の関数'SToolInfo.fnGetNowCount()'を廃止しました。
//	  時刻を取得する関数を提供しなくても、Tool_Step()の引数StepTimeから、当ライブラリの処理に必要な経過時間は求められるからです。
//	  この変更に伴い、内部使用関数'ToolStatic_GetNowTime()'を追加しました。
//	* Fri Apr 21 22:01:07 JST 2017 Naoyuki Sawa
//	- 文字列入力ハンドルを使う機能を使用しない場合は、ToolStatic_GetMouseDoubleClick(),ToolStatic_GetMouseSelectStartPosition(),ToolStatic_GetKeyInputCursorPos()を定義しないようにしました。
//	  これらの内部処理関数はToolLib_StringInput.cモジュールからのみ使用されており、ToolLib_StringInput.cモジュールを使用しない場合はこれらの内部処理関数も不要だからです。
//
#include "clip.h"
//*****************************************************************************
//	定数、マクロ、構造体
//*****************************************************************************
#define TOOL_BASE_RIGHT_X		(350)	//サイズ変更可能な表示領域の初期右端X座標。
#define TOOL_BASE_RIGHT_X_SPACE		(50)	//サイズ変更可能な表示領域を最大まで広くした場合の右端の余白。
#define TOOL_BASE_RIGHT_BAR_WIDTH	(4)	//サイズ変更可能な表示領域のサイズ変更帯の幅。
#define TOOL_DOUBLE_CLICK_TIME		(0.4)	//ダブルクリックされたと判断するクリックとクリックの間隔。(単位:秒)
//-----------------------------------------------------------------------------
//ToolLib管理用構造体
typedef struct _SToolManage {
	const SToolInfo*	pToolInfo;				//初期化情報ポインタ。
	double			NowTime;				//通算経過時間。(単位:秒)
	int			BaseRightX;				//サイズ変更可能な表示領域の右端X座標。
	int			BaseRightGrip;				//サイズ変更可能な表示領域のサイズ変更帯を掴んでいるかどうか。
	int			BaseRightGripX;				//サイズ変更可能な表示領域のサイズ変更帯を掴んだときの右端X座標。
	int			BaseRightGripMouseX;			//サイズ変更可能な表示領域のサイズ変更帯を掴んだときのマウスのX座標。
	int			MouseInput;				//マウスのボタン入力状態。
	int			MouseEdgeInput;				//マウスのボタン入力状態(押された瞬間のボタンのみ)。
	int			MouseX, MouseY;				//マウスカーソルの座標。
	int			MouseMovX, MouseMovY;			//マウスカーソルの座標移動量。
#ifdef  TOOLLIB_USE_STRINGINPUT
	double			MouseClickTime;				//マウスの左クリックがされたときの時間。(単位:秒)
	int			MouseDoubleClick;			//ダブルクリックがされたかどうか。
	int			MouseSelectStartX, MouseSelectStartY;	//マウスの選択開始座標。
	int			MouseSelectEndX, MouseSelectEndY;	//マウスの選択終了座標。
#endif//TOOLLIB_USE_STRINGINPUT
} SToolManage;
//*****************************************************************************
//	ローカル変数
//*****************************************************************************
static SToolManage	g_ToolManage;
//*****************************************************************************
//	アプリケーション用関数
//*****************************************************************************
//ツール用処理の初期化を行う。
void Tool_Initialize(const SToolInfo* pToolInfo) {
	//構造体をクリアする。
	memset(&g_ToolManage, 0, sizeof g_ToolManage);
	//初期化情報ポインタを格納する。
	g_ToolManage.pToolInfo = pToolInfo;
	//サイズ変更可能な表示領域の右端X座標の初期化。
	g_ToolManage.BaseRightX = TOOL_BASE_RIGHT_X;
}
//-----------------------------------------------------------------------------
//ツール用処理の後始末を行う。
void Tool_Terminate() {
#ifdef  TOOLLIB_USE_STRINGINPUT
	//全てのファイル選択情報の削除処理を行う。
	ToolFileSelect_Delete_All();
	//全てのパラメータバー情報の削除処理を行う。
	ToolParamBar_Delete_All();
	//全ての文字列入力情報の削除処理を行う。
	ToolStringInput_Delete_All();
#endif//TOOLLIB_USE_STRINGINPUT
	//全てのリスト情報の削除処理を行う。
	ToolList_Delete_All();
	//全てのボタン情報の削除処理を行う。
	ToolButton_Delete_All();
	//全てのウインドウ情報の削除処理を行う。
	ToolWindow_Delete_All();
	//全ての表示状態情報の削除処理を行う。
	ToolVisible_Delete_All();
	//全てのスペース管理情報の削除処理を行う。
	ToolSpaceManage_Delete_All();
}
//-----------------------------------------------------------------------------
//ツール用処理の状態推移処理を行う。
//[in]
//	StepTime		進める時間。(単位:秒)
void Tool_Step(double StepTime) {
	int MouseX, MouseY;
	int ScreenWidth, ScreenHeight;
	//通算経過時間を加算する。
	g_ToolManage.NowTime += StepTime;
	//前回のマウスのボタン入力を保存。
	g_ToolManage.MouseEdgeInput = g_ToolManage.MouseInput;
	//マウスのボタン入力を取得。
	g_ToolManage.MouseInput = ToolFunc_GetMouseInput();
	//マウスのボタン入力状態(押された瞬間のボタンのみ)を算出。
	g_ToolManage.MouseEdgeInput ^= g_ToolManage.MouseInput;
	g_ToolManage.MouseEdgeInput &= g_ToolManage.MouseInput;
	//マウスカーソルの座標を取得。
	ToolFunc_GetMousePoint(&MouseX, &MouseY);
	//前回からの座標移動量を算出。
	g_ToolManage.MouseMovX = MouseX - g_ToolManage.MouseX;
	g_ToolManage.MouseMovY = MouseY - g_ToolManage.MouseY;
	//マウスカーソルの座標を保存。
	g_ToolManage.MouseX    = MouseX;
	g_ToolManage.MouseY    = MouseY;
#ifdef  TOOLLIB_USE_STRINGINPUT
	//マウスの左ボタンが押された瞬間かどうかで処理を分岐。
	if(g_ToolManage.MouseEdgeInput & (1<<0)/*MOUSE_INPUT_LEFT*/) {
		//アクティブな文字列入力ハンドルを無い状態にする。
		ToolFunc_SetActiveKeyInput(-1);
		//前回クリックされてから直ぐにクリックされた場合はダブルクリックされたと判断する。
		if((ToolStatic_GetNowTime() - g_ToolManage.MouseClickTime) < TOOL_DOUBLE_CLICK_TIME) {
			g_ToolManage.MouseDoubleClick = 1;
		} else {
			g_ToolManage.MouseDoubleClick = 0;
		}
		//クリックされたときの時間を保存。
		g_ToolManage.MouseClickTime    = ToolStatic_GetNowTime();
		//選択範囲をクリックされた座標にする。
		g_ToolManage.MouseSelectStartX = g_ToolManage.MouseX;
		g_ToolManage.MouseSelectStartY = g_ToolManage.MouseY;
		g_ToolManage.MouseSelectEndX   = g_ToolManage.MouseX;
		g_ToolManage.MouseSelectEndY   = g_ToolManage.MouseY;
	//マウスの左ボタンが押された瞬間ではなく押され続けている場合はマウスの選択範囲の終端座標を更新。
	} else if(g_ToolManage.MouseInput & (1<<0)/*MOUSE_INPUT_LEFT*/) {
		g_ToolManage.MouseSelectEndX   = g_ToolManage.MouseX;
		g_ToolManage.MouseSelectEndY   = g_ToolManage.MouseY;
	//マウスの左ボタンが押されてから一定時間経過していたらダブルクリック判定を解除する。
	} else if((ToolStatic_GetNowTime() - g_ToolManage.MouseClickTime) > TOOL_DOUBLE_CLICK_TIME) {
		g_ToolManage.MouseDoubleClick  = 0;
	}
#endif//TOOLLIB_USE_STRINGINPUT
	//サイズ変更可能な表示領域のサイズ変更帯を掴んでいるかどうかで処理を変更。
	if(g_ToolManage.BaseRightGrip) {
		//掴んでいる状態で且つ左ボタンが押されている場合は表示領域のサイズをマウスカーソルの位置に応じて変更する。
		if(g_ToolManage.MouseInput & (1<<0)/*MOUSE_INPUT_LEFT*/) {
			g_ToolManage.BaseRightX = g_ToolManage.BaseRightGripX + (g_ToolManage.MouseX - g_ToolManage.BaseRightGripMouseX);
			//画面のサイズを取得する。
			ToolFunc_GetDrawScreenSize(&ScreenWidth, &ScreenHeight);
			//サイズが初期サイズよりも小さくならないようにする。
			if(g_ToolManage.BaseRightX < TOOL_BASE_RIGHT_X) {
			   g_ToolManage.BaseRightX = TOOL_BASE_RIGHT_X;
			//サイズが「画面横幅－余白」より大きくならないようにする。
			} else if(g_ToolManage.BaseRightX > (ScreenWidth - TOOL_BASE_RIGHT_X_SPACE)) {
				  g_ToolManage.BaseRightX = (ScreenWidth - TOOL_BASE_RIGHT_X_SPACE);
			}
		//左ボタンが押されていない場合は掴んでいるかどうかのフラグを倒す。
		} else {
			g_ToolManage.BaseRightGrip = 0;
		}
	//マウスの左ボタンが押された瞬間の場合はサイズ変更可能な表示領域のサイズ変更帯を掴んでいるかチェックして、掴んでいたら掴み状態にする。
	} else if((g_ToolManage.MouseEdgeInput & (1<<0)/*MOUSE_INPUT_LEFT*/) &&
		 ( g_ToolManage.BaseRightX                              <= g_ToolManage.MouseX) &&
		 ((g_ToolManage.BaseRightX + TOOL_BASE_RIGHT_BAR_WIDTH) >= g_ToolManage.MouseX)) {
			g_ToolManage.BaseRightGrip       = 1;
			g_ToolManage.BaseRightGripMouseX = g_ToolManage.MouseX;
			g_ToolManage.BaseRightGripX      = g_ToolManage.BaseRightX;
	}
	//ウインドウ情報の状態推移処理を行う。
	ToolWindow_Step_All(StepTime);
	//ボタン情報の状態推移処理を行う。
	ToolButton_Step_All(StepTime);
	//リスト情報の状態推移処理を行う。
	ToolList_Step_All(StepTime);
#ifdef  TOOLLIB_USE_STRINGINPUT
	//文字列入力情報の状態推移処理を行う。
	ToolStringInput_Step_All(StepTime);
	//パラメータバー情報の状態推移処理を行う。
	ToolParamBar_Step_All(StepTime);
	//ファイル選択情報の状態推移処理を行う。
	ToolFileSelect_Step_All(StepTime);
#endif//TOOLLIB_USE_STRINGINPUT
}
//-----------------------------------------------------------------------------
//ツール用処理の描画処理を行う。
void Tool_Draw() {
	int ScreenWidth, ScreenHeight;
	//ウインドウ情報の描画処理を行う。
	ToolWindow_Draw_All();
	//ボタン情報の描画処理を行う。
	ToolButton_Draw_All();
	//リスト情報の描画処理を行う。
	ToolList_Draw_All();
#ifdef  TOOLLIB_USE_STRINGINPUT
	//文字列入力情報の描画処理を行う。
	ToolStringInput_Draw_All();
	//パラメータバー情報の描画処理を行う。
	ToolParamBar_Draw_All();
	//ファイル選択情報の描画処理を行う。
	ToolFileSelect_Draw_All();
#endif//TOOLLIB_USE_STRINGINPUT
	//サイズ変更可能な表示領域右端のサイズ変更帯を描画する。
	ToolFunc_GetDrawScreenSize(&ScreenWidth, &ScreenHeight);
	ToolFunc_SetDrawBlendMode(1/*DX_BLENDMODE_ALPHA*/, 32);
	ToolFunc_DrawBox(g_ToolManage.BaseRightX,
	                 0,
	                 g_ToolManage.BaseRightX + TOOL_BASE_RIGHT_BAR_WIDTH,
	                 ScreenHeight,
	                 ToolFunc_GetColor(255,255,255),
	                 1);
	ToolFunc_SetDrawBlendMode(0/*DX_BLENDMODE_NOBLEND*/, 255);
}
//-----------------------------------------------------------------------------
//ツール用処理のサイズ変更可能な表示領域の右端のX座標を取得する。
//[out]
//	戻り値			可変表示領域右端のX座標。
int Tool_GetBaseRightX() {
	return g_ToolManage.BaseRightX;
}
//*****************************************************************************
//	ツールのGUI処理の内部でだけ使用する定義等
//*****************************************************************************
//通算経過時間を取得する。
//[out]
//	戻り値			通算経過時間。(単位:秒)
double ToolStatic_GetNowTime() {
	return g_ToolManage.NowTime;
}
//-----------------------------------------------------------------------------
//マウスカーソルが指定の矩形の内にあるかどうかをチェックする。
//[in]
//	x1,y1			チェックする矩形の左上端座標。
//	x2,y2			チェックする矩形の右下端座標。
//[out]
//	戻り値			矩形の内にマウスカーソルがあるかどうか。(0以外:内にある,0:外にある)
int ToolStatic_CheckMouseIn(int x1, int y1, int x2, int y2) {
	return ((g_ToolManage.MouseX >= x1) && (g_ToolManage.MouseX <= x2)) &&
	       ((g_ToolManage.MouseY >= y1) && (g_ToolManage.MouseY <= y2));
}
//-----------------------------------------------------------------------------
//マウスカーソルの座標を取得する。
//[in]
//	x,y			マウスカーソルのx座標とy座標を代入する変数のアドレス。
void ToolStatic_GetMousePosition(int* x, int* y) {
	*x = g_ToolManage.MouseX;
	*y = g_ToolManage.MouseY;
}
//-----------------------------------------------------------------------------
//マウスカーソルの前フレームから移動した距離を取得する。
//[in]
//	MoveX,MoveY		マウスカーソルの移動距離を代入する変数のアドレス。
void ToolStatic_GetMouseMoveVecter(int* MoveX, int* MoveY) {
	*MoveX = g_ToolManage.MouseMovX;
	*MoveY = g_ToolManage.MouseMovY;
}
//-----------------------------------------------------------------------------
//通常フォントハンドルを取得する。
//[out]
//	戻り値			フォントハンドル。
int ToolStatic_GetNormalFontHandle() {
	return g_ToolManage.pToolInfo->NormalFontHandle;
}
//-----------------------------------------------------------------------------
//ボタン内文字用のフォントハンドルを取得する。
//[out]
//	戻り値			フォントハンドル。
int ToolStatic_GetButtonFontHandle() {
	return g_ToolManage.pToolInfo->ButtonFontHandle;
}
//-----------------------------------------------------------------------------
//マウスのボタン押下状態を取得する。
//[out]
//	戻り値			マウスボタンの押下状態値。(GetMouseInputの戻り値と同じ形式)
int ToolStatic_GetMouseButton() {
	return g_ToolManage.MouseInput;
}
//-----------------------------------------------------------------------------
//マウスのボタン押下状態を取得する。(押された瞬間のみの情報)
//[out]
//	戻り値			マウスボタンの押下状態値。(GetMouseInputの戻り値と同じ形式)
int ToolStatic_GetMouseEdgeButton() {
	return g_ToolManage.MouseEdgeInput;
}
//-----------------------------------------------------------------------------
//ツール処理のボタンを描画する。
//[in]
//	x,y					ボタンを描画する左上座標。
//	w,h					ボタンの幅と高さ。
//	LeftTopColor1,LeftTopColor2		ボタンの左端と上端の色。
//	RightBottomColor1,RightBottomColor2	ボタンの右端と下端の色。
//	CenterColor				ボタンの中央部分の色。
void ToolStatic_DrawButton(int x, int y, int w, int h, int LeftTopColor1, int LeftTopColor2, int RightBottomColor1, int RightBottomColor2, int CenterColor) {
	//中央部分を描画。
	ToolFunc_SetDrawBlendMode(1/*DX_BLENDMODE_ALPHA*/, 128);
	ToolFunc_DrawBox(x + 2, y + 2, x + w - 2, y + h - 2, CenterColor, 1);
	ToolFunc_SetDrawBlendMode(1/*DX_BLENDMODE_ALPHA*/, 200);
	//左端と上端を描画。
	ToolFunc_DrawBox(x,     y,     x + w - 1, y + 1,     LeftTopColor1, 1);
	ToolFunc_DrawBox(x + 1, y + 1, x + w - 2, y + 2,     LeftTopColor2, 1);
	ToolFunc_DrawBox(x,     y + 1, x + 1,     y + h - 1, LeftTopColor1, 1);
	ToolFunc_DrawBox(x + 1, y + 2, x + 2,     y + h - 2, LeftTopColor2, 1);
	//右端と下端を描画。
	ToolFunc_DrawBox(x,         y + h - 1,  x + w,     y + h,     RightBottomColor1, 1);
	ToolFunc_DrawBox(x + 1,     y + h - 2,  x + w,     y + h - 1, RightBottomColor2, 1);
	ToolFunc_DrawBox(x + w - 1, y,          x + w,     y + h - 1, RightBottomColor1, 1);
	ToolFunc_DrawBox(x + w - 2, y + 1,      x + w - 1, y + h - 2, RightBottomColor2, 1);
	ToolFunc_SetDrawBlendMode(0/*DX_BLENDMODE_NOBLEND*/, 0);
}
#ifdef  TOOLLIB_USE_STRINGINPUT
//-----------------------------------------------------------------------------
//マウスの左ボタンがダブルクリックされたかどうかを取得する。
//[out]
//	戻り値			左ボタンがダブルクリックされたかどうか。(0以外:ダブルクリックされた,0:ダブルクリックされていない)
int ToolStatic_GetMouseDoubleClick() {
	int Result = g_ToolManage.MouseDoubleClick;
	//ダブルクリックされたかどうかのフラグを倒す。
	g_ToolManage.MouseDoubleClick = 0;
	return Result;
}
//-----------------------------------------------------------------------------
//マウスの選択範囲の開始座標と終了座標を取得する。
//[in]
//	StartX,StartY		選択範囲の開始座標を格納する変数のアドレス。(NULL可)
//	EndX,EndY		選択範囲の終了座標を格納する変数のアドレス。(NULL可)
void ToolStatic_GetMouseSelectStartPosition(int* StartX, int* StartY, int* EndX, int* EndY) {
	if(StartX) { *StartX = g_ToolManage.MouseSelectStartX; }
	if(StartY) { *StartY = g_ToolManage.MouseSelectStartY; }
	if(EndX) { *EndX = g_ToolManage.MouseSelectEndX; }
	if(EndY) { *EndY = g_ToolManage.MouseSelectEndY; }
}
//-----------------------------------------------------------------------------
//文字列入力ハンドルの中のカーソルの位置を取得する。
//[in]
//	StrDrawX		文字列を描画するX座標。
//	MouseX			マウスカーソルのX座標。
//	InputHandle		文字列入力ハンドル。
//	FontHandle		文字列を描画する際に使用するフォントハンドル。
//[out]
//	戻り値			マウスカーソルがある文字の位置。
int ToolStatic_GetKeyInputCursorPos(int StrDrawX, int MouseX, int InputHandle, int FontHandle) {
	char String[2048];
	int TempMouseX, DrawStartPos, TotalX, i, CharSize, DrawWidth;
	//文字列開始位置座標からみたマウスの相対座標を算出。
	TempMouseX = MouseX - StrDrawX;
	//文字列入力ハンドルの現在の入力文字列を取得。
	ToolFunc_GetKeyInputString(String, InputHandle);
	//入力中文字列の開始文字位置を取得。
	DrawStartPos = ToolFunc_GetKeyInputDrawStartPos(InputHandle);
	//文字の終端がくるまでループ。
	TotalX = 0;
	for(i = 0; String[DrawStartPos + i]; i += CharSize) {
		//1文字のバイト数を取得。
		if(ToolFunc_MultiByteCharCheck(&String[DrawStartPos + i], 1/*DX_CHARSET_SHFTJIS*/)) {
			CharSize = 2;
		} else {
			CharSize = 1;
		}
		//1文字分のピクセル幅を取得。
		DrawWidth = ToolFunc_GetDrawStringWidthToHandle(&String[DrawStartPos + i], CharSize, FontHandle);
		//マウスカーソルのX座標が文字の領域にある場合はループから抜ける。
		if((TempMouseX >= TotalX) && (TempMouseX < (TotalX + DrawWidth))) { break; }
		//チェック位置を文字の幅分だけずらす。
		TotalX += DrawWidth;
	}
	//マウスカーソルがある文字の位置を返す。
	return DrawStartPos + i;
}
#endif//TOOLLIB_USE_STRINGINPUT
//*****************************************************************************
//	アプリケーション定義の関数呼び出し
//*****************************************************************************
int ToolFunc_DrawBox(int x1, int y1, int x2, int y2, unsigned Color, int FillFlag) { return (*g_ToolManage.pToolInfo->fnDrawBox)(x1, y1, x2, y2, Color, FillFlag); }
int ToolFunc_DrawStringToHandle(int x, int y, const char* String, unsigned Color, int FontHandle/*, unsigned EdgeColor = 0, int VerticalFlag = 0*/) { return (*g_ToolManage.pToolInfo->fnDrawStringToHandle)(x, y, String, Color, FontHandle); }
int ToolFunc_DrawTriangle(int x1, int y1, int x2, int y2, int x3, int y3, unsigned Color, int FillFlag) { return (*g_ToolManage.pToolInfo->fnDrawTriangle)(x1, y1, x2, y2, x3, y3, Color, FillFlag); }
unsigned ToolFunc_GetColor(int Red, int Green, int Blue) { return (*g_ToolManage.pToolInfo->fnGetColor)(Red, Green, Blue); }
int ToolFunc_GetDrawScreenSize(int* XBuf, int* YBuf) { return (*g_ToolManage.pToolInfo->fnGetDrawScreenSize)(XBuf, YBuf); }
int ToolFunc_GetDrawStringWidthToHandle(const char* String, int StrLen, int FontHandle/*, int VerticalFlag = 0*/) { return (*g_ToolManage.pToolInfo->fnGetDrawStringWidthToHandle)(String, StrLen, FontHandle); }
int ToolFunc_GetMouseInput() { return (*g_ToolManage.pToolInfo->fnGetMouseInput)(); }
int ToolFunc_GetMousePoint(int* XBuf, int* YBuf) { return (*g_ToolManage.pToolInfo->fnGetMousePoint)(XBuf, YBuf); }
int ToolFunc_SetDrawArea(int x1, int y1, int x2, int y2) { return (*g_ToolManage.pToolInfo->fnSetDrawArea)(x1, y1, x2, y2); }
int ToolFunc_SetDrawAreaFull() { return (*g_ToolManage.pToolInfo->fnSetDrawAreaFull)(); }
int ToolFunc_SetDrawBlendMode(int BlendMode, int BlendParam) { return (*g_ToolManage.pToolInfo->fnSetDrawBlendMode)(BlendMode, BlendParam); }
#ifdef  TOOLLIB_USE_STRINGINPUT
int ToolFunc_CheckKeyInput(int InputHandle) { return (*g_ToolManage.pToolInfo->fnCheckKeyInput)(InputHandle); }
int ToolFunc_DeleteKeyInput(int InputHandle) { return (*g_ToolManage.pToolInfo->fnDeleteKeyInput)(InputHandle); }
int ToolFunc_DrawKeyInputString(int x, int y, int InputHandle) { return (*g_ToolManage.pToolInfo->fnDrawKeyInputString)(x, y, InputHandle); }
int ToolFunc_GetActiveKeyInput() { return (*g_ToolManage.pToolInfo->fnGetActiveKeyInput)(); }
int ToolFunc_GetClipboardText(char* DestBuffer) { return (*g_ToolManage.pToolInfo->fnGetClipboardText)(DestBuffer); }
int ToolFunc_GetKeyInputDrawStartPos(int InputHandle) { return (*g_ToolManage.pToolInfo->fnGetKeyInputDrawStartPos)(InputHandle); }
int ToolFunc_GetKeyInputNumber(int InputHandle) { return (*g_ToolManage.pToolInfo->fnGetKeyInputNumber)(InputHandle); }
float ToolFunc_GetKeyInputNumberToFloat(int InputHandle) { return (*g_ToolManage.pToolInfo->fnGetKeyInputNumberToFloat)(InputHandle); }
int ToolFunc_GetKeyInputSelectArea(int* SelectStart, int* SelectEnd, int InputHandle) { return (*g_ToolManage.pToolInfo->fnGetKeyInputSelectArea)(SelectStart, SelectEnd, InputHandle); }
int ToolFunc_GetKeyInputString(char* StrBuffer, int InputHandle) { return (*g_ToolManage.pToolInfo->fnGetKeyInputString)(StrBuffer, InputHandle); }
HWND ToolFunc_GetMainWindowHandle() { return (*g_ToolManage.pToolInfo->fnGetMainWindowHandle)(); }
int ToolFunc_MakeKeyInput(size_t MaxStrLength, int CancelValidFlag, int SingleCharOnlyFlag, int NumCharOnlyFlag/*, int DoubleCharOnlyFlag = 0, int EnableNewLineFlag = 0*/) { return (*g_ToolManage.pToolInfo->fnMakeKeyInput)(MaxStrLength, CancelValidFlag, SingleCharOnlyFlag, NumCharOnlyFlag); }
int ToolFunc_MultiByteCharCheck(const char* Buf, int CharSet) { return (*g_ToolManage.pToolInfo->fnMultiByteCharCheck)(Buf, CharSet); }
int ToolFunc_RectClipping(RECT* Rect, const RECT* ClippuRect) { return (*g_ToolManage.pToolInfo->fnRectClipping)(Rect, ClippuRect); }
int ToolFunc_ReStartKeyInput(int InputHandle) { return (*g_ToolManage.pToolInfo->fnReStartKeyInput)(InputHandle); }
int ToolFunc_SetActiveKeyInput(int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetActiveKeyInput)(InputHandle); }
int ToolFunc_SetClipboardText(const char* Text) { return (*g_ToolManage.pToolInfo->fnSetClipboardText)(Text); }
int ToolFunc_SetKeyInputCursorPosition(int Position, int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputCursorPosition)(Position, InputHandle); }
int ToolFunc_SetKeyInputNumber(int Number, int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputNumber)(Number, InputHandle); }
int ToolFunc_SetKeyInputNumberToFloat(float Number, int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputNumberToFloat)(Number, InputHandle); }
int ToolFunc_SetKeyInputSelectArea(int SelectStart, int SelectEnd, int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputSelectArea)(SelectStart, SelectEnd, InputHandle); }
int ToolFunc_SetKeyInputString(const char* String, int InputHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputString)(String, InputHandle); }
int ToolFunc_SetKeyInputStringColor(uint64_t NmlStr, uint64_t NmlCur, uint64_t IMEStrBack, uint64_t IMECur, uint64_t IMELine, uint64_t IMESelectStr, uint64_t IMEModeStr/*, uint64_t NmlStrE = 0, uint64_t IMESelectStrE = 0, uint64_t IMEModeStrE = 0, uint64_t IMESelectWinE = -1, uint64_t IMESelectWinF = -1, uint64_t SelectStrBackColor = -1, uint64_t SelectStrColor = -1, uint64_t SelectStrEdgeColor = -1, uint64_t IMEStr = -1, uint64_t IMEStrE = -1*/) { return (*g_ToolManage.pToolInfo->fnSetKeyInputStringColor)(NmlStr, NmlCur, IMEStrBack, IMECur, IMELine, IMESelectStr, IMEModeStr); }
int ToolFunc_SetKeyInputStringFont(int FontHandle) { return (*g_ToolManage.pToolInfo->fnSetKeyInputStringFont)(FontHandle); }
int ToolFunc_StockInputChar(char CharCode) { return (*g_ToolManage.pToolInfo->fnStockInputChar)(CharCode); }
#endif//TOOLLIB_USE_STRINGINPUT
