/// <summary>
        /// Checks that a frame selector is correctly constructed.
        /// </summary>
        /// <param name="nodeType">Type of the node this frame selector can describe.</param>
        /// <param name="nodeTemplateTable">Table of templates with all frames.</param>
        /// <param name="propertyName">The property for which frames can be selected.</param>
        public virtual bool IsValid(Type nodeType, IFocusTemplateReadOnlyDictionary nodeTemplateTable, string propertyName)
        {
            bool IsValid = true;

            IsValid &= SelectorType != null;
            IsValid &= !string.IsNullOrEmpty(SelectorName);

            Type ChildInterfaceType, ChildNodeType;

            IsValid &= NodeTreeHelperChild.IsChildNodeProperty(nodeType, propertyName, out ChildInterfaceType) ||
                       NodeTreeHelperOptional.IsOptionalChildNodeProperty(nodeType, propertyName, out ChildInterfaceType) ||
                       NodeTreeHelperList.IsNodeListProperty(nodeType, propertyName, out ChildInterfaceType) ||
                       NodeTreeHelperBlockList.IsBlockListProperty(nodeType, propertyName, out ChildInterfaceType, out ChildNodeType) ||
                       (NodeTreeHelper.IsBlockType(nodeType) && propertyName == nameof(BaseNode.IBlock.NodeList));

            IsValid &= nodeTemplateTable.ContainsKey(SelectorType);

            IFocusNodeTemplate Template = nodeTemplateTable[SelectorType] as IFocusNodeTemplate;

            Debug.Assert(Template != null);

            IFocusSelectionFrame AsSelectionFrame = Template.Root as IFocusSelectionFrame;

            IsValid &= AsSelectionFrame != null;

            if (IsValid)
            {
                IFocusSelectableFrame SelectedItem = null;
                foreach (IFocusSelectableFrame Item in AsSelectionFrame.Items)
                {
                    if (Item.Name == SelectorName)
                    {
                        SelectedItem = Item;
                        break;
                    }
                }

                IsValid &= SelectedItem != null;
            }

            Debug.Assert(IsValid);
            return(IsValid);
        }
        private bool GetFirstCommentFrameSelection(IFocusSelectionFrame root, IList <FocusFrameSelectorList> selectorStack, out IFocusCommentFrame frame)
        {
            frame = null;

            IFocusSelectableFrame SelectedFrame = null;

            foreach (IFocusSelectableFrame Item in root.Items)
            {
                foreach (FocusFrameSelectorList SelectorList in selectorStack)
                {
                    foreach (IFocusFrameSelector Selector in SelectorList)
                    {
                        if (Selector.SelectorType == NodeType)
                        {
                            if (Selector.SelectorName == Item.Name)
                            {
                                SelectedFrame = Item;
                                break;
                            }
                        }
                    }
                    if (SelectedFrame != null)
                    {
                        break;
                    }
                }
                if (SelectedFrame != null)
                {
                    break;
                }
            }

            if (SelectedFrame != null)
            {
                if (GetFirstCommentFrame(SelectedFrame.Content, selectorStack, out frame))
                {
                    return(true);
                }
            }

            return(false);
        }
        private bool GetFirstNamedFrameSelection(IFocusSelectionFrame root, string propertyName, IList <FocusFrameSelectorList> selectorStack, bool reverseSearch, ref int valueFrameIndex, out IFocusNamedFrame frame)
        {
            frame = null;

            IFocusSelectableFrame SelectedFrame = null;

            foreach (IFocusSelectableFrame Item in root.Items)
            {
                foreach (FocusFrameSelectorList SelectorList in selectorStack)
                {
                    foreach (IFocusFrameSelector Selector in SelectorList)
                    {
                        if (Selector.SelectorType == NodeType)
                        {
                            if (Selector.SelectorName == Item.Name)
                            {
                                SelectedFrame = Item;
                                break;
                            }
                        }
                    }
                    if (SelectedFrame != null)
                    {
                        break;
                    }
                }
                if (SelectedFrame != null)
                {
                    break;
                }
            }

            if (SelectedFrame != null)
            {
                if (GetFirstNamedFrame(SelectedFrame.Content, propertyName, selectorStack, reverseSearch, ref valueFrameIndex, out frame))
                {
                    return(true);
                }
            }

            return(false);
        }