using System;
using System.ComponentModel;
using System.Windows.Forms;
using DevComponents.Charts.TextMarkup;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
    /// 
    /// ChartNote.
    /// 
    public class ChartNote : ChartVisualElement
    {
        #region Private variables
        private States _States;
        private string _Text;
        private BodyElement _TextMarkup;
        private int _FixedHeight;
        #endregion
        #region Public properties
        #region EnableTextMarkup
        /// 
        /// Gets or sets whether text-markup support is enabled
        /// 
        [DefaultValue(false), Category("Appearance")]
        [Description("Indicates whether text-markup support is enabled.")]
        public bool EnableTextMarkup
        {
            get { return (TestState(States.EnableTextMarkup)); }
            set
            {
                if (EnableTextMarkup != value)
                {
                    SetState(States.EnableTextMarkup, value);
                    MarkupTextChanged();
                    OnPropertyChangedEx("EnableTextMarkup", VisualChangeType.Layout);
                }
            }
        }
        #region MarkupTextChanged
        private void MarkupTextChanged()
        {
            if (_TextMarkup != null)
                _TextMarkup.HyperLinkClick -= TextMarkupLinkClick;
            _TextMarkup = null;
            if (EnableTextMarkup == true)
            {
                if (MarkupParser.IsMarkup(_Text) == true)
                {
                    _TextMarkup = MarkupParser.Parse(_Text);
                    if (_TextMarkup != null)
                        _TextMarkup.HyperLinkClick += TextMarkupLinkClick;
                }
            }
        }
        #endregion
        #region TextMarkupLinkClick
        /// 
        /// Occurs when a text markup link is clicked
        /// 
        protected virtual void TextMarkupLinkClick(object sender, EventArgs e)
        {
            HyperLink link = sender as HyperLink;
            if (link != null)
                ChartControl.DoChartTitleMarkupLinkClickEvent(this, link);
        }
        #endregion
        #endregion
        #region PlainText
        /// 
        /// Gets text without text-markup (if text-markup is used in Text)
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public string PlainText
        {
            get { return (_TextMarkup != null ? _TextMarkup.PlainText : _Text); }
        }
        #endregion
        #region FixedHeight
        /// 
        /// Gets or sets the fixed Text height (0 to auto-size)
        /// 
        [DefaultValue(0), Category("Layout")]
        [Description("Indicates the fixed Text height (0 to auto-size)")]
        public int FixedHeight
        {
            get { return (_FixedHeight); }
            set
            {
                if (value != _FixedHeight)
                {
                    _FixedHeight = value;
                    OnPropertyChangedEx("FixedHeight", VisualChangeType.Layout);
                }
            }
        }
        #endregion
        #region Text
        /// 
        /// Gets or sets the item Text.
        /// 
        [DefaultValue(null), Category("Appearance")]
        [Description("Indicates the item Text.")]
        [Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
        public string Text
        {
            get { return (_Text); }
            set
            {
                _Text = value;
                MarkupTextChanged();
                OnPropertyChangedEx("Text", VisualChangeType.Layout);
            }
        }
        #endregion
        #endregion
        #region Internal properties
        #region TextMarkup
        internal BodyElement TextMarkup
        {
            get { return (_TextMarkup); }
        }
        #endregion
        #endregion
        #region MeasureOverride
        protected override void MeasureOverride(ChartLayoutInfo layoutInfo)
        {
            throw new NotImplementedException();
        }
        #endregion
        #region ArrangeOverride
        protected override void ArrangeOverride(ChartLayoutInfo layoutInfo)
        {
            throw new NotImplementedException();
        }
        #endregion
        #region RenderOverride
        protected override void RenderOverride(ChartRenderInfo renderInfo)
        {
            throw new NotImplementedException();
        }
        #endregion
        #region Mouse handling
        #region OnMouseEnter
        protected override bool OnMouseEnter(EventArgs e)
        {
            return (true);
        }
        #endregion
        #region OnMouseLeave
        protected override bool OnMouseLeave(EventArgs e)
        {
            return (true);
        }
        #endregion
        #region OnMouseMove
        protected override bool OnMouseMove(MouseEventArgs e)
        {
            ChartCursor = Cursors.Default;
            return (false);
        }
        #endregion
        #region OnMouseDown
        protected override bool OnMouseDown(MouseEventArgs e)
        {
            return (false);
        }
        #endregion
        #region OnMouseUp
        protected override bool OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
            return (true);
        }
        #endregion
        #endregion
        #region Copy/CopyTo
        public override ChartVisualElement Copy()
        {
            ChartNote copy = new ChartNote();
            CopyTo(copy);
            return (copy);
        }
        public override void CopyTo(ChartVisualElement copy)
        {
            ChartNote c = copy as ChartNote;
            if (c != null)
            {
                base.CopyTo(c);
                c.EnableTextMarkup = EnableTextMarkup;
                c.FixedHeight = FixedHeight;
                c.Text = Text;
            }
        }
        #endregion
        #region GetSerialData
        internal override SerialElementCollection GetSerialData(string serialName)
        {
            SerialElementCollection sec = new SerialElementCollection();
            if (serialName != null)
            {
                if (serialName.Equals("") == true)
                    serialName = "ChartNote";
                sec.AddStartElement(serialName);
            }
            sec.AddValue("EnableTextMarkup", EnableTextMarkup, false);
            sec.AddValue("FixedHeight", FixedHeight, 0);
            sec.AddValue("Text", Text, null);
            sec.AddElement(base.GetSerialData(null));
            if (serialName != null)
                sec.AddEndElement(serialName);
            return (sec);
        }
        #endregion
        #region PutSerialData
        #region ProcessValue
        internal override void ProcessValue(SerialElement se)
        {
            switch (se.Name)
            {
                case "EnableTextMarkup":
                    EnableTextMarkup = bool.Parse(se.StringValue);
                    break;
                case "FixedHeight":
                    FixedHeight = int.Parse(se.StringValue);
                    break;
                case "Text":
                    Text = se.StringValue;
                    break;
                default:
                    base.ProcessValue(se);
                    break;
            }
        }
        #endregion
        #endregion
        #region States
        [Flags]
        private enum States : uint
        {
            EnableTextMarkup = (1U << 0),
        }
        #region TestState
        private bool TestState(States state)
        {
            return ((_States & state) == state);
        }
        #endregion
        #region SetState
        private void SetState(States state, bool value)
        {
            if (value == true)
                _States |= state;
            else
                _States &= ~state;
        }
        #endregion
        #endregion
    }
}