//
//	ToolLib_StringInput.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
//	- 当ライブラリが生成するオブジェクトの識別子を、整数ハンドル⇒ポインタに変更しました。
//	  オリジナル版では生成したオブジェクトを固定長配列に格納して管理していたのですが、メモリ節約のためにリストで管理するように変更し、そのためには整数ハンドルよりもポインタの方が都合が良いからです。
//	  尚、フォントハンドルと文字列入力ハンドルは、当ライブラリが生成するオブジェクトではなくバックエンドのオブジェクトなので、今回の変更には関係無く整数ハンドルのままです。
//
#include "clip.h"
#ifdef  TOOLLIB_USE_STRINGINPUT
//*****************************************************************************
//	定数、マクロ、構造体
//*****************************************************************************
#define TOOL_STRINGINPUT_HEIGHT		(18)	//文字列入力領域の縦幅。
#define TOOL_ONE_NUMBER_SIZE		(7)	//数字一文字の仮の横幅。
#define TOOL_STRING_BUFFER_SIZE		(2049)	//文字列バッファのサイズ。
//-----------------------------------------------------------------------------
//文字列入力構造体
/*typedef*/ struct _SToolStringInput {
	SToolVisible*	TVisible;				//関連付けられている表示状態情報。
	SToolWindow*	TWindow;				//関連付けられているウインドウ情報。
	POINT		Position;				//文字列入力の表示位置。
	char*		Name;					//名前の文字列が格納されているメモリアドレスを保存しているポインタ。
	int		NumberOnly;				//数値のみ入力可能かどうか。
	int		NumberNum;				//入力できる数値の桁数。(NumberOnlyが0以外の場合のみ有効)
	int		StringDrawWidth;			//文字列入力領域の横幅。(NumberOnlyが0の場合のみ有効)
	int		EndFlag;				//文字列入力が完了しているかどうか。
	int		Visible;				//表示状態。
	int		IntNumber;				//入力文字列を整数値に変換した値。
	double		FloatNumber;				//入力文字列を浮動小数点値に変換した値。
	int		InputHandle;				//文字列入力ハンドル。
	char		InputString[TOOL_STRING_BUFFER_SIZE];	//入力文字列を取得する際に使用されるバッファ。
} /*SToolStringInput*/;
//*****************************************************************************
//	ローカル変数
//*****************************************************************************
static GSList*	g_TStringInput;
//*****************************************************************************
//	ローカル関数宣言
//*****************************************************************************
static void ToolStringInput_Step(SToolStringInput* TStringInput, double StepTime);
static void ToolStringInput_Draw(SToolStringInput* TStringInput);
//*****************************************************************************
//	アプリケーション用関数
//*****************************************************************************
//文字列入力情報を作成する。
//[in]
//	Name			名前の文字列が格納されたメモリアドレス。
//	x,y			文字列入力の表示位置。
//	NumberOnly		数値のみ入力可能にするかどうか。
//	NumberNum		入力できる数値の桁数。(NumberOnlyが0以外の場合のみ有効)
//	StringDrawWidth		文字列入力領域の横幅。(NumberOnlyが0の場合のみ有効)
//[out]
//	戻り値			文字列入力情報。
SToolStringInput* ToolStringInput_Create(const char* Name, int x, int y, int NumberOnly, int NumberNum, int StringDrawWidth) {
	SToolStringInput* TStringInput;
	//新しいボタン情報を格納するためのメモリの確保。
	TStringInput = calloc(1, sizeof(SToolStringInput));
	if(!TStringInput) { DIE(); }
	//確保したメモリ領域を保存。
	g_TStringInput = g_slist_append(g_TStringInput, TStringInput);
	//情報を初期化。
//不要	TStringInput->TVisible        = NULL;
//不要	TStringInput->TWindow         = NULL;
	TStringInput->Position.x      = x;
	TStringInput->Position.y      = y;
	TStringInput->NumberOnly      = NumberOnly;
	TStringInput->NumberNum       = NumberNum;
	TStringInput->StringDrawWidth = StringDrawWidth;
//不要	TStringInput->EndFlag         = 0;
	TStringInput->Visible         = 1;
//不要	TStringInput->IntNumber       = 0;
//不要	TStringInput->FloatNumber     = 0;
	TStringInput->InputHandle     = -1;
	if(Name) {
		TStringInput->Name = strdup(Name);
		if(!TStringInput->Name) { DIE(); }
	}
	//文字列入力情報を返す。
	return TStringInput;
}
//-----------------------------------------------------------------------------
//文字列入力情報を削除する。
//[in]
//	TStringInput		文字列入力情報。
void ToolStringInput_Delete(SToolStringInput* TStringInput) {
	//名前保存用にメモリを確保していた場合は解放。
	free(TStringInput->Name);
	//文字列入力ハンドルを作成していたら削除する。
	if(TStringInput->InputHandle != -1) { ToolFunc_DeleteKeyInput(TStringInput->InputHandle); }
	//確保していたメモリを解放する。
	g_TStringInput = g_slist_remove(g_TStringInput, TStringInput);
	free(TStringInput);
}
//-----------------------------------------------------------------------------
//全ての文字列入力情報を削除する。
void ToolStringInput_Delete_All() {
	//有効な全ての文字列入力を削除する。
	while(g_TStringInput) { ToolStringInput_Delete(g_TStringInput->data); }
}
//-----------------------------------------------------------------------------
//文字列入力情報に関連付ける表示状態情報をセットする。
//[in]
//	TStringInput		文字列入力情報。
//	TVisible		表示状態情報。
void ToolStringInput_SetVisibleHandle(SToolStringInput* TStringInput, SToolVisible* TVisible) {
	TStringInput->TVisible = TVisible;
}
//-----------------------------------------------------------------------------
//文字列入力情報の表示状態を変更する。
//[in]
//	TStringInput		文字列入力情報。
//	Visible			新しい表示状態。
void ToolStringInput_SetVisible(SToolStringInput* TStringInput, int Visible) {
	//新しい表示状態を保存する。
	TStringInput->Visible = Visible;
}
//-----------------------------------------------------------------------------
//文字列入力情報の表示状態を取得する。
//[in]
//	TStringInput		文字列入力情報。
//[out]
//	戻り値			表示状態。(0以外:表示,0:非表示)
int ToolStringInput_GetVisible(SToolStringInput* TStringInput) {
	//表示状態が0の場合は0を返す。
	if(!TStringInput->Visible) { return 0; }
	//関連付けられているウインドウ情報の表示状態が0の場合は0を返す。
	if(!ToolWindow_GetVisible(TStringInput->TWindow)) { return 0; }
	//表示状態情報が登録されていて、且つ表示状態情報の表示状態が0の場合は0を返す。
	if(!ToolVisible_GetVisible(TStringInput->TVisible)) { return 0; }
	//ここにきていたら非表示ではないということなので0以外を返す。
	return 1;
}
//-----------------------------------------------------------------------------
//文字列入力情報と関連付けるウインドウ情報を設定する。
//[in]
//	TStringInput		文字列入力情報。
//	TWindow			ウインドウ情報。
void ToolStringInput_SetWindow(SToolStringInput* TStringInput, SToolWindow* TWindow) {
	TStringInput->TWindow = TWindow;
}
//-----------------------------------------------------------------------------
//文字列入力情報の文字入力領域の座標を変更する。
//[in]
//	TStringInput		文字列入力情報。
//	x,y			変更後の文字入力領域の座標。
void ToolStringInput_SetPosition(SToolStringInput* TStringInput, int x, int y) {
	TStringInput->Position.x = x;
	TStringInput->Position.y = y;
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列を変更する。
//[in]
//	TStringInput		文字列入力情報。
//	String			セットする文字列が格納されたメモリアドレス。
void ToolStringInput_SetString(SToolStringInput* TStringInput, const char* String) {
	//文字列を保存する。
	strcpy(TStringInput->InputString, String);
	//文字列入力ハンドルが有効な場合は文字列入力ハンドルに反映する。
	if(TStringInput->InputHandle != -1) { ToolFunc_SetKeyInputString(String, TStringInput->InputHandle); }
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列を取得する。
//[in]
//	TStringInput		文字列入力情報。
//	String			入力中の文字列を格納するメモリ領域の先頭アドレス。
void ToolStringInput_GetString(SToolStringInput* TStringInput, char* String) {
	//文字列入力ハンドルが有効な場合は入力中の文字列を取得する。
	if(TStringInput->InputHandle != -1) {
		ToolFunc_GetKeyInputString(String, TStringInput->InputHandle);
	//入力中ではない場合は入力が確定した文字列をコピーする。
	} else {
		strcpy(String, TStringInput->InputString);
	}
}
//-----------------------------------------------------------------------------
//文字列入力情報の文字列入力を無条件で終了する。
//[in]
//	TStringInput		文字列入力情報。
void ToolStringInput_AlwaysEnd(SToolStringInput* TStringInput) {
	//文字列入力ハンドルが有効な場合は入力中の文字列を取得する。
	if(TStringInput->InputHandle != -1) { ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle); }
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列として整数値に変更する。
//[in]
//	TStringInput		文字列入力情報。
//	Number			入力中文字列として設定する整数値。
void ToolStringInput_SetIntNumber(SToolStringInput* TStringInput, int Number) {
	//値を保存。
	TStringInput->IntNumber   = Number;
	TStringInput->FloatNumber = Number;
	//文字列入力ハンドルが有効な場合は文字列入力ハンドルにセットする。
	if(TStringInput->InputHandle != -1) {
		ToolFunc_SetKeyInputNumber(Number, TStringInput->InputHandle);
		ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
	//文字列入力ハンドルが無効な場合は単純に数値を文字列に変換する。
	} else {
		sprintf(TStringInput->InputString, "%d", Number);
	}
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列として浮動小数点値に変更する。
//[in]
//	TStringInput		文字列入力情報。
//	Number			入力中文字列として設定する浮動小数点値。
void ToolStringInput_SetFloatNumber(SToolStringInput* TStringInput, double Number) {
	//値を保存。
	TStringInput->IntNumber   = Number;
	TStringInput->FloatNumber = Number;
	//文字列入力ハンドルが有効な場合は文字列入力ハンドルにセットする。
	if(TStringInput->InputHandle != -1) {
		ToolFunc_SetKeyInputNumberToFloat(Number, TStringInput->InputHandle);
		ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
	//文字列入力ハンドルが無効な場合は単純に数値を文字列に変換する。
	} else {
		sprintf(TStringInput->InputString, "%f", Number);
	}
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列を整数値に変換したものを取得する。
//[in]
//	TStringInput		文字列入力情報。
//[out]
//	戻り値			入力中の文字列を整数値に変換した値。
int ToolStringInput_GetIntNumber(SToolStringInput* TStringInput) {
	return TStringInput->IntNumber;
}
//-----------------------------------------------------------------------------
//文字列入力情報の入力中の文字列を浮動小数点値に変換したものを取得する。
//[in]
//	TStringInput		文字列入力情報。
//[out]
//	戻り値			入力中の文字列を浮動小数点値に変換した値。
double ToolStringInput_GetFloatNumber(SToolStringInput* TStringInput) {
	return TStringInput->FloatNumber;
}
//-----------------------------------------------------------------------------
//文字列入力情報の文字列の入力が終了しているかどうかを取得する。
//[in]
//	TStringInput		文字列入力情報。
//	Reset			文字列の入力が終了しているかどうかのフラグをリセットするかどうか。
//[out]
//	戻り値			入力が終了しているかどうか。(0以外:終了している,0:終了していない)
int ToolStringInput_CheckEnd(SToolStringInput* TStringInput, int Reset) {
	//戻り値を保存。
	int Result = TStringInput->EndFlag;
	//リセット指定がある場合はフラグを倒す。
	if(Reset) { TStringInput->EndFlag = 0; }
	//戻り値を返す。
	return Result;
}
//-----------------------------------------------------------------------------
//文字列入力情報の文字列入力がアクティブになっていた場合にアクティブ状態を解除する。
//[in]
//	TStringInput		文字列入力情報。
void ToolStringInput_ResetActive(SToolStringInput* TStringInput) {
	//アクティブな文字列入力ハンドルとなっていたらアクティブな文字列入力ハンドルが無い状態にする。
	if(ToolFunc_GetActiveKeyInput() == TStringInput->InputHandle) { ToolFunc_SetActiveKeyInput(-1); }
}
//-----------------------------------------------------------------------------
//全ての文字列入力情報の状態推移処理を行う。
//[in]
//	StepTime		進める時間。(単位:秒)
void ToolStringInput_Step_All(double StepTime) {
	GSList* list = g_TStringInput;
	while(list) {
		ToolStringInput_Step(list->data, StepTime);
		list = list->next;
	}
}
//-----------------------------------------------------------------------------
//全ての文字列入力情報の描画移処理を行う。
void ToolStringInput_Draw_All() {
	GSList* list = g_TStringInput;
	while(list) {
		ToolStringInput_Draw(list->data);
		list = list->next;
	}
}
//*****************************************************************************
//	ローカル関数
//*****************************************************************************
//文字列入力情報の状態推移処理を行う。
//[in]
//	TStringInput		文字列入力情報。
//	StepTime		進める時間。(単位:秒)
static void ToolStringInput_Step(SToolStringInput* TStringInput, double StepTime) {
	int ButtonFontHandle;
	int MouseX, MouseY;
	int MouseInput, MouseEdgeInput;
	int MouseSelectStartX, MouseSelectEndX;
	int SizeX, SizeY;
	int NameDrawW;
	int AreaX, AreaY;
	int In;
	int SelectStart, SelectEnd;
	//表示状態が0の場合は文字列入力ハンドルを削除して終了。
	if(!ToolStringInput_GetVisible(TStringInput)) {
		//文字列入力ハンドルが有効だった場合は入力中の文字列を保存した上で削除。
		if(TStringInput->InputHandle != -1) {
			ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
			ToolFunc_DeleteKeyInput(TStringInput->InputHandle);
			TStringInput->InputHandle = -1;
		}
		return;	//ここまで
	}
	//入力中文字列描画用のフォントハンドルを取得。
	ButtonFontHandle = ToolStatic_GetButtonFontHandle();
	//マウスカーソルの位置を取得。
	ToolStatic_GetMousePosition(&MouseX, &MouseY);
	//マウスの入力状態を取得。
	MouseInput     = ToolStatic_GetMouseButton();
	MouseEdgeInput = ToolStatic_GetMouseEdgeButton();
	//マウスの選択範囲を取得する。
	ToolStatic_GetMouseSelectStartPosition(&MouseSelectStartX, NULL,
	                                       &MouseSelectEndX,   NULL);
	//文字列入力ハンドルが作成されていない場合は作成する。
	if(TStringInput->InputHandle == -1) {
		//数値入力かどうかで作成処理を変更。
		if(TStringInput->NumberOnly) {
			//数値しか入力できない文字列入力ハンドルを作成。
			TStringInput->InputHandle = ToolFunc_MakeKeyInput(TStringInput->NumberNum, 0, 0, 1);
			//数値をセット。
			ToolFunc_SetKeyInputNumberToFloat(TStringInput->FloatNumber, TStringInput->InputHandle);
		} else {
			//数値以外も入力できるの文字列入力ハンドルを作成。
			TStringInput->InputHandle = ToolFunc_MakeKeyInput(TOOL_STRING_BUFFER_SIZE - 1, 0, 0, 0);
			//確定している入力文字列をセット。
			ToolFunc_SetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
		}
		//文字列入力ハンドルの作成に失敗したらエラー。
		if(TStringInput->InputHandle < 0) { DIE(); }
		//現在の文字列入力ハンドルで設定されている文字列を取得。
		ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
	}
	//文字列入力領域の幅と高さをセット。
	SizeX = TStringInput->NumberOnly ? (TStringInput->NumberNum * TOOL_ONE_NUMBER_SIZE + 4)
	                                 :  TStringInput->StringDrawWidth;
	SizeY = TOOL_STRINGINPUT_HEIGHT;
	//名前の描画幅を取得する。
	if(TStringInput->Name) {
		NameDrawW = ToolFunc_GetDrawStringWidthToHandle(TStringInput->Name, -1, ToolStatic_GetNormalFontHandle()) + 2;
	} else {
		NameDrawW = 0;
	}
	//文字列入力領域の座標と文字列入力領域上にマウスカーソルがあるかどうかを取得する。
	if(TStringInput->TWindow) {
		ToolWindow_GetDrawLeftUpPos(TStringInput->TWindow, &AreaX, &AreaY);
		AreaX += TStringInput->Position.x + NameDrawW;
		AreaY += TStringInput->Position.y;
		In = ToolStatic_CheckMouseIn(AreaX, AreaY, AreaX + SizeX, AreaY + SizeY) &&
		     ToolWindow_CheckInfoAreaIn(TStringInput->TWindow, MouseX, MouseY);
	} else {
		AreaX = TStringInput->Position.x + NameDrawW;
		AreaY = TStringInput->Position.y;
		In = ToolStatic_CheckMouseIn(AreaX, AreaY, AreaX + SizeX, AreaY + SizeY);
	}
	//入力中の文字列の選択範囲を取得する。
	ToolFunc_GetKeyInputSelectArea(&SelectStart, &SelectEnd, TStringInput->InputHandle);
	//マウスの左クリックをした瞬間の場合は処理を分岐。
	if(MouseEdgeInput & (1<<0)/*MOUSE_INPUT_LEFT*/) {
		//文字列入力領域の中でクリックしたかどうかで処理を分岐。
		if(In) {
			//文字列入力ハンドルをアクティブにする。
			ToolFunc_SetActiveKeyInput(TStringInput->InputHandle);
			//ダブルクリックだった場合は入力中文字列全体を選択状態にする。
			if(ToolStatic_GetMouseDoubleClick()) {
				ToolFunc_SetKeyInputSelectArea(0, 9999, TStringInput->InputHandle);
			} else {
				//シングルクリックの場合は入力中文字列の選択範囲を解除する。
				ToolFunc_SetKeyInputSelectArea(-1, -1, TStringInput->InputHandle);
				//クリックした座標に合わせて入力中文字列のカーソルの位置を変更。
				ToolFunc_SetKeyInputCursorPosition(ToolStatic_GetKeyInputCursorPos(AreaX,
				                                                                   MouseX,
				                                                                   TStringInput->InputHandle,
				                                                                   ButtonFontHandle),
				                          TStringInput->InputHandle);
			}
		} else {
			//文字列入力領域の外でクリックした場合は文字列の選択範囲を解除する。
			ToolFunc_SetKeyInputSelectArea(-1, -1, TStringInput->InputHandle);
		}
	//マウスの左ボタンが押されていて且つ文字列入力領域にマウスカーソルがある場合は入力中文字列の選択範囲を変更する。
	} else if((MouseInput & (1<<0)/*MOUSE_INPUT_LEFT*/) && In) {
		int Start = ToolStatic_GetKeyInputCursorPos(AreaX,
		                                            MouseSelectStartX,
		                                            TStringInput->InputHandle,
		                                            ButtonFontHandle);
		int End   = ToolStatic_GetKeyInputCursorPos(AreaX,
		                                            MouseSelectEndX,
		                                            TStringInput->InputHandle,
		                                            ButtonFontHandle);
		if(Start != End) { ToolFunc_SetKeyInputSelectArea(Start, End, TStringInput->InputHandle); }
		//入力中文字列のカーソル位置もマウスカーソルの位置にあわせて変更。
		ToolFunc_SetKeyInputCursorPosition(ToolStatic_GetKeyInputCursorPos(AreaX,
		                                                                   MouseX,
		                                                                   TStringInput->InputHandle,
		                                                                   ButtonFontHandle),
		                          TStringInput->InputHandle);
	}
	//文字列入力領域内で右クリックされた場合。
	if((MouseEdgeInput & (1<<1)/*MOUSE_INPUT_RIGHT*/) && In) {
		if(SelectStart != -1) {
			char TempStr[TOOL_STRING_BUFFER_SIZE];
			int StringLength, smin, smax;
			//入力中文字列の選択範囲がある場合はクリップボードに文字列を登録する。
			ToolFunc_GetKeyInputString(TempStr, TStringInput->InputHandle);
			if(SelectStart < SelectEnd) {
				smin = SelectStart;
				smax = SelectEnd;
			} else {
				smin = SelectEnd;
				smax = SelectStart;
			}
			StringLength = smax - smin;
			memmove(TempStr, TempStr + smin, StringLength);
			TempStr[StringLength] = '\0';
			ToolFunc_SetClipboardText(TempStr);
			ToolFunc_SetKeyInputSelectArea(-1, -1, TStringInput->InputHandle);
		} else {
			char *String, *p;
			int Size;
			//入力中文字列の選択範囲が無い場合はクリップボードの文字列を入力文字列に追加。
			//クリップボード上の文字列のサイズを取得する。
			Size = ToolFunc_GetClipboardText(NULL);
			//文字列を格納するためのメモリの確保。
			String = malloc(Size);
			if(!String) { DIE(); }
			//メモリの確保に成功したらクリップボード上の文字列を取得。
			ToolFunc_GetClipboardText(String);
			//取得した文字を入力文字列に追加。
			for(p = String; *p; p++) { ToolFunc_StockInputChar(*p); }
			//確保したメモリの解放。
			free(String);
		}
	}
	//文字列入力が完了していたら完了処理を行う。
	if(ToolFunc_CheckKeyInput(TStringInput->InputHandle)) {
		//文字列入力が完了しているかどうかのフラグを立てる。
		TStringInput->EndFlag = 1;
		//完了時の文字列を取得する。
		ToolFunc_GetKeyInputString(TStringInput->InputString, TStringInput->InputHandle);
		//完了時の文字列を数値とした場合の値を取得する。
		TStringInput->IntNumber   = ToolFunc_GetKeyInputNumber(TStringInput->InputHandle);
		TStringInput->FloatNumber = ToolFunc_GetKeyInputNumberToFloat(TStringInput->InputHandle);
		//文字列入力ハンドルは再度入力状態にする。
		ToolFunc_ReStartKeyInput(TStringInput->InputHandle);
	}
}
//-----------------------------------------------------------------------------
//文字列入力情報を画面に描画する。
//[in]
//	TStringInput		文字列入力情報。
static void ToolStringInput_Draw(SToolStringInput* TStringInput) {
	char String[TOOL_STRING_BUFFER_SIZE];
	int NormalFontHandle, ButtonFontHandle;
	int AreaX, AreaY;
	int NameDrawW;
	int SizeX, SizeY;
	RECT DrawRect, InfoArea;
	//非表示状態の場合は何もせず終了。
	if(!ToolStringInput_GetVisible(TStringInput)) { return; }	//ここまで
	//名前描画用のフォントハンドルを取得。
	NormalFontHandle = ToolStatic_GetNormalFontHandle();
	//入力中文字列描画用のフォントハンドルを取得。
	ButtonFontHandle = ToolStatic_GetButtonFontHandle();
	//文字列入力領域の座標を取得する。
	if(TStringInput->TWindow) {
		ToolWindow_GetDrawLeftUpPos(TStringInput->TWindow, &AreaX, &AreaY);
		AreaX += TStringInput->Position.x;
		AreaY += TStringInput->Position.y;
		//ウインドウ情報が有効な場合は描画領域制限設定を行う。
		ToolWindow_SetupDrawArea(TStringInput->TWindow);
	} else {
		AreaX = TStringInput->Position.x;
		AreaY = TStringInput->Position.y;
	}
	//名前がある場合は名前を描画する。
	if(TStringInput->Name) {
		//名前の描画幅を取得する。
		NameDrawW = ToolFunc_GetDrawStringWidthToHandle(TStringInput->Name, -1, NormalFontHandle) + 2;
		//名前を描画する。
		ToolFunc_DrawStringToHandle(AreaX,
		                            AreaY,
		                            TStringInput->Name,
		                            ToolFunc_GetColor(255,255,255),
		                            NormalFontHandle);
		//文字列入力領域を名前の描画幅分だけ右にずらす。
		AreaX += NameDrawW;
	}
	//文字列入力領域の幅と高さをセット。
	SizeX = TStringInput->NumberOnly ? (TStringInput->NumberNum * TOOL_ONE_NUMBER_SIZE + 4)
	                                 :  TStringInput->StringDrawWidth;
	SizeY = TOOL_STRINGINPUT_HEIGHT;
	//文字列入力領域の枠を描画。
	ToolStatic_DrawButton(AreaX - 3,
	                      AreaY - 3,
	                      SizeX + 4,
	                      18,
	                      ToolFunc_GetColor(  0,  0,  0),
	                      ToolFunc_GetColor( 64, 64, 64),
	                      ToolFunc_GetColor(255,255,255),
	                      ToolFunc_GetColor(191,191,191),
	                      ToolFunc_GetColor(220,220,220));
	//関連付けられているウインドウ情報がある場合はウインドウ情報を考慮した描画領域制限設定を行う。
	if(TStringInput->TWindow) {
		DrawRect.left   = AreaX;
		DrawRect.top    = AreaY;
		DrawRect.right  = AreaX + SizeX;
		DrawRect.bottom = AreaY + 17;
		InfoArea = ToolWindow_GetInfoArea(TStringInput->TWindow);
		ToolFunc_RectClipping(&DrawRect, &InfoArea);
		ToolFunc_SetDrawArea(DrawRect.left, DrawRect.top, DrawRect.right, DrawRect.bottom);
	//ウインドウ情報が関連付けられていない場合は文字列入力領域をそのまま描画制限領域として設定する。
	} else {
		ToolFunc_SetDrawArea(AreaX, AreaY, AreaX + SizeX, AreaY + 17);
	}
	//入力中文字列の文字列描画に使用するフォントを設定する。
	ToolFunc_SetKeyInputStringFont(ButtonFontHandle);
	//現在の入力中の文字列を取得する。
	ToolFunc_GetKeyInputString(String, TStringInput->InputHandle);
	//入力中文字列が確定した文字列と異なる場合は描画色を変更する。
	if(strcmp(String, TStringInput->InputString)) {
		ToolFunc_SetKeyInputStringColor(ToolFunc_GetColor(0,0,255), -1, -1, -1, -1, -1, -1);
	} else {
		ToolFunc_SetKeyInputStringColor(ToolFunc_GetColor(0,0,  0), -1, -1, -1, -1, -1, -1);
	}
	//入力中文字列の描画。
	ToolFunc_DrawKeyInputString(AreaX, AreaY, TStringInput->InputHandle);
	//設定を元に戻す。
	ToolFunc_SetKeyInputStringFont(-1);
	ToolFunc_SetKeyInputStringColor(-1, -1, -1, -1, -1, -1, -1);
	ToolFunc_SetDrawAreaFull();
}
#endif//TOOLLIB_USE_STRINGINPUT
