//
//	ToolLib.c
//
//	エディター共通処理 - ツールの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モジュールを使用しない場合はこれらの内部処理関数も不要だからです。
//	* Thu Apr 27 22:34:39 JST 2017 Naoyuki Sawa
//	- Tool_Delete()を追加しました。
//	  Tool_Delete()を追加した理由は、以下の通りです。
//	- これまで、画面遷移等のために全ての種類のウィジットを全て削除する場合、以下のように書く必要が有りました。
//	  【変更前】
//	  │SToolInfo ToolInfo;
//	  │ToolDxLib_GetDefault(&ToolInfo);
//	  │//1画面目
//	  │Tool_Initialize(&ToolInfo)
//	  │b1 = ToolButton_Create(～);
//	  │b2 = ToolButton_Create(～);
//	  │b3 = ToolButton_Create(～);
//	  │for(;;) { ... }
//	  │Tool_Terminate();		//全ての種類のウィジットを全て削除するために、ToolLibを一旦終了して…
//	  │//2画面目
//	  │Tool_Initialize(&ToolInfo)	//…ToolLibを再初期化する必要が有り、直観的でないという問題が有った。
//	  │b1 = ToolButton_Create(～);
//	  │b2 = ToolButton_Create(～);
//	  │b3 = ToolButton_Create(～);
//	  │for(;;) { ... }
//	  │Tool_Terminate();
//	  動作上は問題無いのですが、直観的でないという問題が有りました。
//	- そこで、ToolLibの終了は行わずに、ウィジットの削除だけを行う関数として、Tool_Delete()を追加しました。
//	  今後は、Tool_Delete()を使用して、以下のように書けるようになりました。
//	  【変更後】
//	  │SToolInfo ToolInfo;
//	  │ToolDxLib_GetDefault(&ToolInfo);
//	  │//ToolLibの初期化
//	  │Tool_Initialize(&ToolInfo)
//	  │//1画面目
//	  │b1 = ToolButton_Create(～);
//	  │b2 = ToolButton_Create(～);
//	  │b3 = ToolButton_Create(～);
//	  │for(;;) { ... }
//	  │//全ての種類のウィジットを全て削除する。
//	  │Tool_Delete();
//	  │//2画面目
//	  │b1 = ToolButton_Create(～);
//	  │b2 = ToolButton_Create(～);
//	  │b3 = ToolButton_Create(～);
//	  │for(;;) { ... }
//	  │//ToolLibの終了
//	  │Tool_Terminate();
//	  変更前の書き方でも引き続き動作可能ですが、変更後の書き方の方が判り易いと思います。
//	- ちなみに、'Tool_Delete()'という関数名からは、'全ての種類のウィジットを全て削除する'という動作が想起しづらく、あまり良い関数名ではないような気もしたのですが、オリジナル版のToolLibの関数名が、
//	  ・全ての種類のウィジットのTool*_Step_All()を呼び出す関数⇒Tool_Step()
//	  ・全ての種類のウィジットのTool*_Draw_All()を呼び出す関数⇒Tool_Draw()
//	  という命名方法になっている事に倣って、今回追加した関数も、
//	  ・全ての種類のウィジットのTool*_Delete_All()を呼び出す関数⇒Tool_Delete()
//	  という関数名にする事にしました。
//	* Tue May 02 22:54:46 JST 2017 Naoyuki Sawa
//	- 各モジュール内のサイズ定義の倍率を一律で調整出来るように、ToolLib.hにTOOL_SCALEの定義を追加しました。
//	  TOOL_SCALEを'1'にするとオリジナル版のToolLibと同じサイズになります。
//	  高解像度の環境でUI要素のサイズが小さ過ぎた場合はTOOL_SCALEを'2'以上に変更して下さい。
//	- TOOL_SCALEの定義は、ライブラリのビルド時に固定され、アプリケーション毎に変更する事は出来ません。
//	  別の案として、TOOL_SCALEをマクロでなくSToolInfo構造体のフィールドとして、アプリケーション毎に変更出来るようにする方法も考えたのですが、今回は行わない事にしました。
//	  もしそうすると、各モジュールの変更量がやや多くなり、複雑化していしまいます。
//	  当モジュールはあくまでも、アプリケーションの開発中や簡易ツールだけで使用する目的であり、汎用性のために複雑化する必要は無いと思いました。
//	* Fri May 12 09:53:14 JST 2017 Naoyuki Sawa
//	- Tool_EnableBaseRight()関数を追加しました。
//	  追加した理由は、以下の通りです。
//	- オリジナル版のToolLibでは、サイズ変更可能な表示領域の機能が常に有効であり、常にサイズ変更帯が表示されています。
//	  しかし実際のアプリケーションでは、サイズ変更可能な表示領域の機能を使いたい事は稀であり、サイズ変更帯の表示も煩わしいと思う事が多いです。
//	  そこで、サイズ変更可能な表示領域の機能を無効化するための関数として、Tool_EnableBaseRight()関数を追加しました。
//	  Tool_Initialize()直後は、オリジナル版のToolLibとの互換性のために、サイズ変更可能な表示領域の機能は有効としてあります。
//	  アプリケーションが明示的に「Tool_EnableBaseRight(0)」を呼び出す事で、サイズ変更可能な表示領域の機能が無効化出来ます。
//	  サイズ変更可能な表示領域の機能が無効化すると、サイズ変更帯も表示されなくなります。
//	  尚、サイズ変更可能な表示領域の機能を無効化すると、スペース管理情報を使用しているウインドウの横幅は画面一杯となります。
//	  詳細は、Tool_GetBaseRightX()内のコメントを参照して下さい。
//	* Sun May 14 23:23:22 JST 2017 Naoyuki Sawa
//	- Tool_IsAnyHovered()関数を追加しました。
//	  アプリケーション側でマウスクリックを認識した時に、アプリケーション側で処理すべきか無視すべきかを判断するためです。
//	  関数名は、Nuklearの「nk_window_is_any_hovered()」から取りました。
//
#include "clip.h"
//*****************************************************************************
//	定数、マクロ、構造体
//*****************************************************************************
#define TOOL_BASE_RIGHT_X		(TOOL_SCALE*(350))	//サイズ変更可能な表示領域の初期右端X座標。
#define TOOL_BASE_RIGHT_X_SPACE		(TOOL_SCALE*(50))	//サイズ変更可能な表示領域を最大まで広くした場合の右端の余白。
#define TOOL_BASE_RIGHT_BAR_WIDTH	(TOOL_SCALE*(4))	//サイズ変更可能な表示領域のサイズ変更帯の幅。
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#ifdef  TOOLLIB_USE_STRINGINPUT
#define TOOL_DOUBLE_CLICK_TIME		(0.4)			//ダブルクリックされたと判断するクリックとクリックの間隔。(単位:秒)
#endif//TOOLLIB_USE_STRINGINPUT
//-----------------------------------------------------------------------------
//ToolLib管理用構造体
typedef struct _SToolManage {
	const SToolInfo*	pToolInfo;				//初期化情報ポインタ。
	double			NowTime;				//通算経過時間。(単位:秒)
	int			BaseRightEnable;			//サイズ変更可能な表示領域の機能を使用するかどうか。
	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.BaseRightEnable = 1;
	g_ToolManage.BaseRightX = TOOL_BASE_RIGHT_X;
}
//-----------------------------------------------------------------------------
//ツール用処理の後始末を行う。
void Tool_Terminate() {
	//ウィジットを全て削除する。
	Tool_Delete();
	//構造体をクリアする。
	memset(&g_ToolManage, 0, sizeof g_ToolManage);
}
//-----------------------------------------------------------------------------
//ツール用処理の状態推移処理を行う。
//[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.BaseRightEnable) {
		//サイズ変更可能な表示領域のサイズ変更帯を掴んでいるかどうかで処理を変更。
		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
	//ツール用処理のサイズ変更可能な表示領域の機能を使用するならば…
	if(g_ToolManage.BaseRightEnable) {
		//サイズ変更可能な表示領域右端のサイズ変更帯を描画する。
		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);
	}
}
//-----------------------------------------------------------------------------
//全ての種類のウィジットを全て削除する。
void Tool_Delete() {
#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();
}
//-----------------------------------------------------------------------------
//ツール用処理のサイズ変更可能な表示領域の右端のX座標を取得する。
//[out]
//	戻り値			可変表示領域右端のX座標。
int Tool_GetBaseRightX() {
	int ScreenWidth, ScreenHeight;
	//ツール用処理のサイズ変更可能な表示領域の機能を使用するならば…
	if(g_ToolManage.BaseRightEnable) {
		//ツール用処理のサイズ変更可能な表示領域の右端のX座標を返す。
		return g_ToolManage.BaseRightX;
	//ツール用処理のサイズ変更可能な表示領域の機能を使用しないならば…
	} else {
		//画面の右端を、仮想的なサイズ変更可能な表示領域の右端のX座標とする。
		// - ツール用処理のサイズ変更可能な表示領域の機能を使用しない場合は、画面全体を使ってGUIを表示するためにこうする事にしました。
		//   ToolWindow_UpdateInfoArea()が当関数を呼び出しており、スペース管理情報を使用しているウインドウの横幅が画面一杯となります。
		ToolFunc_GetDrawScreenSize(&ScreenWidth, &ScreenHeight);
		return ScreenWidth;
	}
}
//-----------------------------------------------------------------------------
//ツール用処理のサイズ変更可能な表示領域の機能を使用するかどうかを設定する。
//[in]
//	bEnable			使用するかどうか。(0以外:使用する,0:使用しない)
void Tool_EnableBaseRight(int bEnable) {
	g_ToolManage.BaseRightEnable = bEnable;
}
//-----------------------------------------------------------------------------
//マウスカーソルがいずれかのウィジットの内にあるかどうかをチェックする。
//[out]
//	戻り値			いずれかのウィジットの内にマウスカーソルがあるかどうか。(0以外:内にある,0:外にある)
int Tool_IsAnyHovered() {
	//ツール用処理のサイズ変更可能な表示領域の機能を使用するならば…
	if(g_ToolManage.BaseRightEnable) {
		//サイズ変更可能な表示領域のサイズ変更帯の内にあるかどうかをチェックする。
		if(( g_ToolManage.BaseRightX                              <= g_ToolManage.MouseX) &&
		   ((g_ToolManage.BaseRightX + TOOL_BASE_RIGHT_BAR_WIDTH) >= g_ToolManage.MouseX)) { return 1; }
	}
	//マウスカーソルがいずれかのウインドウの内にあるかどうかをチェックする。
	if(ToolWindow_IsAnyHovered()) { return 1; }
	//マウスカーソルがいずれかのボタンの内にあるかどうかをチェックする。
	if(ToolButton_IsAnyHovered()) { return 1; }
	//マウスカーソルがいずれかのリストの内にあるかどうかをチェックする。
	if(ToolList_IsAnyHovered()) { return 1; }
#ifdef  TOOLLIB_USE_STRINGINPUT
	//マウスカーソルがいずれかの文字列入力の内にあるかどうかをチェックする。
	if(ToolStringInput_IsAnyHovered()) { return 1; }
	//マウスカーソルがいずれかのパラメータバーの内にあるかどうかをチェックする。
	if(ToolParamBar_IsAnyHovered()) { return 1; }
	//マウスカーソルがいずれかのファイル選択の内にあるかどうかをチェックする。
	if(ToolFileSelect_IsAnyHovered()) { return 1; }
#endif//TOOLLIB_USE_STRINGINPUT
	return 0;
}
//*****************************************************************************
//	ツールの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
