using System;
using System.Linq;
using System.Windows.Controls;
using System.Windows;

namespace CyberX8_Themes.CustomControls
{
    public class CustomPasswordBox : TextBox
    {
        #region Variables

        #region Data

        #endregion

        public String Password
        {
            get { return (String)GetValue(PwdTextProperty); }
            set
            {
                SetValue(PwdTextProperty, value);
            }
        }
        /// <summary>
        ///     The DependencyProperty for the ItemsSource property.
        ///     Flags:              None
        ///     Default Value:      null
        /// </summary>
        public static readonly DependencyProperty PwdTextProperty
            = DependencyProperty.Register("PwdText", typeof(string), typeof(PasswordBox),
                                          new FrameworkPropertyMetadata("",
                                                                        new PropertyChangedCallback(OnPwdTextChanged)));

        private static void OnPwdTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            PasswordBox ic = (PasswordBox)d;
            string oldValue = e.OldValue as string;
            string newValue = e.NewValue as string;
        }


        public String PasswordChar
        {
            get { return (String)GetValue(PwdCharProperty); }
            set
            {
                SetValue(PwdTextProperty, value);
            }
        }
        /// <summary>
        ///     The DependencyProperty for the ItemsSource property.
        ///     Flags:              None
        ///     Default Value:      null
        /// </summary>
        public static readonly DependencyProperty PwdCharProperty
            = DependencyProperty.Register("PasswordChar", typeof(String), typeof(PasswordBox),
                                          new FrameworkPropertyMetadata("*",
                                                                        new PropertyChangedCallback(OnPwdCharChanged)));

        private static void OnPwdCharChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }


        private string SetPwdString(string value)
        {
            try
            {
                var str = value + "";
                var list = str.ToArray();
                var dst = "";
                var pwd = "*";
                if (PasswordChar != null)
                {
                    pwd = PasswordChar + "";
                }
                foreach (var item in list)
                {
                    dst += pwd;
                }
                return dst;
            }
            catch
            {

            }
            return null;
        }


        #endregion

        #region static Variables
        #endregion

        #region Methods
        #region 构造函数


        protected override void OnTextInput(System.Windows.Input.TextCompositionEventArgs e)
        {
            base.OnTextInput(e);
        }
        bool ChangeToPwd = false;
        protected override void OnTextChanged(TextChangedEventArgs e)
        {
            var str = SetPwdString(Text);
            if (ChangeToPwd)
            {
                return;
            }
            ChangeToPwd = true;
            int offset = 0;
            foreach (var item in e.Changes)
            {
                offset = item.Offset;
                if (item.RemovedLength > 0)
                {
                    Password = Password.Remove(item.Offset, item.RemovedLength);
                }
                if (item.AddedLength > 0)
                {
                    var insertStr = Text.Substring(item.Offset, item.AddedLength);
                    Password = Password.Insert(item.Offset, insertStr);
                    offset = item.Offset + item.AddedLength;
                }
            }
            Text = str;
            this.Select(offset, 0);
            base.OnTextChanged(e);
            ChangeToPwd = false;
        }

        #endregion

        #endregion

        #region static Methods
        #endregion

        #region Event
        #endregion
    }
}