diff Source/EditableObjects/EditableObjectHolder.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableObjectHolder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,142 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using System.ComponentModel;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public class /*struct*/ EditableObjectHolder : IEditable, IMemberwiseEditable, ISetParent, IPrintDebugState
+	{
+		public EditableObjectHolder(EditableObject obj)
+		{
+			_original = obj;
+			_current  = obj;
+
+			if (_current != null)
+				_current.PropertyChanged += _current_PropertyChanged;
+		}
+
+		void _current_PropertyChanged(object sender, PropertyChangedEventArgs e)
+		{
+			EditableObject obj = _parent as EditableObject;
+
+			if (obj != null)
+				obj.OnPropertyChanged(_propertyInfo.Name + "." + e.PropertyName);
+		}
+
+		private EditableObject _original;
+		private EditableObject _current;
+		private object         _parent;
+		private PropertyInfo   _propertyInfo;
+
+		[GetValue, SetValue]
+		public EditableObject Value
+		{
+			get { return _current; }
+			set
+			{
+				if (_current != null)
+					_current.PropertyChanged -= _current_PropertyChanged;
+
+				_current = value;
+
+				if (_current != null)
+					_current.PropertyChanged += _current_PropertyChanged;
+			}
+		}
+
+		#region IEditable Members
+
+		public void AcceptChanges()
+		{
+			_original = _current;
+
+			if (_current != null)
+				_current.AcceptChanges();
+		}
+
+		public void RejectChanges()
+		{
+			_current = _original;
+
+			if (_current != null)
+				_current.RejectChanges();
+		}
+
+		public bool IsDirty
+		{
+			get
+			{
+				if (_current == null)
+					return _original != null;
+
+				return _current != _original || _current.IsDirty;
+			}
+		}
+
+		#endregion
+
+		#region IMemberwiseEditable Members
+
+		public bool AcceptMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			AcceptChanges();
+
+			return true;
+		}
+
+		public bool RejectMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			RejectChanges();
+
+			return true;
+		}
+
+		public bool IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			isDirty = IsDirty;
+
+			return true;
+		}
+
+		public void GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list)
+		{
+			if (IsDirty)
+				list.Add(propertyInfo);
+		}
+
+		#endregion
+
+		#region IPrintDebugState Members
+
+		public void PrintDebugState(PropertyInfo propertyInfo, ref string str)
+		{
+			str += string.Format("{0,-20} {1} {2,-40} {3,-40} \r\n",
+				propertyInfo.Name, IsDirty? "*": " ", _original, _current);
+		}
+
+		#endregion
+
+		#region ISetParent Members
+
+		public void SetParent(object parent, PropertyInfo propertyInfo)
+		{
+			_parent       = parent;
+			_propertyInfo = propertyInfo;
+		}
+
+		#endregion
+	}
+}