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
|
|
|