using System.Collections.Generic; using DelftTools.Utils.Aop; using DelftTools.Utils.Editing; namespace DelftTools.Utils.Data { /// /// Provides an implementation of IEditableObject and combines this with Unique. If you need to implement /// IEditableObject and you were subclassing Unique, consider subclassing this class instead. /// /// This IEditableObject implementation allows nested edit actions /// public abstract class EditableObjectUnique : IEditableObject { private readonly Stack editActions = new Stack(); private bool isEditing; public virtual bool IsNestedEditingDone() { // this may look strange..but it's correct return !IsEditing && editActions.Count <= 1; } [NoNotifyPropertyChange] public virtual IEditAction CurrentEditAction { get { return (editActions.Count > 0) ? editActions.Peek() : null; } } [NoNotifyPropertyChange] public virtual bool EditWasCancelled { get; protected set; } public virtual bool IsEditing { get { return isEditing; } protected set { isEditing = value; } } public virtual void BeginEdit(IEditAction action) { editActions.Push(action); EditWasCancelled = false; IsEditing = true; } public virtual void CancelEdit() { EditWasCancelled = true; EndEdit(); } public virtual void EndEdit() { IsEditing = false; //always set to false to trigger listeners editActions.Pop(); //set isEditing back to correct value for consistency (without event): isEditing = editActions.Count > 0; } } }