///////////////////////////////////////
// ResWriter.cs - Resource File Writer
// Copyright (c) 2022 by Ysama
///////////////////////////////////////

using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;		//Assemblyを使う為
using System.Drawing.Imaging;	//Imageオブジェクト処理のため
using System.Resources;			//リソース関係クラス等の使用の為
using System.IO;				//Stream関係クラス等の使用の為
using System.Text;				//Encoding使用の為

class ResWriter : Form
{
	//出力ファイル名
	string Res_FileName = "";	//*.resourceファイル
	string ResX_FileName = "";	//*.resxファイル
	//フォーム関連クラスメンバー変数
	Button Btn_Add;				//リソース追加ボタン
	Button Btn_Del;				//リソース削除ボタン
	Button Btn_Edit;			//リソース編集ボタン
	Button Btn_Gen;				//リソースファイル作成ボタン
	Button Btn_Init;			//初期化ボタン
	Button Btn_Exit;			//終了ボタン
	ListView listView;			//リストビュー

	[STAThread]
	public static void Main()
	{
		Application.Run(new ResWriter());
	}

	//コンストラクター
	public ResWriter()
	{
		Assembly myOwn = Assembly.GetEntryAssembly();
		Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
		Load += new EventHandler(Form_Load);
		Text = "ResWriter";
		ClientSize = new Size(724, 262);
		MinimumSize = new Size(362, 294);
		BackColor = SystemColors.Window;
		AllowDrop = true;
	}

	//WM_CREATE時処理
	protected void Form_Load(object sender, EventArgs e)
	{
		Btn_Add = new Button();
		Btn_Add.Text = "リソースの追加";
		Btn_Add.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Add.Font = new Font("ＭＳ 明朝", 8);
		Btn_Add.ForeColor = Color.Black;
		Btn_Add.Size = new Size(100, 32);
		Btn_Add.BackColor = SystemColors.Control;
		Btn_Add.Location = new Point(ClientSize.Width - Btn_Add.Width - 10, 10);
		Btn_Add.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Add.Click += new EventHandler(OnClick_Add);

		Btn_Del = new Button();
		Btn_Del.Text = "リソースの削除";
		Btn_Del.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Del.Font = new Font("ＭＳ 明朝", 8);
		Btn_Del.ForeColor = Color.Black;
		Btn_Del.Size = new Size(100, 32);
		Btn_Del.BackColor = SystemColors.Control;
		Btn_Del.Location = new Point(ClientSize.Width - Btn_Del.Width - 10, 20 + Btn_Add.Height);
		Btn_Del.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Del.Click += new EventHandler(OnClick_Del);

		Btn_Edit = new Button();
		Btn_Edit.Text = "リソースの編集";
		Btn_Edit.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Edit.Font = new Font("ＭＳ 明朝", 8);
		Btn_Edit.ForeColor = Color.Black;
		Btn_Edit.Size = new Size(100, 32);
		Btn_Edit.BackColor = SystemColors.Control;
		Btn_Edit.Location = new Point(ClientSize.Width - Btn_Edit.Width - 10, 30 + Btn_Add.Height + Btn_Del.Height);
		Btn_Edit.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Edit.Click += new EventHandler(OnClick_Edit);

		Btn_Gen = new Button();
		Btn_Gen.Text = "リソースファイルの作成";
		Btn_Gen.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Gen.Font = new Font("ＭＳ 明朝", 8);
		Btn_Gen.ForeColor = Color.Black;
		Btn_Gen.Size = new Size(100, 32);
		Btn_Gen.BackColor = SystemColors.Control;
		Btn_Gen.Location = new Point(ClientSize.Width - Btn_Gen.Width - 10, 40 + Btn_Add.Height + Btn_Del.Height + Btn_Edit.Height);
		Btn_Gen.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Gen.Click += new EventHandler(OnClick_Gen);

		Btn_Init = new Button();
		Btn_Init.Text = "データ初期化";
		Btn_Init.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Init.Font = new Font("ＭＳ 明朝", 8);
		Btn_Init.ForeColor = Color.Black;
		Btn_Init.Size = new Size(100, 32);
		Btn_Init.BackColor = SystemColors.Control;
		Btn_Init.Location = new Point(ClientSize.Width - Btn_Init.Width - 10, 50 + Btn_Add.Height + Btn_Del.Height + Btn_Edit.Height + Btn_Gen.Height);
		Btn_Init.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Init.Click += new EventHandler(OnClick_Init);

		Btn_Exit = new Button();
		Btn_Exit.Text = "終了";
		Btn_Exit.TextAlign = ContentAlignment.MiddleCenter;
		Btn_Exit.Font = new Font("ＭＳ 明朝", 8);
		Btn_Exit.ForeColor = Color.Black;
		Btn_Exit.Size = new Size(100, 32);
		Btn_Exit.BackColor = SystemColors.Control;
		Btn_Exit.Location = new Point(ClientSize.Width - Btn_Exit.Width - 10, 60 + Btn_Add.Height + Btn_Del.Height + Btn_Edit.Height + Btn_Gen.Height + Btn_Init.Height);
		Btn_Exit.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
		Btn_Exit.Click += new EventHandler(OnClick_Exit);

		this.Controls.Add(Btn_Add);
		this.Controls.Add(Btn_Del);
		this.Controls.Add(Btn_Edit);
		this.Controls.Add(Btn_Gen);
		this.Controls.Add(Btn_Init);
		this.Controls.Add(Btn_Exit);

		//リストビュー
		listView = new ListView();
		listView.BorderStyle = BorderStyle.Fixed3D;					//境界
		listView.Location = new Point(10, 10);						//位置
		listView.Width = ClientSize.Width - Btn_Add.Width - 30;	//サイズ
		listView.Height = ClientSize.Height - 20;
		listView.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);	//アンカー固定
		listView.FullRowSelect = true;								//一行選択
		listView.MultiSelect = true;								//複数選択を許す
		listView.GridLines = true;									//グリッドラインの表示
		listView.HoverSelection = false;							//ポイントで選択できるようにする
		listView.Activation = ItemActivation.OneClick;				//シングルクリック選択;
		listView.CheckBoxes = false;								//チェックボックス無効化
		listView.View = View.Details;								//リストビューの表示方法
		listView.AllowDrop = true;									//listViewへのドロップを受け入れる
		//イベントハンドラの追加
		listView.ColumnClick += new ColumnClickEventHandler(ListView_ColumnClick);
		//Drag and Dropのイベントハンドラの追加
		listView.DragEnter += new DragEventHandler(ListView_DragEnter);
		listView.DragDrop += new DragEventHandler(ListView_DragDrop);
		//ヘッダー定義
		ColumnHeader columnNo = new ColumnHeader{Text = "名前", Width = 100};
		ColumnHeader columnType = new ColumnHeader{Text = "種類", Width = 60};
		ColumnHeader columnData = new ColumnHeader{Text = "データ", Width = 430};
		ColumnHeader[] colHeaderRegValue = {columnNo, columnType, columnData};	//ヘッダー設定
		listView.Columns.AddRange(colHeaderRegValue);	//ヘッダー追加
		//FormにListViewを追加
		this.Controls.Add(listView);
	}

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

	protected void OnClick_Add(object sender, EventArgs e)
	{
		//リソース入力ダイアログによる入力
		InputDlg inpDlg = new InputDlg();
		inpDlg.ShowDialog();
		ListViewItem added_item;
		if(!String.IsNullOrEmpty(inpDlg.ResName))	//入力された場合
		{
			if(inpDlg.ResType == "StrResCollection")	//ファイルによる文字列リソース入力の場合
			{
				//ファイルからテキストを読み込む
				StreamReader sr = new StreamReader(inpDlg.ResData, Encoding.GetEncoding("Shift_JIS"));
 				string str = sr.ReadToEnd();
 				sr.Close();
 				//テキストを行に分解（文字列配列化）する
				string[] lines = str.Split('\n');
				string[] sept = new string[]{"="};
				foreach(string line in lines)
				{	//各行の"key=value"文をkeytovalueに分解する
					if(String.IsNullOrEmpty(line))	//最終行が空行だと「インデックスが配列の境界外です」エラーになる為
						break;
					string[] key_vals = line.Split(sept, StringSplitOptions.RemoveEmptyEntries);	//RemoveEmptyEntriesまたはNone
					added_item = listView.Items.Add(key_vals[0]);
					added_item.SubItems.Add("String");
					added_item.SubItems.Add(key_vals[1]);
				}
			}
			else
			{
				added_item = listView.Items.Add(inpDlg.ResName);
				added_item.SubItems.Add(inpDlg.ResType);
				added_item.SubItems.Add(inpDlg.ResData);
			}
		}
		inpDlg.Dispose();
	}

	protected void OnClick_Del(object sender, EventArgs e)
	{
		//選択された行数を確認する
		if(listView.SelectedItems.Count == 0)
			MessageBox.Show("データが選択されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
		else
		{
			//選択されたアイテムを削除する
			foreach(ListViewItem item in listView.SelectedItems)
			{
				listView.Items.Remove(listView.SelectedItems[0]);
			}
		}
	}

	protected void OnClick_Edit(object sender, EventArgs e)
	{
		//選択された行数を確認する
		if(listView.SelectedItems.Count == 0)
			MessageBox.Show("データが選択されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
		else
		{
			//選択されたアイテムを編集する
			foreach(ListViewItem item in listView.SelectedItems)
			{
				//それぞれについて編集ダイアログを使う
				EditDlg editDlg = new EditDlg(item.Text, item.SubItems[1].Text, item.SubItems[2].Text);
				editDlg.ShowDialog();
				item.Text = editDlg.ResName;
				item.SubItems[1].Text = editDlg.ResType;
				item.SubItems[2].Text = editDlg.ResData;
				editDlg.Dispose();
			}
		}

	}

	protected void OnClick_Gen(object sender, EventArgs e)
	{
		//行数を確認する
		if(listView.Items.Count == 0)
		{
			MessageBox.Show("データがありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			return;
		}
		//ファイル保存ダイアログによるファイル名取得
		SaveFileDialog sfDlg = new SaveFileDialog();
		sfDlg.Filter = "リソースファイル(*.resources)|*.resources|XMLリソースファイル(*.resx)|*.resx";	//ファイルフィルター指定
		sfDlg.FilterIndex = 1;			//ファイルフィルターインデックス指定
		sfDlg.RestoreDirectory = true;	//処理後ディレクトリ復元
		sfDlg.CheckPathExists = true;	//存在しないパスの指定警告
		sfDlg.InitialDirectory = ".";	//デフォルトのフォルダ指定
		sfDlg.Title = "リソースファイルを保存";	//ダイアログタイトル指定
		//ファイル保存ダイアログの表示
		if(sfDlg.ShowDialog() == DialogResult.OK)
		{
			if(Path.GetExtension(sfDlg.FileName) == ".resources")
			{
				Res_FileName = sfDlg.FileName;
				ResX_FileName = Path.GetDirectoryName(sfDlg.FileName) +  "\\" + Path.GetFileNameWithoutExtension(sfDlg.FileName) + ".resx";
			}
			else if(Path.GetExtension(sfDlg.FileName) == ".resx")
			{
				Res_FileName = Path.GetDirectoryName(sfDlg.FileName) + "\\" + Path.GetFileNameWithoutExtension(sfDlg.FileName) + ".resources";
				ResX_FileName = sfDlg.FileName;
			}
			else
			{
				MessageBox.Show("ファイル名が違法です", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
		}
		else
		{
			MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			return;
		}
		//sfDlgインスタンスの破棄
		sfDlg.Dispose();
		/////////////////////////////
		//リソースファイルの書き込み
		/////////////////////////////
		//*.resファイルを作成する
		ResourceWriter res_writer = new ResourceWriter(Res_FileName);
		//*.resxファイルを作成する
		ResXResourceWriter resx_writer = new ResXResourceWriter(ResX_FileName);
		foreach(ListViewItem item in listView.Items)
		{
			switch(item.SubItems[1].Text)
			{
				case "Image":
					//Imageリソースの書き込み
					try
					{
						Image img = Image.FromFile(item.SubItems[2].Text);
						//イメージのファイル形式を調べる
						if(img.RawFormat.Equals(ImageFormat.Bmp))
						{
							res_writer.AddResource(item.SubItems[0].Text, img);
							resx_writer.AddResource(item.SubItems[0].Text, img);
						}
						else if(img.RawFormat.Equals(ImageFormat.Icon))
						{
							Icon ico = new Icon(item.SubItems[2].Text);
							try
							{
								res_writer.AddResource(item.SubItems[0].Text, ico);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（Icon）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
							try
							{
								resx_writer.AddResource(item.SubItems[0].Text, ico);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（Icon）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
						}
						else if(img.RawFormat.Equals(ImageFormat.Wmf))
						{
							Metafile meta = new Metafile(item.SubItems[2].Text);
							try
							{
								res_writer.AddResource(item.SubItems[0].Text, meta);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（Icon）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
							try
							{
								resx_writer.AddResource(item.SubItems[0].Text, meta);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（Icon）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
						}
						else
						{
							MemoryStream imgStream = new MemoryStream();	//Image streamの作成
							img.Save(imgStream, img.RawFormat);
							try
							{
								res_writer.AddResource(item.SubItems[0].Text, imgStream);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（その他イメージ）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
							try
							{
								resx_writer.AddResource(item.SubItems[0].Text, imgStream);
							}
							catch
							{
								MessageBox.Show("リソースファイルを書き込めません", "エラー（その他イメージ）", MessageBoxButtons.OK, MessageBoxIcon.Error);
							}
						}
					}
					catch(OutOfMemoryException)
					{
						MessageBox.Show(item.SubItems[2].Text + " は対象外の画像データです", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
						continue;
					}
					catch(FileNotFoundException)
					{
						MessageBox.Show(item.SubItems[2].Text + " が見当たりません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
						continue;
					}
					break;
				case "File":
					//Fileリソースをシリアライズ化して書き込み
					try
					{
						FileStream fs = new System.IO.FileStream(item.SubItems[2].Text, FileMode.Open, FileAccess.Read);
						byte[] bs = new byte[fs.Length];
						fs.Read(bs, 0, bs.Length);
						res_writer.AddResource(item.SubItems[0].Text, bs);
						resx_writer.AddResource(item.SubItems[0].Text, bs);
						fs.Close();
					}
					catch
					{
						MessageBox.Show(item.SubItems[2].Text + "を読めません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
						continue;
					}
					break;
				case "String":
					//文字列リソースの書き込み
					res_writer.AddResource(item.SubItems[0].Text, item.SubItems[2].Text);
					resx_writer.AddResource(item.SubItems[0].Text, item.SubItems[2].Text);
					break;
			}
		}
		//ResXResourceWriterを閉じる
		res_writer.Close();
		//ResXResourceWriterを閉じる
		resx_writer.Close();
	}

	protected void OnClick_Init(object sender, EventArgs e)
	{
		listView.Items.Clear();
	}

	protected void OnClick_Exit(object sender, EventArgs e)
	{
		Close();
	}

	private void ListView_ColumnClick(object sender, ColumnClickEventArgs e)
	{
		//ListViewItemSorterを指定する
		listView.ListViewItemSorter = new ListViewItemComparer(e.Column);
		//並び替える（ListViewItemSorterを設定するとSortが自動的に呼び出される）
	}

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

	//listViewにドロップされたとき
	private void ListView_DragDrop(object sender, DragEventArgs e)
	{
		//ドロップされたファイルパスを取得
		string[] srclist =  (string[])e.Data.GetData(DataFormats.FileDrop, false);
		//ドロップされたデータをリストビューに追加する
		foreach(string item in srclist)
		{
			//それぞれについてリソース名とイメージファイルか否かを確認する必要がある
			EditDlg editDlg = new EditDlg(Path.GetFileNameWithoutExtension(item), "", item);
			editDlg.ShowDialog();
			ListViewItem added_item;
			if(!String.IsNullOrEmpty(editDlg.ResName))
			{
				if(editDlg.ResType == "StrResCollection")	//ファイルによる文字列リソース入力の場合
				{
					//ファイルからテキストを読み込む
					StreamReader sr = new StreamReader(editDlg.ResData, Encoding.GetEncoding("Shift_JIS"));
					string str = sr.ReadToEnd();
					sr.Close();
					//テキストを行に分解（文字列配列化）する
					string[] lines = str.Split('\n');
					string[] sept = new string[]{"="};
					foreach(string line in lines)
					{	//各行の"key=value"文をkeytovalueに分解する
						if(String.IsNullOrEmpty(line))	//最終行が空行だと「インデックスが配列の境界外です」エラーになる為
							break;
						string[] key_vals = line.Split(sept, StringSplitOptions.RemoveEmptyEntries);	//RemoveEmptyEntriesまたはNone
						added_item = listView.Items.Add(key_vals[0]);
						added_item.SubItems.Add("String");
						added_item.SubItems.Add(key_vals[1]);
					}
				}
				else
				{
					added_item = listView.Items.Add(editDlg.ResName);
					added_item.SubItems.Add(editDlg.ResType);
					added_item.SubItems.Add(editDlg.ResData);
				}
			}
			editDlg.Dispose();
		}
	}
}

///////////////////////////////////////////
//ListViewの項目の並び替えに使用するクラス
///////////////////////////////////////////
public class ListViewItemComparer : IComparer
{
	private int m_column;

	// ListViewItemComparerクラスのコンストラクタ
	public ListViewItemComparer(int col)
	{
		m_column = col;
	}

	//xがyより小さいときはマイナスの数、大きいときはプラスの数、同じときは0を返す
	public int Compare(object x, object y)
	{
		//ListViewItemの取得
		ListViewItem itemx = (ListViewItem) x;
		ListViewItem itemy = (ListViewItem) y;
		//xとyを文字列として比較する
		return string.Compare(itemx.SubItems[m_column].Text, itemy.SubItems[m_column].Text);
	}
}

/////////////////////////
//リソース入力ダイアログ
/////////////////////////
class InputDlg : Form
{
	//プロパティ
	string m_Name = "";
	public string ResName
	{
		get
		{
			return m_Name;
		}
		set
		{
			m_Name = value;
		}
	}

	protected string m_Type = "";
	public string ResType
	{
		get
		{
			return m_Type;
		}
		set
		{
			m_Type = value;
		}
	}

	protected string m_Data = "";
	public string ResData
	{
		get
		{
			return m_Data;
		}
		set
		{
			m_Data = value;
		}
	}

	//ダイアログのコントロール
	Button BtnOK;
	Button BtnCancel;
	Label labelName;
	TextBox txbName;
	GroupBox gBox;
	Label labelChoice;
	RadioButton rdBtnImg;
	RadioButton rdBtnFile;
	Button BtnSelFile;
	RadioButton rdBtnStr;
	TextBox txbStr;

	public InputDlg()
	{
		//クラスフィールドの初期化
		m_Name = "";
		m_Type = "";
		m_Data = "";
		//ダイアログの属性設定
		this.Text = "リソース入力ダイアログ";
		this.ClientSize = new Size(320, 180);
		this.MaximizeBox = false;		// 最大化ボタン
		this.MinimizeBox = false;		// 最小化ボタン
		this.ShowInTaskbar = false;		//タスクバー上非表示
		this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
		this.StartPosition = FormStartPosition.CenterScreen;	//画面中央に配置
		//コントロールの属性設定
		BtnOK = new Button();
		BtnOK.Location = new Point(20, ClientSize.Height - BtnOK.Height - 10);
		BtnOK.Text = "OK";
		BtnOK.AutoSize = true;
		BtnOK.Click += new EventHandler(OnOK_Click);

		BtnCancel = new Button();
		BtnCancel.Location = new Point(ClientSize.Width - BtnCancel.Width - 20, ClientSize.Height - BtnCancel.Height - 10);
		BtnCancel.Text = "Cancel";
		BtnCancel.AutoSize = true;
		BtnCancel.Click += new EventHandler(OnCancel_Click);

		gBox = new GroupBox();
		gBox.Text = "リソース名と設定";
		gBox.Size = new Size(ClientSize.Width - 20, ClientSize.Height - BtnOK.Height - 20);
		gBox.Location = new Point(10, 0);

		labelName = new Label();
		labelName.Text = "リソース名";
		labelName.Location = new Point(10, 15);
		labelName.AutoSize = true;

		txbName = new TextBox();
		txbName.BorderStyle = BorderStyle.Fixed3D;
		txbName.Location = new Point(105, 15);
		txbName.Size = new Size(ClientSize.Width - 135, 16);

		labelChoice = new Label();
		labelChoice.Text = "文字列、またはイメージかファイルを選択してください";
		labelChoice.Location = new Point(10, 40);
		labelChoice.AutoSize = true;

		rdBtnImg = new RadioButton();
		rdBtnImg.Location = new Point(20, 35 + labelChoice.Height);
		rdBtnImg.Size = new Size(80, 16);
		rdBtnImg.Text = "イメージ";
		rdBtnImg.CheckedChanged += new EventHandler(rdBtnImg_CheckedChanged);

		rdBtnFile = new RadioButton();
		rdBtnFile.Location = new Point(20, 45 + labelChoice.Height + rdBtnImg.Height);
		rdBtnFile.Size = new Size(80, 16);
		rdBtnFile.Text = "ファイル";
		rdBtnFile.CheckedChanged += new EventHandler(rdBtnFile_CheckedChanged);

		BtnSelFile = new Button();
		BtnSelFile.Visible = false;
		BtnSelFile.Text = "ファイルを選択する";
		BtnSelFile.AutoSize = true;
		BtnSelFile.Click += new EventHandler(OnSelFile_Click);

		rdBtnStr = new RadioButton();
		rdBtnStr.Location = new Point(20, 55 + labelChoice.Height + rdBtnImg.Height + rdBtnFile.Height);
		rdBtnStr.Size = new Size(80, 16);
		rdBtnStr.Text = "文字列";
		rdBtnStr.CheckedChanged += new EventHandler(rdBtnStr_CheckedChanged);

		txbStr = new TextBox();
		txbStr.Visible = false;
		txbStr.BorderStyle = BorderStyle.Fixed3D;
		txbStr.Location = new Point(105, 55 + labelChoice.Height + rdBtnImg.Height + rdBtnFile.Height);
		txbStr.Size = new Size(ClientSize.Width - 135, 16);

		gBox.Controls.Add(labelName);
		gBox.Controls.Add(txbName);
		gBox.Controls.Add(labelChoice);
		gBox.Controls.Add(rdBtnImg);
		gBox.Controls.Add(rdBtnFile);
		gBox.Controls.Add(BtnSelFile);
		gBox.Controls.Add(rdBtnStr);
		gBox.Controls.Add(txbStr);
		this.Controls.Add(BtnOK);
		this.Controls.Add(BtnCancel);
		this.Controls.Add(gBox);
	}

	void rdBtnImg_CheckedChanged(object sender, EventArgs e)
	{
		txbStr.Visible = false;
		BtnSelFile.Visible = true;
		m_Type = "Image";
		BtnSelFile.Location = new Point(145, 35 + labelChoice.Height);
	}

	void rdBtnFile_CheckedChanged(object sender, EventArgs e)
	{
		txbStr.Visible = false;
		BtnSelFile.Visible = true;
		m_Type = "File";
		BtnSelFile.Location = new Point(145, 45 + labelChoice.Height + rdBtnImg.Height);
	}

	void rdBtnStr_CheckedChanged(object sender, EventArgs e)
	{
		txbStr.Visible = true;
		BtnSelFile.Visible = false;
		m_Type = "String";
	}

	protected void OnSelFile_Click(object sender, EventArgs e)
	{
		OpenFileDialog ofDlg = new OpenFileDialog();
		//ファイルフィルターの指定
		ofDlg.Filter = "イメージファイル|*.bmp;*.ico;*.wmf;*.jpeg;*.jpg;*.png;*.gif;*.tiff;*.emf;*.exif|総てのファイル(*.*)|*.*";
		//ファイルフィルターインデックスの指定
		if(m_Type == "Image")
			ofDlg.FilterIndex = 1;
		else
			ofDlg.FilterIndex = 2;
		//ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
		ofDlg.RestoreDirectory = true;
		// デフォルトのフォルダを指定する
		ofDlg.InitialDirectory = @".";
		//ダイアログのタイトルを指定する
		ofDlg.Title = "ファイルを開く";
		//ダイアログを表示する
		if(ofDlg.ShowDialog() == DialogResult.OK)
		{
			m_Data = ofDlg.FileName;
			txbName.Text = Path.GetFileNameWithoutExtension(ofDlg.FileName);
			string ext = Path.GetExtension(ofDlg.FileName);
			if(ext == ".restext")
			{
				m_Type = "StrResCollection";
			}
			else if(ext == ".txt")
			{
				DialogResult dr = MessageBox.Show("テキストファイルを文字列リソースとして使いますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
				{
					m_Name = m_Type = "StrResCollection";
					//オブジェクトを破棄する
					ofDlg.Dispose();
					Close();
				}
			}
		}
		else
		{
			MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
		}
		//オブジェクトを破棄する
		ofDlg.Dispose();
		//「ファイルを選択する」ボタンを消す
		BtnSelFile.Visible = false;
	}

	protected void OnOK_Click(object sender, EventArgs e)
	{
		m_Name = txbName.Text;
		if(m_Type == "String")
			m_Data = txbStr.Text;
		if(String.IsNullOrEmpty(m_Name))
		{
			MessageBox.Show("リソース名がありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		else
		{
			if(String.IsNullOrEmpty(m_Type) || String.IsNullOrEmpty(m_Data))
			{
				MessageBox.Show("リソース指定またはリソースのデータがありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			else
			{
				Close();
			}
		}
	}

	protected void OnCancel_Click(object sender, EventArgs e)
	{
		m_Name = "";
		m_Type = "";
		m_Data = "";
		Close();
	}
}

/////////////////////////
//リソース編集ダイアログ
/////////////////////////
class EditDlg : Form
{
	//プロパティ
	string m_Name = "";
	public string ResName
	{
		get
		{
			return m_Name;
		}
		set
		{
			m_Name = value;
		}
	}

	protected string m_Type = "";
	public string ResType
	{
		get
		{
			return m_Type;
		}
		set
		{
			m_Type = value;
		}
	}

	protected string m_Data = "";
	public string ResData
	{
		get
		{
			return m_Data;
		}
		set
		{
			m_Data = value;
		}
	}

	//ダイアログのコントロール
	Button BtnOK;
	Button BtnCancel;
	Label labelName;
	TextBox txbName;
	GroupBox gBox;
	RadioButton rdBtnImg;
	RadioButton rdBtnFile;
	RadioButton rdBtnStr;
	Label labelData;
	TextBox txbData;

	public EditDlg(string arg_name, string arg_type, string arg_data)
	{
		//引数の記録
		m_Name = arg_name;
		m_Type = arg_type;
		m_Data = arg_data;
		//ダイアログの属性設定
		this.Text = "リソース編集ダイアログ";
		this.ClientSize = new Size(320, 220);
		this.MaximizeBox = false;		// 最大化ボタン
		this.MinimizeBox = false;		// 最小化ボタン
		this.ShowInTaskbar = false;		//タスクバー上非表示
		this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
		this.StartPosition = FormStartPosition.CenterScreen;	//画面中央に配置

		//コントロールの属性設定
		BtnOK = new Button();
		BtnOK.TabIndex = 1;
		BtnOK.Location = new Point(20, ClientSize.Height - BtnOK.Height - 10);
		BtnOK.Text = "OK";
		BtnOK.AutoSize = true;
		BtnOK.Click += new EventHandler(OnOK_Click);

		BtnCancel = new Button();
		BtnCancel.TabIndex = 2;
		BtnCancel.Location = new Point(ClientSize.Width - BtnCancel.Width - 20, ClientSize.Height - BtnCancel.Height - 10);
		BtnCancel.Text = "Cancel";
		BtnCancel.AutoSize = true;
		BtnCancel.Click += new EventHandler(OnCancel_Click);

		labelName = new Label();
		labelName.Text = "リソース名";
		labelName.Location = new Point(10, 10);
		labelName.AutoSize = true;

		txbName = new TextBox();
		txbName.TabIndex = 0;
		txbName.Text = m_Name;
		txbName.BorderStyle = BorderStyle.Fixed3D;
		txbName.Location = new Point(20 + labelName.Width, 10);
		txbName.Size = new Size(ClientSize.Width - labelName.Width - 30, 16);

		gBox = new GroupBox();
		gBox.Text = "リソース区分";
		gBox.Location = new Point(5, labelName.Height + 10);
		gBox.Size = new Size(ClientSize.Width - 10, 40);

		rdBtnImg = new RadioButton();
		rdBtnImg.Location = new Point(10, 15);
		rdBtnImg.Size = new Size(80, 16);
		rdBtnImg.Text = "イメージ";
		rdBtnImg.CheckedChanged += new EventHandler(rdBtnImg_CheckedChanged);
		if(m_Type == "Image")
			rdBtnImg.Checked = true;

		rdBtnFile = new RadioButton();
		rdBtnFile.Location = new Point(gBox.Width / 3 + 10, 15);
		rdBtnFile.Size = new Size(80, 16);
		rdBtnFile.Text = "ファイル";
		rdBtnFile.CheckedChanged += new EventHandler(rdBtnFile_CheckedChanged);
		if(m_Type == "File")
			rdBtnFile.Checked = true;

		rdBtnStr = new RadioButton();
		rdBtnStr.Location = new Point(gBox.Width * 2 / 3 + 20, 15);
		rdBtnStr.Size = new Size(80, 16);
		rdBtnStr.Text = "文字列";
		rdBtnStr.CheckedChanged += new EventHandler(rdBtnStr_CheckedChanged);
		if(m_Type == "String")
			rdBtnStr.Checked = true;

		labelData = new Label();
		labelData.Text = "リソースデータ";
		labelData.Location = new Point(10, labelName.Height + gBox.Height + 20);
		labelData.AutoSize = true;

		txbData = new TextBox();
		txbData.Multiline = true;
		txbData.Text = m_Data;
		if(m_Type == "String")
			txbData.ReadOnly = false;
		else
			txbData.ReadOnly = true;
		txbData.BorderStyle = BorderStyle.Fixed3D;
		txbData.Location = new Point(10, labelName.Height + gBox.Height + labelData.Height + 20);
		txbData.Size = new Size(ClientSize.Width - 20, 72);

		this.Controls.Add(labelName);
		this.Controls.Add(txbName);
		this.Controls.Add(gBox);
		gBox.Controls.Add(rdBtnImg);
		gBox.Controls.Add(rdBtnFile);
		gBox.Controls.Add(rdBtnStr);
		this.Controls.Add(labelData);
		this.Controls.Add(txbData);
		this.Controls.Add(BtnOK);
		this.Controls.Add(BtnCancel);
	}

	void rdBtnImg_CheckedChanged(object sender, EventArgs e)
	{
		m_Type = "Image";
	}

	void rdBtnFile_CheckedChanged(object sender, EventArgs e)
	{
		m_Type = "File";
		//ファイルから文字列を取得する例外措置
		string ext = Path.GetExtension(m_Data);
		if(ext == ".txt" || ext == ".restext")
		{
			DialogResult dr = MessageBox.Show("テキストファイルを文字列リソースとして使いますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
			{
				m_Name = m_Type = "StrResCollection";
				Close();
			}
		}
	}

	void rdBtnStr_CheckedChanged(object sender, EventArgs e)
	{
		m_Type = "String";
	}

	protected void OnOK_Click(object sender, EventArgs e)
	{
		m_Name = txbName.Text;
		m_Data = txbData.Text;
		if(String.IsNullOrEmpty(m_Name))
		{
			MessageBox.Show("リソース名がありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		else if(String.IsNullOrEmpty(m_Type))
		{
			MessageBox.Show("リソースタイプが指定されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		else if(String.IsNullOrEmpty(m_Data))
		{
			MessageBox.Show("データがありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		else
		{
			Close();
		}
	}

	protected void OnCancel_Click(object sender, EventArgs e)
	{
		Close();
	}
}
