///////////////////////////////
// RichRichEditor.cs
// 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 richTextBoxEx;					//RichTextBoxEx使用の為

namespace RichEditor
{
	public class RichEdit : Form
	{
		//クラスメンバー変数
		Assembly myOwn = Assembly.GetEntryAssembly();
		//クラスコントロール変数
		MenuStrip menuStrip;						//メニュー
		ToolStripMenuItem miWWrap;					//ワードラップメニューアイテム
		ToolStrip toolStrip;						//ツールバー
		ToolStripButton[] tsButton;					//ツールバーボタン
		StatusStrip statusStrip;					//ステータスバー
		ToolStripStatusLabel[] tssl;				//ステータスバーラベル
		RichTextBoxEx rtxtBox;						//テキストボックス

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

		public RichEdit()							//コンストラクター
		{
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.Size = new Size(640, 480);
			this.MinimumSize = new Size(620, 240);
			this.Text = "RichEditor";
			//Drag and Dropでの処理
			this.AllowDrop = true;
			this.DragEnter += RichEdit_DragEnter;
			this.DragDrop += RichEdit_DragDrop;
			//起動時処理
			this.Load += RichEdit_Load;
		}

		private void RichEdit_Load(object sender, EventArgs e)
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//ツールバーとステータスバーの設定
			MakeBars();
			//メニューの作成（MenuStripはコントロールであり、上からの並びはDock投入のFILO順となる）
			MakeMenu();
			//出力用リッチテキストボックス
			rtxtBox = new RichTextBoxEx();
			//位置
			rtxtBox.Location = new Point(0, this.menuStrip.Height + this.toolStrip.Height);
			//サイズ
			rtxtBox.Width = ClientSize.Width;
			rtxtBox.Height = ClientSize.Height - this.menuStrip.Height - this.toolStrip.Height - this.statusStrip.Height;
			//アンカー
			rtxtBox.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			//その他プロパティ
			rtxtBox.AcceptsTab = true;
			rtxtBox.WordWrap	= false;
			rtxtBox.Font = this.Font;			//フォントの指定
			rtxtBox.Multiline = true;			//複数行（既定値）
			rtxtBox.ScrollBars = RichTextBoxScrollBars.Both;	//既定値
			rtxtBox.WordWrap = false;			//ワードラップを行う
			//Drag and Dropのイベントハンドラの追加
			rtxtBox.DragEnter += new DragEventHandler(RichEdit_DragEnter);
			rtxtBox.DragDrop += new DragEventHandler(RichEdit_DragDrop);
			rtxtBox.AllowDrop = true;
			//FormにTextBoxを追加
			this.Controls.Add(rtxtBox);
			//フォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();
			//起動時の引数をチェックし、引数にファイル名があればそれを読み込む
			string[] arg = System.Environment.GetCommandLineArgs();
			if(arg.Length > 1)
			{
				if(Path.GetExtension(arg[arg.Length - 1]) == ".rtf")
				{
					rtxtBox.LoadFile(arg[arg.Length - 1], RichTextBoxStreamType.RichText);
					//ファイル名を記録
					tssl[1].Text = arg[arg.Length - 1];
					tssl[1].ToolTipText = arg[arg.Length - 1];	//ToolTip設定
				}
				else
				{
					rtxtBox.LoadFile(arg[arg.Length - 1], RichTextBoxStreamType.PlainText);
					//ファイル名を記録
					tssl[1].Text = arg[arg.Length - 1];
					tssl[1].ToolTipText = arg[arg.Length - 1];	//ToolTip設定
				}
			}
			else
				rtxtBox.Text = "";
		}

		//メニューの作成
		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 miFormat = new ToolStripMenuItem();	//「書式」メニュー
			miFormat.Text = "書式(&F)";
			menuStrip.Items.Add(miFormat);
			ToolStripMenuItem miDisp = new ToolStripMenuItem();		//「表示」メニュー
			miDisp.Text = "表示(&D)";
			menuStrip.Items.Add(miDisp);
			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 miPrint = new ToolStripMenuItem();	//「印刷」メニューアイテム
			miPrint.Text = "印刷(&P)";
			miPrint.Click += OnPrint_Click;
			miPrint.ShortcutKeys = Keys.Control | Keys.P;
			miFile.DropDownItems.Add(miPrint);
			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);
			//「編集」メニューアイテム付加
			ToolStripMenuItem miUndo = new ToolStripMenuItem();		//「元に戻す」メニューアイテム
			miUndo.Text = "元に戻す(&U)";
			miUndo.Click += OnUndo_Click;
			miUndo.ShortcutKeys = Keys.Control | Keys.U;
			miEdit.DropDownItems.Add(miUndo);
			ToolStripMenuItem miRedo = new ToolStripMenuItem();		//「やり直す」メニューアイテム
			miRedo.Text = "やり直す(&E)";
			miRedo.Click += OnRedo_Click;
			miEdit.DropDownItems.Add(miRedo);
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miCut = new ToolStripMenuItem();		//「切り取り」メニューアイテム
			miCut.Text = "切り取り(&T)";
			miCut.Click += OnCut_Click;
			miCut.ShortcutKeys = Keys.Control | Keys.T;
			miEdit.DropDownItems.Add(miCut);
			ToolStripMenuItem miCopy = new ToolStripMenuItem();		//「コピー」メニューアイテム
			miCopy.Text = "コピー(&C)";
			miCopy.Click += OnCopy_Click;
			miCopy.ShortcutKeys = Keys.Control | Keys.C;
			miEdit.DropDownItems.Add(miCopy);
			ToolStripMenuItem miPaste = new ToolStripMenuItem();	//「貼り付け」メニューアイテム
			miPaste.Text = "貼り付け(&V)";
			miPaste.Click += OnPaste_Click;
			miPaste.ShortcutKeys = Keys.Control | Keys.V;
			miEdit.DropDownItems.Add(miPaste);
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miSelAll = new ToolStripMenuItem();	//「すべて選択」メニューアイテム
			miSelAll.Text = "すべて選択(&A)";
			miSelAll.Click += OnSelAll_Click;
			miSelAll.ShortcutKeys = Keys.Control | Keys.A;
			miEdit.DropDownItems.Add(miSelAll);
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miFind = new ToolStripMenuItem();		//「文字列の検索」メニューアイテム
			miFind.Text = "文字列の検索(&F)";
			miFind.Click += OnFind_Click;
			miFind.ShortcutKeys = Keys.Control | Keys.F;
			miEdit.DropDownItems.Add(miFind);
			ToolStripMenuItem miReplace = new ToolStripMenuItem();	//「文字列の置換」メニューアイテム
			miReplace.Text = "文字列の置換(&R)";
			miReplace.Click += OnReplace_Click;
			miReplace.ShortcutKeys = Keys.Control | Keys.R;
			miEdit.DropDownItems.Add(miReplace);
			miEdit.DropDownItems.Add(new ToolStripSeparator());		//セパレーター
			ToolStripMenuItem miDel = new ToolStripMenuItem();		//「文字列の削除」メニューアイテム
			miDel.Text = "文字列の削除(&D)";
			miDel.Click += OnDel_Click;
			miDel.ShortcutKeys = Keys.Control | Keys.D;
			miEdit.DropDownItems.Add(miDel);
			//「書式」メニューアイテム付加
			ToolStripMenuItem miFont = new ToolStripMenuItem();		//「フォント設定」メニューアイテム
			miFont.Text = "フォント設定(&F)";
			miFont.Click += OnFont_Click;
			miFormat.DropDownItems.Add(miFont);
			ToolStripMenuItem miAlign = new ToolStripMenuItem();	//「文字寄せ」メニューアイテム
			miAlign.Text = "文字寄せ(&A)";
			miFormat.DropDownItems.Add(miAlign);
			ToolStripMenuItem miIndent = new ToolStripMenuItem();	//「インデント」メニューアイテム
			miIndent.Text = "インデント(&I)";
			miFormat.DropDownItems.Add(miIndent);
			//「文字寄せ」メニューアイテム付加
			ToolStripMenuItem miLeft = new ToolStripMenuItem();		//「左寄せ」メニューアイテム
			miLeft.Text = "左寄せ(&L)";
			miLeft.Click += OnLeftAlign_Click;
			miAlign.DropDownItems.Add(miLeft);
			ToolStripMenuItem miCenter = new ToolStripMenuItem();	//「センタリング」メニューアイテム
			miCenter.Text = "センタリング(&C)";
			miCenter.Click += OnCenter_Click;
			miAlign.DropDownItems.Add(miCenter);
			ToolStripMenuItem miRight = new ToolStripMenuItem();	//「右寄せ」メニューアイテム
			miRight.Text = "右寄せ(&R)";
			miRight.Click += OnRightAlign_Click;
			miAlign.DropDownItems.Add(miRight);
			//「インデント」メニューアイテム付加
			ToolStripMenuItem miLInd = new ToolStripMenuItem();		//「左インデント」メニューアイテム
			miLInd.Text = "左インデント(&I)";
			miLInd.Click += OnLIndent_Click;
			miIndent.DropDownItems.Add(miLInd);
			ToolStripMenuItem miLUnInd = new ToolStripMenuItem();	//「左インデント解除」メニューアイテム
			miLUnInd.Text = "左インデント解除(&O)";
			miLUnInd.Click += OnLUnIndent_Click;
			miIndent.DropDownItems.Add(miLUnInd);
			ToolStripMenuItem miRInd = new ToolStripMenuItem();		//「右インデント」メニューアイテム
			miRInd.Text = "右インデント(&I)";
			miRInd.Click += OnRIndent_Click;
			miIndent.DropDownItems.Add(miRInd);
			ToolStripMenuItem miRUnInd = new ToolStripMenuItem();	//「右インデント解除」メニューアイテム
			miRUnInd.Text = "右インデント解除(&O)";
			miRUnInd.Click += OnRUnIndent_Click;
			miIndent.DropDownItems.Add(miRUnInd);
			//「表示」メニューアイテム付加
			miWWrap = new ToolStripMenuItem();	//「ワードラップ」メニューアイテム
			miWWrap.Text = "ワードラップ(&W)";
			miWWrap.Click += OnWordWrap_Click;
			miDisp.DropDownItems.Add(miWWrap);
			//「ヘルプ」メニューアイテム付加
			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[23];
			//本プログラムの埋め込みリソースのリソースマネージャーを作成
			ResourceManager rm = new ResourceManager("RichEditor", myOwn);
			//ツールバービットマップの読み込み
			ImageList imgList = new ImageList();
			imgList.ImageSize = new Size(16, 15);
			imgList.Images.AddStrip((Bitmap)rm.GetObject("rtToolBar"));
			imgList.TransparentColor = Color.FromArgb(0xC0, 0xC0, 0xC0);	//rtToolBarの背景色
			//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]);						//ボタンを追加
			//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 += OnPrint_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 += OnExit_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[4]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//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 += OnUndo_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 += OnRedo_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[6]);						//ボタンを追加
			//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 += OnCut_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 += OnCopy_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[8]);						//ボタンを追加
			//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 += OnPaste_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[9]);					//ボタンを追加
			//ToolStripButton[10]を作成
			this.tsButton[10] = new ToolStripButton();
			this.tsButton[10].Text = "文字列の検索";						//テキスト設定
			this.tsButton[10].Image = (Bitmap)imgList.Images[10];			//画像設定
			this.tsButton[10].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[10].Click += OnFind_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[10]);					//ボタンを追加
			//ToolStripButton[11]を作成
			this.tsButton[11] = new ToolStripButton();
			this.tsButton[11].Text = "文字列の置換";						//テキスト設定
			this.tsButton[11].Image = (Bitmap)imgList.Images[11];			//画像設定
			this.tsButton[11].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[11].Click += OnReplace_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[11]);					//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[12]を作成
			this.tsButton[12] = new ToolStripButton();
			this.tsButton[12].Text = "文字列の削除";						//テキスト設定
			this.tsButton[12].Image = (Bitmap)imgList.Images[12];			//画像設定
			this.tsButton[12].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[12].Click += OnDel_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[12]);					//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[13]を作成
			this.tsButton[13] = new ToolStripButton();
			this.tsButton[13].Text = "左寄せ";								//テキスト設定
			this.tsButton[13].Image = (Bitmap)imgList.Images[13];			//画像設定
			this.tsButton[13].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[13].Click += OnLeftAlign_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[13]);					//ボタンを追加
			//ToolStripButton[14]を作成
			this.tsButton[14] = new ToolStripButton();
			this.tsButton[14].Text = "センタリング";						//テキスト設定
			this.tsButton[14].Image = (Bitmap)imgList.Images[14];			//画像設定
			this.tsButton[14].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[14].Click += OnCenter_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[14]);					//ボタンを追加
			//ToolStripButton[15]を作成
			this.tsButton[15] = new ToolStripButton();
			this.tsButton[15].Text = "右寄せ";								//テキスト設定
			this.tsButton[15].Image = (Bitmap)imgList.Images[15];			//画像設定
			this.tsButton[15].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[15].Click += OnRightAlign_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[15]);					//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[16]を作成
			this.tsButton[16] = new ToolStripButton();
			this.tsButton[16].Text = "フォント設定";						//テキスト設定
			this.tsButton[16].Image = (Bitmap)imgList.Images[16];			//画像設定
			this.tsButton[16].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[16].Click += OnFont_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[16]);					//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[17]を作成
			this.tsButton[17] = new ToolStripButton();
			this.tsButton[17].Text = "左インデント";						//テキスト設定
			this.tsButton[17].Image = (Bitmap)imgList.Images[17];			//画像設定
			this.tsButton[17].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[17].Click += OnLIndent_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[17]);					//ボタンを追加
			//ToolStripButton[18]を作成
			this.tsButton[18] = new ToolStripButton();
			this.tsButton[18].Text = "左インデント解除";					//テキスト設定
			this.tsButton[18].Image = (Bitmap)imgList.Images[18];			//画像設定
			this.tsButton[18].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[18].Click += OnLUnIndent_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[18]);					//ボタンを追加
			//ToolStripButton[19]を作成
			this.tsButton[19] = new ToolStripButton();
			this.tsButton[19].Text = "右インデント";						//テキスト設定
			this.tsButton[19].Image = (Bitmap)imgList.Images[19];			//画像設定
			this.tsButton[19].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[19].Click += OnRIndent_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[19]);					//ボタンを追加
			//ToolStripButton[20]を作成
			this.tsButton[20] = new ToolStripButton();
			this.tsButton[20].Text = "右インデント解除";					//テキスト設定
			this.tsButton[20].Image = (Bitmap)imgList.Images[20];			//画像設定
			this.tsButton[20].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[20].Click += OnRUnIndent_Click;					//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[20]);					//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[21]を作成
			this.tsButton[21] = new ToolStripButton();
			this.tsButton[21].Text = "使い方";								//テキスト設定
			this.tsButton[21].Image = (Bitmap)imgList.Images[21];			//画像設定
			this.tsButton[21].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[21].Click += OnHowtoUse_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[21]);					//ボタンを追加
			//ToolStripButton[22]を作成
			this.tsButton[22] = new ToolStripButton();
			this.tsButton[22].Text = "バージョン情報(&V)";					//テキスト設定
			this.tsButton[22].Image = (Bitmap)imgList.Images[22];			//画像設定
			this.tsButton[22].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.tsButton[22].Click += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.tsButton[22]);					//ボタンを追加

			//ツールバーの設定
			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 = "RichEditor 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 RichEdit_DragEnter(object sender, DragEventArgs e)
		{
			if(e.Data.GetDataPresent(DataFormats.FileDrop))
			{
				e.Effect = DragDropEffects.Copy;
			}
		}

		//ドロップされたとき
		private void RichEdit_DragDrop(object sender, DragEventArgs e)
		{
			//ドロップされたファイルパスを取得
			string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
			if(files.Length > 0)
			{
				RichTextBoxStreamType rtst;
				if(Path.GetExtension(files[files.Length - 1]) == ".rtf")
					rtst = RichTextBoxStreamType.RichText;	//rtfファイル
				else
					rtst = RichTextBoxStreamType.PlainText;	//テキストファイル
				rtxtBox.LoadFile(files[files.Length - 1], rtst);
				//ファイル名を記録
				tssl[1].Text = files[files.Length - 1];
				tssl[1].ToolTipText = files[files.Length - 1];	//ToolTip設定
			}
		}

		//終了処理
		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 OnNew_Click(object sender, EventArgs e)
		{
			if(tssl[1].Text != "（ファイル名）")
			{
				DialogResult dr = MessageBox.Show("データがありますが、初期化しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
				{
					rtxtBox.Clear();
					tssl[1].Text = "（ファイル名）";
					tssl[1].ToolTipText = "（ファイル名）";		//ToolTip設定
				}
			}
		}

		//「ファイルを開く」処理
		private void OnOpen_Click(object sender, EventArgs e)
		{
			OpenFileDialog ofDlg = new OpenFileDialog();
			//ファイルフィルターの指定
			ofDlg.Filter = "リッチテキストファイル|*.rtf|テキストファイル|*.txt|すべてのファイル|*.*";
			ofDlg.FilterIndex = 1;
			ofDlg.RestoreDirectory = true;	//初期ディレクトリへ復帰
			ofDlg.CheckPathExists = true;	//ファイルパスの存在チェック
			ofDlg.InitialDirectory = ".";	// デフォルトのフォルダーの指定
			ofDlg.Title = "ファイルを開く";	//ダイアログのタイトルを指定する
			if(ofDlg.ShowDialog() == DialogResult.Cancel)	//ダイアログを表示する
			{
				MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
			else
			{
				RichTextBoxStreamType rtst;
				if(Path.GetExtension(ofDlg.FileName) == ".rtf")
					rtst = RichTextBoxStreamType.RichText;	//rtfファイル
				else
					rtst = RichTextBoxStreamType.PlainText;	//テキストファイル
				rtxtBox.LoadFile(ofDlg.FileName, rtst);
				//ファイル名を記録
				tssl[1].Text = ofDlg.FileName;
				tssl[1].ToolTipText = ofDlg.FileName;		//ToolTip設定
			}
			//オブジェクトを破棄する
			ofDlg.Dispose();
		}

		//「保存」処理
		private void OnSave_Click(object sender, EventArgs e)
		{
			if(tssl[1].Text == "（ファイル名）")
				OnSaveAs_Click(sender, e);
			else
			{
				RichTextBoxStreamType rtst;
				if(Path.GetExtension(tssl[1].Text) == ".rtf")
					rtst = RichTextBoxStreamType.RichText;	//rtfファイル
				else
					rtst = RichTextBoxStreamType.PlainText;	//テキストファイル
				rtxtBox.SaveFile(tssl[1].Text, rtst);
			}
		}

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

		//「印刷」処理
		private void OnPrint_Click(object sender, EventArgs e)
		{
			rtxtBox.Print();
		}

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

		//「元に戻す」処理
		private void OnUndo_Click(object sender, EventArgs e)
		{
			rtxtBox.Undo();
		}

		//「やり直す」処理
		private void OnRedo_Click(object sender, EventArgs e)
		{
			rtxtBox.Redo();
		}

		//「切り取り」処理
		private void OnCut_Click(object sender, EventArgs e)
		{
			rtxtBox.Cut();
		}

		//「コピー」処理
		private void OnCopy_Click(object sender, EventArgs e)
		{
			rtxtBox.Copy();
		}

		//「貼り付け」処理
		private void OnPaste_Click(object sender, EventArgs e)
		{
			rtxtBox.Paste();
		}

		//「すべて選択」処理
		private void OnSelAll_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectAll();
		}

		//「文字列の検索」処理
		private void OnFind_Click(object sender, EventArgs e)
		{
			rtxtBox.Find();
		}

		//「文字列の置換」処理
		private void OnReplace_Click(object sender, EventArgs e)
		{
			rtxtBox.Replace();
		}

		//「文字列の削除」処理
		private void OnDel_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectedText = "";
		}

		//「フォント設定」処理
		private void OnFont_Click(object sender, EventArgs e)
		{
			//フォント選択ダイアログで選択文字列のフォントと文字色を指定
			FontDialog fontDlg = new FontDialog();
			fontDlg.ShowColor = true;			//文字色を表示
			fontDlg.Font = rtxtBox.Font;		//初期値
			fontDlg.Color = rtxtBox.ForeColor;	//初期値
			if(fontDlg.ShowDialog() != DialogResult.Cancel)
			{
				rtxtBox.SelectionFont = fontDlg.Font;
				rtxtBox.SelectionColor = fontDlg.Color;
			}
			fontDlg.Dispose();
		}

		//「左寄せ」処理
		private void OnLeftAlign_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectionAlignment = HorizontalAlignment.Left;
		}

		//「センタリング」処理
		private void OnCenter_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectionAlignment = HorizontalAlignment.Center;
		}

		//「右寄せ」処理
		private void OnRightAlign_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectionAlignment = HorizontalAlignment.Right;
		}

		//「左インデント」処理
		private void OnLIndent_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectionIndent += 64;
		}

		//「左インデント解除」処理
		private void OnLUnIndent_Click(object sender, EventArgs e)
		{
			if(rtxtBox.SelectionIndent > 63)
				rtxtBox.SelectionIndent -= 64;
			else
				rtxtBox.SelectionIndent = 0;
		}

		//「右インデント」処理
		private void OnRIndent_Click(object sender, EventArgs e)
		{
			rtxtBox.SelectionRightIndent += 64;
		}

		//「右インデント解除」処理
		private void OnRUnIndent_Click(object sender, EventArgs e)
		{
			if(rtxtBox.SelectionRightIndent > 63)
				rtxtBox.SelectionRightIndent -= 64;
			else
				rtxtBox.SelectionRightIndent = 0;
		}

		//「ワードラップ」処理
		private void OnWordWrap_Click(object sender, EventArgs e)
		{
			miWWrap.Checked = !miWWrap.Checked;
			rtxtBox.WordWrap	= !rtxtBox.WordWrap;
		}

		//「使い方」処理
		private void OnHowtoUse_Click(object sender, EventArgs e)
		{
			MessageBox.Show("RichEditorはテキストやリッチテキスト用のエディターです。\r\n\r\n" +
			"拡張子がリッチテキスト（*.rtf）の場合その形式で取り扱い、*.txt等" +
			"その他の拡張子のファイルではテキストファイルとして取り扱います。\r\n\r\n" +
			"起動はダブルクリックの他、ファイルをプログラムアイコンへドロップすることでも可能です。" +
			"また起動後もドラッグアンドドロップでファイルを開くことができます。",
			"簡単な説明", MessageBoxButtons.OK, MessageBoxIcon.Information);
		}

		//「ショートカットキー」処理
		private void OnShortcutKey_Click(object sender, EventArgs e)
		{
			MessageBox.Show(
			"Ctrl+N－新規作成\r\nCtrl+O－ファイルを開く\r\nCtrl+S－ファイルの保存\r\nCtrl+P－印刷\r\nCtrl+X－終了\r\n\r\n" +
			"Ctrl+U－元に戻す\r\nCtrl+T－切り取り\r\nCtrl+C－コピー\r\nCtrl+V－貼り付け\r\n\nCtrl+F－文字列の検索\r\n" +
			"Ctrl+R－文字列の置換\r\n\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 = "RichEditor 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();
		}
	}
}
