diff --git a/src/CodeNav.OutOfProc/Languages/CSharp/Mappers/ClassMapper.cs b/src/CodeNav.OutOfProc/Languages/CSharp/Mappers/ClassMapper.cs index 07c56b9..9da7c84 100644 --- a/src/CodeNav.OutOfProc/Languages/CSharp/Mappers/ClassMapper.cs +++ b/src/CodeNav.OutOfProc/Languages/CSharp/Mappers/ClassMapper.cs @@ -70,7 +70,7 @@ public static CodeClassItem MapClass(ClassDeclarationSyntax member, { // If it is part of a region, add the implemented interface item to the region, add the member to the interface item var regionItem = RegionMapper.GetRegion(regions, implementedInterfaceItemMember); - AddImplementedInterfaceMember(regionItem, implementedInterfaceItem, implementedInterfaceItemMember); + AddImplementedInterfaceMember(regionItem!, implementedInterfaceItem, implementedInterfaceItemMember); } else { diff --git a/src/CodeNav.OutOfProc/Services/CodeDocumentService.cs b/src/CodeNav.OutOfProc/Services/CodeDocumentService.cs index 67cfcb9..1a633be 100644 --- a/src/CodeNav.OutOfProc/Services/CodeDocumentService.cs +++ b/src/CodeNav.OutOfProc/Services/CodeDocumentService.cs @@ -5,6 +5,7 @@ using CodeNav.OutOfProc.Models; using CodeNav.OutOfProc.ViewModels; using Microsoft.VisualStudio.Extensibility; +using Microsoft.VisualStudio.Extensibility.ToolWindows; using Microsoft.VisualStudio.Extensibility.UI; using System.Windows; @@ -36,6 +37,8 @@ public class CodeDocumentService( public OutliningService OutliningService => outliningService; + public ToolWindow? ToolWindow { get; set; } + public async Task UpdateCodeDocumentViewModel( VisualStudioExtensibility? extensibility, string? filePath, @@ -80,9 +83,16 @@ public async Task UpdateCodeDocumentViewModel( if (!codeItems.Any()) { CodeDocumentViewModel.CodeItems = PlaceholderHelper.CreateNoCodeItemsFound(); + + // No code items found, hide the tool window after showing the "No code items found" message + await HideToolWindow(cancellationToken); + return CodeDocumentViewModel; } + // Code items were found, make sure the tool window is visible + await ShowToolWindow(cancellationToken); + // Sort the list of code items, // And update the DataContext for the tool window CodeDocumentViewModel.CodeItems = SortHelper.Sort(codeItems, CodeDocumentViewModel.SortOrder); @@ -204,4 +214,24 @@ public async Task LoadGlobalSettings(bool readFromDisk = false) await LogHelper.LogException(this, "Error loading global settings", e); } } + + private async Task HideToolWindow(CancellationToken cancellationToken) + { + if (ToolWindow == null) + { + return; + } + + await ToolWindow.HideAsync(cancellationToken); + } + + private async Task ShowToolWindow(CancellationToken cancellationToken) + { + if (ToolWindow == null) + { + return; + } + + await ToolWindow.ShowAsync(activate: false, cancellationToken); + } } diff --git a/src/CodeNav.OutOfProc/ToolWindows/CodeNavToolWindow.cs b/src/CodeNav.OutOfProc/ToolWindows/CodeNavToolWindow.cs index 2a386da..7d7af86 100644 --- a/src/CodeNav.OutOfProc/ToolWindows/CodeNavToolWindow.cs +++ b/src/CodeNav.OutOfProc/ToolWindows/CodeNavToolWindow.cs @@ -6,7 +6,7 @@ namespace CodeNav.OutOfProc.ToolWindows; [VisualStudioContribution] -internal class CodeNavToolWindow(CodeDocumentService documentService) : ToolWindow +internal class CodeNavToolWindow(CodeDocumentService codeDocumentService) : ToolWindow { public override ToolWindowConfiguration ToolWindowConfiguration => new() { @@ -20,9 +20,11 @@ public override Task InitializeAsync(CancellationToken cancellationToken) { Title = "CodeNav"; + codeDocumentService.ToolWindow = this; + return Task.CompletedTask; } public override Task GetContentAsync(CancellationToken cancellationToken) - => Task.FromResult(new CodeNavToolWindowControl(documentService.CodeDocumentViewModel)); + => Task.FromResult(new CodeNavToolWindowControl(codeDocumentService.CodeDocumentViewModel)); } diff --git a/src/CodeNav/Services/TextViewService.cs b/src/CodeNav/Services/TextViewService.cs index e7dca15..46e0e86 100644 --- a/src/CodeNav/Services/TextViewService.cs +++ b/src/CodeNav/Services/TextViewService.cs @@ -140,8 +140,13 @@ private async Task GetCurrentNativeTextViewAsync() /// Gets the text view from the window frame. /// /// if the window isn't a document window. - private async Task GetTextView(IVsWindowFrame windowFrame) + private async Task GetTextView(IVsWindowFrame? windowFrame) { + if (windowFrame == null) + { + return null; + } + try { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();