using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace CommonMP.HYMCO.OptionImpl.CommonControlLibrary
{
    /// <summary>
    /// TextBox拡張ｺﾝﾄﾛｰﾙ
    /// </summary>
    public class ExTextBox : System.Windows.Forms.TextBox
    {
        private DataType _dataType = DataType.None;
        private ToolTip _toolTip;
        private string _toolTipText;
        private bool _autoToolTip = false;

        /// <summary>
        /// ﾃﾞｰﾀの種別
        /// </summary>
        public enum DataType
        {
            /// <summary>その他</summary>
            None,
            /// <summary>数値[小数点なし、マイナスを許可]</summary>
            Long,
            /// <summary>数値[小数点あり、マイナスを許可]</summary>
            Double,
            /// <summary>半角</summary>
            SingleByte
        }

        /// <summary>
        /// ﾃﾞｰﾀ種別ﾌﾟﾛﾊﾟﾃｨ
        /// (このﾃﾞｰﾀ種別により入力制限やﾁｪｯｸを行います。)
        /// </summary>
        public DataType exDataType
        {
            get
            {
                return _dataType;
            }
            set 
            {
                _dataType = value;

                //ﾃﾞｰﾀ種別による初期設定
                if ((_dataType == DataType.Long) || (_dataType == DataType.Double))
                {
                    this.TextAlign= HorizontalAlignment.Right;
                    this.MaxLength = 12;
                    if (_toolTipText == null || _toolTipText.Length == 0)
                    {
                        this.exToolTipText = Properties.CommonControlLibraryResources.HINT_INPUT_ONLY_NUMBERS;
                    }
                }
            }
        }

        /// <summary>
        /// ツールヒントを入力文字列に自動設定するか（Text値を変更するごとにツールヒントも変わります。）
        /// </summary>
        public bool exAutoToolTip
        {
            get { return _autoToolTip; }
            set { _autoToolTip = value; }
        }

        /// <summary>
        /// ツールヒント文字列
        /// </summary>
        public string exToolTipText
        {
            get { return _toolTipText; }
            set { _toolTipText = value; }
        }

        /// <summary>
        /// データ型に変換後の値（変換できない場合、数値は0を返します。）
        /// </summary>
        public object exValue
        {
            get
            {
                if (_dataType == DataType.Long)
                {
                    long val;
                    long.TryParse(this.Text, out val);
                    return val;
                }
                if (_dataType == DataType.Double)
                {
                    double val;
                    double.TryParse(this.Text, out val);
                    return val;
                }
                else
                {
                    return this.Text;
                }
            }
        }

        /// <summary>
        /// 未入力かどうか
        /// </summary>
        public bool exIsEmpty
        {
            get
            {
                if (this.Text == null || this.Text.Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        /// <summary>
        /// Textに入力されたファイル名パスが存在するか（相対パスは絶対パスに変換してチェック）
        /// </summary>
        public bool exIsFileExists
        {
            get
            {
                if (this.Text == null || this.Text.Length == 0)
                {
                    return false;
                }
                else
                {
                    return CommonLib.FileExists(this.Text);
                }
            }
        }

        /// <summary>
        /// Textに入力されたファイル名パスが有効な場合、絶対パスを返す
        /// </summary>
        public string exValidFullPath
        {
            get
            {
                string sPath = "";
                if (this.exIsFileExists)
                {
                    return CommonLib.GetFullPath(this.Text);
                }
                return sPath;
            }
        }

        /// <summary>
        /// Textに入力されたファイル名パスのディレクトリが有効な場合、ディレクトリを返す
        /// </summary>
        public string exValidDirectory
        {
            get
            {
                string sDir = "";
                string sPath = CommonLib.GetFullPath(this.Text);
                int iPos = sPath.LastIndexOf('\\');
                if (sPath.Length > 0 && iPos >= 0)
                {
                    sDir = sPath.Substring(0, iPos);
                    if (!System.IO.Directory.Exists(sDir))
                    {
                        sDir = "";
                    }
                }
                return sDir;
            }
        }

        /// <summary>
        /// Textに入力されたファイル名パスのファイル名のみを返す
        /// </summary>
        public string exFileNameRemovePath
        {
            get
            {
                string sFile = "";
                string sPath = CommonLib.GetFullPath(this.Text);
                int iPos = sPath.LastIndexOf('\\');
                if (sPath.Length > (iPos + 1) && iPos >= 0)
                {
                    sFile = sPath.Substring(iPos + 1);
                }
                else
                {
                    sFile = sPath;
                }
                return sFile;
            }
        }



        /// <summary>
        /// ｺﾝｽﾄﾗｸﾀ
        /// </summary>
        public ExTextBox()
        {
            
        }

        /// <summary>
        /// Dispose
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            if (_toolTip != null)
            {
                _toolTip.Dispose();
                _toolTip = null;
            }
            base.Dispose(disposing);
        }

        /// <summary>
        /// OnCreateControl
        /// </summary>
        protected override void OnCreateControl()
        {
            base.OnCreateControl();

            //ﾂｰﾙﾋﾝﾄを設定する
            if (_toolTip == null)
            {
                _toolTip = new ToolTip();
            }
        }

        /// <summary>
        /// OnTextChanged
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);
        }

        /// <summary>
        /// OnMouseEnter
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnMouseEnter(EventArgs e)
        {
            //ﾂｰﾙﾋﾝﾄを設定する
            if (_autoToolTip)
            {
                _toolTip.Active = true;
                _toolTip.SetToolTip(this, this.Text);   //自動設定の場合は入力値
            }
            else if (_toolTipText != null && _toolTipText.Length > 0)
            {
                _toolTip.Active = true;
                _toolTip.SetToolTip(this, _toolTipText);
            }

            base.OnMouseEnter(e);

        }

        /// <summary>
        /// OnMouseLeave
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnMouseLeave(EventArgs e)
        {
            if (_toolTip != null)
            {
                _toolTip.Active = false;
            }

            base.OnMouseLeave(e);
        }

        /// <summary>
        /// OnEnter
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnEnter(EventArgs e)
        {
            //選択済みにする
            this.SelectAll();

            //ﾃﾞｰﾀ種別によりIMEをｾｯﾄ
            if ((_dataType == DataType.Long) || (_dataType == DataType.Double) || (_dataType == DataType.SingleByte))
            {
                this.ImeMode = ImeMode.Disable;     //IME使用不可
            }
            else 
            {
            }

            base.OnEnter(e);
        }

        /// <summary>
        /// OnKeyPress
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            //----------------------------------------
            // 入力文字の制御を行う
            //----------------------------------------
            //Backspaceは許可する
            if (e.KeyChar != '\b')
            {

                //数値[小数点なし]
                if (_dataType == DataType.Long)
                {
                    //0〜9以外はｲﾍﾞﾝﾄを無効にする
                    if (e.KeyChar < '0' || e.KeyChar > '9')
                    {
                        if (e.KeyChar == '-')
                        {
                            if (this.SelectionStart > 0)
                            {
                                //符号は1桁目以外は無効（但し書き換えはOK）
                                e.Handled = true;
                            }
                        }
                        else
                        {
                            e.Handled = true;
                        }
                    }
                }
                //数値[小数点あり]
                else if (_dataType == DataType.Double)
                {
                    //0〜9以外はｲﾍﾞﾝﾄを無効にする
                    if (e.KeyChar < '0' || e.KeyChar > '9')
                    {
                        if (e.KeyChar == '.')
                        {
                            if (this.Text.IndexOf('.') >= 0 && this.SelectedText != this.Text)
                            {
                                //小数点は2つめからは無効（但し書き換えはOK）
                                e.Handled = true;
                            }
                        }
                        else if (e.KeyChar == '-')
                        {
                            if (this.SelectionStart > 0)
                            {
                                //符号は1桁目以外は無効（但し書き換えはOK）
                                e.Handled = true;
                            }
                        }
                        else
                        {
                            e.Handled = true;
                        }
                    }
                }

            }

            base.OnKeyPress(e);
        }

        /// <summary>
        /// OnValidating
        /// </summary>
        /// <param name="e">EventArgs</param>
        protected override void OnValidating(System.ComponentModel.CancelEventArgs e)
        {
            //----------------------------------------
            // 入力文字のﾁｪｯｸを行う
            //----------------------------------------
            if (this.Text != null && this.Text.Length > 0)
            {
                //数値[小数点なし]
                if (_dataType == DataType.Long)
                {
                    long lResult;
                    if (!long.TryParse(this.Text, out lResult))
                    {
                        e.Cancel = true;
                    }
                }
                //数値[小数点あり]
                else if (_dataType == DataType.Double)
                {
                    double dResult;
                    if (!double.TryParse(this.Text, out dResult))
                    {
                        e.Cancel = true;
                    }
                }
            }

            base.OnValidating(e);
        }

        
    }
}
