92 lines
2.8 KiB
C#
92 lines
2.8 KiB
C#
using JD.Collections;
|
|
using JD.Collections.Extensions;
|
|
using JD.Collections.Interfaces;
|
|
using JD.Kernel.StaticHelpers;
|
|
using JD.Sequencers.Windowlesses;
|
|
|
|
namespace JD.Sequencers.Times
|
|
{
|
|
public class AttachedControlCollection<TControl> : ObservableList<TControl>
|
|
where TControl : WindowlessControl
|
|
{
|
|
#region Variables
|
|
|
|
private readonly IObservableList<WindowlessControl> m_originalCollection;
|
|
|
|
#endregion
|
|
|
|
#region Constructor
|
|
|
|
public AttachedControlCollection(IObservableList<WindowlessControl> originalCollection)
|
|
{
|
|
Throw.IfNull(originalCollection, "originalCollection");
|
|
Throw.InvalidArgumentIf(originalCollection.IsReadOnly, "Original collection is readonly", "originalCollection");
|
|
m_originalCollection = originalCollection;
|
|
m_originalCollection.CollectionChanged += m_originalCollection_CollectionChanged;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
protected override void OnCollectionChanged(CollectionChangedEventArgs<TControl> e)
|
|
{
|
|
base.OnCollectionChanged(e);
|
|
|
|
switch (e.Action)
|
|
{
|
|
case CollectionChangeAction.ItemAdded:
|
|
if (!m_originalCollection.Contains(e.Item))
|
|
{
|
|
m_originalCollection.Add(e.Item);
|
|
}
|
|
break;
|
|
|
|
case CollectionChangeAction.ItemRemoved:
|
|
m_originalCollection.Remove(e.Item);
|
|
break;
|
|
|
|
case CollectionChangeAction.Cleared:
|
|
m_originalCollection.RemoveAll(IsTControl);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static bool IsTControl(WindowlessControl control)
|
|
{
|
|
return control is TControl;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Event Handlers
|
|
|
|
void m_originalCollection_CollectionChanged(object sender, CollectionChangedEventArgs<WindowlessControl> e)
|
|
{
|
|
switch (e.Action)
|
|
{
|
|
case CollectionChangeAction.ItemAdded:
|
|
TControl addedControl = e.Item as TControl;
|
|
if (addedControl != null && !Contains(addedControl))
|
|
{
|
|
Add(addedControl);
|
|
}
|
|
break;
|
|
|
|
case CollectionChangeAction.ItemRemoved:
|
|
TControl removedControl = e.Item as TControl;
|
|
if (removedControl != null)
|
|
{
|
|
Remove(removedControl);
|
|
}
|
|
break;
|
|
|
|
case CollectionChangeAction.Cleared:
|
|
Clear();
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|