/// <summary> /// Merges two blocks at the given index. /// </summary> /// <param name="operation">Details of the operation performed.</param> public virtual void MergeBlocks(IWriteableMergeBlocksOperation operation) { Debug.Assert(operation != null); int MergeBlockIndex = operation.BlockIndex; Debug.Assert(MergeBlockIndex > 0 && MergeBlockIndex < BlockStateList.Count); IWriteableBlockState FirstBlockState = BlockStateList[MergeBlockIndex - 1]; IWriteableBlockState SecondBlockState = BlockStateList[MergeBlockIndex]; int MergeIndex = FirstBlockState.StateList.Count; Debug.Assert(MergeIndex > 0); NodeTreeHelperBlockList.MergeBlocks(Owner.Node, PropertyName, MergeBlockIndex, out IBlock mergedBlock); Debug.Assert(FirstBlockState.ChildBlock == mergedBlock); RemoveFromBlockStateList(MergeBlockIndex - 1); operation.Update(FirstBlockState, MergeIndex); int i; for (i = 0; i < MergeIndex; i++) { IWriteablePlaceholderNodeState State = FirstBlockState.StateList[0]; IWriteableBrowsingExistingBlockNodeIndex ChildNodeIndex = State.ParentIndex as IWriteableBrowsingExistingBlockNodeIndex; Debug.Assert(ChildNodeIndex != null); FirstBlockState.Remove(ChildNodeIndex, 0); SecondBlockState.Insert(ChildNodeIndex, i, State); } for (; i < SecondBlockState.StateList.Count; i++) { IWriteablePlaceholderNodeState State = SecondBlockState.StateList[i]; IWriteableBrowsingExistingBlockNodeIndex ChildNodeIndex = State.ParentIndex as IWriteableBrowsingExistingBlockNodeIndex; Debug.Assert(ChildNodeIndex != null); ChildNodeIndex.MoveBlockDown(); for (int j = 0; j < MergeIndex; j++) { ChildNodeIndex.MoveUp(); } } for (i = MergeBlockIndex; i < BlockStateList.Count; i++) { foreach (IWriteablePlaceholderNodeState State in BlockStateList[i].StateList) { IWriteableBrowsingExistingBlockNodeIndex ChildNodeIndex = State.ParentIndex as IWriteableBrowsingExistingBlockNodeIndex; Debug.Assert(ChildNodeIndex != null); ChildNodeIndex.MoveBlockDown(); } } }
/// <summary> /// Handler called every time two blocks are merged. /// </summary> /// <param name="operation">Details of the operation performed.</param> private protected virtual void OnBlocksMerged(IWriteableMergeBlocksOperation operation) { Debug.Assert(operation != null); Debug.Assert(!operation.IsNested); IWriteableBlockState BlockState = operation.BlockState; Debug.Assert(BlockState != null); Debug.Assert(!BlockStateViewTable.ContainsKey(BlockState)); }