示例#1
0
    /// <summary>
    ///     Initializes a new instance of the <see cref="AutoReleaseTransactionContext" /> class.
    /// </summary>
    /// <param name="item">The item.</param>
    /// <param name="parentContext">The parent context.</param>
    /// <param name="editableHandler">The editable handler.</param>
    public AutoReleaseTransactionContext(
        IUndoableItem item,
        IUndoableItem parentContext,
        EventHandler <EditCommittedEventArgs> editableHandler)
    {
        // Contract validation
        Requires.NotNull(
            out this.item,
            item);
        Requires.NotNull(
            out this.parentContext,
            parentContext);
        Requires.NotNull(
            out this.editableHandler,
            editableHandler);

        // Data validation
        if (!item.IsCapturedIntoUndoContext || item.ParentUndoContext != parentContext)
        {
            throw new ItemNotCapturedIntoUndoContextException();
        }

        // State
        items = null;

        item.ReleaseFromUndoContext();

        if (item is IEditCommittableItem tei)
        {
            tei.EditCommitted -= editableHandler;
        }

        AddFailure();
    }
示例#2
0
    /// <summary>
    ///     Initializes a new instance of the <see cref="AutoCaptureTransactionContext" /> class.
    /// </summary>
    /// <param name="item">The item.</param>
    /// <param name="parentContext">The parent context.</param>
    /// <param name="editableHandler">The editable handler.</param>
    public AutoCaptureTransactionContext(
        IUndoableItem item,
        IUndoableItem parentContext,
        EventHandler <EditCommittedEventArgs> editableHandler)
    {
        // Contract validation
        Requires.NotNull(
            out this.item,
            item);
        _ = Requires.NotNull(
            parentContext);
        Requires.NotNull(
            out this.editableHandler,
            editableHandler);

        // Data validation
        if (item.IsCapturedIntoUndoContext && item.ParentUndoContext != parentContext)
        {
            throw new ItemAlreadyCapturedIntoUndoContextException();
        }

        // State
        items = null;

        item.CaptureIntoUndoContext(parentContext);

        if (item is IEditCommittableItem tei)
        {
            tei.EditCommitted += editableHandler;
        }

        AddFailure();
    }
示例#3
0
    /// <summary>
    ///     Initializes a new instance of the <see cref="AutoReleaseTransactionContext" /> class.
    /// </summary>
    public AutoReleaseTransactionContext()
    {
        editableHandler = null !;
        parentContext   = null !;

        Success();
    }
示例#4
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="AutoReleaseTransactionContext" /> class.
        /// </summary>
        /// <param name="items">The items.</param>
        /// <param name="parentContext">The parent context.</param>
        /// <param name="editableHandler">The editable handler.</param>
        public AutoReleaseTransactionContext(
            IEnumerable <IUndoableItem> items,
            IUndoableItem parentContext,
            EventHandler <EditCommittedEventArgs> editableHandler)
        {
            // Contract validation
            Requires.NotNull(
                items,
                nameof(items));
            Requires.NotNull(
                out this.parentContext,
                parentContext,
                nameof(parentContext));
            Requires.NotNull(
                out this.editableHandler,
                editableHandler,
                nameof(editableHandler));

            // Data validation
            // Multiple enumeration warning: this has to be done, as there is no efficient way to do a transactional capturing otherwise
            IUndoableItem[] itemsArray = items.ToArray();
            if (itemsArray.Any(
                    (
                        item,
                        pc) => !item.IsCapturedIntoUndoContext || item.ParentUndoContext != pc, parentContext))
            {
                throw new ItemNotCapturedIntoUndoContextException();
            }

            // State
            this.items = itemsArray;
            this.item  = null;

            foreach (IUndoableItem undoableItem in itemsArray)
            {
                undoableItem.ReleaseFromUndoContext();

                if (undoableItem is IEditCommittableItem tei)
                {
                    tei.EditCommitted -= editableHandler;
                }
            }

            this.AddFailure();
        }
示例#5
0
    /// <summary>
    ///     Initializes a new instance of the <see cref="AutoCaptureTransactionContext" /> class.
    /// </summary>
    /// <param name="items">The items.</param>
    /// <param name="parentContext">The parent context.</param>
    /// <param name="editableHandler">The editable handler.</param>
    public AutoCaptureTransactionContext(
        IEnumerable <IUndoableItem> items,
        IUndoableItem parentContext,
        EventHandler <EditCommittedEventArgs> editableHandler)
    {
        // Contract validation
        _ = Requires.NotNull(
            items);
        _ = Requires.NotNull(
            parentContext);
        Requires.NotNull(
            out this.editableHandler,
            editableHandler);

        // Data validation
        // Multiple enumeration warning: this has to be done, as there is no efficient way to do a transactional capturing otherwise
        IUndoableItem[] itemsArray = items.ToArray();
        if (itemsArray.Any(
                (
                    internalItem,
                    pc) => internalItem.IsCapturedIntoUndoContext && internalItem.ParentUndoContext != pc,
                parentContext))
        {
            throw new ItemAlreadyCapturedIntoUndoContextException();
        }

        // State
        this.items = itemsArray;
        item       = null;

        foreach (IUndoableItem undoableItem in itemsArray)
        {
            undoableItem.CaptureIntoUndoContext(parentContext);

            if (undoableItem is IEditCommittableItem tei)
            {
                tei.EditCommitted += editableHandler;
            }
        }

        AddFailure();
    }