You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace System.Web.UI.WebControls {
 | |
|     
 | |
|     using System.Collections;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Diagnostics;
 | |
|     using System.Linq;
 | |
| 
 | |
|     internal sealed class MethodParametersDictionary : IDictionary<string, MethodParameterValue>, IStateManager {
 | |
| 
 | |
|         private bool _tracking;
 | |
|         private EventHandler _parametersChangedHandler;
 | |
|         private Dictionary<string, MethodParameterValue> _innerDictionary;
 | |
| 
 | |
|         /// <devdoc>
 | |
|         /// Used by Parameters to raise the ParametersChanged event.
 | |
|         /// </devdoc>
 | |
|         internal void CallOnParametersChanged() {
 | |
|             OnParametersChanged(EventArgs.Empty);
 | |
|         }
 | |
| 
 | |
|         /// <devdoc>
 | |
|         /// Raises the ParametersChanged event.
 | |
|         /// </devdoc>
 | |
|         private void OnParametersChanged(EventArgs e) {
 | |
|             if (_parametersChangedHandler != null) {
 | |
|                 _parametersChangedHandler(this, e);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <devdoc>
 | |
|         /// Occurs when any of the Parameter Values in the dictionary change.
 | |
|         /// </devdoc>
 | |
|         public event EventHandler ParametersChanged {
 | |
|             add {
 | |
|                 _parametersChangedHandler = (EventHandler)Delegate.Combine(_parametersChangedHandler, value);
 | |
|             }
 | |
|             remove {
 | |
|                 _parametersChangedHandler = (EventHandler)Delegate.Remove(_parametersChangedHandler, value);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public int Count {
 | |
|             get {
 | |
|                 return InnerDictionary.Count;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void LoadViewState(object savedState) {
 | |
|             if (savedState != null) {
 | |
|                 Debug.Assert(savedState is Pair);
 | |
|                 Pair pair = (Pair)savedState;
 | |
| 
 | |
|                 string[] names = (string[])pair.First;
 | |
|                 object[] states = (object[])pair.Second;
 | |
| 
 | |
|                 for (int i = 0; i < names.Length; i++) {
 | |
|                     string key = names[i];
 | |
|                     Debug.Assert(!InnerDictionary.ContainsKey(key), "The collection was not empty when loading the viewstate");
 | |
|                     MethodParameterValue parameter = new MethodParameterValue();
 | |
|                     Add(key, parameter);
 | |
|                     ((IStateManager)parameter).LoadViewState(states[i]);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private object SaveViewState() {
 | |
|             bool hasState = false;
 | |
|             int count = Count;
 | |
|             string[] names = new string[count];
 | |
|             object[] states = new object[count];
 | |
| 
 | |
|             int i = 0;
 | |
|             foreach (KeyValuePair<string, MethodParameterValue> kvp in InnerDictionary) {
 | |
|                 names[i] = kvp.Key;
 | |
|                 states[i] = ((IStateManager)kvp.Value).SaveViewState();
 | |
|                 if (states[i] != null)
 | |
|                     hasState = true;
 | |
|                 i++;
 | |
|             }
 | |
| 
 | |
|             return hasState ? new Pair(names, states) : null;
 | |
|         }
 | |
| 
 | |
|         private void TrackViewState() {
 | |
|             _tracking = true;
 | |
|             foreach (MethodParameterValue parameter in InnerDictionary.Values) {
 | |
|                 ((IStateManager)parameter).TrackViewState();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private Dictionary<string, MethodParameterValue> InnerDictionary {
 | |
|             get {
 | |
|                 if (_innerDictionary == null) {
 | |
|                     _innerDictionary = new Dictionary<string, MethodParameterValue>();
 | |
|                 }
 | |
|                 return _innerDictionary;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region IDictionary<KeyValuePair<string,MethodParameter>> Members
 | |
|         public ICollection<string> Keys {
 | |
|             get {
 | |
|                 return InnerDictionary.Keys;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public ICollection<MethodParameterValue> Values {
 | |
|             get {
 | |
|                 return InnerDictionary.Values;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public MethodParameterValue this[string key] {
 | |
|             get {
 | |
|                 return InnerDictionary[key];
 | |
|             }
 | |
|             set {
 | |
|                 InnerDictionary[key] = value;
 | |
|                 if (value != null) {
 | |
|                     value.SetOwner(this);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Add(string key, MethodParameterValue value) {
 | |
|             InnerDictionary.Add(key, value);
 | |
|             if (value != null) {
 | |
|                 value.SetOwner(this);
 | |
|                 if (_tracking) {
 | |
|                     ((IStateManager)value).TrackViewState();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool ContainsKey(string key) {
 | |
|             return InnerDictionary.ContainsKey(key);
 | |
|         }
 | |
| 
 | |
|         public bool Remove(string key) {
 | |
|             if (InnerDictionary.ContainsKey(key)) {
 | |
|                 MethodParameterValue value = InnerDictionary[key];
 | |
|                 if (value != null) {
 | |
|                     value.SetOwner(null);
 | |
|                 }
 | |
|             }
 | |
|             return InnerDictionary.Remove(key);
 | |
|         }
 | |
| 
 | |
|         public bool TryGetValue(string key, out MethodParameterValue value) {
 | |
|             return InnerDictionary.TryGetValue(key, out value);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region ICollection<KeyValuePair<string,MethodParameter>> Members
 | |
|         void ICollection<KeyValuePair<string, MethodParameterValue>>.Clear() {
 | |
|             InnerDictionary.Clear();
 | |
|         }
 | |
| 
 | |
|         bool ICollection<KeyValuePair<string, MethodParameterValue>>.IsReadOnly {
 | |
|             get {
 | |
|                 return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).IsReadOnly;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void ICollection<KeyValuePair<string, MethodParameterValue>>.Add(KeyValuePair<string, MethodParameterValue> item) {
 | |
|             Add(item.Key, item.Value);
 | |
|         }
 | |
| 
 | |
|         bool ICollection<KeyValuePair<string, MethodParameterValue>>.Contains(KeyValuePair<string, MethodParameterValue> item) {
 | |
|             return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).Contains(item);
 | |
|         }
 | |
| 
 | |
|         void ICollection<KeyValuePair<string, MethodParameterValue>>.CopyTo(KeyValuePair<string, MethodParameterValue>[] array, int arrayIndex) {
 | |
|             ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).CopyTo(array, arrayIndex);
 | |
|         }
 | |
| 
 | |
|         bool ICollection<KeyValuePair<string, MethodParameterValue>>.Remove(KeyValuePair<string, MethodParameterValue> item) {
 | |
|             return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).Remove(item);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region IEnumerable<KeyValuePair<string,MethodParameter>> Members
 | |
|         public IEnumerator<KeyValuePair<string, MethodParameterValue>> GetEnumerator() {
 | |
|             return InnerDictionary.GetEnumerator();
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region IEnumerable Members
 | |
|         IEnumerator IEnumerable.GetEnumerator() {
 | |
|             return GetEnumerator();
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Implementation of IStateManager
 | |
| 
 | |
|         bool IStateManager.IsTrackingViewState {
 | |
|             get {
 | |
|                 return _tracking;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void IStateManager.LoadViewState(object savedState) {
 | |
|             LoadViewState(savedState);
 | |
|         }
 | |
| 
 | |
|         object IStateManager.SaveViewState() {
 | |
|             return SaveViewState();
 | |
|         }
 | |
| 
 | |
|         void IStateManager.TrackViewState() {
 | |
|             TrackViewState();
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |