mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.0 KiB
70 lines
2.0 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
|
|
using System; |
|
using System.Collections.Generic; |
|
using System.Collections.ObjectModel; |
|
using System.Collections.Specialized; |
|
|
|
namespace ICSharpCode.AvalonEdit.Xml |
|
{ |
|
/// <summary> |
|
/// Two collections in sequence |
|
/// </summary> |
|
public class MergedCollection<T, TCollection> : ObservableCollection<T> where TCollection : INotifyCollectionChanged, IList<T> |
|
{ |
|
TCollection a; |
|
TCollection b; |
|
|
|
/// <summary> Create a wrapper containing elements of 'a' and then 'b' </summary> |
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")] |
|
public MergedCollection(TCollection a, TCollection b) |
|
{ |
|
this.a = a; |
|
this.b = b; |
|
|
|
this.a.CollectionChanged += SourceCollectionAChanged; |
|
this.b.CollectionChanged += SourceCollectionBChanged; |
|
|
|
Reset(); |
|
} |
|
|
|
void Reset() |
|
{ |
|
this.Clear(); |
|
foreach(T item in a) this.Add(item); |
|
foreach(T item in b) this.Add(item); |
|
} |
|
|
|
void SourceCollectionAChanged(object sender, NotifyCollectionChangedEventArgs e) |
|
{ |
|
SourceCollectionChanged(0, e); |
|
} |
|
|
|
void SourceCollectionBChanged(object sender, NotifyCollectionChangedEventArgs e) |
|
{ |
|
SourceCollectionChanged(a.Count, e); |
|
} |
|
|
|
void SourceCollectionChanged(int collectionStart, NotifyCollectionChangedEventArgs e) |
|
{ |
|
switch(e.Action) { |
|
case NotifyCollectionChangedAction.Add: |
|
for (int i = 0; i < e.NewItems.Count; i++) { |
|
this.InsertItem(collectionStart + e.NewStartingIndex + i, (T)e.NewItems[i]); |
|
} |
|
break; |
|
case NotifyCollectionChangedAction.Remove: |
|
for (int i = 0; i < e.OldItems.Count; i++) { |
|
this.RemoveAt(collectionStart + e.OldStartingIndex); |
|
} |
|
break; |
|
case NotifyCollectionChangedAction.Reset: |
|
Reset(); |
|
break; |
|
default: |
|
throw new NotSupportedException(e.Action.ToString()); |
|
} |
|
} |
|
} |
|
}
|
|
|