//------------------------------------------------------------------------------
//	画面のデザインに関するメソッド
//
//		作成者：三上直樹，2023/03/29 作成，(C)三上直樹 2023
//------------------------------------------------------------------------------

using System;
using System.Drawing;
using System.Windows.Forms;

namespace FIR_Design_Remez
{
	public partial class Form1 : Form
	{
		// Label の 1次元配列を生成する
		private void CreateLabelArray(int nBand, int x0, int y0)
		{
			labelBand_ = new Label[nBand];
			for (int n=0; n<nBand; n++)
			{
				labelBand_[n] = new Label();
				labelBand_[n].Location = new Point(Dpi(n*86) + x0, y0);
				labelBand_[n].Size = new Size(Dpi(41), Dpi(12));
				labelBand_[n].Text = "帯域 " + (n+1).ToString();
				Controls.Add(labelBand_[n]);
			}
		}

		// TextBox の 2次元配列 を生成する
		private void CreateTextBoxMatrix(int nBand, int items, int x0, int y0)
		{
			Size mySize = new Size(Dpi(68), Dpi(19));
			int dx = mySize.Width + Dpi(18);	// TextBox の横方向の間隔
			int dy = mySize.Height + Dpi(4);	// TextBox の縦方向の間隔

			parameters_ = new TextBox[items, nBand];

			for (int n2=0; n2<nBand; n2++)
				for (int n1=0; n1<items; n1++)
				{
					parameters_[n1, n2] = new TextBox();
					parameters_[n1, n2].Size = mySize;
					parameters_[n1, n2].Location = new Point(n2*dx + x0, n1*dy + y0);
					parameters_[n1, n2].TextChanged += (s, e) => richTextBox1.Enabled = false;
					parameters_[n1, n2].KeyDown += MyKeyDown;
					parameters_[n1, n2].Click += textBox1_Click;
					parameters_[n1, n2].Enter += (s, e) => ((TextBox)s).SelectAll();
					parameters_[n1, n2].Tag = new Tuple<int, int>(n1, n2);	// 矢印キーサポートのため
					Controls.Add(parameters_[n1, n2]);
					toolTip1.SetToolTip(parameters_[n1, n2], "「Shift＋矢印キー」でセル間の移動ができます．");
				}
		}

		// 2次元配列の TextBox で「矢印キー」をサポートする 
		private void MyKeyDown(object sender, KeyEventArgs e)
		{
			if (!e.Shift) return;

			var num = (Tuple<int, int>)(((TextBox)sender).Tag);
			int n1 = num.Item1;
			int n2 = num.Item2;

			int Dec(int x) => (x <= 0) ? 0 : --x;
			int IncY(int x) => (x < 3) ? ++x : x;
			int IncX(int x) => (x < (nBand_ - 1)) ? ++x : (nBand_ - 1);

			if (e.KeyCode == Keys.Right) parameters_[n1, IncX(n2)].Select();
			if (e.KeyCode == Keys.Left)  parameters_[n1, Dec(n2)].Select();
			if (e.KeyCode == Keys.Up)	 parameters_[Dec(n1), n2].Select();
			if (e.KeyCode == Keys.Down)  parameters_[IncY(n1), n2].Select();
		}

		// 帯域表示の Enable コントロール
		private void BandEnableOnOff(int nBand)
		{
			nBand_ = nBand;
			for (int n=0; n<MAX_BANDS_; n++)
			{
				bool tf = (n < nBand);
				labelBand_[n].Enabled = tf;
				for (int k=0; k<4; k++)	parameters_[k, n].Enabled = tf;
			}
		}

		// 帯域に関するパラメータ入力用 TextBox のデフォルト値を設定する
		private void InitTextBoxes()
		{
			for (int n=0; n<MAX_BANDS_; n++)
			{
				parameters_[0, n].Text = (n == 1) ? "1.2" : "0";
				parameters_[1, n].Text = (n == 0) ? "1.0" : (fSkHz_/2).ToString();
				parameters_[2, n].Text = (n == 0) ? "1" : "0";
				parameters_[3, n].Text = "1";
			}
		}
	}
}
