//------------------------------------------------------------------------------
//	TextBox の Textプロパティ を数値に変換する拡張メソッドを定義するクラス
//
//	変換可能な型：　int, float, duble, Complex
//	＜注意＞ Complex型を使う場合は，プロジェクトのプロパティの “ビルド” タブを
//			 開き “条件付きコンパイル シンボル(Y): ” の項目で USING_COMPLEX
//			 を追加する必要がある．
//			 さらに，System.Numerics を参照設定に追加しておく必要がある．
//
//		作成者：三上直樹，2015/07/03 作成，©三上直樹 2015
//------------------------------------------------------------------------------

using System;
using System.Windows.Forms;

#if USING_COMPLEX
using System.Numerics;
#endif

namespace Mikami.WindowsApplication
{
	public static class TextBoxToValue
	{
		// ｢int 型｣ の数値に変換
		public static bool ToInt(this TextBox tBox, out int x,
								 Func<int, bool> Condition = null,
								 string str = "")
		{
			if (!int.TryParse(tBox.Text, out x))
				return ErrorMessage(tBox);			// 不正な文字列

			if ( (Condition == null) || (Condition(x)) )
				return true;						// 正常
			else
				return ErrorMessage(tBox, str);		// 条件を満足しない
		}

		// ｢float 型｣ の数値に変換
		public static bool ToFloat(this TextBox tBox, out float x,
								   Func<float, bool> Condition = null,
								   string str = "")
		{
			if (!float.TryParse(tBox.Text, out x))
				return ErrorMessage(tBox);			// 不正な文字列

			if ( (Condition == null) || (Condition(x)) )
				return true;						// 正常
			else
				return ErrorMessage(tBox, str);		// 条件を満足しない
		}

		// ｢double 型｣ の数値に変換
		public static bool ToDouble(this TextBox tBox, out double x,
									Func<double, bool> Condition = null,
									string str = "")
		{
			if (!double.TryParse(tBox.Text, out x))
				return ErrorMessage(tBox);			// 不正な文字列

			if ( (Condition == null) || (Condition(x)) )
				return true;						// 正常
			else
				return ErrorMessage(tBox, str);		// 条件を満足しない
		}

#if USING_COMPLEX
		// ｢Complex 型｣ の数値に変換
		public static bool ToComplex(this TextBox tBox, out Complex x,
									 Func<Complex, bool> Condition = null,
									 string str = "")
		{
			x = 0.0;
			string[] s2 = tBox.Text.Split(new char[]{','});
			if (s2.Length > 2) return ErrorMessage(tBox);

			double[] v = new double[2];
			v[1] = 0.0;
			for (int n=0; n<s2.Length; n++)
				if (!(double.TryParse(s2[n], out v[n])))
					return ErrorMessage(tBox);		// 不正な文字列
			x = new Complex(v[0], v[1]);

			if ( (Condition == null) || (Condition(x)) )
				return true;						// 正常
			else
				return ErrorMessage(tBox, str);		// 条件を満足しない
		}
#endif

		// エラーメッセージを出し，エラーの起こった ｢TextBox｣ に ｢フォーカス｣ を移動
		private static bool ErrorMessage(TextBox aTextBox,
										 string msg = "不正な文字列です。")
		{
			MessageBox.Show(msg, "入力エラー!");
			aTextBox.Select();
			aTextBox.SelectAll();
			return false;
		}
	}
}
