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