/// <summary>
        /// Gets indexes for all nodes in the inner.
        /// </summary>
        public virtual IReadOnlyBrowsingBlockNodeIndexList AllIndexes()
        {
            IReadOnlyBrowsingBlockNodeIndexList Result = CreateBlockNodeIndexList();

            foreach (IReadOnlyBlockState BlockState in BlockStateList)
            {
                foreach (IReadOnlyPlaceholderNodeState NodeState in BlockState.StateList)
                {
                    IReadOnlyBrowsingBlockNodeIndex ParentIndex = NodeState.ParentIndex as IReadOnlyBrowsingBlockNodeIndex;
                    Debug.Assert(ParentIndex != null);

                    Result.Add(ParentIndex);
                }
            }

            return(Result);
        }
        private protected virtual void BrowseBlock(IReadOnlyBrowseContext browseNodeContext, INode node, string propertyName, int blockIndex, INodeTreeBlock childBlock, IReadOnlyBrowsingBlockNodeIndexList nodeIndexList)
        {
            Debug.Assert(!string.IsNullOrEmpty(propertyName));

            for (int Index = 0; Index < childBlock.NodeList.Count; Index++)
            {
                INode ChildNode = childBlock.NodeList[Index];

                IReadOnlyBrowsingBlockNodeIndex NewNodeIndex;
                if (Index == 0) // For the first node, we use a IxxxBrowsingNewBlockNodeIndex, otherwise a IxxxBrowsingExistingBlockNodeIndex.
                {
                    NewNodeIndex = CreateNewBlockNodeIndex(browseNodeContext, node, propertyName, blockIndex, ChildNode);
                }
                else
                {
                    NewNodeIndex = CreateExistingBlockNodeIndex(browseNodeContext, node, propertyName, blockIndex, Index, ChildNode);
                }

                nodeIndexList.Add(NewNodeIndex);
            }
        }