#if FRAMEWORK20
using System;
using System.Windows.Forms;
using DevComponents.Schedule.Model;
using System.ComponentModel;
namespace DevComponents.DotNetBar.Schedule
{
    public class CustomCalendarItem : CalendarItem
    {
        #region Events
        /// 
        /// Occurs when the OwnerKey has changed
        /// 
        [Description("Occurs when the OwnerKey has changed.")]
        public event EventHandler OwnerKeyChanged;
        /// 
        /// Occurs when Locked has changed
        /// 
        [Description("Occurs when the Locked property has changed.")]
        public event EventHandler LockedChanged;
        #endregion
        #region Private variables
        private string _OwnerKey = "";      // OwnerKey
        private bool _Locked;               // Locked state
        private CustomCalendarItem _BaseCalendarItem;       // Base CalendarItem
        private CalendarView _CalendarView;
        #endregion
        #region Public properties
        #region CollateId
        /// 
        /// Gets or sets the CollateId used for TimeLine row collation.
        /// 
        public override int CollateId
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.CollateId);
                return (base.CollateId);
            }
            set
            {
                if (_BaseCalendarItem != null)
                    _BaseCalendarItem.CollateId = value;
                base.CollateId = value;
            }
        }
        #endregion
        #region OwnerKey
        /// 
        /// Gets and sets the item OwnerKey
        /// 
        public string OwnerKey
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.OwnerKey);
                
                return (_OwnerKey);
            }
            set
            {
                if (_BaseCalendarItem != null)
                {
                    _BaseCalendarItem.OwnerKey = value;
                }
                else
                {
                    if (value == null)
                        value = "";
                    if (_OwnerKey.Equals(value) == false)
                    {
                        string oldValue = _OwnerKey;
                        _OwnerKey = value;
                        OnOwnerKeyChanged(oldValue, value);
                    }
                }
            }
        }
        /// 
        /// Sends ChangedEvent for the OwnerKey property
        /// 
        /// Old OwnerKey
        /// New OwnerKey
        protected virtual void OnOwnerKeyChanged(string oldValue, string newValue)
        {
            if (OwnerKeyChanged != null)
                OwnerKeyChanged(this, new OwnerKeyChangedEventArgs(oldValue, newValue));
        }
        #endregion
        #region Locked
        /// 
        /// Gets and set whether modification is enabled
        /// through the user interface"
        /// 
        public bool Locked
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.Locked);
                return (_Locked);
            }
            set
            {
                if (_BaseCalendarItem != null)
                {
                    _BaseCalendarItem.Locked = value;
                }
                else
                {
                    if (_Locked != value)
                    {
                        bool oldValue = _Locked;
                        _Locked = value;
                        OnLockedChanged(oldValue, value);
                    }
                }
            }
        }
        /// 
        /// Sends ChangedEvent for the Locked property
        /// 
        /// Old OwnerKey
        /// New OwnerKey
        protected virtual void OnLockedChanged(bool oldValue, bool newValue)
        {
            if (LockedChanged != null)
                LockedChanged(this, new LockedChangedEventArgs(oldValue, newValue));
        }
        #endregion
        #region StartTime
        public override DateTime StartTime
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.StartTime);
                return (base.StartTime);
            }
            set
            {
                if (_BaseCalendarItem != null)
                    _BaseCalendarItem.StartTime = value;
                base.StartTime = value;
            }
        }
        #endregion
        #region EndTime
        public override DateTime EndTime
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.EndTime);
                return (base.EndTime);
            }
            set
            {
                if (_BaseCalendarItem != null)
                    _BaseCalendarItem.EndTime = value;
                base.EndTime = value;
            }
        }
        #endregion
        #region BaseCalendarItem
        /// 
        /// Base CalendarItem
        /// 
        /// This property holds the base CalendarItem from which
        /// each displayed CustomItem (of this type) is based.
        /// 
        /// In order to keep all displayed items "in-sync", it is necessary
        /// to propagate data to and from the base CalendarItem.  This is
        /// accomplished via hooking those members you are interested in, at
        /// both the item (HookEvents) and BaseCalendarItem (HookBaseEvents)
        /// level.
        /// 
        /// 
        public virtual CustomCalendarItem BaseCalendarItem
        {
            get { return (_BaseCalendarItem); }
            set { _BaseCalendarItem = value; }
        }
        #endregion
        #region IsMultiDayOrAllDayEvent
        public bool IsMultiDayOrAllDayEvent
        {
            get
            {
                return (StartTime < EndTime &&
                    (EndTime.Subtract(StartTime).TotalDays >= 1 ||
                    DateTimeHelper.IsSameDay(StartTime, EndTime) == false));
            }
        }
        #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 override string CategoryColor
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.CategoryColor);
                return (base.CategoryColor);
            }
            set
            {
                if (_BaseCalendarItem != null)
                    _BaseCalendarItem.CategoryColor = value;
                base.CategoryColor = value;
            }
        }
        #endregion
        #region IsSelected
        /// 
        /// Gets or sets whether the item is selected.
        /// 
        public override bool IsSelected
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.IsSelected);
                return (base.IsSelected);
            }
            set
            {
                if (_BaseCalendarItem != null)
                    _BaseCalendarItem.IsSelected = value;
                base.IsSelected = value;
            }
        }
        #endregion
        #region Visible
        /// 
        /// Gets and sets the item Visibility
        /// 
        public override bool Visible
        {
            get
            {
                if (_BaseCalendarItem != null)
                    return (_BaseCalendarItem.Visible);
                return (base.Visible);
            }
            set
            {
                if (_BaseCalendarItem != null)
                {
                    _BaseCalendarItem.Visible = value;
                }
                else
                {
                    if (_BaseCalendarItem != null)
                        _BaseCalendarItem.Visible = value;
                    base.Visible = value;
                }
            }
        }
        #endregion
        #endregion
        #region Internal properties
        #region CalendarView
        internal CalendarView CalendarView
        {
            get { return (_CalendarView); }
            set { _CalendarView = value; }
        }
        #endregion
        #endregion
        #region Refresh
        public override void Refresh()
        {
            if (_CalendarView != null)
            {
                Control c = (Control)_CalendarView.GetContainerControl();
                if (c != null)
                {
                    foreach (BaseItem item in _CalendarView.CalendarPanel.SubItems)
                    {
                        BaseView view = item as BaseView;
                        if (view != null)
                            RefreshItems(c, view.SubItems);
                    }
                }
            }
        }
        private void RefreshItems(Control c, SubItemsCollection subItems)
        {
            foreach (BaseItem item in subItems)
            {
                CustomCalendarItem ci = item as CustomCalendarItem;
                if (ci != null)
                {
                    if (ci == this || ci.BaseCalendarItem == this)
                        ci.Invalidate(c);
                }
                else if (item is AllDayPanel)
                {
                    RefreshItems(c, item.SubItems);
                }
            }
        }
    
        #endregion
        #region Paint
        public override void Paint(ItemPaintArgs e)
        {
        }
        #endregion
        #region Copy
        /// 
        /// Returns copy of the item.
        /// 
        public override BaseItem Copy()
        {
            CustomCalendarItem objCopy = new CustomCalendarItem();
            CopyToItem(objCopy);
            return (objCopy);
        }
        /// 
        /// Copies the CustomCalendarItem specific properties to new instance of the item.
        /// 
        /// New CustomCalendarItem instance
        protected override void CopyToItem(BaseItem copy)
        {
            CustomCalendarItem objCopy = copy as CustomCalendarItem;
            if (objCopy != null)
            {
                base.CopyToItem(objCopy);
                objCopy._OwnerKey = this._OwnerKey;
                objCopy._Locked = this.Locked;
                objCopy._CalendarView = this.CalendarView;
            }
        }
        #endregion
    }
    #region OwnerKeyChangedEventArgs
    /// 
    /// OwnerKeyChangedEventArgs
    /// 
    /// 
    public class OwnerKeyChangedEventArgs : ValueChangedEventArgs
    {
        public OwnerKeyChangedEventArgs(string oldValue, string newValue)
            : base(oldValue, newValue)
        {
        }
    }
    #endregion
    #region LockedChangedEventArgs
    /// 
    /// LockedChangedEventArgs
    /// 
    /// 
    public class LockedChangedEventArgs : ValueChangedEventArgs
    {
        public LockedChangedEventArgs(bool oldValue, bool newValue)
            : base(oldValue, newValue)
        {
        }
    }
    #endregion
    #region CategoryColorChangedEventArgs
    /// 
    /// CategoryColorChangedEventArgs
    /// 
    /// 
    public class CategoryColorChangedEventArgs : ValueChangedEventArgs
    {
        public CategoryColorChangedEventArgs(string oldValue, string newValue)
            : base(oldValue, newValue)
        {
        }
    }
    #endregion
}
#endif