diff Source/EditableObjects/EditableValue.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/EditableValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,103 @@
+using System;
+using System.Collections;
+using System.Reflection;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public struct EditableValue<T>: IEditable, IMemberwiseEditable, IPrintDebugState
+	{
+		private T _original;
+		private T _current;
+
+		public EditableValue(T value)
+		{
+			_original = value;
+			_current  = value;
+		}
+
+		[GetValue, SetValue]
+		public T Value
+		{
+			get { return _current;  }
+			set { _current = value; }
+		}
+
+		#region IEditable Members
+
+		public void AcceptChanges()
+		{
+			_original = _current;
+		}
+
+		public void RejectChanges()
+		{
+			_current = _original;
+		}
+
+		public bool IsDirty
+		{
+			get
+			{
+				object o = _original;
+				object c = _current;
+
+				return o == null? c != null: o.Equals(c) == false;
+			}
+		}
+
+		#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
+	}
+}