///////////////////////////////
//		IDList.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 IDList_CS;						//IDList.dll（idList使用の為）

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

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

		public testIDList()						//コンストラクター
		{
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコン
			this.Size = new Size(1280, 640);
			this.MinimumSize = new Size(640, 480);
			this.Text = "IDList";
			//起動時処理
			this.Load += testIDList_Load;
		}

		private void testIDList_Load(object sender, EventArgs e)
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//ツールバーとステータスバーの設定
			MakeBars();
			//メニューの作成（MenuStripはコントロールであり、上からの並びはDock投入のFILO順となる）
			MakeMenu();
			//idListの追加
			IDList = new idList();
			IDList.Location = new Point(0, menuStrip.Height + toolStrip.Height);
			IDList.Size = new Size(this.ClientSize.Width, this.ClientSize.Height - (menuStrip.Height + toolStrip.Height + statusStrip.Height));
			IDList.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left);
			this.Controls.Add(IDList);
			//フォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();
			//起動時の引数をチェックし、引数にファイル名があればそれを読み込む
			string[] arg = System.Environment.GetCommandLineArgs();
			if(arg.Length > 1)
			{
				if(Path.GetExtension(arg[arg.Length - 1]) == ".dat")
				{
					bool crptflag;
					if(MessageBox.Show("暗号化データファイルですか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
						crptflag = true;
					else
						crptflag = false;
					IDList.DataRead(arg[arg.Length - 1], crptflag);
					//（複数投入であれば最後の）ファイル名を記録
					tssl[1].Text = arg[arg.Length - 1];
					tssl[1].ToolTipText = arg[arg.Length - 1];	//ToolTip設定
				}
				else
				{
					//エラー処理
					MessageBox.Show("データファイル（*.dat）ではありません。", "エラー", 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 miDisp = new ToolStripMenuItem();		//「表示」メニュー
			miDisp.Text = "表示(&D)";
			menuStrip.Items.Add(miDisp);
			ToolStripMenuItem miHelp = new ToolStripMenuItem();		//「ヘルプ」メニュー
			miHelp.Text = "ヘルプ(&H)";
			menuStrip.Items.Add(miHelp);
			//「ファイル」メニューアイテム付加
			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);
			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 miAdd = new ToolStripMenuItem();		//「追加」メニューアイテム
			miAdd.Text = "追加(&A)";
			miAdd.Click += OnAdd_Click;
			miAdd.ShortcutKeys = Keys.Control | Keys.A;
			miEdit.DropDownItems.Add(miAdd);
			ToolStripMenuItem miSearch = new ToolStripMenuItem();	//「検索」メニューアイテム
			miSearch.Text = "検索(&S)";
			miSearch.Click += OnSearch_Click;
			miSearch.ShortcutKeys = Keys.Control | Keys.S;
			miEdit.DropDownItems.Add(miSearch);
			ToolStripMenuItem miEdItem = new ToolStripMenuItem();	//「編集」メニューアイテム
			miEdItem.Text = "編集(&E)";
			miEdItem.Click += OnEdItem_Click;
			miEdItem.ShortcutKeys = Keys.Control | Keys.E;
			miEdit.DropDownItems.Add(miEdItem);
			ToolStripMenuItem miDelete = new ToolStripMenuItem();	//「削除」メニューアイテム
			miDelete.Text = "削除(&D)";
			miDelete.Click += OnDelete_Click;
			miDelete.ShortcutKeys = Keys.Control | Keys.E;
			miEdit.DropDownItems.Add(miDelete);
			//「表示」メニューアイテム付加
			ToolStripMenuItem miSort = new ToolStripMenuItem();		//「並び替え」メニューアイテム
			miSort.Text = "並び替え(&S)";
			miSort.Click += OnSort_Click;
			miDisp.DropDownItems.Add(miSort);
			//「ヘルプ」メニューアイテム付加
			ToolStripMenuItem miHowtoUse = new ToolStripMenuItem();	//「使い方」メニューアイテム
			miHowtoUse.Text = "使い方(&H)";
			miHowtoUse.Click += OnHowtoUse_Click;
			miHowtoUse.ShortcutKeys = Keys.Control | Keys.H;
			miHelp.DropDownItems.Add(miHowtoUse);
			miHelp.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			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[10];
			//本プログラムの埋め込みリソースのリソースマネージャーを作成
			ResourceManager rm = new ResourceManager("IDList", myOwn);
			//ツールバービットマップの読み込み
			ImageList imgList = new ImageList();
			imgList.ImageSize = new Size(16, 15);
			imgList.Images.AddStrip((Bitmap)rm.GetObject("ToolBar"));
			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 += OnOpen_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 += OnSave_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[1]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//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 += OnExit_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 += OnAdd_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[3]);						//ボタンを追加
			//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 += OnSearch_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 += OnEdItem_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 += OnDelete_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 += OnSort_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[7]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//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 += OnHowtoUse_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 += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[9]);						//ボタンを追加
			//ツールバーの設定
			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 = "IDList for C# 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(ステータスバー)を追加
		}

		//終了処理
		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.Filter = "データファイル|*.dat";
			ofDlg.FilterIndex = 0;
			ofDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			ofDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			ofDlg.InitialDirectory = ".\\IDListFiles";		// デフォルトのフォルダーの指定
			ofDlg.Title = "ファイルを開く";	//ダイアログのタイトルを指定する
			if(ofDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				bool flag;
				if(MessageBox.Show("暗号化データファイルですか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
					flag = true;
				else
					flag = false;
				IDList.DataRead(ofDlg.FileName, flag);
				tssl[1].Text = ofDlg.FileName;			//ファイル名を記録
				tssl[1].ToolTipText = ofDlg.FileName;	//ToolTip設定
			}
			//オブジェクトを破棄する
			ofDlg.Dispose();
		}

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

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

		//「追加」処理
		private void OnAdd_Click(object sender, EventArgs e)
		{
			IDList.Add();
		}

		//「検索」処理
		private void OnSearch_Click(object sender, EventArgs e)
		{
			IDList.Find();
		}

		//「編集」処理
		private void OnEdItem_Click(object sender, EventArgs e)
		{
			IDList.Edit();
		}

		//「削除」処理
		private void OnDelete_Click(object sender, EventArgs e)
		{
			IDList.Delete();
		}

		//「並び替え」処理
		private void OnSort_Click(object sender, EventArgs e)
		{
			IDList.Sort();
		}

		//「使い方」処理
		private void OnHowtoUse_Click(object sender, EventArgs e)
		{
			string str = ".\\HowToUse.txt";
			using(StreamReader file = new StreamReader(str, Encoding.UTF8))
			{
				str = file.ReadToEnd();
				file.Close();				//ファイルを閉じる
			}
			MessageBox.Show(str, "簡単な説明", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Help.ShowHelp(this, "IDListHelp.chm");
		}

		//「バージョン」処理
		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 = "IDList for C# 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();
		}
	}
}
