using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

namespace MyScreenCap.Ctrl {
    /// <summary>
    /// フォルダパス取得用テキストボックス
    /// </summary>
    public partial class DirTextBox : UserControl {

        /// <summary>
        /// デフォルトパス
        /// </summary>
        private readonly string DEFAULT_DIR = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        /// <summary>
        /// テキストチェンジイベント
        /// </summary>
        public event EventHandler TxtChanged = delegate(object sender, EventArgs e) { };

        /// <summary>
        /// フォルダパスの取得
        /// </summary>
        public string DirectoryPath {
            get {
                return this.txtDirectory.Text;
            }
            set {
                this.txtDirectory.Text = value;
                CheckDirPath();
            }
        }

        /// <summary>
        /// フォルダブラウズダイアログに表示するメッセージの取得・設定
        /// </summary>
        public string FolderBrowseDialogMsg { get; set; }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DirTextBox() {
            InitializeComponent();
            this.txtDirectory.AllowDrop = true;
            this.txtDirectory.Text = DEFAULT_DIR;
        }

        /// <summary>
        /// パネルResize
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void splitContainer_Panel1_Resize(object sender, EventArgs e) {
            // テキストボックスをパネルの幅に合わせる
            this.txtDirectory.Width = this.splitContainer.Panel1.Width;
        }

        /// <summary>
        /// ボタンClick
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBrowse_Click(object sender, EventArgs e) {
            // フォルダブラウズダイアログ表示
            GetDirectory();
        }

        /// <summary>
        /// テキストボックスLeave
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtDirectory_Leave(object sender, EventArgs e) {
            CheckDirPath();
        }

        /// <summary>
        /// テキストボックスDragEnter
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtDirectory_DragEnter(object sender, DragEventArgs e) {
            e.Effect = DragDropEffects.All;
        }

        /// <summary>
        /// テキストボックスDragDrop
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtDirectory_DragDrop(object sender, DragEventArgs e) {
            // Dropされたファイル・フォルダのパスを取得
            if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
                foreach (string filePath in (string[])e.Data.GetData(DataFormats.FileDrop)) {
                    if (Directory.Exists(filePath)) {
                        // フォルダDropの場合
                        this.txtDirectory.Text = filePath;
                    } else {
                        // ファイルDropの場合
                        this.txtDirectory.Text = Path.GetDirectoryName(filePath);
                    }
                    break;
                }
            }
            // ディレクトリパス変更イベント発生
            TxtChanged(this, e);
        }

        /// <summary>
        /// フォルダOpen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenDir_Click(object sender, EventArgs e) {
            try {
                Process.Start(DirectoryPath);
            } catch {
                CustomMsgBox.Show(this.FindForm(), DirectoryPath + "のオープンに失敗しました！", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// フォルダパスの取得
        /// </summary>
        private void GetDirectory() {
            // フォルダブラウズダイアログ表示
            FolderBrowserDialog browseDialog = new FolderBrowserDialog();
            browseDialog.Description = FolderBrowseDialogMsg;
            browseDialog.SelectedPath = DirectoryPath;

            if (ShowDialogAtCenter.ShowDialog(browseDialog, this.FindForm()) == DialogResult.OK) {
                this.txtDirectory.Text = browseDialog.SelectedPath;
                // ディレクトリパス変更イベント発生
                TxtChanged(this, null);
            }
        }

        /// <summary>
        /// フォルダパスのチェック
        /// </summary>
        private void CheckDirPath() {
            try {
                // 入力されたフォルダが存在するかどうかチェック
                if (!Directory.Exists(this.txtDirectory.Text)) {
                    this.txtDirectory.Text = Path.GetDirectoryName(this.txtDirectory.Text);
                    if (string.IsNullOrEmpty(this.txtDirectory.Text)) {
                        this.txtDirectory.Text = DEFAULT_DIR;
                    }
                }
            } catch {
                this.txtDirectory.Text = DEFAULT_DIR;
            }
            TxtChanged(this, null);
        }
    }
}
