From 0c55dff1fc53b845ed221692e97fb0397bf49f41 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 7 Mar 2020 22:50:50 +0100 Subject: [PATCH] Fix #1948: Toolbar loses focus when changing language/version --- ILSpy/Languages/Languages.cs | 10 ++++++++ ILSpy/MainWindow.xaml.cs | 38 +++++++++++++++++++++++++---- ILSpy/TreeNodes/EventTreeNode.cs | 3 +-- ILSpy/TreeNodes/FieldTreeNode.cs | 3 +-- ILSpy/TreeNodes/MethodTreeNode.cs | 3 +-- ILSpy/TreeNodes/PropertyTreeNode.cs | 3 +-- ILSpy/TreeNodes/TypeTreeNode.cs | 3 +-- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/ILSpy/Languages/Languages.cs b/ILSpy/Languages/Languages.cs index d8ef5b8ff..f8c70f46a 100644 --- a/ILSpy/Languages/Languages.cs +++ b/ILSpy/Languages/Languages.cs @@ -60,5 +60,15 @@ namespace ICSharpCode.ILSpy { return AllLanguages.FirstOrDefault(l => l.Name == name) ?? AllLanguages.First(); } + + static ILLanguage ilLanguage; + public static ILLanguage ILLanguage { + get { + if (ilLanguage == null) { + ilLanguage = (ILLanguage)GetLanguage("IL"); + } + return ilLanguage; + } + } } } diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs index c4d3ad19f..b72cb2454 100644 --- a/ILSpy/MainWindow.xaml.cs +++ b/ILSpy/MainWindow.xaml.cs @@ -727,7 +727,17 @@ namespace ICSharpCode.ILSpy #region Node Selection - public void SelectNode(SharpTreeNode obj, bool inNewTabPage = false) + public void SelectNode(SharpTreeNode obj) + { + SelectNode(obj, false); + } + + public void SelectNode(SharpTreeNode obj, bool inNewTabPage) + { + SelectNode(obj, inNewTabPage, true); + } + + public void SelectNode(SharpTreeNode obj, bool inNewTabPage, bool setFocus) { if (obj != null) { if (!obj.AncestorsAndSelf().Any(node => node.IsHidden)) { @@ -742,7 +752,11 @@ namespace ICSharpCode.ILSpy } // Set both the selection and focus to ensure that keyboard navigation works as expected. - AssemblyTreeView.FocusNode(obj); + if (setFocus) { + AssemblyTreeView.FocusNode(obj); + } else { + AssemblyTreeView.ScrollIntoView(obj); + } AssemblyTreeView.SelectedItem = obj; } else { MessageBox.Show("Navigation failed because the target is hidden or a compiler-generated class.\n" + @@ -753,7 +767,17 @@ namespace ICSharpCode.ILSpy } } - public void SelectNodes(IEnumerable nodes, bool inNewTabPage = false) + public void SelectNodes(IEnumerable nodes) + { + SelectNodes(nodes, false); + } + + public void SelectNodes(IEnumerable nodes, bool inNewTabPage) + { + SelectNodes(nodes, inNewTabPage, true); + } + + public void SelectNodes(IEnumerable nodes, bool inNewTabPage, bool setFocus) { if (nodes.Any() && nodes.All(n => !n.AncestorsAndSelf().Any(a => a.IsHidden))) { if (inNewTabPage) { @@ -765,7 +789,11 @@ namespace ICSharpCode.ILSpy DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); } - AssemblyTreeView.FocusNode(nodes.First()); + if (setFocus) { + AssemblyTreeView.FocusNode(nodes.First()); + } else { + AssemblyTreeView.ScrollIntoView(nodes.First()); + } AssemblyTreeView.SetSelectedNodes(nodes); } } @@ -998,7 +1026,7 @@ namespace ICSharpCode.ILSpy refreshInProgress = true; var path = GetPathForNode(AssemblyTreeView.SelectedItem as SharpTreeNode); ShowAssemblyList(AssemblyListManager.LoadList(ILSpySettings.Load(), assemblyList.ListName)); - SelectNode(FindNodeByPath(path, true)); + SelectNode(FindNodeByPath(path, true), false, false); } finally { refreshInProgress = false; } diff --git a/ILSpy/TreeNodes/EventTreeNode.cs b/ILSpy/TreeNodes/EventTreeNode.cs index 5a4468fd5..e8f9b6e4f 100644 --- a/ILSpy/TreeNodes/EventTreeNode.cs +++ b/ILSpy/TreeNodes/EventTreeNode.cs @@ -89,8 +89,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override string ToString() { - int token = System.Reflection.Metadata.Ecma335.MetadataTokens.GetToken(EventDefinition.MetadataToken); - return "@" + token.ToString("X8"); + return EventDefinition.Name; } } } diff --git a/ILSpy/TreeNodes/FieldTreeNode.cs b/ILSpy/TreeNodes/FieldTreeNode.cs index 75255c6a2..ceb7c046e 100644 --- a/ILSpy/TreeNodes/FieldTreeNode.cs +++ b/ILSpy/TreeNodes/FieldTreeNode.cs @@ -90,8 +90,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override string ToString() { - int token = System.Reflection.Metadata.Ecma335.MetadataTokens.GetToken(FieldDefinition.MetadataToken); - return "@" + token.ToString("X8"); + return FieldDefinition.Name; } } } diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index db7f72254..ed743dc56 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -115,8 +115,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override string ToString() { - int token = System.Reflection.Metadata.Ecma335.MetadataTokens.GetToken(MethodDefinition.MetadataToken); - return "@" + token.ToString("X8"); + return Languages.ILLanguage.MethodToString(MethodDefinition, false, false, false); } } } diff --git a/ILSpy/TreeNodes/PropertyTreeNode.cs b/ILSpy/TreeNodes/PropertyTreeNode.cs index ede31f5bd..a9df0df87 100644 --- a/ILSpy/TreeNodes/PropertyTreeNode.cs +++ b/ILSpy/TreeNodes/PropertyTreeNode.cs @@ -96,8 +96,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override string ToString() { - int token = System.Reflection.Metadata.Ecma335.MetadataTokens.GetToken(PropertyDefinition.MetadataToken); - return "@" + token.ToString("X8"); + return Languages.ILLanguage.PropertyToString(PropertyDefinition, false, false, false); } } } diff --git a/ILSpy/TreeNodes/TypeTreeNode.cs b/ILSpy/TreeNodes/TypeTreeNode.cs index 3a65fc385..1d6fef38c 100644 --- a/ILSpy/TreeNodes/TypeTreeNode.cs +++ b/ILSpy/TreeNodes/TypeTreeNode.cs @@ -157,8 +157,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override string ToString() { - int token = System.Reflection.Metadata.Ecma335.MetadataTokens.GetToken(TypeDefinition.MetadataToken); - return "@" + token.ToString("X8"); + return TypeDefinition.ReflectionName; } } }