//
//	ToolLib.h
//
//	エディター共通処理 - ツールの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()」から取りました。
//
#ifndef __TOOLLIB_H__
#define __TOOLLIB_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
//*****************************************************************************
//	定数、マクロ、構造体
//*****************************************************************************
#ifdef  _WIN32
#define TOOLLIB_USE_STRINGINPUT		//Windows環境以外では、文字列入力ハンドルを使う機能は使用しない。
#endif//_WIN32
//-----------------------------------------------------------------------------
//初期化情報構造体
typedef struct _SToolInfo {
//{{静的に初期化出来るフィールド
	int		(*fnDrawBox)(int x1, int y1, int x2, int y2, unsigned Color, int FillFlag);
	int		(*fnDrawStringToHandle)(int x, int y, const char* String, unsigned Color, int FontHandle/*, unsigned EdgeColor = 0, int VerticalFlag = 0*/);
	int		(*fnDrawTriangle)(int x1, int y1, int x2, int y2, int x3, int y3, unsigned Color, int FillFlag);
	unsigned	(*fnGetColor)(int Red, int Green, int Blue);
	int		(*fnGetDrawScreenSize)(int* XBuf, int* YBuf);
	int		(*fnGetDrawStringWidthToHandle)(const char* String, int StrLen, int FontHandle/*, int VerticalFlag = 0*/);
	int		(*fnGetMouseInput)();
	int		(*fnGetMousePoint)(int* XBuf, int* YBuf);
	int		(*fnSetDrawArea)(int x1, int y1, int x2, int y2);
	int		(*fnSetDrawAreaFull)();
	int		(*fnSetDrawBlendMode)(int BlendMode, int BlendParam);
#ifdef  TOOLLIB_USE_STRINGINPUT
	int		(*fnCheckKeyInput)(int InputHandle);
	int		(*fnDeleteKeyInput)(int InputHandle);
	int		(*fnDrawKeyInputString)(int x, int y, int InputHandle);
	int		(*fnGetActiveKeyInput)();
	int		(*fnGetClipboardText)(char* DestBuffer);
	int		(*fnGetKeyInputDrawStartPos)(int InputHandle);
	int		(*fnGetKeyInputNumber)(int InputHandle);
	float		(*fnGetKeyInputNumberToFloat)(int InputHandle);
	int		(*fnGetKeyInputSelectArea)(int* SelectStart, int* SelectEnd, int InputHandle);
	int		(*fnGetKeyInputString)(char* StrBuffer, int InputHandle);
	HWND		(*fnGetMainWindowHandle)();
	int		(*fnMakeKeyInput)(size_t MaxStrLength, int CancelValidFlag, int SingleCharOnlyFlag, int NumCharOnlyFlag/*, int DoubleCharOnlyFlag = 0, int EnableNewLineFlag = 0*/);
	int		(*fnMultiByteCharCheck)(const char* Buf, int CharSet);
	int		(*fnRectClipping)(RECT* Rect, const RECT* ClippuRect);
	int		(*fnReStartKeyInput)(int InputHandle);
	int		(*fnSetActiveKeyInput)(int InputHandle);
	int		(*fnSetClipboardText)(const char* Text);
	int		(*fnSetKeyInputCursorPosition)(int Position, int InputHandle);
	int		(*fnSetKeyInputNumber)(int Number, int InputHandle);
	int		(*fnSetKeyInputNumberToFloat)(float Number, int InputHandle);
	int		(*fnSetKeyInputSelectArea)(int SelectStart, int SelectEnd, int InputHandle);
	int		(*fnSetKeyInputString)(const char* String, int InputHandle);
	int		(*fnSetKeyInputStringColor)(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*/);
	int		(*fnSetKeyInputStringFont)(int FontHandle);
	int		(*fnStockInputChar)(char CharCode);
#endif//TOOLLIB_USE_STRINGINPUT
//}}静的に初期化出来るフィールド
//{{実行時に初期化するフィールド
	int		NormalFontHandle;	//通常文字描画用のフォントハンドル。		一般的には「CreateFontToHandle(NULL,TOOL_FONT_HEIGHT,0,DX_FONTTYPE_EDGE  )」で初期化するのでこのフィールドは実行時に初期化する必要が有りますが、環境によってフォントハンドルを定数で表せる場合はこのフィールドも静的に初期化しても構いません。
	int		ButtonFontHandle;	//ボタン内文字描画用のフォントハンドル。	一般的には「CreateFontToHandle(NULL,TOOL_FONT_HEIGHT,0,DX_FONTTYPE_NORMAL)」で初期化するのでこのフィールドは実行時に初期化する必要が有りますが、環境によってフォントハンドルを定数で表せる場合はこのフィールドも静的に初期化しても構いません。
//}}実行時に初期化するフィールド
} SToolInfo;
//*****************************************************************************
//	アプリケーション用関数
//*****************************************************************************
void Tool_Initialize(const SToolInfo* pToolInfo);
void Tool_Terminate();
void Tool_Step(double StepTime);
void Tool_Draw();
void Tool_Delete();
int Tool_GetBaseRightX();
void Tool_EnableBaseRight(int bEnable);
int Tool_IsAnyHovered();
//-----------------------------------------------------------------------------
#ifdef  _WIN32	//__DXLIBでは判断出来ません。extclip.hでDxLib.hをインクルードするよりも先に、clipstd.hで当ファイルをインクルードするからです。
#include "ToolLib_DxLib.h"		//DxLib用のバックエンド
#endif//_WIN32	//__DXLIBでは判断出来ません。extclip.hでDxLib.hをインクルードするよりも先に、clipstd.hで当ファイルをインクルードするからです。
#include "ToolLib_SpaceManage.h"	//ツールのGUI処理のスペース管理		スペース管理の使用方法については、「ＤＸライブラリ質問掲示板 - SwordBoutのCommonSource」(http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4058)が参考になります。
#include "ToolLib_Visible.h"		//ツールのGUI処理の表示・非表示管理
#include "ToolLib_Window.h"		//ツールのGUIのウインドウ
#include "ToolLib_Button.h"		//ツールのGUIのボタン
#include "ToolLib_List.h"		//ツールのGUIのリスト
#ifdef  TOOLLIB_USE_STRINGINPUT
#include "ToolLib_StringInput.h"	//ツールのGUIの文字列入力
#include "ToolLib_ParamBar.h"		//ツールのGUIのパラメーターバー
#include "ToolLib_FileSelect.h"		//ツールのGUIのファイル選択
#endif//TOOLLIB_USE_STRINGINPUT
//*****************************************************************************
//	ツールのGUI処理の内部でだけ使用する定義等
//*****************************************************************************
#define TOOL_SCALE		1/*調整可*/		//各モジュール内のサイズ定義の倍率。	TOOL_SCALEを'1'にするとオリジナル版のToolLibと同じサイズになります。高解像度の環境でUI要素のサイズが小さ過ぎた場合はTOOL_SCALEを'2'以上に変更して下さい。
#define TOOL_FONT_HEIGHT	(TOOL_SCALE*12)		//ボタン用フォントの縦幅。
//-----------------------------------------------------------------------------
double ToolStatic_GetNowTime();
int ToolStatic_CheckMouseIn(int x1, int y1, int x2, int y2);
void ToolStatic_GetMousePosition(int* x, int* y);
void ToolStatic_GetMouseMoveVecter(int* MoveX, int* MoveY);
int ToolStatic_GetNormalFontHandle();
int ToolStatic_GetButtonFontHandle();
int ToolStatic_GetMouseButton();
int ToolStatic_GetMouseEdgeButton();
void ToolStatic_DrawButton(int x, int y, int w, int h, int LeftTopColor1, int LeftTopColor2, int RightBottomColor1, int RightBottomColor2, int CenterColor);
#ifdef  TOOLLIB_USE_STRINGINPUT
int ToolStatic_GetMouseDoubleClick();
void ToolStatic_GetMouseSelectStartPosition(int* StartX, int* StartY, int* EndX, int* EndY);
int ToolStatic_GetKeyInputCursorPos(int StrDrawX, int MouseX, int InputHandle, int FontHandle);
#endif//TOOLLIB_USE_STRINGINPUT
//*****************************************************************************
//	アプリケーション定義の関数呼び出し
//*****************************************************************************
int ToolFunc_DrawBox(int x1, int y1, int x2, int y2, unsigned Color, int FillFlag);
int ToolFunc_DrawStringToHandle(int x, int y, const char* String, unsigned Color, int FontHandle/*, unsigned EdgeColor = 0, int VerticalFlag = 0*/);
int ToolFunc_DrawTriangle(int x1, int y1, int x2, int y2, int x3, int y3, unsigned Color, int FillFlag);
unsigned ToolFunc_GetColor(int Red, int Green, int Blue);
int ToolFunc_GetDrawScreenSize(int* XBuf, int* YBuf);
int ToolFunc_GetDrawStringWidthToHandle(const char* String, int StrLen, int FontHandle/*, int VerticalFlag = 0*/);
int ToolFunc_GetMouseInput();
int ToolFunc_GetMousePoint(int* XBuf, int* YBuf);
int ToolFunc_SetDrawArea(int x1, int y1, int x2, int y2);
int ToolFunc_SetDrawAreaFull();
int ToolFunc_SetDrawBlendMode(int BlendMode, int BlendParam);
#ifdef  TOOLLIB_USE_STRINGINPUT
int ToolFunc_CheckKeyInput(int InputHandle);
int ToolFunc_DeleteKeyInput(int InputHandle);
int ToolFunc_DrawKeyInputString(int x, int y, int InputHandle);
int ToolFunc_GetActiveKeyInput();
int ToolFunc_GetClipboardText(char* DestBuffer);
int ToolFunc_GetKeyInputDrawStartPos(int InputHandle);
int ToolFunc_GetKeyInputNumber(int InputHandle);
float ToolFunc_GetKeyInputNumberToFloat(int InputHandle);
int ToolFunc_GetKeyInputSelectArea(int* SelectStart, int* SelectEnd, int InputHandle);
int ToolFunc_GetKeyInputString(char* StrBuffer, int InputHandle);
HWND ToolFunc_GetMainWindowHandle();
int ToolFunc_MakeKeyInput(size_t MaxStrLength, int CancelValidFlag, int SingleCharOnlyFlag, int NumCharOnlyFlag/*, int DoubleCharOnlyFlag = 0, int EnableNewLineFlag = 0*/);
int ToolFunc_MultiByteCharCheck(const char* Buf, int CharSet);
int ToolFunc_RectClipping(RECT* Rect, const RECT* ClippuRect);
int ToolFunc_ReStartKeyInput(int InputHandle);
int ToolFunc_SetActiveKeyInput(int InputHandle);
int ToolFunc_SetClipboardText(const char* Text);
int ToolFunc_SetKeyInputCursorPosition(int Position, int InputHandle);
int ToolFunc_SetKeyInputNumber(int Number, int InputHandle);
int ToolFunc_SetKeyInputNumberToFloat(float Number, int InputHandle);
int ToolFunc_SetKeyInputSelectArea(int SelectStart, int SelectEnd, int InputHandle);
int ToolFunc_SetKeyInputString(const char* String, int 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*/);
int ToolFunc_SetKeyInputStringFont(int FontHandle);
int ToolFunc_StockInputChar(char CharCode);
#endif//TOOLLIB_USE_STRINGINPUT
//*****************************************************************************
//	
//*****************************************************************************
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__TOOLLIB_H__
