Forms/T_MessageSender.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ChatworkBulkSender.UserControls;
using ChatworkBulkSender.Daos;
using ChatworkBulkSender.Dtos;
using ChatworkBulkSender.Utils;

namespace ChatworkBulkSender.Forms
{
    public partial class T_MessageSender : Form
    {
        private Constants.SEND_TYPE _sendType;
        private MessageInputControl _ucMessageInput = null;
        private MessageConfirmControl _ucMessageConfirm = null;
        private MessageSendResultControl _ucMessageSendResult = null;

        public T_MessageSender(Constants.SEND_TYPE sendType)
        {
            InitializeComponent();
            _sendType = sendType;
            Init();
        }

        private void Init()
        {
            // ユーザーコントロール生成
            _ucMessageInput = new MessageInputControl(_sendType) { Dock = DockStyle.Fill };
            _ucMessageConfirm = new MessageConfirmControl { Dock = DockStyle.Fill };
            _ucMessageSendResult = new MessageSendResultControl { Dock = DockStyle.Fill };

            // ユーザーコントロールへのイベント登録
            _ucMessageInput.SwitchToMessageConfirm += SwitchToMessageConfirmRequested;
            _ucMessageInput.CloseForm += CloseFormRequested;
            _ucMessageConfirm.SwitchToMessageInput += SwitchToMessageInputRequested;
            _ucMessageConfirm.SwitchToMessageResult += SwitchToMessageResultRequested;
            _ucMessageSendResult.CloseForm += CloseFormRequested;
            _ucMessageSendResult.SwitchToMessageInputOnlyFailed += SwitchToMessageInputOnlyFailedRequested;

            // パネルにセット
            panel1.Controls.AddRange(new Control[]{
                _ucMessageInput,
                _ucMessageConfirm,
                _ucMessageSendResult
            });

            // 入力画面を初期表示
            SwitchToMessageInputRequested(this, EventArgs.Empty);
        }

        /// <summary>
        /// 送信入力画面を表示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SwitchToMessageInputRequested(object sender, EventArgs e)
        {
            // フォームタイトル
            SetFormTitle("作成");
            // 表示
            _ucMessageInput.BringToFront();
        }

        /// <summary>
        /// 送信確認画面を表示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SwitchToMessageConfirmRequested(object sender, EventArgs e)
        {
            // データ受け渡し
            BulkSendJobDto dto = _ucMessageInput.GetBulkSendJobDto();
            _ucMessageConfirm.SetBulkSendJobDto(dto);
            // フォームタイトル
            SetFormTitle("確認");
            // 表示
            _ucMessageConfirm.BringToFront();
        }

        /// <summary>
        /// 送信結果画面を表示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SwitchToMessageResultRequested(object sender, EventArgs e)
        {
            // データ受け渡し
            BulkSendJobDto dto = _ucMessageConfirm.GetBulkSendJobDto();
            _ucMessageSendResult.RenderResults(dto.SendHistoryId);
            _ucMessageSendResult.ChangeMode(_sendType);
            // フォームタイトル
            SetFormTitle("結果確認");
            // 表示
            _ucMessageSendResult.BringToFront();
        }


        private void CloseFormRequested(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 送信入力画面を開く(失敗データ再送モード)
        /// </summary>
        /// <param name="reSendHistoryId">再送したい履歴ID</param>
        public void SwitchToMessageInputOnlyFailedRequested(int reSendHistoryId)
        {
            // _sendTypeを最新の情報に更新
            var sendHistoryDto = new SendHistoryDao().GetSendHistory(reSendHistoryId);
            _sendType = (Constants.SEND_TYPE)sendHistoryDto.SendType;
            // フォームタイトル
            SetFormTitle("作成");
            // データロード(指定ID内の送信失敗データのみが画面に自動セットされる)
            _ucMessageInput.LoadFailedHistory(reSendHistoryId);
            // 表示
            _ucMessageInput.BringToFront();
        }

        private void T_MessageSender_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult result;
            if (_sendType == Constants.SEND_TYPE.REGULAR_SENDING)
            {
                result = MessageBox.Show("定期送信画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            }
            else
            {
                result = MessageBox.Show("不定期送信画面を終了してもよろしいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            }
            if (result == DialogResult.No)
            {
                e.Cancel = true;
                return;
            }
        }

        /// <summary>
        /// フォームタイトルをセットする
        /// </summary>
        /// <param name="phase">"作成"/"確認"/"結果確認"</param>
        private void SetFormTitle(string phase)
        {
            var baseText = _sendType == Constants.SEND_TYPE.REGULAR_SENDING
                ? "定期送信"
                : "不定期送信";
            this.Text = $"【Chatworkメッセージ送信ツール】{baseText} {phase}";
        }
    }
}