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; }