using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
namespace DevComponents.DotNetBar.Controls
{
    /// 
    /// Class represents single token in TokenEditor control.
    /// 
    [ToolboxItem(false)]
    public class EditToken : Component
    {
        #region Constructor
        /// 
        /// Initializes a new instance of the EditToken class.
        /// 
        /// Indicates token value.
        public EditToken(string value)
        {
            _Value = value;
        }
        /// 
        /// Initializes a new instance of the EditToken class.
        /// 
        /// Indicates token value
        /// Indicates token text
        public EditToken(string value, string text)
        {
            _Value = value;
            _Text = text;
        }
        /// 
        /// Initializes a new instance of the EditToken class.
        /// 
        /// Indicates token value
        /// Indicates token text
        /// Indicates token image
        public EditToken(string value, string text, Image image)
        {
            _Value = value;
            _Text = text;
            _Image = image;
        }
        #endregion
        #region Implementation
        private eTokenPart _MouseOverPart;
        private string _Value = "";
        /// 
        /// Indicates the token value, for example an email token has email address as token Value and full name as token Text.
        /// 
        [DefaultValue(""), Category("Data"), Description("Indicates the token value, for example an email token has email address as token Value and full name as token Text.")]
        public string Value
        {
            get { return _Value; }
            set
            {
                if (value != _Value)
                {
                    string oldValue = _Value;
                    _Value = value;
                    OnValueChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when Value property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnValueChanged(string oldValue, string newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("Value"));
        }
        private string _Text = "";
        /// 
        /// Indicates the token text, for example an email token has email address as token Value and full name as token Text.
        /// 
        [DefaultValue(""), Category("Data"), Description("Indicates the token text, for example an email token has email address as token Value and full name as token Text.")]
        public string Text
        {
            get { return _Text; }
            set
            {
                if (value != _Text)
                {
                    string oldValue = _Text;
                    _Text = value;
                    OnTextChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when Text property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnTextChanged(string oldValue, string newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("Text"));
        }
        private object _Tag = null;
        /// 
        /// Gets or sets custom data associated with the object.
        /// 
        [DefaultValue((string)null), Localizable(false), TypeConverter(typeof(StringConverter)), Category("Data"), Description("Custom data associated with the object")]
        public object Tag
        {
            get { return _Tag; }
            set { _Tag = value; }
        }
        private Rectangle _Bounds = Rectangle.Empty;
        /// 
        /// Gets the display bounds of the token, if displayed, inside of TokenEditor control.
        /// 
        [Browsable(false)]
        public Rectangle Bounds
        {
            get { return _Bounds; }
            internal set { _Bounds = value; }
        }
        private Image _Image = null;
        /// 
        /// Indicates the image that is displayed next to the token
        /// 
        [DefaultValue(null), Category("Appearance"), Description("Indicates the image that is displayed next to the token")]
        public Image Image
        {
            get { return _Image; }
            set
            {
                if (value != _Image)
                {
                    Image oldValue = _Image;
                    _Image = value;
                    OnImageChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when Image property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnImageChanged(Image oldValue, Image newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("Image"));
        }
        /// 
        /// Gets the realized symbol string.
        /// 
        [Browsable(false)]
        public string SymbolRealized
        {
            get { return _SymbolRealized; }
        }
        private string _Symbol = "", _SymbolRealized = "";
        /// 
        /// Indicates the symbol displayed on face of the token instead of the image. Setting the symbol overrides the image setting.
        /// 
        [DefaultValue(""), Category("Appearance"), Description("Indicates the symbol displayed on face of the token instead of the image. Setting the symbol overrides the image setting.")]
        [Editor("DevComponents.DotNetBar.Design.SymbolTypeEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
        public string Symbol
        {
            get { return _Symbol; }
            set
            {
                if (value != _Symbol)
                {
                    string oldValue = _Symbol;
                    _Symbol = value;
                    OnSymbolChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when Symbol property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnSymbolChanged(string oldValue, string newValue)
        {
            if (string.IsNullOrEmpty(newValue))
                _SymbolRealized = "";
            else
                _SymbolRealized = Symbols.GetSymbol(newValue);
            //OnPropertyChanged(new PropertyChangedEventArgs("Symbol"));
            this.Invalidate();
        }
        private eSymbolSet _SymbolSet = eSymbolSet.Awesome;
        /// 
        /// Gets or sets the symbol set used to represent the Symbol.
        /// 
        [Browsable(false), DefaultValue(eSymbolSet.Awesome)]
        public eSymbolSet SymbolSet
        {
            get { return _SymbolSet; }
            set
            {
                if (_SymbolSet != value)
                {
                    eSymbolSet oldValue = _SymbolSet;
                    _SymbolSet = value;
                    OnSymbolSetChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when SymbolSet property value changes.
        /// 
        /// Indciates old value
        /// Indicates new value
        protected virtual void OnSymbolSetChanged(eSymbolSet oldValue, eSymbolSet newValue)
        {
            this.Invalidate();
        }
        private void Invalidate()
        {
            //throw new NotImplementedException();
        }
        private Color _SymbolColor = Color.Empty;
        /// 
        /// Gets or sets the color of the Symbol.
        /// 
        [Category("Appearance"), Description("Indicates color of the Symbol.")]
        public Color SymbolColor
        {
            get { return _SymbolColor; }
            set { _SymbolColor = value; this.Invalidate(); }
        }
        /// 
        /// Gets whether property should be serialized.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public bool ShouldSerializeSymbolColor()
        {
            return !_SymbolColor.IsEmpty;
        }
        /// 
        /// Resets property to its default value.
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)]
        public void ResetSymbolColor()
        {
            this.SymbolColor = Color.Empty;
        }
        private string _Tooltip = "";
        /// 
        /// Indicates tooltip that is displayed when mouse is over the token and token is selected.
        /// 
        [DefaultValue(""), Category("Behavior"), Description("Indicates tooltip that is displayed when mouse is over the token and token is selected")]
        public string Tooltip
        {
            get { return _Tooltip; }
            set
            {
                if (value !=_Tooltip)
                {
                    string oldValue = _Tooltip;
                    _Tooltip = value;
                    OnTooltipChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when Tooltip property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnTooltipChanged(string oldValue, string newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("Tooltip"));
            
        }
        /// 
        /// Gets the part of the token mouse is over. Valid only when token is selected.
        /// 
        [Browsable(false)]
        public eTokenPart MouseOverPart
        {
            get { return _MouseOverPart; }
            internal set
            {
                if (value !=_MouseOverPart)
                {
                    eTokenPart oldValue = _MouseOverPart;
                    _MouseOverPart = value;
                    OnMouseOverPartChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Called when MouseOverPart property has changed.
        /// 
        /// Old property value
        /// New property value
        protected virtual void OnMouseOverPartChanged(eTokenPart oldValue, eTokenPart newValue)
        {
            //OnPropertyChanged(new PropertyChangedEventArgs("MouseOverPart"));
            
        }
        private Rectangle _RemoveButtonBounds = Rectangle.Empty;
        /// 
        /// Gets the bounds of the remove button if displayed. Valid only when token is selected.
        /// 
        [Browsable(false)]
        public Rectangle RemoveButtonBounds
        {
            get
            {
                return _RemoveButtonBounds;
            }
            internal set
            {
                _RemoveButtonBounds = value;
            }
        }
        private Rectangle _ImageBounds = Rectangle.Empty;
        /// 
        /// Gets the bounds of the image if displayed. Valid only when token is selected.
        /// 
        [Browsable(false)]
        public Rectangle ImageBounds
        {
            get
            {
                return _ImageBounds;
            }
            internal set
            {
                _ImageBounds = value;
            }
        }
        private bool _IsSelected = false;
        /// 
        /// Indicates whether token is selected.
        /// 
        [Browsable(false)]
        public bool IsSelected
        {
            get
            {
                return _IsSelected;
            }
            internal set
            {
                _IsSelected = value;
            }
        }
        private bool _IsFocused = false;
        /// 
        /// Indicates whether token is focused while selected.
        /// 
        [Browsable(false)]
        public bool IsFocused
        {
            get
            {
                return _IsFocused;
            }
            internal set
            {
                _IsFocused = value;
            }
        }
        #endregion
    }
    /// 
    /// Defines the token parts.
    /// 
    public enum eTokenPart
    {
        /// 
        /// Identifies no token part.
        /// 
        None,
        /// 
        /// Identifies the token body/text.
        /// 
        Token,
        /// 
        /// Identifies the remove token button.
        /// 
        RemoveButton,
        /// 
        /// Identifies the token image.
        /// 
        Image
    }
}