//
//	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モジュールを使用しない場合はこれらの内部処理関数も不要だからです。
//
#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_BUTTON_FONT_HEIGHT,0,DX_FONTTYPE_EDGE  )」で初期化するのでこのフィールドは実行時に初期化する必要が有りますが、環境によってフォントハンドルを定数で表せる場合はこのフィールドも静的に初期化しても構いません。
	int		ButtonFontHandle;	//ボタン内文字描画用のフォントハンドル。	一般的には「CreateFontToHandle(NULL,TOOL_BUTTON_FONT_HEIGHT,0,DX_FONTTYPE_NORMAL)」で初期化するのでこのフィールドは実行時に初期化する必要が有りますが、環境によってフォントハンドルを定数で表せる場合はこのフィールドも静的に初期化しても構いません。
//}}実行時に初期化するフィールド
} SToolInfo;
//*****************************************************************************
//	アプリケーション用関数
//*****************************************************************************
void Tool_Initialize(const SToolInfo* pToolInfo);
void Tool_Terminate();
void Tool_Step(double StepTime);
void Tool_Draw();
int Tool_GetBaseRightX();
//-----------------------------------------------------------------------------
#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_BUTTON_FONT_HEIGHT		(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__
