#if FRAMEWORK20
using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace DevComponents.Editors
{
    public class VisualItem
    {
        #region Private Variables
        #endregion
        #region Events
        /// 
        /// Occurs when item arrange becomes invalid.
        /// 
        public event EventHandler ArrangeInvalid;
        /// 
        /// Occurs when item appearance becomes invalid and items needs to be repainted.
        /// 
        public event EventHandler RenderInvalid;
        /// 
        /// Occurs when item needs to signal to parent control that MouseHover needs to be reset usually in response to tooltip hiding.
        /// 
        public event EventHandler ResetMouseHover;
        /// 
        /// Occurs when item is clicked.
        /// 
        public event EventHandler Click;
        /// 
        /// Occurs when item is clicked using mouse.
        /// 
        public event MouseEventHandler MouseClick;
        /// 
        /// Occurs when mouse button is pressed over the item.
        /// 
        public event MouseEventHandler MouseDown;
        /// 
        /// Occurs when mouse button is pressed over the item.
        /// 
        public event MouseEventHandler MouseUp;
        /// 
        /// Occurs when mouse hovers over the item.
        /// 
        public event EventHandler MouseHover;
        #endregion
        #region Constructor
        #endregion
        #region Internal Implementation
        internal virtual void ProcessMouseEnter()
        {
            if (this.GetIsEnabled())
                OnMouseEnter();
        }
        protected virtual void OnMouseEnter()
        {
        }
        internal virtual void ProcessMouseLeave()
        {
            if (this.GetIsEnabled())
                OnMouseLeave();
        }
        protected virtual void OnMouseLeave()
        {
        }
        internal virtual void ProcessMouseMove(MouseEventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseMove(e);
        }
        protected virtual void OnMouseMove(MouseEventArgs e)
        {
        }
        internal virtual void ProcessMouseWheel(MouseEventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseWheel(e);
        }
        protected virtual void OnMouseWheel(MouseEventArgs e)
        {
        }
        internal virtual void ProcessMouseDown(MouseEventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseDown(e);
        }
        protected virtual void OnMouseDown(MouseEventArgs e)
        {
            if (MouseDown != null)
                MouseDown(this, e);
        }
        internal virtual void ProcessMouseUp(MouseEventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseUp(e);
        }
        protected virtual void OnMouseUp(MouseEventArgs e)
        {
            if (MouseUp != null)
                MouseUp(this, e);
        }
        internal virtual void ProcessMouseHover(EventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseHover(e);
        }
        protected virtual void OnMouseHover(EventArgs e)
        {
            if (MouseHover != null)
                MouseHover(this, e);
        }
        internal virtual void ProcessClick()
        {
            if (this.GetIsEnabled())
                OnClick(EventArgs.Empty);
        }
        protected virtual void OnClick(EventArgs e)
        {
            if (Click != null)
                Click(this, e);
        }
        internal virtual void ProcessMouseClick(MouseEventArgs e)
        {
            if (this.GetIsEnabled())
                OnMouseClick(e);
        }
        protected virtual void OnMouseClick(MouseEventArgs e)
        {
            if (MouseClick != null)
                MouseClick(this, e);
        }
        internal virtual void ProcessKeyDown(KeyEventArgs e)
        {
            OnKeyDown(e);
        }
        protected virtual void OnKeyDown(KeyEventArgs e)
        {
        }
        internal virtual void ProcessKeyUp(KeyEventArgs e)
        {
            OnKeyUp(e);
        }
        protected virtual void OnKeyUp(KeyEventArgs e)
        {
        }
        internal virtual void ProcessKeyPress(KeyPressEventArgs e)
        {
            OnKeyPress(e);
        }
        protected virtual void OnKeyPress(KeyPressEventArgs e)
        {
        }
        internal virtual bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            return OnCmdKey(ref msg, keyData);
        }
        protected virtual bool OnCmdKey(ref Message msg, Keys keyData)
        {
            return false;
        }
        internal virtual void ProcessGotFocus()
        {
            OnGotFocus();
        }
        protected virtual void OnGotFocus()
        {
            _IsFocused = true;
            OnFocusChanged();
        }
        internal virtual void ProcessLostFocus()
        {
            OnLostFocus();
        }
        protected virtual void OnLostFocus()
        {
            _IsFocused = false;
            OnFocusChanged();
        }
        protected virtual void OnFocusChanged()
        {
        }
        internal virtual void ProcessPaint(PaintInfo p)
        {
            if (!IsRendered) return;
            OnPaint(p);
        }
        protected virtual void OnPaint(PaintInfo p)
        {
        }
        private bool _Focusable = false;
        public bool Focusable
        {
            get { return _Focusable; }
            set
            {
                if (_Focusable != value)
                {
                    _Focusable = value;
                    OnFocusableChanged();
                }
            }
        }
        protected virtual void OnFocusableChanged()
        {
        }
        private bool _Enabled = true;
        /// 
        /// Gets or sets whether item is Enabled.
        /// 
        [DefaultValue(true)]
        public bool Enabled
        {
            get { return _Enabled; }
            set
            {
                if (_Enabled != value)
                {
                    _Enabled = value;
                    OnRenderInvalid();
                }
            }
        }
        protected virtual bool GetIsEnabled()
        {
            if (!_Enabled) return _Enabled;
            VisualItem p = this.Parent;
            while (p != null)
            {
                if (!p.Enabled) return false;
                p = p.Parent;
            }
            return _Enabled;
        }
        protected virtual bool GetIsEnabled(PaintInfo p)
        {
            return p.ParentEnabled && _Enabled;
        }
        private bool _Visible = true;
        public bool Visible
        {
            get { return _Visible; }
            set
            {
                if (_Visible != value)
                {
                    _Visible = value;
                    OnVisibleChanged();
                }
            }
        }
        protected virtual void OnVisibleChanged()
        {
            if (_Parent != null)
            {
                _Parent.OnChildItemVisibleChanged(this);
            }
        }
        private bool _IsRendered = true;
        /// 
        /// Gets or sets whether visual is rendered. Default value is true.
        /// 
        public virtual bool IsRendered
        {
            get { return _IsRendered; }
            set
            {
                _IsRendered = value;
            }
        }
        public virtual void InvalidateArrange()
        {
            _RenderBounds = Rectangle.Empty;
            _Location = Point.Empty;
            _IsLayoutValid = false;
            if (_Parent != null)
                _Parent.InvalidateArrange();
            OnArrangeInvalid();
        }
        public virtual void InvalidateRender()
        {
            if (_Parent != null)
                _Parent.InvalidateRender();
            OnRenderInvalid();
        }
        /// 
        /// Raises the RenderInvalid event.
        /// 
        protected virtual void OnRenderInvalid()
        {
            if (RenderInvalid != null)
                RenderInvalid(this, new EventArgs());
        }
        /// 
        /// Raises the ArrangeInvalid event.
        /// 
        protected virtual void OnArrangeInvalid()
        {
            if (ArrangeInvalid != null)
                ArrangeInvalid(this, new EventArgs());
        }
        private VisualGroup _Parent;
        /// 
        /// Gets the parent of the item.
        /// 
        public VisualGroup Parent
        {
            get { return _Parent; }
            internal set
            {
                if (_Parent != value)
                {
                    _Parent = value;
                    OnParentChanged();
                }
            }
        }
        protected virtual void OnParentChanged()
        {
        }
        private Size _ItemSize = Size.Empty;
        public Size Size
        {
            get { return _ItemSize; }
            internal set
            {
                _ItemSize = value;
            }
        }
        private Rectangle _RenderBounds = Rectangle.Empty;
        public Rectangle RenderBounds
        {
            get { return _RenderBounds; }
            internal set
            {
                _RenderBounds = value;
            }
        }
        private Point _Location;
        /// 
        /// Gets the relative location of the element inside of its parent item.
        /// 
        public Point Location
        {
            get { return _Location; }
            internal set { _Location = value; }
        }
        private bool _IsRightToLeft;
        public bool IsRightToLeft
        {
            get { return _IsRightToLeft; }
            set
            {
                if (_IsRightToLeft != value)
                {
                    _IsRightToLeft = value;
                    OnIsRightToLeftChanged();
                }
            }
        }
        protected virtual void OnIsRightToLeftChanged()
        {
            InvalidateArrange();
        }
        private bool _IsLayoutValid = false;
        public virtual bool IsLayoutValid
        {
            get { return _IsLayoutValid; }
        }
        public virtual void PerformLayout(PaintInfo pi) { _IsLayoutValid = true; }
        private bool _IsFocused = false;
        public bool IsFocused
        {
            get { return _IsFocused; }
        }
        private eItemAlignment _Alignment = eItemAlignment.Left;
        /// 
        /// Gets or sets the item horizontal alignment inside of the parent group. Default value is left.
        /// 
        [DefaultValue(eItemAlignment.Left)]
        public eItemAlignment Alignment
        {
            get { return _Alignment; }
            set
            {
                if (_Alignment != value)
                {
                    _Alignment = value;
                    this.InvalidateArrange();
                }
            }
        }
        private eSystemItemType _ItemType = eSystemItemType.Default;
        internal eSystemItemType ItemType
        {
            get { return _ItemType; }
            set
            {
                _ItemType = value;
            }
        }
        private Size _CalculatedSize;
        public Size CalculatedSize
        {
            get { return _CalculatedSize; }
            internal set { _CalculatedSize = value; }
        }
        public virtual void ResetHover()
        {
            if (_Parent != null)
                _Parent.ResetHover();
            OnResetMouseHover();
        }
        /// 
        /// Raises the ResetMouseHover event.
        /// 
        protected virtual void OnResetMouseHover()
        {
            if (ResetMouseHover != null)
                ResetMouseHover(this, new EventArgs());
        }
        #endregion
    }
}
#endif