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