public ElementHierarchySearchBar(ElementHierarchyView parent)
        {
            m_ParentTreeView = parent;
            m_FoundItems     = new List <SearchResultItem>();

            this.AddToClassList("unity-treeview-searchbar");

            m_FieldHelpLabel             = new Label("Search by type, name, or class");
            m_FieldHelpLabel.pickingMode = PickingMode.Ignore;
            m_FieldHelpLabel.AddToClassList("unity-treeview-searchbar-label");
            m_FieldHelpLabel.AddToClassList("unity-treeview-searchbar-label-help");
            Add(m_FieldHelpLabel);

            var field = new TextField();

            field.AddToClassList("unity-treeview-searchbar-field");
            field.RegisterValueChangedCallback(PerformSearch);
            field.RegisterCallback <KeyDownEvent>((e) =>
            {
                var targetField = field;
                if (e.keyCode == KeyCode.F3 || e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter)
                {
                    if (e.modifiers == EventModifiers.Shift)
                    {
                        SelectPrev();
                    }
                    else
                    {
                        SelectNext();
                    }
                }
                else if (e.keyCode == KeyCode.Escape)
                {
                    targetField.value = string.Empty;
                    targetField.visualInput.Blur();
                    m_ParentTreeView.ClearSearchResults();
                    m_ParentTreeView.Focus();
                }
            }, TrickleDown.TrickleDown);
            Add(field);

            m_CountLabel = new Label();
            m_CountLabel.AddToClassList("unity-treeview-searchbar-label");
            m_CountLabel.AddToClassList("unity-treeview-searchbar-hidden");
            Add(m_CountLabel);

            var prevButton = new Button(SelectPrev)
            {
                text = "<"
            };

            prevButton.AddToClassList("unity-treeview-searchbar-button");
            prevButton.AddToClassList("unity-treeview-searchbar-button-prev");
            Add(prevButton);

            var nextButton = new Button(SelectNext)
            {
                text = ">"
            };

            nextButton.AddToClassList("unity-treeview-searchbar-button");
            nextButton.AddToClassList("unity-treeview-searchbar-button-next");
            Add(nextButton);
        }
        void PerformSearch(ChangeEvent <string> evt)
        {
            m_FoundItems.Clear();
            m_SelectedIndex = 0;

            m_CountLabel.text = string.Empty;
            m_CountLabel.AddToClassList("unity-treeview-searchbar-hidden");

            m_ParentTreeView.ClearSearchResults();

            m_FieldHelpLabel.AddToClassList("unity-treeview-searchbar-hidden");

            var query = evt.newValue;

            if (string.IsNullOrEmpty(query))
            {
                m_FieldHelpLabel.RemoveFromClassList("unity-treeview-searchbar-hidden");
                return;
            }

            var items = m_ParentTreeView.treeItems;

            if (items == null)
            {
                return;
            }

            m_CurrentFilter = ElementHierarchySearchBarFilter.All;

            if (query.StartsWith(BuilderConstants.UssSelectorNameSymbol))
            {
                m_CurrentFilter = ElementHierarchySearchBarFilter.Name;
            }
            else if (query.StartsWith(BuilderConstants.UssSelectorClassNameSymbol))
            {
                m_CurrentFilter = ElementHierarchySearchBarFilter.Class;
            }

            if ((m_CurrentFilter & ElementHierarchySearchBarFilter.All) != ElementHierarchySearchBarFilter.All)
            {
                query = query.Remove(0, 1);
            }

            m_CurrentQuery = query;
            foreach (var item in items)
            {
                var treeItem = item as TreeViewItem <VisualElement>;
                var element  = treeItem.data;

                if (m_CurrentFilter == ElementHierarchySearchBarFilter.All &&
                    element.typeName.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    m_FoundItems.Add(new SearchResultItem()
                    {
                        item = treeItem, highlight = SearchHighlight.Type
                    });
                }

                if ((m_CurrentFilter & ElementHierarchySearchBarFilter.Name) != 0 &&
                    element.name.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    m_FoundItems.Add(new SearchResultItem()
                    {
                        item = treeItem, highlight = SearchHighlight.Name
                    });
                }

                if ((m_CurrentFilter & ElementHierarchySearchBarFilter.Class) != 0)
                {
                    foreach (var styleClass in element.GetClasses())
                    {
                        if (styleClass.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0)
                        {
                            m_FoundItems.Add(new SearchResultItem()
                            {
                                item = treeItem, highlight = SearchHighlight.Class
                            });
                            break;
                        }
                    }
                }
            }

            if (m_FoundItems.Count == 0)
            {
                return;
            }

            m_CountLabel.RemoveFromClassList("unity-treeview-searchbar-hidden");
            m_CountLabel.text =
                string.Format("{0} of {1}", m_SelectedIndex + 1, m_FoundItems.Count);

            var firstItem = m_FoundItems.First();

            m_ParentTreeView.SelectElement(firstItem.item.data, query, firstItem.highlight);
        }