/// <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> /// 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); } }
private protected virtual void ClearOptional(IWriteableReplaceOperation operation) { INode ParentNode = Owner.Node; WriteableBrowsingOptionalNodeIndex OldBrowsingIndex = (WriteableBrowsingOptionalNodeIndex)ChildState.ParentIndex; INode OldNode = ChildState.Optional.HasItem ? ChildState.Node : null; NodeTreeHelperOptional.ClearOptionalChildNode(ParentNode, PropertyName); IWriteableBrowsingOptionalNodeIndex NewBrowsingIndex = CreateBrowsingNodeIndex(); IWriteableOptionalNodeState NewChildState = (IWriteableOptionalNodeState)CreateNodeState(NewBrowsingIndex); SetChildState(NewChildState); operation.Update(OldBrowsingIndex, NewBrowsingIndex, OldNode, NewChildState); }
/// <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 ReplaceOptional(IWriteableReplaceOperation operation) { Node ParentNode = Owner.Node; IWriteableBrowsingOptionalNodeIndex OldBrowsingIndex = (IWriteableBrowsingOptionalNodeIndex)ChildState.ParentIndex; Node OldNode = ChildState.Node; if (operation.ClearNode) { NodeTreeHelperOptional.UnassignChildNode(ParentNode, PropertyName); } else { NodeTreeHelperOptional.SetOptionalChildNode(ParentNode, PropertyName, operation.NewNode); } IWriteableBrowsingOptionalNodeIndex NewBrowsingIndex = CreateBrowsingNodeIndex(); IWriteableOptionalNodeState NewChildState = (IWriteableOptionalNodeState)CreateNodeState(NewBrowsingIndex); SetChildState(NewChildState); operation.Update(OldBrowsingIndex, NewBrowsingIndex, OldNode, NewChildState); }
/// <summary> /// Initializes a new instance of the <see cref="WriteableOptionalNodeState{IInner}"/> class. /// </summary> /// <param name="parentIndex">The index used to create the state.</param> public WriteableOptionalNodeState(IWriteableBrowsingOptionalNodeIndex parentIndex) : base(parentIndex) { }