/// <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(); }
/// <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(); }
/// <summary> /// Initializes a new instance of the <see cref="AutoReleaseTransactionContext" /> class. /// </summary> public AutoReleaseTransactionContext() { editableHandler = null !; parentContext = null !; Success(); }
/// <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(); }
/// <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(); }