396 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			396 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using DevComponents.Schedule.Model;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Collections.Generic;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Schedule
 | 
						|
{
 | 
						|
    internal class ModelYearViewConnector : ModelViewConnector
 | 
						|
    {
 | 
						|
        #region Static data
 | 
						|
 | 
						|
        static private List<Appointment> _lineAppts;
 | 
						|
 | 
						|
        static private int _lineState;              // Refresh state
 | 
						|
        static private DateTime _lineStartTime;     // YearView start date
 | 
						|
        static private DateTime _lineEndTime;       // YearView end date
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private CalendarModel _Model;       // The associated CalendarModel
 | 
						|
        private YearView _View;             // The associated YearView
 | 
						|
 | 
						|
        private bool _IsConnected;          // Connection status
 | 
						|
        private int _ViewState;             // View refresh state
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Constructor
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="model">Assoc CalendarModel</param>
 | 
						|
        /// <param name="yearView">Assoc YearView</param>
 | 
						|
        public ModelYearViewConnector(CalendarModel model, YearView yearView)
 | 
						|
        {
 | 
						|
            _Model = model;
 | 
						|
            _View = yearView;
 | 
						|
        }
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the connection status
 | 
						|
        /// </summary>
 | 
						|
        public override bool IsConnected
 | 
						|
        {
 | 
						|
            get { return _IsConnected; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal properties
 | 
						|
 | 
						|
        internal int ViewState
 | 
						|
        {
 | 
						|
            get { return (_ViewState); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Connect processing
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Performs Model connection processing
 | 
						|
        /// </summary>
 | 
						|
        public override void Connect()
 | 
						|
        {
 | 
						|
            // Load the connection data
 | 
						|
 | 
						|
            if (_IsConnected)
 | 
						|
                Disconnect();
 | 
						|
 | 
						|
            LoadData(_ViewState == _lineState);
 | 
						|
 | 
						|
            // Get notification on Model property changes
 | 
						|
 | 
						|
            _Model.PropertyChanged += ModelPropertyChanged;
 | 
						|
            _Model.SubPropertyChanged += ModelSubPropertyChanged;
 | 
						|
            _View.CalendarView.CustomItems.CollectionChanged += CustomItemsCollectionChanged;
 | 
						|
 | 
						|
            _IsConnected = true;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Disconnect processing
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Severs the Model/MonthView connection
 | 
						|
        /// </summary>
 | 
						|
        public override void Disconnect()
 | 
						|
        {
 | 
						|
            if (_IsConnected)
 | 
						|
            {
 | 
						|
                // Loop through each week, clearing each
 | 
						|
                // associated view connection
 | 
						|
 | 
						|
                for (int i = 0; i < _View.YearMonths.Length; i++)
 | 
						|
                    _View.YearMonths[i].AppBits.SetAll(false);
 | 
						|
 | 
						|
                // Stop notification on Model property changes
 | 
						|
 | 
						|
                _Model.PropertyChanged -= ModelPropertyChanged;
 | 
						|
                _Model.SubPropertyChanged -= ModelSubPropertyChanged;
 | 
						|
                _View.CalendarView.CustomItems.CollectionChanged -= CustomItemsCollectionChanged;
 | 
						|
 | 
						|
                _IsConnected = false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region LoadData processing
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Loads Model/YearView connection data
 | 
						|
        /// </summary>
 | 
						|
        private void LoadData(bool reload)
 | 
						|
        {
 | 
						|
            if (reload == true ||
 | 
						|
                _lineStartTime != _View.StartDate || _lineEndTime != _View.EndDate)
 | 
						|
            {
 | 
						|
                _lineStartTime = _View.StartDate;
 | 
						|
                _lineEndTime = _View.EndDate;
 | 
						|
 | 
						|
                _lineAppts = GetAppointmentList(_Model, _View.StartDate, _View.EndDate.AddDays(1));
 | 
						|
            }
 | 
						|
 | 
						|
            if (reload == true)
 | 
						|
                _lineState = _lineState ^ 1;
 | 
						|
 | 
						|
            _ViewState = _lineState;
 | 
						|
 | 
						|
            foreach (YearMonth yearMonth in _View.YearMonths)
 | 
						|
                yearMonth.AppBits.SetAll(false);
 | 
						|
 | 
						|
            int rootMonth = _View.StartDate.Year * 12 + _View.StartDate.Month;
 | 
						|
 | 
						|
            for (int i = 0; i < _lineAppts.Count; i++)
 | 
						|
            {
 | 
						|
                Appointment app = _lineAppts[i];
 | 
						|
 | 
						|
                if (IsAppointmentVisible(app) == true)
 | 
						|
                {
 | 
						|
                    int day = app.StartTime.Day - 1;
 | 
						|
                    int month = (app.StartTime.Year * 12 + app.StartTime.Month) - rootMonth;
 | 
						|
 | 
						|
                    DateTime date = app.StartTime;
 | 
						|
 | 
						|
                    if (month < 0)
 | 
						|
                    {
 | 
						|
                        day = 0;
 | 
						|
                        month = 0;
 | 
						|
 | 
						|
                        if (_View.YearMonths.Length > 0)
 | 
						|
                            date = _View.YearMonths[0].StartDate;
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (month < _View.YearMonths.Length)
 | 
						|
                    {
 | 
						|
                        YearMonth ym = _View.YearMonths[month];
 | 
						|
 | 
						|
                        while (date < app.EndTime || (date == app.EndTime && app.StartTime == app.EndTime))
 | 
						|
                        {
 | 
						|
                            if (day >= ym.DaysInMonth)
 | 
						|
                            {
 | 
						|
                                month++;
 | 
						|
 | 
						|
                                if (month >= _View.YearMonths.Length)
 | 
						|
                                    break;
 | 
						|
 | 
						|
                                ym = _View.YearMonths[month];
 | 
						|
                                day = 0;
 | 
						|
                            }
 | 
						|
 | 
						|
                            ym.AppBits.Set(day++, true);
 | 
						|
 | 
						|
                            date = date.AddDays(1);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            foreach (YearMonth yearMonth in _View.YearMonths)
 | 
						|
                UpdateCustomItems(yearMonth);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region UpdateCustomItems
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// UpdateCustomItems
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="yearMonth"></param>
 | 
						|
        private void UpdateCustomItems(YearMonth yearMonth)
 | 
						|
        {
 | 
						|
            CustomCalendarItemCollection items = _View.CalendarView.CustomItems;
 | 
						|
 | 
						|
            if (items != null && items.Count > 0)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < items.Count; i++)
 | 
						|
                {
 | 
						|
                    CustomCalendarItem item = items[i];
 | 
						|
 | 
						|
                    if (IsCustomItemVisible(item) == true &&
 | 
						|
                        (item.StartTime.Year == yearMonth.StartDate.Year && item.StartTime.Month == yearMonth.StartDate.Month))
 | 
						|
                    {
 | 
						|
                        yearMonth.AppBits.Set(item.StartTime.Day - 1, true);
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CustomItems_CollectionChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles CustomItemCollection change events
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        void CustomItemsCollectionChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            LoadData(_ViewState == _lineState);
 | 
						|
 | 
						|
            _View.NeedRecalcLayout = true;
 | 
						|
            _View.NeedRecalcSize = true;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetFirstAppointment
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// GetFirstAppointment
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        internal Appointment GetFirstAppointment(DateTime date)
 | 
						|
        {
 | 
						|
            Appointment app = null;
 | 
						|
            AppointmentSubsetCollection asc = _Model.GetDay(date).Appointments;
 | 
						|
 | 
						|
            if (asc.Count > 0)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < asc.Count; i++)
 | 
						|
                {
 | 
						|
                    if (IsAppointmentVisible(asc[i]) == true)
 | 
						|
                    {
 | 
						|
                        if (app == null || asc[i].StartTime < app.StartTime)
 | 
						|
                            app = asc[i];
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                return (app);
 | 
						|
            }
 | 
						|
 | 
						|
            return (null);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetFirstCustomItem
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// GetFirstCustomItem
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="date"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        internal CustomCalendarItem GetFirstCustomItem(DateTime date)
 | 
						|
        {
 | 
						|
            CustomCalendarItemCollection items = _View.CalendarView.CustomItems;
 | 
						|
 | 
						|
            if (items != null && items.Count > 0)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < items.Count; i++)
 | 
						|
                {
 | 
						|
                    CustomCalendarItem item = items[i];
 | 
						|
 | 
						|
                    if (IsCustomItemVisible(item) == true &&
 | 
						|
                        (item.StartTime.Date == date.Date))
 | 
						|
                    {
 | 
						|
                        return (item);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (null);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetView
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the Month view
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        public override eCalendarView GetView()
 | 
						|
        {
 | 
						|
            return (eCalendarView.Year);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ResetModelData
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// ResetModelData
 | 
						|
        /// </summary>
 | 
						|
        static internal void ResetModelData()
 | 
						|
        {
 | 
						|
            _lineStartTime = DateTime.MinValue;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ModelPropertyChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles Model property change notifications
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender"></param>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        private void ModelPropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.PropertyName == CalendarModel.AppointmentsPropertyName)
 | 
						|
            {
 | 
						|
                LoadData(_ViewState == _lineState);
 | 
						|
 | 
						|
                _View.NeedRecalcSize = true;
 | 
						|
                _View.Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ModelSubPropertyChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Handles ModelSubProperty change notifications
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="sender">object</param>
 | 
						|
        /// <param name="e">SubPropertyChangedEventArgs</param>
 | 
						|
        private void ModelSubPropertyChanged(object sender, SubPropertyChangedEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Source is Owner)
 | 
						|
            {
 | 
						|
                Owner owner = (Owner)e.Source;
 | 
						|
 | 
						|
                if (_View.OwnerKey != null && _View.OwnerKey.Equals(owner.Key))
 | 
						|
                {
 | 
						|
                    if (e.PropertyChangedArgs.PropertyName == Owner.DisplayNamePropertyName)
 | 
						|
                        _View.DisplayName = owner.DisplayName;
 | 
						|
 | 
						|
                    else if (e.PropertyChangedArgs.PropertyName.Equals("ColorScheme"))
 | 
						|
                        _View.CalendarColor = owner.ColorScheme;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (e.Source is Appointment)
 | 
						|
            {
 | 
						|
                Appointment app = e.Source as Appointment;
 | 
						|
 | 
						|
                string name = e.PropertyChangedArgs.PropertyName;
 | 
						|
 | 
						|
                if (name.Equals("OwnerKey"))
 | 
						|
                {
 | 
						|
                    if (_View.CalendarView.IsMultiCalendar == true)
 | 
						|
                    {
 | 
						|
                        if (_View.OwnerKey == app.OwnerKey)
 | 
						|
                        {
 | 
						|
                            LoadData(_ViewState == _lineState);
 | 
						|
 | 
						|
                            _View.NeedRecalcSize = true;
 | 
						|
                            _View.Refresh();
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (name.Equals("Visible"))
 | 
						|
                {
 | 
						|
                    LoadData(true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |