289 lines
7.4 KiB
C#
289 lines
7.4 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
|
|
namespace DevComponents.DotNetBar.Schedule
|
|
{
|
|
public class CustomCalendarItemCollection : Collection<CustomCalendarItem>, IDisposable
|
|
{
|
|
#region Events
|
|
|
|
/// <summary>
|
|
/// Occurs when the collection has changed
|
|
/// </summary>
|
|
[Description("Occurs when the collection has changed.")]
|
|
public event EventHandler<EventArgs> CollectionChanged;
|
|
|
|
#endregion
|
|
|
|
#region Private variables
|
|
|
|
private int _UpdateCount;
|
|
|
|
#endregion
|
|
|
|
#region AddRange
|
|
|
|
/// <summary>
|
|
/// Adds a range of CustomCalendarItems to the collection
|
|
/// </summary>
|
|
/// <param name="items">Array of items to add</param>
|
|
public void AddRange(CustomCalendarItem[] items)
|
|
{
|
|
for (int i = 0; i < items.Length; i++)
|
|
Add(items[i]);
|
|
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Remove
|
|
|
|
/// <summary>
|
|
/// Removes a CustomCalendarItem from
|
|
/// the collection.
|
|
/// </summary>
|
|
/// <param name="item">Item to remove</param>
|
|
public new void Remove(CustomCalendarItem item)
|
|
{
|
|
if (item.BaseCalendarItem != null)
|
|
item = item.BaseCalendarItem;
|
|
|
|
base.Remove(item);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region RemoveItem
|
|
|
|
/// <summary>
|
|
/// Processes list RemoveItem calls
|
|
/// </summary>
|
|
/// <param name="index">Index to remove</param>
|
|
protected override void RemoveItem(int index)
|
|
{
|
|
HookItem(Items[index], false);
|
|
|
|
base.RemoveItem(index);
|
|
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region InsertItem
|
|
|
|
/// <summary>
|
|
/// Processes list InsertItem calls
|
|
/// </summary>
|
|
/// <param name="index">Index to add</param>
|
|
/// <param name="item">CustomCalendarItem to add</param>
|
|
protected override void InsertItem(int index, CustomCalendarItem item)
|
|
{
|
|
if (item != null)
|
|
{
|
|
HookItem(item, true);
|
|
|
|
base.InsertItem(index, item);
|
|
|
|
OnCollectionChanged();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SetItem
|
|
|
|
/// <summary>
|
|
/// Processes list SetItem calls (e.g. replace)
|
|
/// </summary>
|
|
/// <param name="index">Index to replace</param>
|
|
/// <param name="newItem">CustomCalendarItem to replace</param>
|
|
protected override void SetItem(int index, CustomCalendarItem newItem)
|
|
{
|
|
if (newItem != null)
|
|
{
|
|
HookItem(Items[index], false);
|
|
HookItem(newItem, true);
|
|
|
|
base.SetItem(index, newItem);
|
|
|
|
OnCollectionChanged();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ClearItems
|
|
|
|
/// <summary>
|
|
/// Processes list Clear calls (e.g. remove all)
|
|
/// </summary>
|
|
protected override void ClearItems()
|
|
{
|
|
for (int i = 0; i < Count; i++)
|
|
HookItem(Items[i], false);
|
|
|
|
base.ClearItems();
|
|
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region HookItem
|
|
|
|
/// <summary>
|
|
/// Hooks needed system events
|
|
/// </summary>
|
|
/// <param name="item"></param>
|
|
/// <param name="hook"></param>
|
|
private void HookItem(CustomCalendarItem item, bool hook)
|
|
{
|
|
if (hook == true)
|
|
{
|
|
item.StartTimeChanged += ItemStartTimeChanged;
|
|
item.EndTimeChanged += ItemEndTimeChanged;
|
|
item.OwnerKeyChanged += ItemOwnerKeyChanged;
|
|
item.CategoryColorChanged += ItemCategoryColorChanged;
|
|
item.VisibleChanged += ItemVisibleChanged;
|
|
item.CollateIdChanged += ItemCollateIdChanged;
|
|
}
|
|
else
|
|
{
|
|
item.StartTimeChanged -= ItemStartTimeChanged;
|
|
item.EndTimeChanged -= ItemEndTimeChanged;
|
|
item.OwnerKeyChanged -= ItemOwnerKeyChanged;
|
|
item.CategoryColorChanged -= ItemCategoryColorChanged;
|
|
item.VisibleChanged -= ItemVisibleChanged;
|
|
item.CollateIdChanged -= ItemCollateIdChanged;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Event processing
|
|
|
|
/// <summary>
|
|
/// Processes OwnerKeyChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ItemOwnerKeyChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes StartTimeChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ItemStartTimeChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes EndTimeChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void ItemEndTimeChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes ItemCategoryColorChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void ItemCategoryColorChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes ItemVisibleChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void ItemVisibleChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes ItemCollateIdChanged events
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
void ItemCollateIdChanged(object sender, EventArgs e)
|
|
{
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region OnCollectionChanged
|
|
|
|
/// <summary>
|
|
/// Propagates CollectionChanged events
|
|
/// </summary>
|
|
protected virtual void OnCollectionChanged()
|
|
{
|
|
if (_UpdateCount == 0)
|
|
{
|
|
if (CollectionChanged != null)
|
|
CollectionChanged(this, EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Begin/EndUpdate
|
|
|
|
/// <summary>
|
|
/// Begins Update block
|
|
/// </summary>
|
|
public void BeginUpdate()
|
|
{
|
|
_UpdateCount++;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ends update block
|
|
/// </summary>
|
|
public void EndUpdate()
|
|
{
|
|
if (_UpdateCount == 0)
|
|
{
|
|
throw new InvalidOperationException(
|
|
"EndUpdate must be called After BeginUpdate");
|
|
}
|
|
|
|
_UpdateCount--;
|
|
|
|
if (_UpdateCount == 0)
|
|
OnCollectionChanged();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IDisposable
|
|
|
|
public void Dispose()
|
|
{
|
|
for (int i = 0; i < Count; i++)
|
|
HookItem(Items[i], false);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|
|
#endif
|
|
|