From 6545fb3c8d27cc57354707f6ba3a3b3460756547 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 21 Sep 2018 08:57:04 +0200 Subject: [PATCH] Fix #1264: Always show 'Open containing folder' --- ILSpy/TreeNodes/AssemblyTreeNode.cs | 36 ++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index b0e215f9b..0f152f215 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -443,7 +443,20 @@ namespace ICSharpCode.ILSpy.TreeNodes if (context.SelectedTreeNodes == null) return false; return context.SelectedTreeNodes - .All(n => n is AssemblyTreeNode a && File.Exists(a.LoadedAssembly.FileName)); + .All(n => { + var a = GetAssemblyTreeNode(n); + return a != null && File.Exists(a.LoadedAssembly.FileName); + }); + } + + internal static AssemblyTreeNode GetAssemblyTreeNode(SharpTreeNode node) + { + while (node != null) { + if (node is AssemblyTreeNode a) + return a; + node = node.Parent; + } + return null; } public bool IsEnabled(TextViewContext context) @@ -451,14 +464,18 @@ namespace ICSharpCode.ILSpy.TreeNodes if (context.SelectedTreeNodes == null) return false; return context.SelectedTreeNodes - .All(n => n is AssemblyTreeNode a && File.Exists(a.LoadedAssembly.FileName)); + .All(n => { + var a = GetAssemblyTreeNode(n); + return a != null && File.Exists(a.LoadedAssembly.FileName); + }); } public void Execute(TextViewContext context) { if (context.SelectedTreeNodes == null) return; - foreach (var node in context.SelectedTreeNodes.OfType()) { + foreach (var n in context.SelectedTreeNodes) { + var node = GetAssemblyTreeNode(n); var path = node.LoadedAssembly.FileName; if (File.Exists(path)) { MainWindow.ExecuteCommand("explorer.exe", $"/select,\"{path}\""); @@ -475,7 +492,10 @@ namespace ICSharpCode.ILSpy.TreeNodes if (context.SelectedTreeNodes == null) return false; return context.SelectedTreeNodes - .All(n => n is AssemblyTreeNode a && File.Exists(a.LoadedAssembly.FileName)); + .All(n => { + var a = OpenContainingFolder.GetAssemblyTreeNode(n); + return a != null && File.Exists(a.LoadedAssembly.FileName); + }); } public bool IsEnabled(TextViewContext context) @@ -483,14 +503,18 @@ namespace ICSharpCode.ILSpy.TreeNodes if (context.SelectedTreeNodes == null) return false; return context.SelectedTreeNodes - .All(n => n is AssemblyTreeNode a && File.Exists(a.LoadedAssembly.FileName)); + .All(n => { + var a = OpenContainingFolder.GetAssemblyTreeNode(n); + return a != null && File.Exists(a.LoadedAssembly.FileName); + }); } public void Execute(TextViewContext context) { if (context.SelectedTreeNodes == null) return; - foreach (var node in context.SelectedTreeNodes.OfType()) { + foreach (var n in context.SelectedTreeNodes) { + var node = OpenContainingFolder.GetAssemblyTreeNode(n); var path = Path.GetDirectoryName(node.LoadedAssembly.FileName); if (Directory.Exists(path)) { MainWindow.ExecuteCommand("cmd.exe", $"/k \"cd {path}\"");