private bool AddStreamNodeToTree(StreamNode Stream, string[] Filter, TreeNode ParentTreeNode, bool bExpandAll)
        {
            TreeNode StreamTreeNode = new TreeNode(Stream.Record.Name);

            StreamTreeNode.ImageIndex         = 0;
            StreamTreeNode.SelectedImageIndex = 0;
            StreamTreeNode.Tag = Stream;
            ParentTreeNode.Nodes.Add(StreamTreeNode);

            if (Stream.Record.Identifier == SelectedStream && IncludeNodeInFilter(Stream, Filter))
            {
                StreamsTreeView.SelectedNode = StreamTreeNode;
            }

            bool bExpand = bExpandAll;

            foreach (StreamNode ChildNode in Stream.ChildNodes)
            {
                bExpand |= AddStreamNodeToTree(ChildNode, Filter, StreamTreeNode, bExpandAll);
            }
            if (bExpand)
            {
                StreamTreeNode.Expand();
            }
            return(bExpand || (SelectedStream == Stream.Record.Identifier));
        }
Exemplo n.º 2
0
        public ExpressionNode BuildExpression(bool enableValidation)
        {
            ExpressionNode pathRoot = null;
            ExpressionNode path     = null;

            foreach (var element in _elements)
            {
                ExpressionNode node = null;
                switch (element)
                {
                case NotExpressionPathElement _:
                    node = new LogicalNotNode();
                    break;

                case PropertyElement prop:
                    node = new PropertyAccessorNode(prop.Property.Name, enableValidation, new PropertyInfoAccessorPlugin(prop.Property, prop.AccessorFactory));
                    break;

                case ArrayElementPathElement arr:
                    node = new PropertyAccessorNode(CommonPropertyNames.IndexerName, enableValidation, new ArrayElementPlugin(arr.Indices, arr.ElementType));
                    break;

                case VisualAncestorPathElement visualAncestor:
                    node = new FindVisualAncestorNode(visualAncestor.AncestorType, visualAncestor.Level);
                    break;

                case AncestorPathElement ancestor:
                    node = new FindAncestorNode(ancestor.AncestorType, ancestor.Level);
                    break;

                case SelfPathElement _:
                    node = new SelfNode();
                    break;

                case ElementNameElement name:
                    node = new ElementNameNode(name.NameScope, name.Name);
                    break;

                case IStronglyTypedStreamElement stream:
                    node = new StreamNode(stream.CreatePlugin());
                    break;

                case ITypeCastElement typeCast:
                    node = new StrongTypeCastNode(typeCast.Type, typeCast.Cast);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown binding path element type {element.GetType().FullName}");
                }

                path = pathRoot is null ? (pathRoot = node) : path.Next = node;
            }

            return(pathRoot ?? new EmptyExpressionNode());
        }
        private string GetSelectedStream()
        {
            string NewSelectedStream = null;

            if (StreamsTreeView.SelectedNode != null)
            {
                StreamNode StreamNode = (StreamNode)StreamsTreeView.SelectedNode.Tag;
                if (StreamNode != null)
                {
                    NewSelectedStream = StreamNode.Record.Identifier;
                }
            }
            return(NewSelectedStream);
        }
        private bool TryFilterTree(StreamNode Node, string[] Filter, out StreamNode NewNode)
        {
            StreamNode FilteredNode = new StreamNode(Node.Record);

            foreach (StreamNode ChildNode in Node.ChildNodes)
            {
                StreamNode FilteredChildNode;
                if (TryFilterTree(ChildNode, Filter, out FilteredChildNode))
                {
                    FilteredNode.ChildNodes.Add(FilteredChildNode);
                }
            }

            if (FilteredNode.ChildNodes.Count > 0 || IncludeNodeInFilter(FilteredNode, Filter))
            {
                NewNode = FilteredNode;
                return(true);
            }
            else
            {
                NewNode = null;
                return(false);
            }
        }
Exemplo n.º 5
0
        public (ExpressionNode?Node, SourceMode Mode) Parse(ref CharacterReader r)
        {
            ExpressionNode?rootNode = null;
            ExpressionNode?node     = null;

            var(astNodes, mode) = BindingExpressionGrammar.Parse(ref r);

            foreach (var astNode in astNodes)
            {
                ExpressionNode?nextNode = null;
                switch (astNode)
                {
                case BindingExpressionGrammar.EmptyExpressionNode _:
                    nextNode = new EmptyExpressionNode();
                    break;

                case BindingExpressionGrammar.NotNode _:
                    nextNode = new LogicalNotNode();
                    break;

                case BindingExpressionGrammar.StreamNode _:
                    nextNode = new StreamNode();
                    break;

                case BindingExpressionGrammar.PropertyNameNode propName:
                    nextNode = new PropertyAccessorNode(propName.PropertyName, _enableValidation);
                    break;

                case BindingExpressionGrammar.IndexerNode indexer:
                    nextNode = new StringIndexerNode(indexer.Arguments);
                    break;

                case BindingExpressionGrammar.AttachedPropertyNameNode attachedProp:
                    nextNode = ParseAttachedProperty(attachedProp);
                    break;

                case BindingExpressionGrammar.SelfNode _:
                    nextNode = new SelfNode();
                    break;

                case BindingExpressionGrammar.AncestorNode ancestor:
                    nextNode = ParseFindAncestor(ancestor);
                    break;

                case BindingExpressionGrammar.NameNode elementName:
                    nextNode = new ElementNameNode(_nameScope ?? throw new NotSupportedException("Invalid element name binding with null name scope!"), elementName.Name);
                    break;

                case BindingExpressionGrammar.TypeCastNode typeCast:
                    nextNode = ParseTypeCastNode(typeCast);
                    break;
                }
                if (node is null)
                {
                    rootNode = node = nextNode;
                }
                else
                {
                    node.Next = nextNode;
                    node      = nextNode;
                }
            }

            return(rootNode, mode);
        }
        private void PopulateTree()
        {
            StreamsTreeView.BeginUpdate();
            StreamsTreeView.Nodes.Clear();

            string[] Filter = FilterTextBox.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            List <StreamDepot> FilteredDepots = Depots;

            if (Filter.Length > 0)
            {
                FilteredDepots = new List <StreamDepot>();
                foreach (StreamDepot Depot in Depots)
                {
                    StreamDepot FilteredDepot = new StreamDepot(Depot.Name);
                    foreach (StreamNode RootNode in Depot.RootNodes)
                    {
                        StreamNode FilteredRootNode;
                        if (TryFilterTree(RootNode, Filter, out FilteredRootNode))
                        {
                            FilteredDepot.RootNodes.Add(FilteredRootNode);
                        }
                    }
                    if (FilteredDepot.RootNodes.Count > 0)
                    {
                        FilteredDepots.Add(FilteredDepot);
                    }
                }
            }

            bool bExpandAll = Filter.Length > 0;

            foreach (StreamDepot Depot in FilteredDepots)
            {
                TreeNode DepotTreeNode = new TreeNode(Depot.Name);
                DepotTreeNode.ImageIndex         = 1;
                DepotTreeNode.SelectedImageIndex = 1;
                StreamsTreeView.Nodes.Add(DepotTreeNode);

                bool bExpand = bExpandAll;
                foreach (StreamNode RootNode in Depot.RootNodes)
                {
                    bExpand |= AddStreamNodeToTree(RootNode, Filter, DepotTreeNode, bExpandAll);
                }
                if (bExpand)
                {
                    DepotTreeNode.Expand();
                }
            }

            if (StreamsTreeView.SelectedNode == null && Filter.Length > 0 && StreamsTreeView.Nodes.Count > 0)
            {
                for (TreeNode Node = StreamsTreeView.Nodes[0];; Node = Node.Nodes[0])
                {
                    StreamNode Stream = Node.Tag as StreamNode;
                    if (Stream != null && IncludeNodeInFilter(Stream, Filter))
                    {
                        StreamsTreeView.SelectedNode = Node;
                        break;
                    }
                    if (Node.Nodes.Count == 0)
                    {
                        break;
                    }
                }
            }

            if (StreamsTreeView.SelectedNode != null)
            {
                StreamsTreeView.SelectedNode.EnsureVisible();
            }
            else if (StreamsTreeView.Nodes.Count > 0)
            {
                StreamsTreeView.Nodes[0].EnsureVisible();
            }
            StreamsTreeView.EndUpdate();

            UpdateOkButton();
        }
 private bool IncludeNodeInFilter(StreamNode Node, string[] Filter)
 {
     return(Filter.All(x => Node.Record.Identifier.IndexOf(x, StringComparison.InvariantCultureIgnoreCase) != -1 || Node.Record.Name.IndexOf(x, StringComparison.InvariantCultureIgnoreCase) != -1));
 }