using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace DevComponents.Schedule.Model
{
    /// 
    /// Defines a working day.
    /// 
    public abstract class BaseWorkDay : INotifyPropertyChanged, INotifySubPropertyChanged
    {
        #region Internal Implementation
        protected WorkTime _WorkStartTime = new WorkTime(8, 0);
        /// 
        /// Gets or sets the work start time.
        /// 
        public WorkTime WorkStartTime
        {
            get { return _WorkStartTime; }
            set
            {
                WorkTime oldValue = _WorkStartTime;
                _WorkStartTime = value;
                OnWorkStartTimeChanged(oldValue, value);
            }
        }
        /// 
        /// Called when WorkStartTime has changed.
        /// 
        /// Old property value.
        /// New property value.
        protected virtual void OnWorkStartTimeChanged(WorkTime oldValue, WorkTime newValue)
        {
            OnPropertyChanged(new PropertyChangedEventArgs("WorkStartTime"));
        }
        protected WorkTime _WorkEndTime = new WorkTime(17, 0);
        /// 
        /// Gets or sets the work end time.
        /// 
        public WorkTime WorkEndTime
        {
            get { return _WorkEndTime; }
            set
            {
                WorkTime oldValue = _WorkEndTime;
                _WorkEndTime = value;
                OnWorkEndTimeChanged(oldValue, value);
            }
        }
        /// 
        /// Called when WorkEndTime has changed.
        /// 
        /// Old property value.
        /// New property value.
        protected virtual void OnWorkEndTimeChanged(WorkTime oldValue, WorkTime newValue)
        {
            OnPropertyChanged(new PropertyChangedEventArgs("WorkEndTime"));
        }
        private CalendarModel _Calendar = null;
        /// 
        /// Gets the calendar work day is associated with.
        /// 
        [Browsable(false)]
        public CalendarModel Calendar
        {
            get { return _Calendar; }
            internal set
            {
                if (_Calendar != value)
                {
                    _Calendar = value;
                }
            }
        }
        #endregion
        #region INotifyPropertyChanged Members
        /// 
        /// Occurs when property value has changed.
        /// 
        public event PropertyChangedEventHandler PropertyChanged;
        /// 
        /// Raises the PropertyChanged event.
        /// 
        /// Event arguments
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler eh = PropertyChanged;
            if (eh != null) eh(this, e);
            OnSubPropertyChanged(new SubPropertyChangedEventArgs(this, e));
        }
        #endregion
        #region INotifySubPropertyChanged Members
        /// 
        /// Occurs when property or property of child objects has changed. This event is similar to PropertyChanged event with key
        /// difference that it occurs for the property changed of child objects as well.
        /// 
        public event SubPropertyChangedEventHandler SubPropertyChanged;
        /// 
        /// Raises the SubPropertyChanged event.
        /// 
        /// Event arguments
        protected virtual void OnSubPropertyChanged(SubPropertyChangedEventArgs e)
        {
            SubPropertyChangedEventHandler eh = SubPropertyChanged;
            if (eh != null) eh(this, e);
        }
        #endregion
    }
}