///////////////////////////////
// MSBuilder.cs
// that calls and uses MSBuild
// Copyright (c) 2025 by ysama
///////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Reflection;				//Assemblyを使う為
using System.Resources;					//リソース関係クラス等の使用の為
using System.IO;						//File.ReadAllText使用の為
using System.Text;  					//Encoding.GetEncoding使用の為
using System.Text.RegularExpressions;	//Regex.Splitを使用の為
using System.Diagnostics;				//Process使用の為

namespace MSBuilder
{
	public class MSB : Form
	{
		//クラスメンバー変数
		string MSBPath = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\";	//MSBuild.exeへのパス
		string TargetFile = "";						//ビルドするcsprojまたはslnファイル名
		string MSBSwitch = "";						//MSBuildのスイッチ文
		string MSBDataFile = "";					//MSBuilderのデータファイル（*.msb)
		//クラスコントロール変数
		ToolStrip toolStrip;						//ツールバー
		ToolStripButton[] toolStripButton;			//ツールバーボタン
		StatusStrip statusStrip;					//ステータスバー
		ToolStripStatusLabel[] tssl;				//ステータスバーラベル
		TextBox txtBox;								//出力用テキストボックス

		[STAThread]
		public static void Main()					//エントリーポイント
		{
			Application.Run(new MSB());
		}

		public MSB()								//コンストラクター
		{
			Assembly myOwn = Assembly.GetEntryAssembly();
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.Size = new Size(640, 480);
			this.MinimumSize = new Size(320, 190);
			this.Text = "MSBuilder";
			this.Load += MSB_Load;
		}

		private void MSB_Load(object sender, EventArgs e)
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//メインメニュー作成
			MainMenu menu = new MainMenu();
			Menu = menu;
			//メインメニューアイテム付加
			MenuItem miFile = new MenuItem();		//「ファイル」メニュー
			miFile.Text = "ファイル(&F)";
			miFile.Index = 0;
			menu.MenuItems.Add(miFile);
			MenuItem miBuild = new MenuItem();		//「ビルド」メニュー
			miBuild.Text = "ビルド(&B)";
			miBuild.Index = 1;
			menu.MenuItems.Add(miBuild);
			MenuItem miHelp = new MenuItem();		//「ヘルプ」メニュー
			miHelp.Text = "ヘルプ(&H)";
			miHelp.Index = 2;
			menu.MenuItems.Add(miHelp);
			//サブメニューアイテム付加
			MenuItem miOpen = new MenuItem();		//「開く」メニューアイテム
			miOpen.Text = "開く(&O)";
			miOpen.Index = 0;
			miOpen.Click += OnOpen_Click;
			miOpen.Shortcut = Shortcut.CtrlO;
			miFile.MenuItems.Add(miOpen);
			MenuItem miSave = new MenuItem();		//「保存」メニューアイテム
			miSave.Text = "保存(&S)";
			miSave.Index = 1;
			miSave.Click += OnSave_Click;
			miSave.Shortcut = Shortcut.CtrlS;
			miFile.MenuItems.Add(miSave);
			miFile.MenuItems.Add("-");				//セパレーター
			MenuItem miSetUp = new MenuItem();		//「設定」メニューアイテム
			miSetUp.Text = "設定(&U)";
			miSetUp.Index = 2;
			miSetUp.Click += OnSetUp_Click;
			miSetUp.Shortcut = Shortcut.CtrlU;
			miFile.MenuItems.Add(miSetUp);
			miFile.MenuItems.Add("-");				//セパレーター
			MenuItem miExit = new MenuItem();		//「終了」メニューアイテム
			miExit.Text = "終了(&X)";
			miExit.Index = 3;
			miExit.Click += OnExit_Click;
			miExit.Shortcut = Shortcut.CtrlX;
			miFile.MenuItems.Add(miExit);
			MenuItem miSwitch = new MenuItem();		//「スイッチ」メニューアイテム
			miSwitch.Text = "スイッチ(&W)";
			miSwitch.Index = 0;
			miSwitch.Click += OnSwitch_Click;
			miSwitch.Shortcut = Shortcut.CtrlW;
			miBuild.MenuItems.Add(miSwitch);
			MenuItem miExec = new MenuItem();		//「実行」メニューアイテム
			miExec.Text = "実行(&E)";
			miExec.Index = 1;
			miExec.Click += OnExec_Click;
			miExec.Shortcut = Shortcut.CtrlE;
			miBuild.MenuItems.Add(miExec);
			MenuItem miHowtoUse = new MenuItem();	//「使い方」メニューアイテム
			miHowtoUse.Text = "使い方(&U)";
			miHowtoUse.Index = 0;
			miHowtoUse.Click += OnHowtoUse_Click;
			miHelp.MenuItems.Add(miHowtoUse);
			MenuItem miVer = new MenuItem();		//「バージョン」メニューアイテム
			miVer.Text = "バージョン(&N)";
			miVer.Index = 1;
			miVer.Click += OnVersion_Click;
			miVer.Shortcut = Shortcut.CtrlN;
			miHelp.MenuItems.Add(miVer);

			//ツールバーとステータスバーの設定
			//ToolStripクラスインスタンスの生成
			this.toolStrip = new ToolStrip();
			//ツールバーのレイアウトを一時停止
			this.toolStrip.SuspendLayout();
			//ToolStripButton配列を作成
			this.toolStripButton = new ToolStripButton[6];
			//本プログラムの埋め込みリソースのリソースマネージャーを作成
			Assembly asm = Assembly.GetExecutingAssembly();
			ResourceManager rm = new ResourceManager("MSBuilder", asm);
			//ツールバービットマップの読み込み
			ImageList imgList = new ImageList();
			imgList.ImageSize = new Size(16, 15);
			imgList.Images.AddStrip((Bitmap)rm.GetObject("ToolBar"));
			imgList.TransparentColor = Color.White;
			//ToolStripButton[0]を作成
			this.toolStripButton[0] = new ToolStripButton();
			this.toolStripButton[0].Text = "開く(&O)";								//テキスト設定
			this.toolStripButton[0].Image = (Bitmap)imgList.Images[0];				//画像設定
			this.toolStripButton[0].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[0].Click += OnOpen_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[0]);						//ボタンを追加
			//ToolStripButton[1]を作成
			this.toolStripButton[1] = new ToolStripButton();
			this.toolStripButton[1].Text = "保存(&S)";								//テキスト設定
			this.toolStripButton[1].Image = (Bitmap)imgList.Images[1];				//画像設定
			this.toolStripButton[1].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[1].Click += OnSave_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[1]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[2]を作成
			this.toolStripButton[2] = new ToolStripButton();
			this.toolStripButton[2].Text = "終了(&X)";								//テキスト設定
			this.toolStripButton[2].Image = (Bitmap)imgList.Images[2];				//画像設定
			this.toolStripButton[2].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[2].Click += OnExit_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[2]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[3]を作成
			this.toolStripButton[3] = new ToolStripButton();
			this.toolStripButton[3].Text = "実行(&E)";								//テキスト設定
			this.toolStripButton[3].Image = (Bitmap)imgList.Images[3];				//画像設定
			this.toolStripButton[3].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[3].Click += OnExec_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[3]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[4]を作成
			this.toolStripButton[4] = new ToolStripButton();
			this.toolStripButton[4].Text = "使い方(&U)";							//テキスト設定
			this.toolStripButton[4].Image = (Bitmap)imgList.Images[4];				//画像設定
			this.toolStripButton[4].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[4].Click += OnHowtoUse_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[4]);						//ボタンを追加
			//ToolStripButton[5]を作成
			this.toolStripButton[5] = new ToolStripButton();
			this.toolStripButton[5].Text = "バージョン情報(&V)";					//テキスト設定
			this.toolStripButton[5].Image = (Bitmap)imgList.Images[5];				//画像設定
			this.toolStripButton[5].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[5].Click += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[5]);						//ボタンを追加
			//ツールバーの設定
			this.Controls.Add(this.toolStrip);
			//ツールバーのレイアウトを再開
			this.toolStrip.ResumeLayout(false);
			this.toolStrip.PerformLayout();

			//StatusStripクラスインスタンスの生成
			this.statusStrip = new StatusStrip();
			//ステータスバーにパネルとテキストを追加
			tssl = new ToolStripStatusLabel[2];
			tssl[0] = new ToolStripStatusLabel();
			tssl[0].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[0].BorderStyle = Border3DStyle.SunkenInner;
			tssl[0].BackColor = SystemColors.Control;
			tssl[0].Text = "MSBuilder Ver. 1.0";
			tssl[0].AutoSize = true;
			tssl[0].TextAlign = ContentAlignment.MiddleLeft;
			tssl[1] = new ToolStripStatusLabel();
			tssl[1].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[1].BorderStyle = Border3DStyle.SunkenInner;
			tssl[1].BackColor = SystemColors.Control;
			tssl[1].TextAlign = ContentAlignment.MiddleLeft;
			tssl[1].Text = "（ビルドするファイル名）";
			tssl[1].ToolTipText = "（ビルドするファイル名）";		//ToolTip設定
			tssl[1].Spring = true;
			statusStrip.Items.AddRange(tssl);
			statusStrip.ShowItemToolTips = true;					//ToolTip表示
			this.Controls.Add(this.statusStrip);					//StatusStrip(ステータスバー)を追加

			//出力用テキストボックス
			txtBox = new TextBox();
			//位置
			txtBox.Location = new Point(0, this.toolStrip.Height);
			//サイズ
			txtBox.Width = ClientSize.Width;
			txtBox.Height = ClientSize.Height - this.toolStrip.Height - this.statusStrip.Height;
			//アンカー
			txtBox.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			//その他プロパティ
			txtBox.AcceptsReturn = true;
			txtBox.AcceptsTab = true;
			txtBox.Multiline = true;
			txtBox.ScrollBars = ScrollBars.Both;
			txtBox.WordWrap  = false;
			//Drag and Dropのイベントハンドラの追加（2025年05月05日追加－MSB_Loadに追加する））
			txtBox.DragEnter += new DragEventHandler(TB_DragEnter);
			txtBox.DragDrop += new DragEventHandler(TB_DragDrop);
			txtBox.AllowDrop = true;
			//FormにTextBoxを追加
			this.Controls.Add(txtBox);

			//メインフォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();

			//2025年05月05日追加（MSB_Loadの最後に追加する）
			//起動時の引数をチェックし、引数にファイル名があればそれを読み込む
			string[] arg = System.Environment.GetCommandLineArgs();
			//ドロップされた（最後の）ファイルパスを取得
			if(arg.Length > 1)
				SetArg(arg[arg.Length - 1]);
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
			{
				e.Cancel = true;
			}
		}

		//「ファイルを開く」処理
		private void OnOpen_Click(object sender, EventArgs e)
		{
			//ファイル選択ダイアログの設定
			OpenFileDialog ofDlg = new OpenFileDialog();
			//ファイルフィルターの指定
			ofDlg.FilterIndex = 1;			//フィルター選択番号
			ofDlg.Filter = "ビルド用ファイル(*.csproj, *.sln)|*.csproj;*.sln|msbファイル(*.msb)|*.msb";
			ofDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			ofDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			ofDlg.InitialDirectory = ".";	// デフォルトのフォルダーの指定
			ofDlg.Title = "ファイルを開く";	//ダイアログのタイトルを指定する
			if(ofDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				SetArg(ofDlg.FileName);
			}
			// オブジェクトを破棄する
			ofDlg.Dispose();
		}

		//「保存」処理
		private void OnSave_Click(object sender, EventArgs e)
		{
			//MSBDataFileにTargetFileとSwitchを保存する
			if(MSBDataFile != "")
			{
				using(FileStream fs = new FileStream(MSBDataFile, FileMode.OpenOrCreate))
				{
					using(StreamWriter file = new StreamWriter(fs, Encoding.GetEncoding("shift-jis")))
					{
						// ファイルを書き込む
						file.Write("TargetFile=");
						file.WriteLine(TargetFile);		//ビルド用ファイル
						file.Write("MSBSwitch=");
						file.WriteLine(MSBSwitch);		//ビルド用スイッチ
					}
					//ファイルクローズ
					fs.Close();
					fs.Dispose();
				}
			}
			//MSBDataFileが""であれば、名前を付けてTargetFileとSwitchを保存する
			else
			{
				SaveFileDialog sfDlg = new SaveFileDialog();
				//ファイルフィルターの指定
				sfDlg.AddExtension = true;		//拡張子自動付加
				sfDlg.DefaultExt = "msb";
				sfDlg.Filter = "msbファイル(*.msb)|*.msb";
				sfDlg.FilterIndex = 1;			
				sfDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
				sfDlg.CheckPathExists = true;	//ファイルパスの存在チェック
				sfDlg.InitialDirectory = ".";	// デフォルトのフォルダーの指定
				sfDlg.Title = "MSBデータファイルを保存";		//ダイアログのタイトルを指定する
				sfDlg.OverwritePrompt = true;					//上書き確認
				if(sfDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
				{
					MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				}
				else
				{
					MSBDataFile = sfDlg.FileName;
					using(FileStream fs = new FileStream(MSBDataFile, FileMode.OpenOrCreate))
					{
						using(StreamWriter file = new StreamWriter(fs, Encoding.GetEncoding("shift-jis")))
						{
							//ファイルを書き込む
							file.Write("TargetFile=");
							file.WriteLine(TargetFile);		//ビルド用ファイル
							file.Write("MSBSwitch=");
							file.WriteLine(MSBSwitch);		//ビルド用スイッチ
						}
						//ファイルクローズ
						fs.Close();
						fs.Dispose();
					}
				}
			}
		}

		//「設定」処理
		private void OnSetUp_Click(object sender, EventArgs e)
		{
			//64bit版MSBuildまたは32bit版に設定する
			string msg = "現在のMSBuildへのパスは、\r\n\"" + MSBPath +"\"\r\nとなっています。\r\n64bitにしますか？（「はい」）\r\nそれとも32bitですか？（「いいえ」））";
			DialogResult dr = MessageBox.Show(msg, "Framework種類確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
				MSBPath = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\";
			else
				MSBPath = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\";
		}

		//「終了」処理
		private void OnExit_Click(object sender, EventArgs e)
		{
			Close();	//修了確認はOnClosingメソッドで行う
		}

		//「スイッチ」処理
		private void OnSwitch_Click(object sender, EventArgs e)
		{
			SwitchDlg SwtDlg = new SwitchDlg(MSBSwitch);	//スイッチダイアログを呼び出す
			SwtDlg.ShowDialog();
			MSBSwitch = SwtDlg.Switch;						//スイッチ文を引き取る
			SwtDlg.Dispose();
		}

		//「実行」処理
		private void OnExec_Click(object sender, EventArgs e)
		{
			string msg = TargetFile + "\r\nをビルドします。\r\n", stdoutput, stderr;
			if(MSBSwitch == "")
				msg += "指定されたスイッチはありません。\r\n宜しいですか？";
			else
				msg += "指定されたスイッチは\r\n" + MSBSwitch + "\r\nです。\r\n宜しいですか？";
			DialogResult dr = MessageBox.Show(msg, "MSBuildのスイッチ確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
			{
				//コマンドライン引数を指定してMSBuildを起動する
				ProcessStartInfo startInfo = new ProcessStartInfo()
				{	FileName = MSBPath + "msbuild.exe",
					Arguments = "\"" + TargetFile + "\" " + MSBSwitch,
					UseShellExecute = false,
					RedirectStandardOutput = true,
					RedirectStandardError = true
				};
				using(Process process = Process.Start(startInfo))
				{
					stdoutput = process.StandardOutput.ReadToEnd();	//結果出力
					stderr = process.StandardError.ReadToEnd();		//エラー出力（あれば）
					process.WaitForExit();							//終了待機
				}
				//MSBuildからの出力結果とエラーを表示
				txtBox.Text = "【出力結果】\r\n" + stdoutput + "\r\n【エラー】\r\n" + stderr;
			}
			else
				txtBox.Text = "ビルドは中止されました。";
		}

		//「使い方」処理
		private void OnHowtoUse_Click(object sender, EventArgs e)
		{
			Help.ShowHelp(txtBox, @".\MSBuilderHelp.chm");	//ヘルプ表示（*.chmファイル）
		}

		//「バージョン」処理
		private void OnVersion_Click(object sender, EventArgs e)
		{
			VersionDlg verDlg = new VersionDlg(this.Icon);	//Versionダイアログ表示
			verDlg.ShowDialog();
			verDlg.Dispose();
		}

		//2025年05月05日追加（MSBクラスの最後に追加する）
		///////////////////////////
		//コントロール関連メソッド
		///////////////////////////
		//txtBoxにドラッグされた時
		private void TB_DragEnter(object sender, DragEventArgs e)
		{
			if(e.Data.GetDataPresent(DataFormats.FileDrop))
				e.Effect = DragDropEffects.Copy;
			else
				e.Effect = DragDropEffects.None;
		}

		//txtBoxにドロップされたとき
		private void TB_DragDrop(object sender, DragEventArgs e)
		{
			//ドロップされた（最後の）ファイルパスを取得
			string[] ddlist =  (string[])e.Data.GetData(DataFormats.FileDrop, false);
			SetArg(ddlist[ddlist.Length - 1]);
		}

		//ファイルからビルド用ファイル名とスイッチを取得
		private void SetArg(string arg)
		{
			string ext = Path.GetExtension(arg);
			if(ext == ".MSB" || ext == ".msb")
			{
				//MSBDataFileを記録し、TargetFileとSwitchを読み込み、設定する
				MSBDataFile = arg;
				string InFile = File.ReadAllText(MSBDataFile, Encoding.GetEncoding("shift-jis"));
				string[] tokens = Regex.Split(InFile, @"\r\n|=");			//改行または'='をセパレーターとして分割する
				if(tokens[0] == "TargetFile" && tokens[2] == "MSBSwitch")	//出力形式が合う場合
				{
					//slnまたはprojファイル名を記録
					tssl[1].Text = TargetFile = tokens[1];
					tssl[1].ToolTipText = TargetFile;	//ToolTip設定
					//スイッチ文を記録
					MSBSwitch = tokens[3];
					//slnまたはprojファイルを表示
					txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
				}
				else
					MessageBox.Show("正しいmsbファイルパスではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			else if(ext == ".CSPROJ" || ext == ".csproj" || ext == ".SLN" || ext == ".sln")
			{
				//slnまたはprojファイル名を記録
				tssl[1].Text = TargetFile = arg;
				tssl[1].ToolTipText = TargetFile;	//ToolTip設定
				//slnまたはprojファイルを表示
				txtBox.Text = File.ReadAllText(TargetFile, Encoding.GetEncoding("shift-jis"));
				MSBSwitch = "";						//MSBSwitchを初期化する
				MSBDataFile = "";					//MSBDataFileを初期化する
				MessageBox.Show("現在のビルド情報は「保存」しなければ失われてしまいます。\r\n必ず「保存」してください。", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
				MessageBox.Show("正しいビルド用ファイルパスではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	}

	/////////////////////
	//Switch ダイアログ
	/////////////////////
	class SwitchDlg : Form
	{
		//メンバー変数
		public string Switch;		//データ受け渡し用メンバー変数
		//メンバーコントロール
		Button btnOK, btnHelp, btnAdd;
		ComboBox cmbBox;
		TextBox txtBox;

		public SwitchDlg(string swt = "")
		{
			//ダイアログの属性設定
			this.Text = "MSBuildスイッチ設定";
			this.ClientSize = new Size(320, 240);
			this.MaximizeBox = false;		// 最大化ボタン
			this.MinimizeBox = false;		// 最小化ボタン
			this.ShowInTaskbar = false;		//タスクバー上表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	// 親フォームの中央に配置
			//コントロールの属性設定
			//スイッチ文選択用コンボボックス
			cmbBox = new ComboBox();
			cmbBox.DropDownStyle = ComboBoxStyle.DropDown;
			cmbBox.DropDownWidth = 176;
			cmbBox.DropDownHeight = 176;
			cmbBox.Size = new Size(180, 20);
			cmbBox.Location = new Point(10, 10);
			string[] Items = new string [] {"/consoleloggerparameters:",
										"/distributedlogger:",
										"/distributedFileLogger",
										"/detailedsummary",
										"/fileLogger",
										"/fileloggerparameters",
										"/help",
										"/ignoreprojectextensions:",
										"/logger:",
										"/maxcpucount",
										"/noautoresponse",
										"/noconsolelogger",
										"/nodeReuse:",
										"/nologo",
										"/preprocess:",
										"/property:", 
										"/target:",
										"/toolsversion:",
										"/validate",
										"/verbosity:",
										"/version"};
			foreach(string item in Items)
			{
				cmbBox.Items.Add(item);
			}
			this.Controls.Add(cmbBox);
			//スイッチ文表示用テキストボックス
			txtBox = new TextBox();
			txtBox.Multiline = true;
			txtBox.WordWrap = true;
			txtBox.ScrollBars = ScrollBars.Vertical;
			txtBox.Size = new Size(this.ClientSize.Width - 20, 120);
			txtBox.Location = new Point(10, cmbBox.Height + 20);
			txtBox.Text = swt;
			this.Controls.Add(txtBox);
			//終了ボタン
			btnOK = new Button();
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, ClientSize.Height - btnOK.Height - 10);
			btnOK.Text = "終了";
			btnOK.Click += new EventHandler(OnOK_Click);
			this.Controls.Add(btnOK);
			//Helpボタン
			btnHelp = new Button();
			btnHelp.Location = new Point(ClientSize.Width - btnHelp.Width - 10, ClientSize.Height - btnHelp.Height - btnOK.Height - 20);
			btnHelp.Text = "Help";
			btnHelp.Click += new EventHandler(OnHelp_Click);
			this.Controls.Add(btnHelp);
			//追加ボタン
			btnAdd = new Button();
			btnAdd.Location = new Point(ClientSize.Width - btnAdd.Width - 10, 10);
			btnAdd.Text = "追加";
			btnAdd.Click += new EventHandler(OnAdd_Click);
			this.Controls.Add(btnAdd);
		}

		private void OnOK_Click(object sender, EventArgs e)
		{
			Switch = txtBox.Text;	//データ引き渡し用メンバーへんすうに結果を代入
			Close();
		}

		private void OnHelp_Click(object sender, EventArgs e)
		{
			//ヘルプ表示（URLにすると既定のブラウザーで開く）
			Help.ShowHelp(btnHelp, "https://learn.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2022#switches");
		}

		private void OnAdd_Click(object sender, EventArgs e)
		{
			txtBox.Text += cmbBox.Text + " ";	//スイッチ文を追加してゆく（削除、編集はテキストボックスで行う）
		}
	}

	/////////////////////
	//Version ダイアログ
	/////////////////////
	class VersionDlg : Form
	{
		public VersionDlg(Icon ico)
		{
			//ダイアログの属性設定
			this.Text = "バーション情報";
			this.ClientSize = new Size(320, 100);
			this.MaximizeBox = false;		// 最大化ボタン
			this.MinimizeBox = false;		// 最小化ボタン
			this.ShowInTaskbar = false;		//タスクバー上表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	// 親フォームの中央に配置
			//コントロールの属性設定
			Button btnOK = new Button();
			btnOK.Size = new Size(40, 28);
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, (ClientSize.Height - btnOK.Height) / 2);
			btnOK.Font = new Font("Times New Roman", 10, FontStyle.Bold);
			btnOK.Text = "OK";
			btnOK.Click += new EventHandler(OnOK_Click);
			Label imglabel = new Label();
			imglabel.Size = new Size(40, 40);
			imglabel.Location = new Point(10, (ClientSize.Height - imglabel.Height) / 2);
			imglabel.BorderStyle = BorderStyle.Fixed3D;
			imglabel.Image = ico.ToBitmap();						//親のシステムアイコン
			Label label = new Label();
			label.Size = new Size(ClientSize.Width - imglabel.Width - btnOK.Width - 40, ClientSize.Height- 20);
			label.Location = new Point(imglabel.Width + 20, (ClientSize.Height - label.Height) / 2);
			label.BorderStyle = BorderStyle.Fixed3D;
			label.Text = "MSBuilder Version 1.0\r\nCopyright (c) 2025 by Ysama\r\n(written in Microsoft C#)";
			label.TextAlign = ContentAlignment.MiddleCenter;
			label.Font = new Font("Times New Roman", 10, FontStyle.Bold);
			this.Controls.Add(btnOK);
			this.Controls.Add(imglabel);
			this.Controls.Add(label);
		}

		private void OnOK_Click(object sender, EventArgs e)
		{
			Close();
		}
	}
}
