예제 #1
0
        private void BrowseAndExpandMember()
        {
            object member = _searchPath.FirstOrDefault();

            if (member == null)
            {
                CurrentTreeView.Focus();
                _currentSearchNode.EnsureVisible();
                CurrentTreeView.SelectedNode = _currentSearchNode;

                MainForm.HandleExpand = true;
                return;
            }

            if (member is TypeDef)
            {
                _currentSearchNode =
                    _currentSearchNode.Nodes.Cast <TreeNode>().First(n => n.Text == NewType(member as TypeDef).Text);

                _currentSearchNode.Expand();
            }
            else if (member is MethodDef)
            {
                var method = (MethodDef)member;

                TreeNode newNode = _currentSearchNode.Nodes.Cast <TreeNode>().FirstOrDefault(n => n.Text == NewMethod(method).Text);

                if (newNode != null)
                {
                    _currentSearchNode = newNode;
                }
                else
                {
                    foreach (TreeNode node in _currentSearchNode.Nodes.Cast <TreeNode>().Where(n => n.Tag is PropertyDef || n.Tag is EventDef))
                    {
                        newNode = node.Nodes.Cast <TreeNode>().FirstOrDefault(n => n.Text == NewMethod(method).Text);

                        if (newNode != null)
                        {
                            _currentSearchNode = newNode;
                            break;
                        }
                    }

                    if (newNode == null)
                    {
                        _searchPath.Clear();
                        BrowseAndExpandMember();
                    }
                }

                treeView_NodeMouseClick(this,
                                        new TreeNodeMouseClickEventArgs(_currentSearchNode, MouseButtons.Left, 1,
                                                                        _currentSearchNode.Bounds.X, _currentSearchNode.Bounds.Y));

                DataGridViewHandler.SelectTab();
            }
            else if (member is FieldDef)
            {
                _currentSearchNode =
                    _currentSearchNode.Nodes.Cast <TreeNode>().First(n => n.Text == NewField(member as FieldDef).Text);

                treeView_NodeMouseClick(this,
                                        new TreeNodeMouseClickEventArgs(_currentSearchNode, MouseButtons.Left, 1,
                                                                        _currentSearchNode.Bounds.X, _currentSearchNode.Bounds.Y));

                DataGridViewHandler.SelectTab();
            }
            else if (member is PropertyDef)
            {
                _currentSearchNode =
                    _currentSearchNode.Nodes.Cast <TreeNode>().First(n => n.Text == NewProperty(member as PropertyDef).Text);

                _currentSearchNode.Expand();
            }
            else if (member is EventDef)
            {
                _currentSearchNode =
                    _currentSearchNode.Nodes.Cast <TreeNode>().First(n => n.Text == NewEvent(member as EventDef).Text);

                _currentSearchNode.Expand();
            }

            _searchPath.RemoveAt(0);

            if (_currentSearchNode.HasVirtualNode())
            {
                var processor = new NodeDevirtualizer(_currentSearchNode, this);
                processor.WorkerFinished += searchProcessor_WorkerFinished;
                processor.ProcessNode();
                VirtualNodeHandler.VirtualNodes--;
                _currentSearchNode.Nodes.Remove(_currentSearchNode.FindVirtualNode());
            }
            else
            {
                BrowseAndExpandMember();
            }
        }