/// <summary> /// Unassign the optional node. /// </summary> /// <param name="nodeIndex">Index of the optional node.</param> /// <param name="isChanged">True upon return if the node was changed. False if the node was already not assigned.</param> public virtual void Unassign(IWriteableBrowsingOptionalNodeIndex nodeIndex, out bool isChanged) { Contract.RequireNotNull(nodeIndex, out IWriteableBrowsingOptionalNodeIndex NodeIndex); Debug.Assert(StateTable.ContainsKey(NodeIndex)); IWriteableOptionalNodeState State = StateTable[NodeIndex] as IWriteableOptionalNodeState; Debug.Assert(State != null); IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex> Inner = State.ParentInner as IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex>; Debug.Assert(Inner != null); if (Inner.IsAssigned) { Action <IWriteableOperation> HandlerRedo = (IWriteableOperation operation) => RedoUnassign(operation); Action <IWriteableOperation> HandlerUndo = (IWriteableOperation operation) => UndoUnassign(operation); WriteableAssignmentOperation Operation = CreateAssignmentOperation(Inner.Owner.Node, Inner.PropertyName, HandlerRedo, HandlerUndo, isNested: false); Operation.Redo(); SetLastOperation(Operation); CheckInvariant(); isChanged = true; } else { isChanged = false; } }
/// <summary> /// Handler called every time a state is unassigned in the controller. /// </summary> /// <param name="operation">Details of the operation performed.</param> private protected virtual void OnStateUnassigned(WriteableAssignmentOperation operation) { IWriteableOptionalNodeState State = operation.State; Debug.Assert(State != null); Debug.Assert(StateViewTable.ContainsKey(State)); }
private protected virtual void UndoAssign(IWriteableOperation operation) { WriteableAssignmentOperation AssignmentOperation = (WriteableAssignmentOperation)operation; AssignmentOperation = AssignmentOperation.ToInverseAssignment(); ExecuteUnassign(AssignmentOperation); }
private protected virtual void ExecuteAssign(WriteableAssignmentOperation operation) { Node ParentNode = operation.ParentNode; string PropertyName = operation.PropertyName; IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex> Inner = GetInner(ParentNode, PropertyName) as IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex>; Inner.Assign(operation); Stats.AssignedOptionalNodeCount++; NotifyStateAssigned(operation); }
/// <summary> /// Reduces the optional node. /// </summary> private protected virtual void ReduceOptional(IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex> optionalInner, WriteableOperationList operationList, bool isNested) { if (optionalInner.IsAssigned && NodeHelper.IsOptionalAssignedToDefault(optionalInner.ChildState.Optional)) { IWriteableBrowsingOptionalNodeIndex ParentIndex = optionalInner.ChildState.ParentIndex; Action <IWriteableOperation> HandlerRedo = (IWriteableOperation operation) => RedoUnassign(operation); Action <IWriteableOperation> HandlerUndo = (IWriteableOperation operation) => UndoUnassign(operation); WriteableAssignmentOperation Operation = CreateAssignmentOperation(optionalInner.Owner.Node, optionalInner.PropertyName, HandlerRedo, HandlerUndo, isNested); Operation.Redo(); operationList.Add(Operation); } }
/// <summary> /// Expands the optional node. /// * If assigned, does nothing. /// * If it has an item, assign it. /// * Otherwise, assign the item to a default node. /// </summary> private protected virtual void ExpandOptional(IWriteableOptionalInner <IWriteableBrowsingOptionalNodeIndex> optionalInner, WriteableOperationList operationList) { if (optionalInner.IsAssigned) { return; } IWriteableBrowsingOptionalNodeIndex ParentIndex = optionalInner.ChildState.ParentIndex; Action <IWriteableOperation> HandlerRedo = (IWriteableOperation operation) => RedoAssign(operation); Action <IWriteableOperation> HandlerUndo = (IWriteableOperation operation) => UndoAssign(operation); WriteableAssignmentOperation Operation = CreateAssignmentOperation(optionalInner.Owner.Node, optionalInner.PropertyName, HandlerRedo, HandlerUndo, isNested: false); Operation.Redo(); operationList.Add(Operation); }
private protected virtual void RedoAssign(IWriteableOperation operation) { WriteableAssignmentOperation AssignmentOperation = (WriteableAssignmentOperation)operation; ExecuteAssign(AssignmentOperation); }
private protected virtual void NotifyStateUnassigned(WriteableAssignmentOperation operation) { StateUnassignedHandler?.Invoke(operation); }
/// <summary> /// Unassign the optional node. /// </summary> /// <param name="operation">Details of the operation performed.</param> public void Unassign(WriteableAssignmentOperation operation) { NodeTreeHelperOptional.UnassignChildNode(Owner.Node, PropertyName); operation.Update(ChildState); }