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