source: trunk/CrypPlugins/WorkspaceManager/View/VisualComponents/ObservableDictionary.cs @ 2388

Last change on this file since 2388 was 2280, checked in by matkovic, 11 years ago

-fixed "Fit to Screen"
-fixed Scrollbars
-fixed Dragging
-added custom names
-New: IControl- Presentation
--Loading adjusted
-New: Multi selection
-New: Copy /Past (not complete)
-New: Multi Dragging
-New: PluginContainerView Highlighting added

File size: 7.6 KB
Line 
1using System;
2using System.Linq;
3using System.ComponentModel;
4using System.Collections.Generic;
5using System.Collections.Specialized;
6
7namespace System.Collections.ObjectModel
8{
9    class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, INotifyCollectionChanged, INotifyPropertyChanged
10    {
11        private const string CountString = "Count";
12        private const string IndexerName = "Item[]";
13        private IDictionary<TKey, TValue> _Dictionary;
14        protected IDictionary<TKey, TValue> Dictionary
15        {
16            get { return _Dictionary; }
17        }
18
19        #region Constructors
20        public ObservableDictionary()
21        {
22            _Dictionary = new Dictionary<TKey, TValue>();
23        }
24        public ObservableDictionary(IDictionary<TKey, TValue> dictionary)
25        {
26            _Dictionary = new Dictionary<TKey, TValue>(dictionary);
27        }
28        public ObservableDictionary(IEqualityComparer<TKey> comparer)
29        {
30            _Dictionary = new Dictionary<TKey, TValue>(comparer);
31        }
32        public ObservableDictionary(int capacity)
33        {
34            _Dictionary = new Dictionary<TKey, TValue>(capacity);
35        }
36        public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)
37        {
38            _Dictionary = new Dictionary<TKey, TValue>(dictionary, comparer);
39        }
40        public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer)
41        {
42            _Dictionary = new Dictionary<TKey, TValue>(capacity, comparer);
43        }
44        #endregion
45
46        #region IDictionary<TKey,TValue> Members
47
48        public void Add(TKey key, TValue value)
49        {
50            Insert(key, value, true);
51        }
52
53        public bool ContainsKey(TKey key)
54        {
55            return Dictionary.ContainsKey(key);
56        }
57
58        public ICollection<TKey> Keys
59        {
60            get { return Dictionary.Keys; }
61        }
62
63        public bool Remove(TKey key)
64        {
65            if (key == null) throw new ArgumentNullException("key");
66
67            TValue value;
68            Dictionary.TryGetValue(key, out value);
69            var removed = Dictionary.Remove(key);
70            if (removed) OnCollectionChanged(NotifyCollectionChangedAction.Remove, new KeyValuePair<TKey, TValue>(key, value));
71            return removed;
72        }
73
74        public bool TryGetValue(TKey key, out TValue value)
75        {
76            return Dictionary.TryGetValue(key, out value);
77        }
78
79        public ICollection<TValue> Values
80        {
81            get { return Dictionary.Values; }
82        }
83
84        public TValue this[TKey key]
85        {
86            get
87            {
88                return Dictionary[key];
89            }
90            set
91            {
92                Insert(key, value, false);
93            }
94        }
95
96        #endregion
97
98        #region ICollection<KeyValuePair<TKey,TValue>> Members
99
100        public void Add(KeyValuePair<TKey, TValue> item)
101        {
102            Insert(item.Key, item.Value, true);
103        }
104
105        public void Clear()
106        {
107            if (Dictionary.Count > 0)
108            {
109                Dictionary.Clear();
110                OnCollectionChanged();
111            }
112        }
113
114        public bool Contains(KeyValuePair<TKey, TValue> item)
115        {
116            return Dictionary.Contains(item);
117        }
118
119        public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
120        {
121            Dictionary.CopyTo(array, arrayIndex);
122        }
123
124        public int Count
125        {
126            get { return Dictionary.Count; }
127        }
128
129        public bool IsReadOnly
130        {
131            get { return Dictionary.IsReadOnly; }
132        }
133
134        public bool Remove(KeyValuePair<TKey, TValue> item)
135        {
136            return Remove(item.Key);
137        }
138
139
140        #endregion
141
142        #region IEnumerable<KeyValuePair<TKey,TValue>> Members
143
144        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
145        {
146            return Dictionary.GetEnumerator();
147        }
148
149        #endregion
150
151        #region IEnumerable Members
152
153        IEnumerator IEnumerable.GetEnumerator()
154        {
155            return ((IEnumerable)Dictionary).GetEnumerator();
156        }
157
158        #endregion
159
160        #region INotifyCollectionChanged Members
161
162        public event NotifyCollectionChangedEventHandler CollectionChanged;
163
164        #endregion
165
166        #region INotifyPropertyChanged Members
167
168        public event PropertyChangedEventHandler PropertyChanged;
169
170        #endregion
171
172        public void AddRange(IDictionary<TKey, TValue> items)
173        {
174            if (items == null) throw new ArgumentNullException("items");
175
176            if (items.Count > 0)
177            {
178                if (Dictionary.Count > 0)
179                {
180                    if (items.Keys.Any((k) => Dictionary.ContainsKey(k)))
181                        throw new ArgumentException("An item with the same key has already been added.");
182                    else
183                        foreach (var item in items) Dictionary.Add(item);
184                }
185                else
186                    _Dictionary = new Dictionary<TKey, TValue>(items);
187
188                OnCollectionChanged(NotifyCollectionChangedAction.Add, items.ToArray());
189            }
190        }
191
192        private void Insert(TKey key, TValue value, bool add)
193        {
194            if (key == null) throw new ArgumentNullException("key");
195
196            TValue item;
197            if (Dictionary.TryGetValue(key, out item))
198            {
199                if (add) throw new ArgumentException("An item with the same key has already been added.");
200                if (Equals(item, value)) return;
201                OnCollectionChanged(NotifyCollectionChangedAction.Replace, new KeyValuePair<TKey, TValue>(key, value), new KeyValuePair<TKey, TValue>(key, item));
202            }
203            else
204                OnCollectionChanged(NotifyCollectionChangedAction.Add, new KeyValuePair<TKey, TValue>(key, value));
205
206            Dictionary[key] = value;
207        }
208
209        private void OnPropertyChanged()
210        {
211            OnPropertyChanged(CountString);
212            OnPropertyChanged(IndexerName);
213        }
214
215        protected virtual void OnPropertyChanged(string propertyName)
216        {
217            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
218        }
219
220        private void OnCollectionChanged()
221        {
222            OnPropertyChanged();
223            if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
224        }
225
226        private void OnCollectionChanged(NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> changedItem)
227        {
228            OnPropertyChanged();
229            if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, changedItem));
230        }
231
232        private void OnCollectionChanged(NotifyCollectionChangedAction action, KeyValuePair<TKey, TValue> newItem, KeyValuePair<TKey, TValue> oldItem)
233        {
234            OnPropertyChanged();
235            if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, newItem, oldItem));
236        }
237
238        private void OnCollectionChanged(NotifyCollectionChangedAction action, IList newItems)
239        {
240            OnPropertyChanged();
241            if (CollectionChanged != null) CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, newItems));
242        }
243    }
244}
Note: See TracBrowser for help on using the repository browser.