#if FRAMEWORK20
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DevComponents.Schedule.Model;
namespace DevComponents.DotNetBar.Schedule
{
    public class CalendarItem : PopupItem
    {
        #region enums
        public enum eHitArea
        {
            None,
            Move,
            LeftResize,
            RightResize,
            TopResize,
            BottomResize
        }
        #endregion
        #region Events
        /// 
        /// Occurs when CategoryColor has changed
        /// 
        [Description("Occurs when the CategoryColor property has changed.")]
        public event EventHandler CategoryColorChanged;
        /// 
        /// Occurs when StartTime has Changed
        /// 
        public event EventHandler StartTimeChanged;
        /// 
        /// Occurs when EndTime has Changed
        /// 
        public event EventHandler EndTimeChanged;
        /// 
        /// Occurs when IsSelected has Changed
        /// 
        public event EventHandler IsSelectedChanged;
        /// 
        /// Occurs when CollateId has Changed
        /// 
        public event EventHandler CollateIdChanged;
        #endregion
        #region Private variables
        private DateTime _StartTime;        // Start time
        private DateTime _EndTime;          // End time
        private string _CategoryColor;      // CategoryColor
        private int _CollateId = -1;
        private object _ModelItem;          // Model item
        private object _RootItem;           // Root model item
        private bool _IsRecurring;          // Is recurring
        private bool _IsSelected;           // Is selected
        private eHitArea _HitArea = eHitArea.None;
        private DateTime _LastMouseDown = DateTime.MinValue;
        private uint _RefreshCount;
        #endregion
        /// 
        /// Constructor
        /// 
        public CalendarItem()
        {
            // Set our default Model item
            _ModelItem = this;
            MouseUpNotification = true;
            SetIsContainer(true);
        }
        #region Public properties
        #region CollateId
        /// 
        /// Gets or sets the CollateId used for TimeLine row collation.
        /// 
        public virtual int CollateId
        {
            get { return (_CollateId); }
            set
            {
                if (_CollateId != value)
                {
                    _CollateId = value;
                    OnCollateIdChanged();
                }
            }
        }
        protected virtual void OnCollateIdChanged()
        {
            if (CollateIdChanged != null)
                CollateIdChanged(this, new EventArgs());
            this.Refresh();
        }
        #endregion
        #region StartTime
        /// 
        /// Gets or sets the CalendarItem Start time.
        /// 
        public virtual DateTime StartTime
        {
            get { return (_StartTime); }
            set
            {
                if (_StartTime != value)
                {
                    _StartTime = value;
                    OnStartTimeChanged();
                }
            }
        }
        protected virtual void OnStartTimeChanged()
        {
            if (StartTimeChanged != null)
                StartTimeChanged(this, new EventArgs());
            this.Refresh();
        }
        #endregion
        #region EndTime
        /// 
        /// Gets or sets the CalendarItem End time.
        /// 
        public virtual DateTime EndTime
        {
            get { return (_EndTime); }
            set
            {
                if (_EndTime != value)
                {
                    _EndTime = value;
                    OnEndTimeChanged();
                }
            }
        }
        protected virtual void OnEndTimeChanged()
        {
            if (EndTimeChanged != null)
                EndTimeChanged(this, new EventArgs());
            this.Refresh();
        }
        #endregion
        #region CategoryColor
        /// 
        /// Gets or sets the category color used for TimeLine CondensedView markers.
        /// Use static members on Appointment class to assign the category color for example Appointment.CategoryRed.
        /// 
        public virtual string CategoryColor
        {
            get { return (_CategoryColor); }
            set
            {
                if (_CategoryColor == null || _CategoryColor.Equals(value) == false)
                {
                    string oldValue = _CategoryColor;
                    _CategoryColor = value;
                    OnCategoryColorChanged(oldValue, value);
                }
            }
        }
        /// 
        /// Sends ChangedEvent for the CategoryColor property
        /// 
        /// Old CategoryColor
        /// New CategoryColor
        protected virtual void OnCategoryColorChanged(string oldValue, string newValue)
        {
            if (CategoryColorChanged != null)
                CategoryColorChanged(this, new CategoryColorChangedEventArgs(oldValue, newValue));
        }
        #endregion
        #region ModelItem
        /// 
        /// Gets and sets the Model item
        /// 
        public object ModelItem
        {
            get { return (_ModelItem); }
            set { _ModelItem = value; }
        }
        #endregion
        #region RootItem
        /// 
        /// Gets and sets the Root Model item
        /// 
        public object RootItem
        {
            get { return (_RootItem); }
            set { _RootItem = value; }
        }
        #endregion
        #region IsRecurring
        /// 
        /// Gets and sets the IsRecurring item status
        /// 
        public bool IsRecurring
        {
            get { return (_IsRecurring); }
            set { _IsRecurring = value; }
        }
        #endregion
        #region IsSelected
        /// 
        /// Gets and sets the selection state
        /// 
        public virtual bool IsSelected
        {
            get { return (_IsSelected); }
            set
            {
                if (_IsSelected != value)
                {
                    _IsSelected = value;
                    Control c = this.ContainerControl as Control;
                    if (c != null)
                    {
                        Rectangle r = Bounds;
                        r.Inflate(4, 4);
                        c.Invalidate(r);
                    }
                    Appointment ap = ModelItem as Appointment;
                    if (ap != null)
                        ap.IsSelected = value;
                    OnIsSelectedChanged();
                }
            }
        }
        private void OnIsSelectedChanged()
        {
            if (IsSelectedChanged != null)
                IsSelectedChanged(this, new EventArgs());
        }
        #endregion
        #region HitArea
        /// 
        /// Gets and sets the last hit area
        /// 
        public eHitArea HitArea
        {
            get { return (_HitArea); }
            set { _HitArea = value; }
        }
        #endregion
        #endregion
        #region Internal properties
        internal uint RefreshCount
        {
            get { return (_RefreshCount); }
            set { _RefreshCount = value; }
        }
        #endregion
        #region Mouse support
        /// 
        /// Handles control MouseDown events
        /// 
        /// MouseEventArgs
        public override void InternalMouseDown(MouseEventArgs objArg)
        {
            base.InternalMouseDown(objArg);
            if (objArg.Button == MouseButtons.Left)
            {
                if (IsSimpleMouseDown())
                    this.IsSelected = true;
                InternalMouseMove(objArg);
                _LastMouseDown = DateTime.Now;
            }
        }
        /// 
        /// Determines if it is a simple, single-click MouseDown
        /// 
        /// 
        private bool IsSimpleMouseDown()
        {
            return (_LastMouseDown == DateTime.MinValue ||
                    _LastMouseDown != DateTime.MinValue &&
                    DateTime.Now.Subtract(_LastMouseDown).TotalMilliseconds > SystemInformation.DoubleClickTime);
        }
        #endregion
        #region RecalcSize
        public override void RecalcSize()
        {
        }
        #endregion
        #region Paint
        public override void Paint(ItemPaintArgs p)
        {
        }
        #endregion
        #region IsMarkupSupported
        /// 
        /// IsMarkupSupported
        /// 
        protected override bool IsMarkupSupported
        {
            get { return (true); }
        }
        #endregion
        #region Copy object
        /// 
        /// Returns copy of the item.
        /// 
        public override BaseItem Copy()
        {
            CalendarItem objCopy = new CalendarItem();
            CopyToItem(objCopy);
            return (objCopy);
        }
        /// 
        /// Copies the CalendarItem specific properties to new instance of the item.
        /// 
        /// New CalendarItem instance
        protected override void CopyToItem(BaseItem copy)
        {
            CalendarItem objCopy = copy as CalendarItem;
            if (objCopy != null)
            {
                base.CopyToItem(objCopy);
                objCopy._StartTime = this._StartTime;
                objCopy._EndTime = this._EndTime;
            }
        }
        #endregion
    }
}
#endif