using System;
using System.Collections.ObjectModel;
using System.Drawing;
using DevComponents.Schedule.Model;
namespace DevComponents.DotNetBar.Schedule
{
///
/// ViewDisplayCustomizations
///
public class ViewDisplayCustomizations
{
#region Events
///
/// Occurs when the ViewDisplayCustomizations have changed
///
public event EventHandler CollectionChanged;
#endregion
#region Private variables
private CalendarView _CalendarView;
private DaySlotBackgrounds _DaySlotBackgrounds;
#endregion
///
/// ViewDisplayCustomizations
///
///
public ViewDisplayCustomizations(CalendarView calendarView)
{
_CalendarView = calendarView;
}
#region Public properties
///
/// DaySlotBackgrounds
///
public DaySlotBackgrounds DaySlotBackgrounds
{
get
{
if (_DaySlotBackgrounds == null)
{
_DaySlotBackgrounds = new DaySlotBackgrounds();
_DaySlotBackgrounds.CollectionChanged += _DaySlotBackgrounds_CollectionChanged;
}
return (_DaySlotBackgrounds);
}
set
{
if (_DaySlotBackgrounds != null)
_DaySlotBackgrounds.CollectionChanged -= _DaySlotBackgrounds_CollectionChanged;
_DaySlotBackgrounds = value;
if (_DaySlotBackgrounds != null)
_DaySlotBackgrounds.CollectionChanged += _DaySlotBackgrounds_CollectionChanged;
}
}
#endregion
#region Event handling
///
/// Handles DaySlotBackgrounds CollectionChanged events
///
///
///
void _DaySlotBackgrounds_CollectionChanged(object sender, EventArgs e)
{
_CalendarView.Refresh();
if (CollectionChanged != null)
CollectionChanged(this, EventArgs.Empty);
}
#endregion
#region GetDaySlotAppearance
///
/// Retrieves the DaySlotAppearance from the given criteris
///
///
///
///
///
///
internal DaySlotAppearance GetDaySlotAppearance(
string ownerKey, DateTime dateTime, WorkTime wkStart, WorkTime wkEnd)
{
foreach (DaySlotBackground dsb in DaySlotBackgrounds)
{
if (IsValidSlot(dsb, dateTime, wkStart, wkEnd) == true)
{
if (IsValidOwner(dsb, ownerKey) == true)
return (dsb.Appearance);
}
}
return (null);
}
#endregion
#region IsValidSlot
///
/// Determines if the given slot is a valid
/// day and time slot
///
///
///
///
///
///
private bool IsValidSlot(DaySlotBackground dsb,
DateTime dateTime, WorkTime wkStart, WorkTime wkEnd)
{
if (IsValidDaySlot(dsb, dateTime) == true)
return (IsValidTimeSlot(dsb, wkStart, wkEnd));
return (false);
}
#endregion
#region IsValidTimeSlot
///
/// Determines if the given slot is a valid time slot
///
///
///
///
///
private bool IsValidTimeSlot(DaySlotBackground dsb, WorkTime wkStart, WorkTime wkEnd)
{
return (wkStart < dsb.Appearance.EndTime && wkEnd > dsb.Appearance.StartTime);
}
#endregion
#region IsValidDaySlot
///
/// Determines if the given slot is a valid time slot
///
///
///
///
private bool IsValidDaySlot(DaySlotBackground dsb, DateTime dateTime)
{
if (dsb.DateTime == DateTime.MinValue)
return (dsb.DayOfWeek == dateTime.DayOfWeek);
return (dsb.DateTime.Date == dateTime.Date);
}
#endregion
#region IsValidOwner
///
/// Determines if the given owner key is valid for the slot
///
///
///
///
private bool IsValidOwner(DaySlotBackground dsb, string ownerKey)
{
if (dsb.HasOwnerKeys == true)
{
if (dsb.OwnerKeys.Contains("") == true)
return (true);
if (dsb.OwnerKeys.Contains(ownerKey) == false)
return (false);
}
return (true);
}
#endregion
}
///
/// DaySlotBackgrounds
///
public class DaySlotBackgrounds : Collection
{
#region Events
///
/// Occurs when the DaySlotBackgrounds collection changes
///
public event EventHandler CollectionChanged;
#endregion
#region Private variables
private bool _IsRangeSet;
private bool _SuspendUpdate;
#endregion
#region Internal properties
///
/// Gets and sets the SuspendUpdate state
///
internal bool SuspendUpdate
{
get { return (_SuspendUpdate); }
set { _SuspendUpdate = value; }
}
#endregion
#region Remove
///
/// Removes the DaySlotBackground for the given DateTime
///
///
public void Remove(DateTime dateTime)
{
int n = Items.Count;
try
{
SuspendUpdate = true;
for (int i = Items.Count - 1; i >= 0; i--)
{
DaySlotBackground dsb = Items[i];
if (dsb.DateTime.Equals(dateTime) == true)
RemoveAt(i);
}
}
finally
{
SuspendUpdate = false;
if (Items.Count != n)
OnCollectionChanged();
}
}
///
/// Removes the DaySlotBackground for the given DayOfWeek
///
///
public void Remove(DayOfWeek dayOfWeek)
{
int n = Items.Count;
try
{
SuspendUpdate = true;
for (int i = Items.Count - 1; i >= 0; i--)
{
DaySlotBackground dsb = Items[i];
if (dsb.DateTime.Equals(DateTime.MinValue) == true)
{
if (dsb.DayOfWeek == dayOfWeek)
RemoveAt(i);
}
}
}
finally
{
SuspendUpdate = false;
if (Items.Count != n)
OnCollectionChanged();
}
}
#endregion
#region AddRange
///
/// Adds a range of DaySlotBackgrounds
///
///
public void AddRange(DaySlotBackgrounds daySlotBackgrounds)
{
try
{
_IsRangeSet = true;
foreach (DaySlotBackground dsb in daySlotBackgrounds)
Add(dsb);
}
finally
{
_IsRangeSet = false;
OnCollectionChanged();
}
}
#endregion
#region RemoveItem
///
/// Processes list RemoveItem calls
///
/// Index to remove
protected override void RemoveItem(int index)
{
base.RemoveItem(index);
OnCollectionChanged();
}
#endregion
#region InsertItem
///
/// Processes list InsertItem calls
///
/// Index to add
/// Text to add
protected override void InsertItem(int index, DaySlotBackground item)
{
if (item != null)
{
base.InsertItem(index, item);
item.DaySlotBackgrounds = this;
OnCollectionChanged();
}
}
#endregion
#region SetItem
///
/// Processes list SetItem calls (e.g. replace)
///
/// Index to replace
/// Text to replace
protected override void SetItem(int index, DaySlotBackground newItem)
{
base.SetItem(index, newItem);
newItem.DaySlotBackgrounds = this;
OnCollectionChanged();
}
#endregion
#region ClearItems
///
/// Processes list Clear calls (e.g. remove all)
///
protected override void ClearItems()
{
if (Count > 0)
{
base.ClearItems();
OnCollectionChanged();
}
}
#endregion
#region OnCollectionChanged
///
/// Handles collection change notification
///
private void OnCollectionChanged()
{
if (_SuspendUpdate == false && _IsRangeSet == false)
{
if (CollectionChanged != null)
CollectionChanged(this, EventArgs.Empty);
}
}
#endregion
}
///
/// DaySlotBackground
///
public class DaySlotBackground
{
#region Events
///
/// Occurs when the DaySlotBackground collection changes
///
public event EventHandler CollectionChanged;
#endregion
#region Private variables
private DayOfWeek _DayOfWeek;
private DateTime _DateTime = DateTime.MinValue;
private DaySlotAppearance _Appearance;
private DaySlotBackgrounds _DaySlotBackgrounds;
private OwnerKeyCollection _OwnerKeys;
#endregion
#region Constructors
public DaySlotBackground(DateTime dateTime, DaySlotAppearance appearance)
{
_DateTime = dateTime;
_Appearance = appearance;
}
public DaySlotBackground(DayOfWeek dayOfWeek, DaySlotAppearance appearance)
{
_DayOfWeek = dayOfWeek;
_DateTime = DateTime.MinValue;
_Appearance = appearance;
}
#endregion
#region Public properties
#region Appearance
///
/// Gets or sets the Appearance
///
public DaySlotAppearance Appearance
{
get { return (_Appearance); }
set
{
_Appearance = value;
OnCollectionChanged();
}
}
#endregion
#region DateTime
///
/// Gets or sets the DateTime
///
public DateTime DateTime
{
get { return (_DateTime); }
set
{
if (_DateTime != value)
{
_DateTime = value;
OnCollectionChanged();
}
}
}
#endregion
#region DayOfWeek
///
/// Gets or sets the DayOfWeek
///
public DayOfWeek DayOfWeek
{
get { return (_DayOfWeek); }
set
{
if (_DayOfWeek != value)
{
_DayOfWeek = value;
OnCollectionChanged();
}
}
}
#endregion
#region OwnerKeys
///
/// Gets or sets the OwnerKeyCollection
///
public OwnerKeyCollection OwnerKeys
{
get
{
if (_OwnerKeys == null)
{
_OwnerKeys = new OwnerKeyCollection();
_OwnerKeys.CollectionChanged += OwnerKeys_CollectionChanged;
}
return (_OwnerKeys);
}
set
{
if (_OwnerKeys != null)
_OwnerKeys.CollectionChanged -= OwnerKeys_CollectionChanged;
_OwnerKeys = value;
if (_OwnerKeys != null)
_OwnerKeys.CollectionChanged += OwnerKeys_CollectionChanged;
}
}
#endregion
#endregion
#region Internal properties
#region DaySlotBackgrounds
///
/// Gets or sets the DaySlotBackgrounds
///
internal DaySlotBackgrounds DaySlotBackgrounds
{
get { return (_DaySlotBackgrounds); }
set
{
_DaySlotBackgrounds = value;
OnCollectionChanged();
}
}
#endregion
#region HasOwnerKeys
///
/// HasOwnerKeys
///
internal bool HasOwnerKeys
{
get { return (_OwnerKeys != null && _OwnerKeys.Count > 0); }
}
#endregion
#endregion
#region Event processing
///
/// Processes OwnerKeys_CollectionChanged events
///
///
///
private void OwnerKeys_CollectionChanged(object sender, EventArgs e)
{
OnCollectionChanged();
}
#endregion
#region OnCollectionChanged
///
/// Handles collection change notification
///
private void OnCollectionChanged()
{
if (CollectionChanged != null)
CollectionChanged(this, EventArgs.Empty);
}
#endregion
}
///
/// DaySlotAppearance
///
public class DaySlotAppearance
{
#region Private variables
private WorkTime _StartTime;
private WorkTime _EndTime;
private Color _BackColor;
private Color _HourBorderColor;
private Color _HalfHourBorderColor;
private string _Text;
private ContentAlignment _TextAlignment;
private Color _TextColor;
private Color _SelectedTextColor;
private Font _Font;
private bool _OnTop;
private bool _ShowTextWhenSelected = true;
#endregion
#region Constructors
public DaySlotAppearance(WorkTime startTime, WorkTime endTime,
Color backColor, Color hourBorderColor, Color halfHourBorderColor)
{
_StartTime = startTime;
_EndTime = endTime;
_BackColor = backColor;
_HourBorderColor = hourBorderColor;
_HalfHourBorderColor = halfHourBorderColor;
}
public DaySlotAppearance(int startHour, int startMinute,
int endHour, int endMinute, Color backColor, Color hourBorderColor, Color halfHourBorderColor)
: this(new WorkTime(startHour, startMinute), new WorkTime(endHour, endMinute), backColor, hourBorderColor, halfHourBorderColor)
{
}
#endregion
#region Public properties
#region BackColor
///
/// Gets or sets the BackColor
///
public Color BackColor
{
get { return (_BackColor); }
set { _BackColor = value; }
}
#endregion
#region EndTime
///
/// Gets or sets the Appearance end time
///
public WorkTime EndTime
{
get { return (_EndTime); }
set { _EndTime = value; }
}
#endregion
#region Font
///
/// Gets or sets the DaySlot Font
///
public Font Font
{
get { return (_Font); }
set { _Font = value; }
}
#endregion
#region HalfHourBorderColor
///
/// Gets or sets the HalfHourBorderColor
///
public Color HalfHourBorderColor
{
get { return (_HalfHourBorderColor); }
set { _HalfHourBorderColor = value; }
}
#endregion
#region HourBorderColor
///
/// Gets or sets the HourBorderColor
///
public Color HourBorderColor
{
get { return (_HourBorderColor); }
set { _HourBorderColor = value; }
}
#endregion
#region OnTop
///
/// Gets or sets whether the Text is on top of the borders
///
public bool OnTop
{
get { return (_OnTop); }
set { _OnTop = value; }
}
#endregion
#region StartTime
///
/// Gets or sets the Appearance start time
///
public WorkTime StartTime
{
get { return (_StartTime); }
set { _StartTime = value; }
}
#endregion
#region Text
///
/// Gets or sets the Text
///
public string Text
{
get { return (_Text); }
set { _Text = value; }
}
#endregion
#region TextAlignment
///
/// Gets or sets the Text Alignment
///
public ContentAlignment TextAlignment
{
get { return (_TextAlignment); }
set { _TextAlignment = value; }
}
#endregion
#region TextColor
///
/// Gets or sets the Text Color
///
public Color TextColor
{
get { return (_TextColor); }
set { _TextColor = value; }
}
#endregion
#region SelectedTextColor
///
/// Gets or sets the Selected Text Color
///
public Color SelectedTextColor
{
get { return (_SelectedTextColor); }
set { _SelectedTextColor = value; }
}
#endregion
#region ShowTextWhenSelected
///
/// Gets or sets wheter the Text is displayed when cells are selected
///
public bool ShowTextWhenSelected
{
get { return (_ShowTextWhenSelected); }
set { _ShowTextWhenSelected = value; }
}
#endregion
#endregion
}
///
/// OwnerKeyCollection
///
public class OwnerKeyCollection : Collection
{
#region Events
///
/// Occurs when the OwnerKeyCollection changes
///
public event EventHandler CollectionChanged;
#endregion
#region RemoveItem
///
/// Processes list RemoveItem calls
///
/// Index to remove
protected override void RemoveItem(int index)
{
base.RemoveItem(index);
OnCollectionChanged();
}
#endregion
#region InsertItem
///
/// Processes list InsertItem calls
///
/// Index to add
/// Text to add
protected override void InsertItem(int index, string item)
{
if (item != null)
{
base.InsertItem(index, item);
OnCollectionChanged();
}
}
#endregion
#region SetItem
///
/// Processes list SetItem calls (e.g. replace)
///
/// Index to replace
/// Text to replace
protected override void SetItem(int index, string newItem)
{
base.SetItem(index, newItem);
OnCollectionChanged();
}
#endregion
#region ClearItems
///
/// Processes list Clear calls (e.g. remove all)
///
protected override void ClearItems()
{
if (Count > 0)
{
base.ClearItems();
OnCollectionChanged();
}
}
#endregion
#region OnCollectionChanged
///
/// Handles collection change notification
///
private void OnCollectionChanged()
{
if (CollectionChanged != null)
CollectionChanged(this, EventArgs.Empty);
}
#endregion
}
}