Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs @ 2618

Last change on this file since 2618 was 2618, checked in by swagner, 14 years ago

Worked on HeuristicLab.Collections (#819)

  • removed implementation of IDisposable
  • added read-only wrappers
File size: 5.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections;
24using System.Collections.Generic;
25using System.Collections.ObjectModel;
26using System.Linq;
27using System.Text;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29
30namespace HeuristicLab.Collections {
31  [Serializable]
32  public class ReadOnlyObservableList<T> : IObservableList<T> {
33    [Storable]
34    private IObservableList<T> list;
35
36    #region Properties
37    public int Count {
38      get { return ((ICollection<T>)list).Count; }
39    }
40    bool ICollection<T>.IsReadOnly {
41      get { return true; }
42    }
43
44    public T this[int index] {
45      get { return list[index]; }
46    }
47    T IList<T>.this[int index] {
48      get { return list[index]; }
49      set { throw new NotSupportedException(); }
50    }
51    #endregion
52
53    #region Constructors
54    public ReadOnlyObservableList(IObservableList<T> list) {
55      if (list == null) throw new ArgumentNullException();
56      this.list = list;
57      list.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_ItemsAdded);
58      list.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_ItemsRemoved);
59      list.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_ItemsReplaced);
60      list.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_ItemsMoved);
61      list.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(list_CollectionReset);
62    }
63    #endregion
64
65    #region Access
66    public bool Contains(T item) {
67      return list.Contains(item);
68    }
69
70    public int IndexOf(T item) {
71      return list.IndexOf(item);
72    }
73    #endregion
74
75    #region Manipulation
76    void ICollection<T>.Add(T item) {
77      throw new NotSupportedException();
78    }
79
80    void IList<T>.Insert(int index, T item) {
81      throw new NotSupportedException();
82    }
83
84    bool ICollection<T>.Remove(T item) {
85      throw new NotSupportedException();
86    }
87    void IList<T>.RemoveAt(int index) {
88      throw new NotSupportedException();
89    }
90
91    void ICollection<T>.Clear() {
92      throw new NotSupportedException();
93    }
94    #endregion
95
96    #region Conversion
97    void ICollection<T>.CopyTo(T[] array, int arrayIndex) {
98      list.CopyTo(array, arrayIndex);
99    }
100    #endregion
101
102    #region Enumeration
103    public IEnumerator<T> GetEnumerator() {
104      return ((ICollection<T>)list).GetEnumerator();
105    }
106    IEnumerator IEnumerable.GetEnumerator() {
107      return ((IEnumerable)list).GetEnumerator();
108    }
109    #endregion
110
111    #region Events
112    [field: NonSerialized]
113    public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsAdded;
114    protected virtual void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
115      if (ItemsAdded != null)
116        ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
117    }
118
119    [field: NonSerialized]
120    public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
121    protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
122      if (ItemsRemoved != null)
123        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
124    }
125
126    [field: NonSerialized]
127    public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
128    protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
129      if (ItemsReplaced != null)
130        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
131    }
132
133    [field: NonSerialized]
134    public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
135    protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
136      if (ItemsMoved != null)
137        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
138    }
139
140    [field: NonSerialized]
141    public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
142    protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
143      if (CollectionReset != null)
144        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
145    }
146
147    private void list_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
148      OnItemsAdded(e.Items);
149    }
150    private void list_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
151      OnItemsRemoved(e.Items);
152    }
153    private void list_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
154      OnItemsReplaced(e.Items, e.OldItems);
155    }
156    private void list_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
157      OnItemsMoved(e.Items, e.OldItems);
158    }
159    private void list_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
160      OnCollectionReset(e.Items, e.OldItems);
161    }
162    #endregion
163  }
164}
Note: See TracBrowser for help on using the repository browser.