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