using System.Collections.Generic; using System.Collections.ObjectModel; namespace JD.TeaBoxAddinSystem.Addins.Description { /// /// A keyed collection of s. /// internal abstract class AddinObjectKeyedCollection : KeyedCollection where V : AddinObject { #region Variables private Module m_owner; #endregion #region Constructor /// /// Constructor. /// internal AddinObjectKeyedCollection() : this(null, null) { } /// /// Constructor. /// /// internal AddinObjectKeyedCollection(Module owner) : this(owner, null) { } /// /// Constructor. /// /// /// internal AddinObjectKeyedCollection(Module owner, IEqualityComparer keyComparer) : base(keyComparer) { m_owner = owner; } #endregion #region Properties internal Module Owner { get { return m_owner; } set { if (m_owner != value) { m_owner = value; foreach (V item in this) { item.Module = m_owner; } } } } #endregion #region Methods /// /// Overriden. /// /// /// protected override void InsertItem(int index, V item) { ThrowIfLoaded(); base.InsertItem(index, item); item.Module = m_owner; } /// /// Overriden. /// /// protected override void RemoveItem(int index) { ThrowIfLoaded(); this[index].Module = null; base.RemoveItem(index); } /// /// Overriden. /// /// /// protected override void SetItem(int index, V item) { ThrowIfLoaded(); this[index].Module = null; base.SetItem(index, item); item.Module = m_owner; } /// /// Overriden. /// protected override void ClearItems() { ThrowIfLoaded(); foreach (V item in this) { item.Module = null; } base.ClearItems(); } private void ThrowIfLoaded() { if (Owner != null) { Owner.ThrowIfLoaded(); } } #endregion } }