168 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.ObjectModel;
 | 
						|
 | 
						|
namespace DevComponents.Instrumentation.Primitives
 | 
						|
{
 | 
						|
    public class BaseCollection<T> : Collection<T> where T : class, ICloneable, new()
 | 
						|
    {
 | 
						|
        #region Events
 | 
						|
 | 
						|
        public event EventHandler<EventArgs> CollectionChanged;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private bool _IsRangeSet;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region AddRange
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Adds a range of items to the collection
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="items">Array of items to add</param>
 | 
						|
        public void AddRange(T[] items)
 | 
						|
        {
 | 
						|
            try
 | 
						|
            {
 | 
						|
                _IsRangeSet = true;
 | 
						|
 | 
						|
                for (int i = 0; i < items.Length; i++)
 | 
						|
                    Add(items[i]);
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                _IsRangeSet = false;
 | 
						|
 | 
						|
                OnCollectionChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RemoveItem
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Processes list RemoveItem calls
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="index">Index to remove</param>
 | 
						|
        protected override void RemoveItem(int index)
 | 
						|
        {
 | 
						|
            base.RemoveItem(index);
 | 
						|
 | 
						|
            OnCollectionChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region InsertItem
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Processes list InsertItem calls
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="index">Index to add</param>
 | 
						|
        /// <param name="item">Text to add</param>
 | 
						|
        protected override void InsertItem(int index, T item)
 | 
						|
        {
 | 
						|
            if (item != null)
 | 
						|
            {
 | 
						|
                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">Text to replace</param>
 | 
						|
        protected override void SetItem(int index, T newItem)
 | 
						|
        {
 | 
						|
            base.SetItem(index, newItem);
 | 
						|
 | 
						|
            OnCollectionChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ClearItems
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Processes list Clear calls (e.g. remove all)
 | 
						|
        /// </summary>
 | 
						|
        protected override void ClearItems()
 | 
						|
        {
 | 
						|
            if (Count > 0)
 | 
						|
                base.ClearItems();
 | 
						|
 | 
						|
            OnCollectionChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnCollectionChanged
 | 
						|
 | 
						|
        private void OnCollectionChanged()
 | 
						|
        {
 | 
						|
            if (CollectionChanged != null)
 | 
						|
            {
 | 
						|
                if (_IsRangeSet == false)
 | 
						|
                    CollectionChanged(this, EventArgs.Empty);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ICloneable Members
 | 
						|
 | 
						|
        public virtual object Clone()
 | 
						|
        {
 | 
						|
            BaseCollection<T> copy = new BaseCollection<T>();
 | 
						|
 | 
						|
            CopyToItem(copy);
 | 
						|
 | 
						|
            return (copy);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CopyToItem
 | 
						|
 | 
						|
        internal void CopyToItem(BaseCollection<T> copy)
 | 
						|
        {
 | 
						|
            foreach (T item in this)
 | 
						|
                copy.Add((T)item.Clone());
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    public class GenericCollection<T> : BaseCollection<T> where T : GaugeItem, new()
 | 
						|
    {
 | 
						|
        #region Name indexer
 | 
						|
 | 
						|
        public T this[string name]
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                foreach (T item in Items)
 | 
						|
                {
 | 
						|
                    if (item.Name != null && item.Name.Equals(name))
 | 
						|
                        return (item);
 | 
						|
                }
 | 
						|
 | 
						|
                return (null);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |