Mercurial > pub > bltoolkit
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 + } +}