98 lines
2.8 KiB
C#
98 lines
2.8 KiB
C#
|
|
namespace SRDebugger.Services.Implementation
|
|||
|
|
{
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using Internal;
|
|||
|
|
using SRF.Service;
|
|||
|
|
|
|||
|
|
[Service(typeof (IOptionsService))]
|
|||
|
|
public class OptionsServiceImpl : IOptionsService
|
|||
|
|
{
|
|||
|
|
public event EventHandler OptionsUpdated;
|
|||
|
|
public event EventHandler<PropertyChangedEventArgs> OptionsValueUpdated;
|
|||
|
|
|
|||
|
|
public ICollection<OptionDefinition> Options
|
|||
|
|
{
|
|||
|
|
get { return _optionsReadonly; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private readonly Dictionary<object, ICollection<OptionDefinition>> _optionContainerLookup = new Dictionary<object, ICollection<OptionDefinition>>();
|
|||
|
|
private readonly List<OptionDefinition> _options = new List<OptionDefinition>();
|
|||
|
|
private readonly IList<OptionDefinition> _optionsReadonly;
|
|||
|
|
|
|||
|
|
public OptionsServiceImpl()
|
|||
|
|
{
|
|||
|
|
_optionsReadonly = new ReadOnlyCollection<OptionDefinition>(_options);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Scan(object obj)
|
|||
|
|
{
|
|||
|
|
AddContainer(obj);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void AddContainer(object obj)
|
|||
|
|
{
|
|||
|
|
if (_optionContainerLookup.ContainsKey(obj))
|
|||
|
|
{
|
|||
|
|
throw new Exception("An object should only be added once.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var options = SRDebuggerUtil.ScanForOptions(obj);
|
|||
|
|
_optionContainerLookup.Add(obj, options);
|
|||
|
|
|
|||
|
|
if (options.Count > 0)
|
|||
|
|
{
|
|||
|
|
_options.AddRange(options);
|
|||
|
|
OnOptionsUpdated();
|
|||
|
|
|
|||
|
|
var changed = obj as INotifyPropertyChanged;
|
|||
|
|
if (changed != null)
|
|||
|
|
{
|
|||
|
|
changed.PropertyChanged += OnPropertyChanged;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RemoveContainer(object obj)
|
|||
|
|
{
|
|||
|
|
if (!_optionContainerLookup.ContainsKey(obj))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = _optionContainerLookup[obj];
|
|||
|
|
_optionContainerLookup.Remove(obj);
|
|||
|
|
foreach (var op in list)
|
|||
|
|
{
|
|||
|
|
_options.Remove(op);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var changed = obj as INotifyPropertyChanged;
|
|||
|
|
if (changed != null)
|
|||
|
|
{
|
|||
|
|
changed.PropertyChanged -= OnPropertyChanged;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OnOptionsUpdated();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
|
|||
|
|
{
|
|||
|
|
if (OptionsValueUpdated != null)
|
|||
|
|
{
|
|||
|
|
OptionsValueUpdated(this, propertyChangedEventArgs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnOptionsUpdated()
|
|||
|
|
{
|
|||
|
|
if (OptionsUpdated != null)
|
|||
|
|
{
|
|||
|
|
OptionsUpdated(this, EventArgs.Empty);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|