Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.EditableObjects.EditableValue.cs

 
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
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net