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;
}
}
}