///////////////////////////////
//        TGEditor.cs
// Copyright (c) 2026 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 TGE;								//TGEditクラス使用の為

namespace TGEditor
{
	public class tgEditor : Form
	{
		//クラスメンバーフィールド
		Assembly myOwn = Assembly.GetEntryAssembly();
		TGEdit tge;		//TGEditクラスインスタンス
		//クラスメンバーコントロール
		MenuStrip menuStrip;						//メニュー
		ToolStrip toolStrip;						//ツールバー
		ToolStripButton[] tsButton;					//ツールバーボタン
		StatusStrip statusStrip;					//ステータスバー
		ToolStripStatusLabel[] tssl;				//ステータスバーラベル

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

		public tgEditor()							//コンストラクター
		{
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコン
			this.Size = new Size(960, 640);
			this.MinimumSize = new Size(480, 320);
			this.Text = "TGEditor";
			//Drag and Dropでの処理
			this.AllowDrop = true;
			this.DragEnter += tgEditor_DragEnter;
			this.DragDrop += tgEditor_DragDrop;
			//起動時処理
			this.Load += tgEditor_Load;
			//TGEditクラスインスタンス作成と描画初期化
			tge = new TGEdit(this);
			tge.Reset();
			//*.tgeファイル用ディレクトリーの作成（初回のみ）
			Directory.CreateDirectory(".\\tgeFiles");
		}

		private void tgEditor_Load(object sender, EventArgs e)
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//ツールバーとステータスバーの設定
			MakeBars();
			//メニューの作成（MenuStripはコントロールであり、上からの並びはDock投入のFILO順となる）
			MakeMenu();
			//フォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();
			//命令セットライブラリー（CmdList.tge）を読み込む
			tge.CmdList.FileName = ".\\tgeFiles\\CmdList.tge";
			tge.CmdList.ReadFile();
			//起動時の引数をチェックし、引数にファイル名があればそれを読み込む
			string[] arg = System.Environment.GetCommandLineArgs();
			if(arg.Length > 1)
			{
				if(Path.GetExtension(arg[arg.Length - 1]) == ".tge")
				{
					//（複数投入であれば最後の）ファイル名を記録
					tssl[1].Text = arg[arg.Length - 1];
					tssl[1].ToolTipText = arg[arg.Length - 1];	//ToolTip設定
					//ExeListを初期化、ファイル読み込み
					tge.ExeList.Clear();
					tge.ExeList.FileName = tssl[1].Text;
					tge.ExeList.ReadFile();
				}
				else
				{
					//エラー処理
					MessageBox.Show("タートルグラフィックデータファイル（*.tge）ではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
		}

		//メニューの作成
		private void MakeMenu()
		{
			//メインメニュー作成
			menuStrip = new MenuStrip();
			menuStrip.SuspendLayout();
			//メインメニューアイテム付加
			ToolStripMenuItem miFile = new ToolStripMenuItem();		//「ファイル」メニュー
			miFile.Text = "ファイル(&F)";
			menuStrip.Items.Add(miFile);
			ToolStripMenuItem miEdit = new ToolStripMenuItem();		//「編集」メニュー
			miEdit.Text = "編集(&E)";
			menuStrip.Items.Add(miEdit);
			ToolStripMenuItem miExeTG = new ToolStripMenuItem();	//「実行」メニュー
			miExeTG.Text = "実行(&E)";
			menuStrip.Items.Add(miExeTG);
			ToolStripMenuItem miHelp = new ToolStripMenuItem();		//「ヘルプ」メニュー
			miHelp.Text = "ヘルプ(&H)";
			menuStrip.Items.Add(miHelp);
			//「ファイル」メニューアイテム付加
			ToolStripMenuItem miNew = new ToolStripMenuItem();		//「新規」メニューアイテム
			miNew.Text = "実行ファイルの新規作成(&N)";
			miNew.Click += OnNew_Click;
			miNew.ShortcutKeys = Keys.Control | Keys.N;
			miFile.DropDownItems.Add(miNew);
			ToolStripMenuItem miOpen = new ToolStripMenuItem();		//「開く」メニューアイテム
			miOpen.Text = "実行ファイルを開く(&O)";
			miOpen.Click += OnOpen_Click;
			miOpen.ShortcutKeys = Keys.Control | Keys.O;
			miFile.DropDownItems.Add(miOpen);
			ToolStripMenuItem miSave = new ToolStripMenuItem();		//「保存」メニューアイテム
			miSave.Text = "実行ファイルを保存(&S)";
			miSave.Click += OnSave_Click;
			miSave.ShortcutKeys = Keys.Control | Keys.S;
			miFile.DropDownItems.Add(miSave);
			ToolStripMenuItem miSaveAs = new ToolStripMenuItem();	//「名前を付けて保存」メニューアイテム
			miSaveAs.Text = "実行ファイルを名前を付けて保存(&A)";
			miSaveAs.Click += OnSaveAs_Click;
			miSaveAs.ShortcutKeys = Keys.Control | Keys.A;
			miFile.DropDownItems.Add(miSaveAs);
			miFile.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miExit = new ToolStripMenuItem();		//「終了」メニューアイテム
			miExit.Text = "終了(&X)";
			miExit.Click += OnExit_Click;
			miExit.ShortcutKeys = Keys.Control | Keys.X;
			miFile.DropDownItems.Add(miExit);
			//「編集」メニューアイテム付加
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miSetEdit = new ToolStripMenuItem();	//「命令セット作成」メニューアイテム
			miSetEdit.Text = "命令セット作成(&T)";
			miSetEdit.Click += OnSetEdit_Click;
			miSetEdit.ShortcutKeys = Keys.Control | Keys.T;
			miEdit.DropDownItems.Add(miSetEdit);
			ToolStripMenuItem miListEdit = new ToolStripMenuItem();	//「命令リスト編集」メニューアイテム
			miListEdit.Text = "命令リスト編集(&L)";
			miListEdit.Click += OnListEdit_Click;
			miListEdit.ShortcutKeys = Keys.Control | Keys.L;
			miEdit.DropDownItems.Add(miListEdit);
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miExeList = new ToolStripMenuItem();	//「実行リスト編集」メニューアイテム
			miExeList.Text = "実行リスト編集(&E)";
			miExeList.Click += OnExeListEdit_Click;
			miExeList.ShortcutKeys = Keys.Control | Keys.E;
			miEdit.DropDownItems.Add(miExeList);
			//「実行」メニューアイテム付加
			ToolStripMenuItem miSetExe = new ToolStripMenuItem();	//「命令セット実行」メニューアイテム
			miSetExe.Text = "命令セット実行(&T)";
			miSetExe.Click += OnSetExe_Click;
			miExeTG.DropDownItems.Add(miSetExe);
			miExeTG.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miExe_List = new ToolStripMenuItem();	//「実行リスト実行」メニューアイテム
			miExe_List.Text = "実行リスト実行(&E)";
			miExe_List.Click += OnExe_List_Click;
			miExeTG.DropDownItems.Add(miExe_List);
			//「ヘルプ」メニューアイテム付加
			ToolStripMenuItem miHowtoUse = new ToolStripMenuItem();	//「使い方」メニューアイテム
			miHowtoUse.Text = "使い方(&H)";
			miHowtoUse.Click += OnHowtoUse_Click;
			miHowtoUse.ShortcutKeys = Keys.Control | Keys.H;
			miHelp.DropDownItems.Add(miHowtoUse);
			ToolStripMenuItem miShortcutKey = new ToolStripMenuItem();	//「ショートカットキー」メニューアイテム
			miShortcutKey.Text = "ショートカットキー(&S)";
			miShortcutKey.Click += OnShortcutKey_Click;
			miShortcutKey.ShortcutKeys = Keys.F1;
			miHelp.DropDownItems.Add(miShortcutKey);
			ToolStripMenuItem miVer = new ToolStripMenuItem();		//「バージョン」メニューアイテム
			miVer.Text = "バージョン(&V)";
			miVer.Click += OnVersion_Click;
			miVer.ShortcutKeys = Keys.F2;
			miHelp.DropDownItems.Add(miVer);
			//メインメニューに設定して表示
			this.MainMenuStrip = menuStrip;
			this.Controls.Add(menuStrip);
			menuStrip.ResumeLayout(false);
			menuStrip.PerformLayout();
		}

		//ツールバーとステータスバーの作成
		private void MakeBars()
		{
			//ToolStripクラスインスタンスの生成
			this.toolStrip = new ToolStrip();
			//ツールバーのレイアウトを一時停止
			this.toolStrip.SuspendLayout();
			//ToolStripButton配列を作成
			this.tsButton = new ToolStripButton[11];
			//本プログラムの埋め込みリソースのリソースマネージャーを作成
			ResourceManager rm = new ResourceManager("TGEditor", myOwn);
			//ツールバービットマップの読み込み
			ImageList imgList = new ImageList();
			imgList.ImageSize = new Size(16, 15);
			imgList.Images.AddStrip((Bitmap)rm.GetObject("tgToolBar"));
			imgList.TransparentColor = Color.FromArgb(0xFF, 0xFF, 0xFF);	//tgToolBar.bmpの背景色

			//ToolStripButton[0]を作成
			this.tsButton[0] = new ToolStripButton();
			this.tsButton[0].Text = "実行ファイル新規作成";					//テキスト設定
			this.tsButton[0].Image = (Bitmap)imgList.Images[0];				//画像設定
			this.tsButton[0].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[0].Click += OnNew_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[0]);						//ボタンを追加
			//ToolStripButton[1]を作成
			this.tsButton[1] = new ToolStripButton();
			this.tsButton[1].Text = "実行ファイルを開く";					//テキスト設定
			this.tsButton[1].Image = (Bitmap)imgList.Images[1];				//画像設定
			this.tsButton[1].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[1].Click += OnOpen_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[1]);						//ボタンを追加
			//ToolStripButton[2]を作成
			this.tsButton[2] = new ToolStripButton();
			this.tsButton[2].Text = "実行ファイルの保存";					//テキスト設定
			this.tsButton[2].Image = (Bitmap)imgList.Images[2];				//画像設定
			this.tsButton[2].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[2].Click += OnSave_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[2]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[3]を作成
			this.tsButton[3] = new ToolStripButton();
			this.tsButton[3].Text = "終了";									//テキスト設定
			this.tsButton[3].Image = (Bitmap)imgList.Images[3];				//画像設定
			this.tsButton[3].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[3].Click += OnExit_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[3]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[4]を作成
			this.tsButton[4] = new ToolStripButton();
			this.tsButton[4].Text = "命令セット作成";						//テキスト設定
			this.tsButton[4].Image = (Bitmap)imgList.Images[4];				//画像設定
			this.tsButton[4].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[4].Click += OnSetEdit_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[4]);						//ボタンを追加
			//ToolStripButton[5]を作成
			this.tsButton[5] = new ToolStripButton();
			this.tsButton[5].Text = "命令リスト編集";						//テキスト設定
			this.tsButton[5].Image = (Bitmap)imgList.Images[5];				//画像設定
			this.tsButton[5].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[5].Click += OnListEdit_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[5]);						//ボタンを追加
			//ToolStripButton[6]を作成
			this.tsButton[6] = new ToolStripButton();
			this.tsButton[6].Text = "実行リスト編集";						//テキスト設定
			this.tsButton[6].Image = (Bitmap)imgList.Images[6];				//画像設定
			this.tsButton[6].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[6].Click += OnExeListEdit_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[6]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[7]を作成
			this.tsButton[7] = new ToolStripButton();
			this.tsButton[7].Text = "命令セット実行";						//テキスト設定
			this.tsButton[7].Image = (Bitmap)imgList.Images[7];				//画像設定
			this.tsButton[7].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[7].Click += OnSetExe_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[7]);						//ボタンを追加
			//ToolStripButton[8]を作成
			this.tsButton[8] = new ToolStripButton();
			this.tsButton[8].Text = "実行リスト実行";						//テキスト設定
			this.tsButton[8].Image = (Bitmap)imgList.Images[8];				//画像設定
			this.tsButton[8].DisplayStyle = ToolStripItemDisplayStyle.Image;//画像表示のみ
			this.tsButton[8].Click += OnExe_List_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[8]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[9]を作成
			this.tsButton[9] = new ToolStripButton();
			this.tsButton[9].Text = "使い方";								//テキスト設定
			this.tsButton[9].Image = (Bitmap)imgList.Images[9];			//画像設定
			this.tsButton[9].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[9].Click += OnHowtoUse_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[9]);					//ボタンを追加
			//ToolStripButton[10]を作成
			this.tsButton[10] = new ToolStripButton();
			this.tsButton[10].Text = "バージョン情報(&V)";					//テキスト設定
			this.tsButton[10].Image = (Bitmap)imgList.Images[10];			//画像設定
			this.tsButton[10].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[10].Click += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[10]);					//ボタンを追加
			//ツールバーの設定
			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 = "TGEditor 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(ステータスバー)を追加
		}

		//ドラッグされた時
		private void tgEditor_DragEnter(object sender, DragEventArgs e)
		{
			if(e.Data.GetDataPresent(DataFormats.FileDrop))
			{
				e.Effect = DragDropEffects.Copy;
			}
		}

		//ドロップされたとき
		private void tgEditor_DragDrop(object sender, DragEventArgs e)
		{
			//ドロップされたファイルパスを取得
			string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
			if(files.Length > 0)
			{
				if(Path.GetExtension(files[files.Length - 1]) == ".tge")
				{
					//ファイル名を記録
					tssl[1].Text = files[files.Length - 1];
					tssl[1].ToolTipText = files[files.Length - 1];	//ToolTip設定
					//ExeListを初期化、ファイル読み込み
					tge.ExeList.Clear();
					tge.ExeList.FileName = tssl[1].Text;
					tge.ExeList.ReadFile();
				}
				else	//エラー処理
					MessageBox.Show("タートルグラフィックデータファイル（*.tge）ではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
			{
				e.Cancel = true;
			}
			//命令セットライブラリー（CmdList.tge）を書き込む
			tge.CmdList.FileName = ".\\tgeFiles\\CmdList.tge";
			tge.CmdList.WriteFile();
		}

		//「新規作成」処理
		private void OnNew_Click(object sender, EventArgs e)
		{
			if(tssl[1].Text != "（ファイル名）")
			{
				DialogResult dr = MessageBox.Show("データがありますが、初期化しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
				{
					tssl[1].Text = "（ファイル名）";
					tssl[1].ToolTipText = "（ファイル名）";		//ToolTip設定
				}
				else
					return;
			}
			tge.Reset();			//Nakov.TurtleGraphics初期化
			tge.ExeList.Clear();	//「実行リスト（ExeList）」初期化
			MessageBox.Show("実行リストを作るには、「実行リストの編集」で「命令リスト」から「命令セット」を選んでください。\r\n" +
							"「命令リスト」は「命令リスト編集」で編集できます。また、新たに命令セットを作成するには「命令セット" +
							"作成」または「命令リスト編集」の「命令セット追加」を選んでください。", "ToDo", MessageBoxButtons.OK,
							MessageBoxIcon.Information);
		}

		//「ファイルを開く」処理
		private void OnOpen_Click(object sender, EventArgs e)
		{
			OpenFileDialog ofDlg = new OpenFileDialog();
			//ファイルフィルターの指定
			ofDlg.Filter = "タートルグラフィックデータファイル|*.tge";
			ofDlg.FilterIndex = 0;
			ofDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			ofDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			ofDlg.InitialDirectory = ".\\tgeFiles";			// デフォルトのフォルダーの指定
			ofDlg.Title = "ファイルを開く";	//ダイアログのタイトルを指定する
			if(ofDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				if(Path.GetExtension(ofDlg.FileName) == ".tge")
				{
					tssl[1].Text = ofDlg.FileName;			//ファイル名を記録
					tssl[1].ToolTipText = ofDlg.FileName;	//ToolTip設定
					//ExeListを初期化、ファイル読み込み
					tge.ExeList.Clear();
					tge.ExeList.FileName = tssl[1].Text;
					tge.ExeList.ReadFile();
				}
				else
				{
					//エラー処理
					MessageBox.Show("タートルグラフィックデータファイル（*.tge）ではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
			//オブジェクトを破棄する
			ofDlg.Dispose();
		}

		//「保存」処理
		private void OnSave_Click(object sender, EventArgs e)
		{
			if(tssl[1].Text == "（ファイル名）")
				OnSaveAs_Click(sender, e);
			else
			{
				//ファイル保存処理
				tge.ExeList.FileName = tssl[1].Text;
				tge.ExeList.WriteFile();
			}
		}

		//「名前を付けて保存」処理
		private void OnSaveAs_Click(object sender, EventArgs e)
		{
			SaveFileDialog sfDlg = new SaveFileDialog();
			//ファイルフィルターの指定
			sfDlg.AddExtension = true;		//拡張子自動付加
			sfDlg.DefaultExt = ".tge";
			sfDlg.Filter = "タートルグラフィックデータファイル|*.tge";
			sfDlg.FilterIndex = 0;
			sfDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			sfDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			sfDlg.InitialDirectory = ".\\tgeFiles";			// デフォルトのフォルダーの指定
			sfDlg.Title = "ファイルを保存";	//ダイアログのタイトルを指定する
			sfDlg.OverwritePrompt = true;	//上書き確認
			if(sfDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				//ファイル名を記録
				tssl[1].Text = sfDlg.FileName;
				tssl[1].ToolTipText = sfDlg.FileName;	//ToolTip設定
				//ファイル保存処理
				tge.ExeList.FileName = tssl[1].Text;
				tge.ExeList.WriteFile();
			}
			//オブジェクトを破棄する
			sfDlg.Dispose();
		}

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

		//「命令セット作成」処理
		private void OnSetEdit_Click(object sender, EventArgs e)
		{
			//CmdSetDlgによる命令セットの作成
			CmdSetDlg csd = new CmdSetDlg();	//引数無し（新規作成）
			if(csd.ShowDialog(this) == DialogResult.OK)
			{
				tge.CmdList.AddSet(csd.Tgs);	//作成したTGSetはCmdListに追加する
			}
			csd.Dispose();
		}

		//「命令リスト編集」処理
		private void OnListEdit_Click(object sender, EventArgs e)
		{
			//CmdListDlgによる命令セットの編集
			CmdListDlg cld = new CmdListDlg(tge, 1);
			if(cld.ShowDialog(this) == DialogResult.OK)
			{
				MessageBox.Show("命令リストが編集されました", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			cld.Dispose();
		}

		//「実行リスト編集」処理
		private void OnExeListEdit_Click(object sender, EventArgs e)
		{
			//CmdListDlgによる命令セットの編集
			CmdListDlg cld = new CmdListDlg(tge, 2);
			if(cld.ShowDialog(this) == DialogResult.OK)
			{
				MessageBox.Show("実行リストが編集されました", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			cld.Dispose();
		}

		//「命令セット実行」処理
		private void OnSetExe_Click(object sender, EventArgs e)
		{
			//CmdListDlgによる命令セットの選択
			CmdListDlg cld = new CmdListDlg(tge, 0);
			if(cld.ShowDialog(this) == DialogResult.OK)
			{
				//描画初期化
				tge.Reset();
				tge.CmdList.GetSet(cld.Selection).DoThis();
			}
			cld.Dispose();
		}

		//「実行リスト実行」処理
		private void OnExe_List_Click(object sender, EventArgs e)
		{
			//描画初期化
			tge.Reset();
			tge.ExeList.DoSet();
		}

		//「使い方」処理
		private void OnHowtoUse_Click(object sender, EventArgs e)
		{
			MessageBox.Show("TGEditorはNakov.TurtleGraphics用の描画エディターです。\r\n\r\n" +
			"LOGOベースの描画命令を纏めた「命令セット」、その一覧である「命令リスト」及び" +
			"指定する「命令セット」で繰り返しを含め実行順を定めた「実行リスト」を編集し、" +
			"「命令セット」単体や「実行リスト」を実行してウィンドウに描画します。\r\n\r\n" +
			"出来上がった「命令リスト」、「実行リスト」は\"*.tge\"ファイルにすることができ" +
			"\"*.tge\"ファイルで起動したり、また起動後もドラッグアンドドロップすることができます。\r\n\r\n" +
			"【TurtleGraphicsメソッド】\r\n" +
			"Init(arg)−タートルグラフィックスシステムを初期化します。argは描画対象のFormsコントロールで、指定しない場合、アクティブなフォームが描画領域となります。\r\n" +
			"Dispose() / Reset()−タートルグラフィックスシステムを破棄し、関連するすべてのリソースを解放します。\r\n" +
			"Forward(arg)−現在の方向に亀をarg1ピクセル前進させ、ペンが下がっている場合線を描きます。\r\n" +
			"Backward(arg)−現在の方向に亀をarg1ピクセル後退させ、ペンが下がっている場合線を描きます。\r\n" +
			"MoveTo(arg1, arg2)−亀を指定した位置へ移動させます。ペンが下がっている場合線を描きます。\r\n" +
			"Rotate(arg)−現在の向きからarg（度数）亀を回転させます。\r\n" +
			"RotateTo(arg)−亀を指定角度（度数）へ向けます。初期状態の亀の方向（角度）は0度（上向き）です。\r\n" +
			"PenUp()−ペンを描画面から離し、線は描かれません。\r\n" +
			"PenDown()−ペンを描画面に降ろし、線が描かれます。\r\n\r\n" +
			"【TurtleGraphicsプロパティ】\r\n" +
			"X−亀の現在X座標を取得／設定します。初期状態の亀は {0, 0}（画面中央）です。\r\n" +
			"Y−亀の現在Y座標を取得／設定します。初期状態の亀は {0, 0}（画面中央）です。\r\n" +
			"Angle−亀の現在方向（度数）を取得／設定します。（上−0、右−90、下−180、左−270）\r\n" +
			"PenColor−描画色を取得／設定します。既定色はBlue（青）です。\r\n" +
			"PenSize−描画太さ（ピクセル単位）を取得／設定します。規定値は7です。\r\n" +
			"PenVisible−ペンが下がり描画可能であればtrue、ペンが上がればfalseとなります。\r\n" +
			"ShowTurtle−亀の表示可否を取得／設定します。規定値は表示可です。\r\n" +
			"Delay−移動／回転後の待機時間（ミリ秒）を取得／設定します。規定値は0です。",
			"簡単な説明", MessageBoxButtons.OK, MessageBoxIcon.Information);
		}

		//「ショートカットキー」処理
		private void OnShortcutKey_Click(object sender, EventArgs e)
		{
			MessageBox.Show("Ctrl+N−新規作成\r\nCtrl+O−ファイルを開く\r\n" +
			"Ctrl+S−ファイルの保存\r\nCtrl+P−印刷\r\nCtrl+X−終了\r\n\r\n" +
			"Ctrl+T−命令セット編集\r\nCtrl+L−命令リスト編集\r\nCtrl+E−実行リスト編集\r\n\r\n" +
			"Ctrl+H−使い方\r\nF1−ショートカットキーの解説\r\nF2−バージョン情報",
			"ショートカットキーの解説", MessageBoxButtons.OK, MessageBoxIcon.Information);
		}

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

	/////////////////////
	//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.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 = "TGEditor Version 1.0\r\nCopyright (c) 2026 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();
		}
	}
}
/*
		string[] CmdNameList = new string[15] {"Nop", "Forward()", "Backward()",
												"MoveTo()", "Rotate()", "RotateTo()",
												"PenUp()", "PenDown()", ".X",
												".Y", ".Angle", ".PenColor",
												".PenSize", ".PenVisible", ".Delay"};
		string[] CmdExplList = new string[15] {"何もしない", "前進する", "後退する",
												"絶対座標へ移動する", "現在の方向から指定角度回転", "絶対角度へ回転（↑0→90↓180←270）",
												"描画停止", "描画開始", "X座標指定（移動）",
												"X座標指定（移動）", "角度指定（↑0→90↓180←270）",
												"描画色指定（Color）", "描画幅指定", "可視可(1)、不可(0)", "中断時間（ms）"};
*/
