diff --git a/src/EditorFeatures/Core/Host/IStreamingFindReferencesPresenter.cs b/src/EditorFeatures/Core/Host/IStreamingFindReferencesPresenter.cs index 5d308bd6f0fcc1385ea53bd113e88a7aa945eed1..b1660368409cf4117b26772731d65f828374dc2d 100644 --- a/src/EditorFeatures/Core/Host/IStreamingFindReferencesPresenter.cs +++ b/src/EditorFeatures/Core/Host/IStreamingFindReferencesPresenter.cs @@ -53,7 +53,7 @@ internal static class IStreamingFindUsagesPresenterExtensions var externalItems = definitions.WhereAsArray(d => d.IsExternal); foreach (var item in externalItems) { - if (item.TryNavigateTo()) + if (item.TryNavigateTo(isPreview: true)) { return true; } @@ -69,7 +69,7 @@ internal static class IStreamingFindUsagesPresenterExtensions nonExternalItems[0].SourceSpans.Length <= 1) { // There was only one location to navigate to. Just directly go to that location. - return nonExternalItems[0].TryNavigateTo(); + return nonExternalItems[0].TryNavigateTo(isPreview: true); } if (presenter != null) diff --git a/src/Features/Core/Portable/DocumentSpan.cs b/src/Features/Core/Portable/DocumentSpan.cs index d8e577ce03322f5433f9f609a34cc763f1091836..b5a9b1dfda050994a2f2487ba1165d007580e5a3 100644 --- a/src/Features/Core/Portable/DocumentSpan.cs +++ b/src/Features/Core/Portable/DocumentSpan.cs @@ -52,13 +52,13 @@ public static bool CanNavigateTo(this DocumentSpan documentSpan) return service.CanNavigateToSpan(workspace, documentSpan.Document.Id, documentSpan.SourceSpan); } - public static bool TryNavigateTo(this DocumentSpan documentSpan) + public static bool TryNavigateTo(this DocumentSpan documentSpan, bool isPreview) { var solution = documentSpan.Document.Project.Solution; var workspace = solution.Workspace; var service = workspace.Services.GetService(); return service.TryNavigateToSpan(workspace, documentSpan.Document.Id, documentSpan.SourceSpan, - options: solution.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, true)); + options: solution.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, isPreview)); } public static async Task IsHiddenAsync( diff --git a/src/Features/Core/Portable/FindUsages/DefinitionItem.DocumentLocationDefinitionItem.cs b/src/Features/Core/Portable/FindUsages/DefinitionItem.DocumentLocationDefinitionItem.cs index e5a303aecee9629288e0278bd948cdd2d7b1603a..a51a948b38387dae4c463da05cf26a1f7552b6c1 100644 --- a/src/Features/Core/Portable/FindUsages/DefinitionItem.DocumentLocationDefinitionItem.cs +++ b/src/Features/Core/Portable/FindUsages/DefinitionItem.DocumentLocationDefinitionItem.cs @@ -29,7 +29,7 @@ internal sealed class DocumentLocationDefinitionItem : DefinitionItem } public override bool CanNavigateTo() => SourceSpans[0].CanNavigateTo(); - public override bool TryNavigateTo() => SourceSpans[0].TryNavigateTo(); + public override bool TryNavigateTo(bool isPreview) => SourceSpans[0].TryNavigateTo(isPreview); } } } \ No newline at end of file diff --git a/src/Features/Core/Portable/FindUsages/DefinitionItem.NonNavigatingDefinitionItem.cs b/src/Features/Core/Portable/FindUsages/DefinitionItem.NonNavigatingDefinitionItem.cs index 67c9381fb44831bd0078420bea80ba9ac7e377bd..dd27809c524de5cb8ac19c9d45958eb842feb075 100644 --- a/src/Features/Core/Portable/FindUsages/DefinitionItem.NonNavigatingDefinitionItem.cs +++ b/src/Features/Core/Portable/FindUsages/DefinitionItem.NonNavigatingDefinitionItem.cs @@ -28,7 +28,7 @@ private sealed class NonNavigatingDefinitionItem : DefinitionItem } public override bool CanNavigateTo() => false; - public override bool TryNavigateTo() => false; + public override bool TryNavigateTo(bool isPreview) => false; } } } \ No newline at end of file diff --git a/src/Features/Core/Portable/FindUsages/DefinitionItem.SymbolDefinitionItem.cs b/src/Features/Core/Portable/FindUsages/DefinitionItem.SymbolDefinitionItem.cs index 0e94223c7824b3130121d24eb09e48eeb4c78634..e1da86057571e71f63b3fef9ac193c80f02cd248 100644 --- a/src/Features/Core/Portable/FindUsages/DefinitionItem.SymbolDefinitionItem.cs +++ b/src/Features/Core/Portable/FindUsages/DefinitionItem.SymbolDefinitionItem.cs @@ -48,11 +48,11 @@ private sealed class MetadataDefinitionItem : DefinitionItem public override bool CanNavigateTo() => TryNavigateTo((symbol, project, service) => true); - public override bool TryNavigateTo() + public override bool TryNavigateTo(bool isPreview) { return TryNavigateTo((symbol, project, service) => service.TryNavigateToSymbol( - symbol, project, project.Solution.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, true))); + symbol, project, project.Solution.Options.WithChangedOption(NavigationOptions.PreferProvisionalTab, isPreview))); } private bool TryNavigateTo(Func action) diff --git a/src/Features/Core/Portable/FindUsages/DefinitionItem.cs b/src/Features/Core/Portable/FindUsages/DefinitionItem.cs index b9ff5667b7b1615b41f8d9e2d1845c68c9a1441a..039fc07a01fbe3c87f1fd22f51a189385e7d4569 100644 --- a/src/Features/Core/Portable/FindUsages/DefinitionItem.cs +++ b/src/Features/Core/Portable/FindUsages/DefinitionItem.cs @@ -87,7 +87,7 @@ internal abstract partial class DefinitionItem } public abstract bool CanNavigateTo(); - public abstract bool TryNavigateTo(); + public abstract bool TryNavigateTo(bool isPreview); public static DefinitionItem Create( ImmutableArray tags, diff --git a/src/VisualStudio/Core/Def/Implementation/FindReferences/VisualStudioDefinitionsAndReferencesFactory.cs b/src/VisualStudio/Core/Def/Implementation/FindReferences/VisualStudioDefinitionsAndReferencesFactory.cs index cadc2cc36879546df16d8d2441fe9948ab8a1edd..926b169e585c2c23525a97698f16c9e709d19cde 100644 --- a/src/VisualStudio/Core/Def/Implementation/FindReferences/VisualStudioDefinitionsAndReferencesFactory.cs +++ b/src/VisualStudio/Core/Def/Implementation/FindReferences/VisualStudioDefinitionsAndReferencesFactory.cs @@ -108,7 +108,7 @@ private class ExternalDefinitionItem : DefinitionItem public override bool CanNavigateTo() => true; - public override bool TryNavigateTo() + public override bool TryNavigateTo(bool isPreview) { return TryOpenFile() && TryNavigateToPosition(); } diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs index ad63ca8c6b79c44191a4867202b0421346abec2f..668fe9aecce088695d4961e4252cd4e96b122f4b 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs @@ -49,7 +49,7 @@ private string CreateDisplayText() public override int GoToSource() { - return _definitionItem.TryNavigateTo() + return _definitionItem.TryNavigateTo(isPreview: true) ? VSConstants.S_OK : VSConstants.E_FAIL; } diff --git a/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentNavigationService.cs b/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentNavigationService.cs index 87c91a7443ef8d60ea401beef66b2a67260030a5..f6fea9c666fab64ae338babb6a8499fb3f85a573 100644 --- a/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentNavigationService.cs +++ b/src/VisualStudio/Core/Def/Implementation/Workspace/VisualStudioDocumentNavigationService.cs @@ -275,7 +275,11 @@ private static Document OpenDocument(Workspace workspace, DocumentId documentId, { if (options.GetOption(NavigationOptions.PreferProvisionalTab)) { - using (NewDocumentStateScope ndss = new NewDocumentStateScope(__VSNEWDOCUMENTSTATE.NDS_Provisional, VSConstants.NewDocumentStateReason.Navigation)) + // If we're just opening the provisional tab, then do not "activate" the document + // (i.e. don't give it focus). This way if a user is just arrowing through a set + // of FindAllReferences results, they don't have their cursor placed into the document. + var state = __VSNEWDOCUMENTSTATE.NDS_Provisional | __VSNEWDOCUMENTSTATE.NDS_NoActivate; + using (var scope = new NewDocumentStateScope(state, VSConstants.NewDocumentStateReason.Navigation)) { workspace.OpenDocument(documentId); } diff --git a/src/VisualStudio/Core/Next/FindReferences/FindReferencesTableControlEventProcessorProvider.cs b/src/VisualStudio/Core/Next/FindReferences/FindReferencesTableControlEventProcessorProvider.cs index fadb3cff5e17f1c79518227ead654db1b7485607..0ef92fde3e93f119df9a3f0ec57471a55fb985af 100644 --- a/src/VisualStudio/Core/Next/FindReferences/FindReferencesTableControlEventProcessorProvider.cs +++ b/src/VisualStudio/Core/Next/FindReferences/FindReferencesTableControlEventProcessorProvider.cs @@ -33,7 +33,7 @@ public override void PreprocessNavigate(ITableEntryHandle entry, TableEntryNavig var supportsNavigation = entry.Identity as ISupportsNavigation; if (supportsNavigation != null) { - if (supportsNavigation.TryNavigateTo()) + if (supportsNavigation.TryNavigateTo(e.IsPreview)) { e.Handled = true; return; diff --git a/src/VisualStudio/Core/Next/FindReferences/ISupportsNavigation.cs b/src/VisualStudio/Core/Next/FindReferences/ISupportsNavigation.cs index bbd27fe9259b46c5e66b7c3fcdf319925a670948..db0a6a2e4fefdd7a0de95f6744e36d04de9c6371 100644 --- a/src/VisualStudio/Core/Next/FindReferences/ISupportsNavigation.cs +++ b/src/VisualStudio/Core/Next/FindReferences/ISupportsNavigation.cs @@ -4,6 +4,6 @@ namespace Microsoft.VisualStudio.LanguageServices.FindUsages { internal interface ISupportsNavigation { - bool TryNavigateTo(); + bool TryNavigateTo(bool isPreview); } } \ No newline at end of file diff --git a/src/VisualStudio/Core/Next/FindReferences/RoslynDefinitionBucket.cs b/src/VisualStudio/Core/Next/FindReferences/RoslynDefinitionBucket.cs index fbeedb1f129de13887b443cb155b8c8687456e94..9faaf0f2219166b8f323adb3cea432eb81116232 100644 --- a/src/VisualStudio/Core/Next/FindReferences/RoslynDefinitionBucket.cs +++ b/src/VisualStudio/Core/Next/FindReferences/RoslynDefinitionBucket.cs @@ -34,9 +34,9 @@ private class RoslynDefinitionBucket : DefinitionBucket, ISupportsNavigation DefinitionItem = definitionItem; } - public bool TryNavigateTo() + public bool TryNavigateTo(bool isPreview) { - return DefinitionItem.TryNavigateTo(); + return DefinitionItem.TryNavigateTo(isPreview); } public override bool TryGetValue(string key, out object content)