//////////////////////////
// Microsoft Learn Sample
// Modified by Ysama 2024
// https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.imagelist?view=windowsdesktop-8.0
//////////////////////////
using System;
//using System.ComponentModel;
using System.Drawing;
using System.Reflection;		//Assemblyを使う為
using System.Windows.Forms;

namespace ImageRotator
{
	public class ImgRotator : Form
	{
		private ListBox listBox;
		private Label num_label;
		private Button open_button;
		private Button disp_button;
		private Button del_button;
		private Button clr_button;
		private Button exit_button;
		private PictureBox pictureBox;
		private ImageList imageList;
		protected Graphics graphics;
		private Panel panel;
		private Label path_label;
		private int currentImage = 0;

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

		//コンストラクター
		public ImgRotator()
		{
			this.Icon = Icon.ExtractAssociatedIcon(Assembly.GetEntryAssembly().Location);	//プログラムアイコンをフォームにつける
			this.ClientSize = new Size(480, 504);
			this.Text = "Image Rotator";
			InitComponent();		//コントロール等の初期化
		}

		//コントロール等の初期化
		private void InitComponent()
		{
			//表示停止
			SuspendLayout();
			//イメージリスト
			imageList = new ImageList ();
			imageList.ImageSize = new Size(128, 128);	//イメージリストのimage sizeの設定（image sizeの初期値は16 x 16）
			imageList.TransparentColor = Color.White;	//背景白地は透明となる
			//オリジナルのコードに競合がある
			//コンテナー（components = new Container();）も不要
			//imageList = new ImageList(components);
			//imageList.ImageSize = new Size(16, 16);
			//imageList.TransparentColor = Color.Transparent;
			//リストボックス
			listBox = new ListBox();
			listBox.Location = new Point(10, 10);
			listBox.Size = new Size(280, 164);
			listBox.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
			listBox.HorizontalScrollbar = true;
			listBox.TabIndex = 0;
			//ボタン
			open_button = new Button();
			open_button.Location = new Point(300, 10);
			open_button.Size = new Size(160, 24);
			open_button.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			open_button.Text = "イメージを開く";
			open_button.Click += new System.EventHandler(open_button_Click);
			disp_button = new Button();
			disp_button.Location = new Point(300, open_button.Height + 20);
			disp_button.Size = new Size(160, 24);
			disp_button.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			disp_button.Text = "選択イメージを表示";
			disp_button.Click += new System.EventHandler(disp_button_Click);
			del_button = new Button();
			del_button.Location = new Point(300, open_button.Height + disp_button.Height + 30);
			del_button.Size = new Size(160, 24);
			del_button.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			del_button.Text = "イメージの削除";
			del_button.Click += new System.EventHandler(del_button_Click);
			clr_button = new Button();
			clr_button.Location = new Point(300,  open_button.Height + disp_button.Height + del_button.Height + 40);
			clr_button.Size = new Size(160, 24);
			clr_button.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			clr_button.Text = "リスト初期化";
			clr_button.Click += new System.EventHandler(clr_button_Click);
			exit_button = new Button();
			exit_button.Location = new Point(300,  open_button.Height + disp_button.Height + del_button.Height + clr_button.Height + 50);
			exit_button.Size = new Size(160, 24);
			exit_button.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			exit_button.Text = "終了";
			exit_button.Click += new System.EventHandler(exit_button_Click);
			//パネル
			panel = new Panel();
			panel.Location = new Point(10, 204);
			panel.Size = new Size(128, 128);
			panel.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			//描画で使うpanelのgraphicsオブジェクト
			graphics = Graphics.FromHwnd(panel.Handle);
			//ピクチャーボックス
			pictureBox = new PictureBox();
			pictureBox.Location = new Point(10, 364);
			pictureBox.Size = new Size(128, 128);
			pictureBox.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			//ラベル
			num_label = new Label();
			num_label.AutoSize = true;
			num_label.Location = new Point(10, 184);
			num_label.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			num_label.Text = "番号";
			path_label = new Label();
			path_label.AutoSize = true;
			path_label.Location = new Point(10, 342);
			path_label.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
			path_label.Text = "ファイルパス";
			//フォームにコントロールを追加
			Controls.Add(path_label);
			Controls.Add(panel);
			Controls.Add(pictureBox);
			Controls.Add(open_button);
			Controls.Add(disp_button);
			Controls.Add(clr_button);
			Controls.Add(del_button);
			Controls.Add(exit_button);
			Controls.Add(num_label);
			Controls.Add(listBox);
			//表示再開
			ResumeLayout(false);
		}

		//終了処理
		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 open_button_Click (object sender, System.EventArgs e)
		{
			//OpenFileDialogオブジェクトの生成
			OpenFileDialog openDlg = new OpenFileDialog();
			openDlg.Multiselect = true;
			if(openDlg.ShowDialog() == DialogResult.OK)
			{
				if(openDlg.FileNames != null)	//複数ファイル選択の場合
				{
					for(int i =0; i < openDlg.FileNames.Length; i++ )
					{
						addImage(openDlg.FileNames[i]);
					}
				}
				else							//単一ファイル選択の場合
				{
					addImage(openDlg.FileName);
				}
			}
			else if(openDlg.ShowDialog() == DialogResult.Cancel)
				MessageBox.Show("キャンセルされました", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//オブジェクトを破棄する
			openDlg.Dispose();
		}

		//イメージの表示
		private void disp_button_Click (object sender, System.EventArgs e)
		{
			if(imageList.Images.Empty != true)	//イメージリストにイメージがあるか
			{
				panel.Refresh();
				//イメージをパネルに描画
				imageList.Draw(graphics, 0, 0, currentImage);
				//イメージをPictureBox.に表示
				pictureBox.Image = imageList.Images[currentImage];
				num_label.Text = "イメージ番号：" + currentImage;
				listBox.SelectedIndex = currentImage;
				path_label.Text = "パス：" + listBox.Text;
				if(imageList.Images.Count - 1 > currentImage)
				{
					currentImage++;
				}
				else
				{
					currentImage = 0;
				}
			}
			else
			{								//イメージリストにイメージがない
				currentImage = 0;
				MessageBox.Show("イメージがありません。", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
		}

		//リストボックスで指定したイメージの消去
		private void del_button_Click (object sender, System.EventArgs e)
		{
			if(listBox.SelectedIndex > -1)	//選択されている場合（-1は選択されていない場合）
			{
				imageList.Images.RemoveAt(listBox.SelectedIndex);	//イメージリストから消去
				listBox.Items.Remove(listBox.SelectedItem);			//リストボックスから消去
				graphics.Clear(SystemColors.Control);				//panel画面消去
				pictureBox.Image = null;							//pictureBoxの画面消去
				num_label.Text = "イメージ番号：";
				path_label.Text = "パス：";
				if(currentImage > 0) {
					currentImage--;									//currentImageが1以上であれば一つ減らす
					//listBox.SelectedIndex = currentImage;
					listBox.SetSelected (currentImage, true);		//リストボックスのcurrentImageを選択
				}
			}
			else if(listBox.SelectedIndex == -1)
				MessageBox.Show("選択されていません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
 
		//すべてのイメージの消去
		private void clr_button_Click (object sender, System.EventArgs e)
		{
			imageList.Images.Clear();				//イメージリストから消去する
			listBox.Items.Clear();					//リストボックスから消去する
			graphics.Clear(SystemColors.Control);	//panel画面消去
			pictureBox.Image = null;				//pictureBoxの画面消去
			currentImage = 0;						//初期化
			num_label.Text = "イメージ番号：";
			path_label.Text = "パス：";
		}
 
		//フォームを閉じる
		private void exit_button_Click (object sender, System.EventArgs e)
		{
			Close();
		}

		//イメージリストとリストボックスにイメージファイル名を登録
		private void addImage(string imageToLoad)
		{
			if(imageToLoad != "")
			{
				imageList.Images.Add(Image.FromFile(imageToLoad));
				listBox.BeginUpdate();
				listBox.Items.Add(imageToLoad);
				listBox.EndUpdate();
			}
		}
	}
}
