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

  Source.EditableObjects.EditableObjectHolder.cs

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