Forms/M_SendPatternMaster.cs

/*
 * Copyright XXXX Co.
 */

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ChatworkBulkSender.UserControls;
using ChatworkBulkSender.Utils;

namespace ChatworkBulkSender.Forms
{

    public partial class M_SendPatternMaster : Form
    {
        private PatternSearchBoxControl _patternSearchBoxControl = null;

        private PattrernDgvControl _pattrernDgvControl = null;

        private BtnAddMasterControl _btnControl = null;
        
        // 追加:戻るボタンからの終了フラグ
        private bool _isReturnButtonClicked = false;

        public M_SendPatternMaster()
        {
            InitializeComponent();

            // 初期画面のサイズ
            this.ClientSize = new Size(1600,900);

            // ウィンドウサイズを固定にする
            this.FormBorderStyle = FormBorderStyle.FixedSingle;

            // 現在の画面の中央に表示する
            this.StartPosition = FormStartPosition.CenterScreen;


            _patternSearchBoxControl = new PatternSearchBoxControl();
            _patternSearchBoxControl.Dock = DockStyle.Fill;
            _pattrernDgvControl = new PattrernDgvControl();
            _pattrernDgvControl.Dock = DockStyle.Fill;
            _btnControl = new BtnAddMasterControl();
            _btnControl.Dock = DockStyle.Fill;

            panelSearch.Controls.Add(_patternSearchBoxControl);
            panelDgv.Controls.Add(_pattrernDgvControl);
            panelBtn.Controls.Add(_btnControl);

            this.ActiveControl = panelSearch;
        }

        private void M_SenderPatternMaster_Load(object sender, EventArgs e)
        {
            // 戻るボタンのクリックイベントの登録
            _btnControl.BtnReturnClicked += BtnReturn_Click;

            _btnControl.BtnCreateAddClicked += BtnCreateAdd_Click;

            //検索イベント
            _patternSearchBoxControl.SearchRequested += PatternSearchBoxControl_SearchRequested;
            
            // フォントの統一設定を適用
            FontSettingHelper.ApplyFontsToForm(this);
            
            // ユーザーコントロールにも適用
            FontSettingHelper.ApplyFontsToControl(_patternSearchBoxControl);
            FontSettingHelper.ApplyFontsToControl(_pattrernDgvControl);
            FontSettingHelper.ApplyFontsToControl(_btnControl);
            
            // TableLayoutPanelの最初の行(検索ボックス)の高さを固定値に設定
            tableLayoutPanel.RowStyles[0] = new RowStyle(SizeType.Absolute, 310F);
            
            // レイアウトの調整(枠線とボタン配置の統一)
            LayoutAdjustmentHelper.AdjustMasterScreenLayout(
                this, 
                _patternSearchBoxControl, 
                _pattrernDgvControl, 
                _btnControl);
                
            // TabIndexの設定(フォーカス順制御)
            TabIndexHelper.SetMasterScreenTabOrder(
                this,
                _patternSearchBoxControl,
                _pattrernDgvControl,
                _btnControl);
        }

        /// <summary>
        /// 戻るボタンのクリックの時にフォームを閉じる
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnReturn_Click(object sender, EventArgs e)
        {
            // 戻るボタンからの終了であることを示すフラグを設定
            _isReturnButtonClicked = true;
            // フォームを閉じる
            this.Close();
        }

        private void BtnCreateAdd_Click(object sender, EventArgs e)
        {
            this.Hide();

            M_SendPatternIndividualEdit individualEdit = new M_SendPatternIndividualEdit();

            individualEdit.Owner = this;

            individualEdit.Show();
        }

        /// <summary>
        /// フォームに表示するユーザーコントロールをパネルから削除した後、明示的なDisposeで解放する。
        /// </summary>
        private void DisposeViewControls()
        {
            // パネルから削除する
            panelSearch.Controls.Clear();
            panelDgv.Controls.Clear();
            panelBtn.Controls.Clear();

            // 削除だけでは解放されないので、明示的に解放する
            _patternSearchBoxControl.Dispose();
            _pattrernDgvControl.Dispose();
            _btnControl.Dispose();
        }

        private void PatternSearchBoxControl_SearchRequested(object sender, Dictionary<string,object> criteria)
        {
            _pattrernDgvControl.Search(criteria);
        }

        private void M_SenderPatternMaster_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 戻るボタンからの終了の場合は確認メッセージをスキップ
            if (!_isReturnButtonClicked)
            {
                DialogResult result = MessageBox.Show("送信パターンマスタ画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (result == DialogResult.No)
                {
                    e.Cancel = true;

                    return;
                }
            }

            // イベント登録の解除
            _btnControl.BtnReturnClicked -= BtnReturn_Click;

            // 明示的に解放する
            this.DisposeViewControls();

            // 設定メニューを表示する
            this.Owner.Show();

            // 再描写を行う
            this.Owner.Refresh();
        }
    }
}