Example #1
0
        private static void FindReferencesForNavigation(object searchTarget, bool findNext)
        {
            var navLoop = ReferenceNavigationLoop.New(searchTarget);
            var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor(true, false);
            var solution = IdeApp.ProjectOperations.CurrentSelectedSolution;

            // find out where we are so that we can make an educated guess for which result to navigate to next
            var currentCaret = NavigationTools.GetCaretInActiveDocument();
            var fileName = IdeApp.Workbench.ActiveDocument.FileName;

            ThreadPool.QueueUserWorkItem(delegate {
                try
                {
                    bool droppedMarker = false;

                    foreach (var mref in ReferenceFinder.FindReferences(solution, searchTarget, true, ReferenceFinder.RefactoryScope.Unknown, monitor))
                    {
                        var navItem = new NavigationItem(mref.FileName, mref.Region.BeginLine, mref.Region.BeginColumn);
                        navLoop.Items.Add(navItem);

                        if (mref.FileName == fileName)
                        {
                            // TODO: need to check column as well as line number
                            bool candidateForNavigation = findNext ? currentCaret.Line < mref.Region.BeginLine : currentCaret.Line > mref.Region.BeginLine;

                            if (!droppedMarker && candidateForNavigation)
                            {
                                droppedMarker = true;

                                DispatchService.GuiDispatch(() => {
                                    NavigationTools.DropMarkerAtCaret();
                                    IdeApp.Workbench.OpenDocument(mref.FileName, mref.Region.BeginLine, mref.Region.BeginColumn);
                                    navLoop.MakeCurrent(navItem);
                                });
                            }
                        }

                        monitor.ReportResult(mref);
                    }

                    if (!droppedMarker && navLoop.Items.Count > 0)
                    {
                        var navItem = findNext ? navLoop.Next() : navLoop.Prev();

                        DispatchService.GuiDispatch(() => {
                            NavigationTools.DropMarkerAtCaret();
                            IdeApp.Workbench.OpenDocument(navItem.FileName, navItem.Line, navItem.Col);
                        });
                    }
                }
                catch(Exception ex)
                {
                    if (monitor != null)
                    {
                        monitor.ReportError("Error finding references", ex);
                    }
                    else
                    {
                        LoggingService.LogError("Error finding references", ex);
                    }
                }
                finally
                {
                    if (monitor != null)
                    {
                        monitor.Dispose();
                    }
                }
            });
        }
        public void MakeCurrent(NavigationItem item)
        {
            var index = this.Items.IndexOf(item);
            if (index < 0)
            {
                throw new InvalidOperationException("item is not in this navigation loop");
            }

            this.currentIndex = index;
        }