using System;
using System.Collections;
using System.Collections.Generic;
namespace DTS.Common.Core.Settings
{
///
/// Implements a dictionary with events when an item is changed
///
/// key type
/// value type
public class SettingsCollection : IDictionary
{
///
/// Event fired when an item changes in dictionary
///
public event EventHandler> CollectionItemPropertyChanged;
///
/// List of stored items
///
private readonly Dictionary _items = new Dictionary();
#region IDictionary
///
/// Add item
///
/// key
/// value
public void Add(TKey key, TItem value)
{
_items.Add(key, value);
FireItemChangedEvent(ChangeSettingType.Add, key, value);
}
///
/// Returns true if item contains key
///
/// key
/// true if key exists
public bool ContainsKey(TKey key)
{
return _items.ContainsKey(key);
}
///
///
/// Returns all keys in collection
///
public ICollection Keys => _items.Keys;
///
/// Removes key
///
/// key
/// true if key removed
public bool Remove(TKey key)
{
var res = _items.Remove(key);
if (res) FireItemChangedEvent(ChangeSettingType.Remove, key);
return res;
}
///
/// Trys to get specified value
///
/// key
/// value if key exists
/// true if key exists; false if it doesn't exist
public bool TryGetValue(TKey key, out TItem value)
{
return _items.TryGetValue(key, out value);
}
///
/// List of values in collection
///
public ICollection Values => _items.Values;
///
/// Gets/sets item in collection (overloads [] operator)
///
/// key
/// item in collection
public TItem this[TKey key]
{
get => _items[key];
set
{
_items[key] = value;
FireItemChangedEvent(ChangeSettingType.Add, key, value);
}
}
///
/// Adds new item
///
/// new item to add
public void Add(KeyValuePair item)
{
_items.Add(item.Key, item.Value);
FireItemChangedEvent(ChangeSettingType.Add, item.Key, item.Value);
}
///
/// Clears entire collection
///
public void Clear()
{
_items.Clear();
FireItemChangedEvent(ChangeSettingType.ClearAll);
}
///
/// Returns true if item is in collection
///
/// item to check
/// true if item exists
public bool Contains(KeyValuePair item)
{
return _items.ContainsKey(item.Key) && _items.ContainsValue(item.Value);
}
///
/// Copys items to array
///
///
///
public void CopyTo(KeyValuePair[] array, int arrayIndex)
{
throw new NotImplementedException();
}
///
/// Returns count of items
///
public int Count => _items.Count;
///
/// Returns true if readonly collection
///
public bool IsReadOnly => false;
///
/// Removes specified item
///
/// item to remove
/// true if item removed
public bool Remove(KeyValuePair item)
{
var res = _items.Remove(item.Key);
if (res) FireItemChangedEvent(ChangeSettingType.Remove, item.Key);
return res;
}
///
/// Return enumerator for collection
///
/// enumerator
public IEnumerator> GetEnumerator()
{
return _items.GetEnumerator();
}
///
/// Return enumerator for collection
///
/// enumerator
IEnumerator IEnumerable.GetEnumerator()
{
return _items.GetEnumerator();
}
#endregion
#region Private methods
///
/// Fires collection change event
///
/// type of change
private void FireItemChangedEvent(ChangeSettingType changeType)
{
CollectionItemPropertyChanged?.Invoke(this, new SettingsChangedEventArgs(changeType));
}
///
/// Fires collection change event
///
/// type of change
/// key
private void FireItemChangedEvent(ChangeSettingType changeType, TKey key)
{
CollectionItemPropertyChanged?.Invoke(this, new SettingsChangedEventArgs(changeType, key));
}
///
/// Fires collection change event
///
/// type of change
/// key
/// item
private void FireItemChangedEvent(ChangeSettingType changeType, TKey key, TItem item)
{
CollectionItemPropertyChanged?.Invoke(this, new SettingsChangedEventArgs(changeType, key, item));
}
#endregion
}
}