Browse Source

Merge pull request #3591 from miloush/history

Navigate visible history
pull/3013/head
Siegfried Pammer 3 weeks ago committed by GitHub
parent
commit
612c5bc032
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 9
      ICSharpCode.Decompiler/Metadata/MetadataFile.cs
  2. 4
      ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs
  3. 21
      ILSpy/AssemblyTree/AssemblyTreeModel.cs
  4. 13
      ILSpy/Commands/BrowseBackCommand.cs
  5. 12
      ILSpy/Commands/BrowseForwardCommand.cs
  6. 7
      ILSpy/Commands/SimpleCommand.cs
  7. 104
      ILSpy/Controls/MainToolBar.xaml.cs
  8. 2
      ILSpy/Metadata/CoffHeaderTreeNode.cs
  9. 2
      ILSpy/Metadata/DataDirectoriesTreeNode.cs
  10. 2
      ILSpy/Metadata/DebugDirectory/DebugDirectoryEntryTreeNode.cs
  11. 2
      ILSpy/Metadata/DebugDirectoryTreeNode.cs
  12. 2
      ILSpy/Metadata/DebugMetadataTablesTreeNode.cs
  13. 2
      ILSpy/Metadata/DosHeaderTreeNode.cs
  14. 2
      ILSpy/Metadata/MetadataHeapTreeNode.cs
  15. 2
      ILSpy/Metadata/MetadataTableTreeNode.cs
  16. 2
      ILSpy/Metadata/MetadataTablesTreeNode.cs
  17. 2
      ILSpy/Metadata/MetadataTreeNode.cs
  18. 2
      ILSpy/Metadata/OptionalHeaderTreeNode.cs
  19. 3
      ILSpy/NavigationHistory.cs
  20. 16
      ILSpy/NavigationState.cs
  21. 9
      ILSpy/Properties/Resources.Designer.cs
  22. 3
      ILSpy/Properties/Resources.resx
  23. 6
      ILSpy/Themes/ThemeManager.cs
  24. 2
      ILSpy/TreeNodes/AssemblyReferenceReferencedTypesTreeNode.cs
  25. 2
      ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs
  26. 2
      ILSpy/TreeNodes/BaseTypesEntryNode.cs
  27. 2
      ILSpy/TreeNodes/BaseTypesTreeNode.cs
  28. 2
      ILSpy/TreeNodes/DerivedTypesEntryNode.cs
  29. 2
      ILSpy/TreeNodes/DerivedTypesTreeNode.cs
  30. 6
      ILSpy/TreeNodes/EventTreeNode.cs
  31. 6
      ILSpy/TreeNodes/FieldTreeNode.cs
  32. 2
      ILSpy/TreeNodes/MemberReferenceTreeNode.cs
  33. 6
      ILSpy/TreeNodes/MethodTreeNode.cs
  34. 2
      ILSpy/TreeNodes/ModuleReferenceTreeNode.cs
  35. 6
      ILSpy/TreeNodes/PropertyTreeNode.cs
  36. 2
      ILSpy/TreeNodes/ReferenceFolderTreeNode.cs
  37. 2
      ILSpy/TreeNodes/ResourceListTreeNode.cs
  38. 2
      ILSpy/TreeNodes/TypeReferenceTreeNode.cs
  39. 3
      ILSpy/TreeNodes/TypeTreeNode.cs

9
ICSharpCode.Decompiler/Metadata/MetadataFile.cs

@ -73,9 +73,12 @@ namespace ICSharpCode.Decompiler.Metadata
if (value == null) if (value == null)
{ {
var metadata = Metadata; var metadata = Metadata;
value = metadata.IsAssembly if (metadata.IsAssembly)
? metadata.GetString(metadata.GetAssemblyDefinition().Name) value = metadata.GetString(metadata.GetAssemblyDefinition().Name);
: metadata.GetString(metadata.GetModuleDefinition().Name); else if (metadata.DebugMetadataHeader == null) // standalone debug metadata does not contain module table
value = metadata.GetString(metadata.GetModuleDefinition().Name);
else
value = "debug metadata";
value = LazyInit.GetOrSet(ref name, value); value = LazyInit.GetOrSet(ref name, value);
} }
return value; return value;

4
ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs

@ -126,6 +126,10 @@ namespace ICSharpCode.ILSpyX.TreeView
get { return null; } get { return null; }
} }
public virtual object? NavigationText {
get { return Text; }
}
public virtual object? Icon { public virtual object? Icon {
get { return null; } get { return null; }
} }

21
ILSpy/AssemblyTree/AssemblyTreeModel.cs

@ -853,15 +853,24 @@ namespace ICSharpCode.ILSpy.AssemblyTree
#endregion #endregion
public void NavigateHistory(bool forward) public void NavigateHistory(bool forward, NavigationState? toState = null)
{ {
try try
{ {
TabPageModel tabPage = DockWorkspace.ActiveTabPage; TabPageModel tabPage = DockWorkspace.ActiveTabPage;
var state = tabPage.GetState(); var currentState = tabPage.GetState();
if (state != null) if (currentState != null)
history.UpdateCurrent(new NavigationState(tabPage, state)); history.UpdateCurrent(new NavigationState(tabPage, currentState));
var newState = forward ? history.GoForward() : history.GoBack();
NavigationState newState;
do
{
newState = forward ? history.GoForward() : history.GoBack();
} while (newState != null && toState != null && toState != newState);
if (newState == null)
return;
navigatingToState = newState; navigatingToState = newState;
TabPageModel activeTabPage = newState.TabPage; TabPageModel activeTabPage = newState.TabPage;
@ -884,6 +893,8 @@ namespace ICSharpCode.ILSpy.AssemblyTree
} }
} }
public NavigationState[] GetNavigateHistory(bool forward) => forward ? history.ForwardList : history.BackList;
public bool CanNavigateBack => history.CanNavigateBack; public bool CanNavigateBack => history.CanNavigateBack;
public bool CanNavigateForward => history.CanNavigateForward; public bool CanNavigateForward => history.CanNavigateForward;

13
ILSpy/Commands/BrowseBackCommand.cs

@ -16,7 +16,9 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections;
using System.Composition; using System.Composition;
using System.Linq;
using System.Windows.Input; using System.Windows.Input;
using ICSharpCode.ILSpy.AssemblyTree; using ICSharpCode.ILSpy.AssemblyTree;
@ -26,7 +28,7 @@ namespace ICSharpCode.ILSpy
{ {
[ExportToolbarCommand(ToolTip = nameof(Resources.Back), ToolbarIcon = "Images/Back", ToolbarCategory = nameof(Resources.Navigation), ToolbarOrder = 0)] [ExportToolbarCommand(ToolTip = nameof(Resources.Back), ToolbarIcon = "Images/Back", ToolbarCategory = nameof(Resources.Navigation), ToolbarOrder = 0)]
[Shared] [Shared]
sealed class BrowseBackCommand : CommandWrapper sealed class BrowseBackCommand : CommandWrapper, IProvideParameterList
{ {
readonly AssemblyTreeModel assemblyTreeModel; readonly AssemblyTreeModel assemblyTreeModel;
@ -49,8 +51,15 @@ namespace ICSharpCode.ILSpy
if (assemblyTreeModel.CanNavigateBack) if (assemblyTreeModel.CanNavigateBack)
{ {
e.Handled = true; e.Handled = true;
assemblyTreeModel.NavigateHistory(false); assemblyTreeModel.NavigateHistory(false, e.Parameter as NavigationState);
} }
} }
public IEnumerable ParameterList => assemblyTreeModel.GetNavigateHistory(false).Reverse();
public object GetParameterText(object parameter)
{
return (parameter as NavigationState)?.NavigationText;
}
} }
} }

12
ILSpy/Commands/BrowseForwardCommand.cs

@ -16,7 +16,9 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System.Collections;
using System.Composition; using System.Composition;
using System.Linq;
using System.Windows.Input; using System.Windows.Input;
using ICSharpCode.ILSpy.AssemblyTree; using ICSharpCode.ILSpy.AssemblyTree;
@ -26,7 +28,7 @@ namespace ICSharpCode.ILSpy
{ {
[ExportToolbarCommand(ToolTip = nameof(Resources.Forward), ToolbarIcon = "Images/Forward", ToolbarCategory = nameof(Resources.Navigation), ToolbarOrder = 1)] [ExportToolbarCommand(ToolTip = nameof(Resources.Forward), ToolbarIcon = "Images/Forward", ToolbarCategory = nameof(Resources.Navigation), ToolbarOrder = 1)]
[Shared] [Shared]
sealed class BrowseForwardCommand : CommandWrapper sealed class BrowseForwardCommand : CommandWrapper, IProvideParameterList
{ {
private readonly AssemblyTreeModel assemblyTreeModel; private readonly AssemblyTreeModel assemblyTreeModel;
@ -49,9 +51,15 @@ namespace ICSharpCode.ILSpy
if (assemblyTreeModel.CanNavigateForward) if (assemblyTreeModel.CanNavigateForward)
{ {
e.Handled = true; e.Handled = true;
assemblyTreeModel.NavigateHistory(true); assemblyTreeModel.NavigateHistory(true, e.Parameter as NavigationState);
} }
} }
public IEnumerable ParameterList => assemblyTreeModel.GetNavigateHistory(true).Reverse();
public object GetParameterText(object parameter)
{
return (parameter as NavigationState)?.NavigationText;
}
} }
} }

7
ILSpy/Commands/SimpleCommand.cs

@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Collections;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
@ -41,4 +42,10 @@ namespace ICSharpCode.ILSpy
{ {
Binding ParameterBinding { get; } Binding ParameterBinding { get; }
} }
public interface IProvideParameterList
{
IEnumerable ParameterList { get; }
object GetParameterText(object parameter);
}
} }

104
ILSpy/Controls/MainToolBar.xaml.cs

@ -16,6 +16,8 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System;
using System.ComponentModel;
using System.Composition; using System.Composition;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
@ -23,9 +25,11 @@ using System.Windows.Controls;
using System.Windows.Controls.Primitives; using System.Windows.Controls.Primitives;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using ICSharpCode.ILSpy.Themes; using ICSharpCode.ILSpy.Themes;
using ICSharpCode.ILSpyX.TreeView;
using TomsToolbox.Composition; using TomsToolbox.Composition;
@ -85,7 +89,8 @@ namespace ICSharpCode.ILSpy.Controls
} }
} }
static Button CreateToolbarItem(IExport<ICommand, IToolbarCommandMetadata> commandExport)
static UIElement CreateToolbarItem(IExport<ICommand, IToolbarCommandMetadata> commandExport)
{ {
var command = commandExport.Value; var command = commandExport.Value;
@ -108,9 +113,106 @@ namespace ICSharpCode.ILSpy.Controls
parameterBinding.ParameterBinding); parameterBinding.ParameterBinding);
} }
if (command is IProvideParameterList parameterList)
{
toolbarItem.Margin = new Thickness(2, 0, 0, 0);
var dropDownPanel = new StackPanel { Orientation = Orientation.Horizontal };
var dropDownToggle = new ToggleButton {
Style = ThemeManager.Current.CreateToolBarToggleButtonStyle(),
Content = "▾",
Padding = new Thickness(0),
MinWidth = 0,
Margin = new Thickness(0, 0, 2, 0)
};
var contextMenu = new ContextMenu {
PlacementTarget = dropDownPanel,
Tag = command
};
ContextMenuService.SetPlacement(toolbarItem, PlacementMode.Bottom);
toolbarItem.ContextMenu = contextMenu;
toolbarItem.ContextMenuOpening += (_, _) =>
PrepareParameterList(contextMenu);
dropDownToggle.Checked += (_, _) => {
PrepareParameterList(contextMenu);
contextMenu.Placement = PlacementMode.Bottom;
contextMenu.SetCurrentValue(ContextMenu.IsOpenProperty, true);
};
BindingOperations.SetBinding(dropDownToggle, ToggleButton.IsCheckedProperty,
new Binding(nameof(contextMenu.IsOpen)) { Source = contextMenu });
BindingOperations.SetBinding(dropDownToggle, IsEnabledProperty,
new Binding(nameof(IsEnabled)) { Source = toolbarItem });
// When the toggle button is checked, clicking it to uncheck will dismiss the menu first
// which unchecks the toggle button via binding above and the click is used to open it again.
// This is a workaround to ignore the click to uncheck the already unchecked toggle button.
// We have to ensure the dismissing click is on the toggle button, otherwise the flag
// will not get cleared and menu will not open next time.
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(contextMenu, (_, e) => {
var point = e.GetPosition(dropDownToggle);
dropDownToggle.Tag = dropDownToggle.InputHitTest(point);
});
dropDownToggle.PreviewMouseLeftButtonDown += (_, e) => {
e.Handled = dropDownToggle.Tag != null;
dropDownToggle.Tag = null;
};
dropDownPanel.Children.Add(toolbarItem);
dropDownPanel.Children.Add(dropDownToggle);
return dropDownPanel;
}
return toolbarItem; return toolbarItem;
} }
static void PrepareParameterList(ContextMenu menu)
{
const int maximumParameterListCount = 20;
var command = (ICommand)menu.Tag;
var parameterList = (IProvideParameterList)command;
menu.Items.Clear();
foreach (var parameter in parameterList.ParameterList)
{
MenuItem parameterItem = new MenuItem();
parameterItem.Command = CommandWrapper.Unwrap(command);
parameterItem.CommandParameter = parameter;
parameterItem.CommandTarget = menu.PlacementTarget;
parameterItem.InputGestureText = " ";
var headerPresenter = new ContentPresenter { RecognizesAccessKey = false };
parameterItem.Header = headerPresenter;
var header = parameterList.GetParameterText(parameter);
switch (header)
{
case SharpTreeNode node:
headerPresenter.Content = node.NavigationText;
if (node.Icon is ImageSource icon)
parameterItem.Icon = new Image {
Width = 16,
Height = 16,
Source = icon
};
break;
default:
headerPresenter.Content = header;
break;
}
menu.Items.Add(parameterItem);
if (menu.Items.Count >= maximumParameterListCount)
break;
}
}
void MainWindow_KeyDown(object sender, KeyEventArgs e) void MainWindow_KeyDown(object sender, KeyEventArgs e)
{ {
if (e.Handled || e.KeyboardDevice.Modifiers != ModifierKeys.Alt || e.Key != Key.System) if (e.Handled || e.KeyboardDevice.Modifiers != ModifierKeys.Alt || e.Key != Key.System)

2
ILSpy/Metadata/CoffHeaderTreeNode.cs

@ -43,6 +43,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "COFF Header"; public override object Text => "COFF Header";
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.Header; public override object Icon => Images.Header;
public override bool View(TabPageModel tabPage) public override bool View(TabPageModel tabPage)

2
ILSpy/Metadata/DataDirectoriesTreeNode.cs

@ -35,6 +35,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "Data Directories"; public override object Text => "Data Directories";
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.ListFolder; public override object Icon => Images.ListFolder;
public override object ExpandedIcon => Images.ListFolderOpen; public override object ExpandedIcon => Images.ListFolderOpen;

2
ILSpy/Metadata/DebugDirectory/DebugDirectoryEntryTreeNode.cs

@ -40,6 +40,8 @@ namespace ICSharpCode.ILSpy.Metadata
override public object Text => entry.Type.ToString(); override public object Text => entry.Type.ToString();
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.MetadataTable; public override object Icon => Images.MetadataTable;
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

2
ILSpy/Metadata/DebugDirectoryTreeNode.cs

@ -40,6 +40,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "Debug Directory"; public override object Text => "Debug Directory";
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.ListFolder; public override object Icon => Images.ListFolder;
public override object ExpandedIcon => Images.ListFolderOpen; public override object ExpandedIcon => Images.ListFolderOpen;

2
ILSpy/Metadata/DebugMetadataTablesTreeNode.cs

@ -37,6 +37,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "Tables"; public override object Text => "Tables";
public override object NavigationText => $"{Text} ({metadataFile.Name})";
public override object Icon => Images.MetadataTableGroup; public override object Icon => Images.MetadataTableGroup;
protected override void LoadChildren() protected override void LoadChildren()

2
ILSpy/Metadata/DosHeaderTreeNode.cs

@ -36,6 +36,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "DOS Header"; public override object Text => "DOS Header";
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.Header; public override object Icon => Images.Header;
public override bool View(TabPageModel tabPage) public override bool View(TabPageModel tabPage)

2
ILSpy/Metadata/MetadataHeapTreeNode.cs

@ -33,6 +33,8 @@ namespace ICSharpCode.ILSpy.Metadata
public HandleKind Kind { get; } public HandleKind Kind { get; }
public override object NavigationText => $"{Text} ({metadataFile.Name})";
public override object Icon => Images.Heap; public override object Icon => Images.Heap;
public MetadataHeapTreeNode(HandleKind kind, MetadataFile metadataFile) public MetadataHeapTreeNode(HandleKind kind, MetadataFile metadataFile)

2
ILSpy/Metadata/MetadataTableTreeNode.cs

@ -39,6 +39,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => $"{(int)Kind:X2} {Kind} ({metadataFile.Metadata.GetTableRowCount(Kind)})"; public override object Text => $"{(int)Kind:X2} {Kind} ({metadataFile.Metadata.GetTableRowCount(Kind)})";
public override object NavigationText => $"{(int)Kind:X2} {Kind} ({metadataFile.Name})";
public override object Icon => Images.MetadataTable; public override object Icon => Images.MetadataTable;
public MetadataTableTreeNode(TableIndex table, MetadataFile metadataFile) public MetadataTableTreeNode(TableIndex table, MetadataFile metadataFile)

2
ILSpy/Metadata/MetadataTablesTreeNode.cs

@ -39,6 +39,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "Tables"; public override object Text => "Tables";
public override object NavigationText => $"{Text} ({metadataFile.Name})";
public override object Icon => Images.MetadataTableGroup; public override object Icon => Images.MetadataTableGroup;
protected override void LoadChildren() protected override void LoadChildren()

2
ILSpy/Metadata/MetadataTreeNode.cs

@ -45,6 +45,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => title; public override object Text => title;
public override object NavigationText => $"{Text} ({metadataFile.Name})";
public override object Icon => Images.Metadata; public override object Icon => Images.Metadata;
public override bool View(TabPageModel tabPage) public override bool View(TabPageModel tabPage)

2
ILSpy/Metadata/OptionalHeaderTreeNode.cs

@ -42,6 +42,8 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => "Optional Header"; public override object Text => "Optional Header";
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.Header; public override object Icon => Images.Header;
public override bool View(ViewModels.TabPageModel tabPage) public override bool View(ViewModels.TabPageModel tabPage)

3
ILSpy/NavigationHistory.cs

@ -34,6 +34,9 @@ namespace ICSharpCode.ILSpy
List<T> back = new List<T>(); List<T> back = new List<T>();
List<T> forward = new List<T>(); List<T> forward = new List<T>();
public T[] BackList => back.ToArray();
public T[] ForwardList => forward.ToArray();
public bool CanNavigateBack { public bool CanNavigateBack {
get { return back.Count > 0; } get { return back.Count > 0; }
} }

16
ILSpy/NavigationState.cs

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpy.ViewModels;
@ -62,5 +63,20 @@ namespace ICSharpCode.ILSpy
return this.ViewState.Equals(other.ViewState); return this.ViewState.Equals(other.ViewState);
} }
public object NavigationText {
get {
if (this.treeNodes.Count == 1)
return this.treeNodes.First();
if (this.treeNodes.Count > 0)
return string.Join(", ", treeNodes.Select(tn => tn.NavigationText));
if (this.ViewState?.ViewedUri is Uri uri)
return uri;
return ToString();
}
}
} }
} }

9
ILSpy/Properties/Resources.Designer.cs generated

@ -2401,6 +2401,15 @@ namespace ICSharpCode.ILSpy.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Referenced Types.
/// </summary>
public static string ReferencedTypes {
get {
return ResourceManager.GetString("ReferencedTypes", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Reference Name. /// Looks up a localized string similar to Reference Name.
/// </summary> /// </summary>

3
ILSpy/Properties/Resources.resx

@ -824,6 +824,9 @@ If this does not solve the problem and your system supports long paths, you can
<data name="ReferenceName" xml:space="preserve"> <data name="ReferenceName" xml:space="preserve">
<value>Reference Name</value> <value>Reference Name</value>
</data> </data>
<data name="ReferencedTypes" xml:space="preserve">
<value>Referenced Types</value>
</data>
<data name="References" xml:space="preserve"> <data name="References" xml:space="preserve">
<value>References</value> <value>References</value>
</data> </data>

6
ILSpy/Themes/ThemeManager.cs

@ -24,6 +24,7 @@ using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media; using System.Windows.Media;
using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Highlighting;
@ -81,6 +82,11 @@ namespace ICSharpCode.ILSpy.Themes
return new Style(typeof(Button), (Style)Application.Current.FindResource(ToolBar.ButtonStyleKey)); return new Style(typeof(Button), (Style)Application.Current.FindResource(ToolBar.ButtonStyleKey));
} }
public Style CreateToolBarToggleButtonStyle()
{
return new Style(typeof(ToggleButton), (Style)Application.Current.FindResource(ToolBar.ToggleButtonStyleKey));
}
public void ApplyHighlightingColors(IHighlightingDefinition highlightingDefinition) public void ApplyHighlightingColors(IHighlightingDefinition highlightingDefinition)
{ {
// Make sure all color values are taken from the theme // Make sure all color values are taken from the theme

2
ILSpy/TreeNodes/AssemblyReferenceReferencedTypesTreeNode.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.LazyLoading = true; this.LazyLoading = true;
} }
public override object Text => $"Referenced Types ({r.TypeReferences.Length + r.ExportedTypes.Length})"; public override object Text => $"{Properties.Resources.ReferencedTypes} ({r.TypeReferences.Length + r.ExportedTypes.Length})";
public override object Icon => Images.MetadataTable; public override object Icon => Images.MetadataTable;
protected override void LoadChildren() protected override void LoadChildren()

2
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

@ -53,6 +53,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return Language.EscapeName(r.Name) + GetSuffixString(r.Handle); } get { return Language.EscapeName(r.Name) + GetSuffixString(r.Handle); }
} }
public override object NavigationText => $"{Text} ({Properties.Resources.References})";
public override object Icon => ImagesProvider.Assembly; public override object Icon => ImagesProvider.Assembly;
public override bool ShowExpander { public override bool ShowExpander {

2
ILSpy/TreeNodes/BaseTypesEntryNode.cs

@ -36,6 +36,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => this.Language.TypeToString(type, includeNamespace: true); public override object Text => this.Language.TypeToString(type, includeNamespace: true);
public override object NavigationText => $"{Text} ({Properties.Resources.BaseTypes})";
public override object Icon => type.Kind == TypeKind.Interface ? Images.Interface : Images.Class; public override object Icon => type.Kind == TypeKind.Interface ? Images.Interface : Images.Class;
public override void ActivateItem(IPlatformRoutedEventArgs e) public override void ActivateItem(IPlatformRoutedEventArgs e)

2
ILSpy/TreeNodes/BaseTypesTreeNode.cs

@ -46,6 +46,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => Properties.Resources.BaseTypes; public override object Text => Properties.Resources.BaseTypes;
public override object NavigationText => $"{Text} ({this.Language.TypeToString(type, includeNamespace: true)})";
public override object Icon => Images.SuperTypes; public override object Icon => Images.SuperTypes;
protected override void LoadChildren() protected override void LoadChildren()

2
ILSpy/TreeNodes/DerivedTypesEntryNode.cs

@ -47,6 +47,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return Language.TypeToString(type, includeNamespace: true) + GetSuffixString(type.MetadataToken); } get { return Language.TypeToString(type, includeNamespace: true) + GetSuffixString(type.MetadataToken); }
} }
public override object NavigationText => $"{Text} ({Properties.Resources.DerivedTypes})";
public override object Icon => TypeTreeNode.GetIcon(type); public override object Icon => TypeTreeNode.GetIcon(type);
public override FilterResult Filter(LanguageSettings settings) public override FilterResult Filter(LanguageSettings settings)

2
ILSpy/TreeNodes/DerivedTypesTreeNode.cs

@ -46,6 +46,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => Resources.DerivedTypes; public override object Text => Resources.DerivedTypes;
public override object NavigationText => $"{Text} ({this.Language.TypeToString(type, includeNamespace: true)})";
public override object Icon => Images.SubTypes; public override object Icon => Images.SubTypes;
protected override void LoadChildren() protected override void LoadChildren()

6
ILSpy/TreeNodes/EventTreeNode.cs

@ -49,6 +49,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => GetText(GetEventDefinition(), this.Language) + GetSuffixString(EventDefinition); public override object Text => GetText(GetEventDefinition(), this.Language) + GetSuffixString(EventDefinition);
public override object NavigationText => GetText(GetEventDefinition(), Language, includeDeclaringTypeName: true);
private IEvent GetEventDefinition() private IEvent GetEventDefinition()
{ {
return ((MetadataModule)EventDefinition.ParentModule?.MetadataFile return ((MetadataModule)EventDefinition.ParentModule?.MetadataFile
@ -56,9 +58,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
?.MainModule)?.GetDefinition((EventDefinitionHandle)EventDefinition.MetadataToken) ?? EventDefinition; ?.MainModule)?.GetDefinition((EventDefinitionHandle)EventDefinition.MetadataToken) ?? EventDefinition;
} }
public static object GetText(IEvent ev, Language language) public static object GetText(IEvent ev, Language language, bool includeDeclaringTypeName = false)
{ {
return language.EventToString(ev, false, false, false); return language.EventToString(ev, includeDeclaringTypeName, false, false);
} }
public override object Icon => GetIcon(GetEventDefinition()); public override object Icon => GetIcon(GetEventDefinition());

6
ILSpy/TreeNodes/FieldTreeNode.cs

@ -41,6 +41,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => GetText(GetFieldDefinition(), Language) + GetSuffixString(FieldDefinition); public override object Text => GetText(GetFieldDefinition(), Language) + GetSuffixString(FieldDefinition);
public override object NavigationText => GetText(GetFieldDefinition(), Language, includeDeclaringTypeName: true);
private IField GetFieldDefinition() private IField GetFieldDefinition()
{ {
return ((MetadataModule)FieldDefinition.ParentModule?.MetadataFile return ((MetadataModule)FieldDefinition.ParentModule?.MetadataFile
@ -48,9 +50,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
?.MainModule)?.GetDefinition((FieldDefinitionHandle)FieldDefinition.MetadataToken) ?? FieldDefinition; ?.MainModule)?.GetDefinition((FieldDefinitionHandle)FieldDefinition.MetadataToken) ?? FieldDefinition;
} }
public static object GetText(IField field, Language language) public static object GetText(IField field, Language language, bool includeDeclaringTypeName = false)
{ {
return language.FieldToString(field, includeDeclaringTypeName: false, includeNamespace: false, includeNamespaceOfDeclaringTypeName: false); return language.FieldToString(field, includeDeclaringTypeName, includeNamespace: false, includeNamespaceOfDeclaringTypeName: false);
} }
public override object Icon => GetIcon(GetFieldDefinition()); public override object Icon => GetIcon(GetFieldDefinition());

2
ILSpy/TreeNodes/MemberReferenceTreeNode.cs

@ -49,6 +49,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => Signature + GetSuffixString(r.Handle); public override object Text => Signature + GetSuffixString(r.Handle);
public override object NavigationText => $"{Text} ({Properties.Resources.ReferencedTypes})";
public override object Icon => r.MemberReferenceKind switch { public override object Icon => r.MemberReferenceKind switch {
MemberReferenceKind.Method => Images.MethodReference, MemberReferenceKind.Method => Images.MethodReference,
MemberReferenceKind.Field => Images.FieldReference, MemberReferenceKind.Field => Images.FieldReference,

6
ILSpy/TreeNodes/MethodTreeNode.cs

@ -41,6 +41,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => GetText(GetMethodDefinition(), Language) + GetSuffixString(MethodDefinition); public override object Text => GetText(GetMethodDefinition(), Language) + GetSuffixString(MethodDefinition);
public override object NavigationText => GetText(GetMethodDefinition(), Language, includeDeclaringTypeName: true);
private IMethod GetMethodDefinition() private IMethod GetMethodDefinition()
{ {
return ((MetadataModule)MethodDefinition.ParentModule?.MetadataFile return ((MetadataModule)MethodDefinition.ParentModule?.MetadataFile
@ -48,9 +50,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
?.MainModule)?.GetDefinition((MethodDefinitionHandle)MethodDefinition.MetadataToken) ?? MethodDefinition; ?.MainModule)?.GetDefinition((MethodDefinitionHandle)MethodDefinition.MetadataToken) ?? MethodDefinition;
} }
public static object GetText(IMethod method, Language language) public static object GetText(IMethod method, Language language, bool includeDeclaringTypeName = false)
{ {
return language.MethodToString(method, false, false, false); return language.MethodToString(method, includeDeclaringTypeName, false, false);
} }
public override object Icon => GetIcon(GetMethodDefinition()); public override object Icon => GetIcon(GetMethodDefinition());

2
ILSpy/TreeNodes/ModuleReferenceTreeNode.cs

@ -68,6 +68,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return moduleName + GetSuffixString(handle); } get { return moduleName + GetSuffixString(handle); }
} }
public override object NavigationText => $"{Text} ({Properties.Resources.References})";
public override object Icon => Images.Library; public override object Icon => Images.Library;
public override void ActivateItem(IPlatformRoutedEventArgs e) public override void ActivateItem(IPlatformRoutedEventArgs e)

6
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -51,6 +51,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => GetText(GetPropertyDefinition(), Language) + GetSuffixString(PropertyDefinition); public override object Text => GetText(GetPropertyDefinition(), Language) + GetSuffixString(PropertyDefinition);
public override object NavigationText => GetText(GetPropertyDefinition(), Language, includeDeclaringTypeName: true);
private IProperty GetPropertyDefinition() private IProperty GetPropertyDefinition()
{ {
return ((MetadataModule)PropertyDefinition.ParentModule?.MetadataFile return ((MetadataModule)PropertyDefinition.ParentModule?.MetadataFile
@ -58,9 +60,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
?.MainModule)?.GetDefinition((PropertyDefinitionHandle)PropertyDefinition.MetadataToken) ?? PropertyDefinition; ?.MainModule)?.GetDefinition((PropertyDefinitionHandle)PropertyDefinition.MetadataToken) ?? PropertyDefinition;
} }
public static object GetText(IProperty property, Language language) public static object GetText(IProperty property, Language language, bool includeDeclaringTypeName = false)
{ {
return language.PropertyToString(property, false, false, false); return language.PropertyToString(property, includeDeclaringTypeName, false, false);
} }
public override object Icon => GetIcon(GetPropertyDefinition()); public override object Icon => GetIcon(GetPropertyDefinition());

2
ILSpy/TreeNodes/ReferenceFolderTreeNode.cs

@ -44,6 +44,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => Resources.References; public override object Text => Resources.References;
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.ReferenceFolder; public override object Icon => Images.ReferenceFolder;
protected override void LoadChildren() protected override void LoadChildren()

2
ILSpy/TreeNodes/ResourceListTreeNode.cs

@ -41,6 +41,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => Resources._Resources; public override object Text => Resources._Resources;
public override object NavigationText => $"{Text} ({module.Name})";
public override object Icon => Images.FolderClosed; public override object Icon => Images.FolderClosed;
public override object ExpandedIcon => Images.FolderOpen; public override object ExpandedIcon => Images.FolderOpen;

2
ILSpy/TreeNodes/TypeReferenceTreeNode.cs

@ -45,6 +45,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text public override object Text
=> Language.TypeToString(resolvedType, includeNamespace: false) + GetSuffixString(r.Handle); => Language.TypeToString(resolvedType, includeNamespace: false) + GetSuffixString(r.Handle);
public override object NavigationText => $"{Text} ({Properties.Resources.ReferencedTypes})";
public override object Icon => Images.TypeReference; public override object Icon => Images.TypeReference;
protected override void LoadChildren() protected override void LoadChildren()

3
ILSpy/TreeNodes/TypeTreeNode.cs

@ -45,6 +45,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override object Text => this.Language.TypeToString(GetTypeDefinition(), includeNamespace: false) public override object Text => this.Language.TypeToString(GetTypeDefinition(), includeNamespace: false)
+ GetSuffixString(TypeDefinition.MetadataToken); + GetSuffixString(TypeDefinition.MetadataToken);
public override object NavigationText => this.Language.TypeToString(GetTypeDefinition(), includeNamespace: true)
+ GetSuffixString(TypeDefinition.MetadataToken);
private ITypeDefinition GetTypeDefinition() private ITypeDefinition GetTypeDefinition()
{ {
return ((MetadataModule)ParentAssemblyNode.LoadedAssembly return ((MetadataModule)ParentAssemblyNode.LoadedAssembly

Loading…
Cancel
Save