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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |