|
|
|
@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy
@@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
internal AssemblyListManager AssemblyListManager { get; } |
|
|
|
|
|
|
|
|
|
public SharpTreeView treeView { |
|
|
|
|
public SharpTreeView AssemblyTreeView { |
|
|
|
|
get { |
|
|
|
|
return FindResource("TreeView") as SharpTreeView; |
|
|
|
|
return FindResource("AssemblyTreeView") as SharpTreeView; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -120,13 +120,13 @@ namespace ICSharpCode.ILSpy
@@ -120,13 +120,13 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
DockWorkspace.Instance.LoadSettings(sessionSettings); |
|
|
|
|
InitializeComponent(); |
|
|
|
|
InitToolPanes(); |
|
|
|
|
DockWorkspace.Instance.InitializeLayout(DockManager); |
|
|
|
|
sessionSettings.FilterSettings.PropertyChanged += filterSettings_PropertyChanged; |
|
|
|
|
sessionSettings.PropertyChanged += SessionSettings_PropertyChanged; |
|
|
|
|
|
|
|
|
|
InitMainMenu(); |
|
|
|
|
InitToolbar(); |
|
|
|
|
ContextMenuProvider.Add(treeView); |
|
|
|
|
ContextMenuProvider.Add(AssemblyTreeView); |
|
|
|
|
|
|
|
|
|
this.Loaded += MainWindow_Loaded; |
|
|
|
|
} |
|
|
|
@ -231,6 +231,48 @@ namespace ICSharpCode.ILSpy
@@ -231,6 +231,48 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Tool Pane extensibility
|
|
|
|
|
private void InitToolPanes() |
|
|
|
|
{ |
|
|
|
|
var toolPanes = App.ExportProvider.GetExports<ToolPaneModel, IToolPaneMetadata>("ToolPane"); |
|
|
|
|
var templateSelector = new PaneTemplateSelector(); |
|
|
|
|
templateSelector.Mappings.Add(new TemplateMapping { |
|
|
|
|
Type = typeof(TabPageModel), |
|
|
|
|
Template = (DataTemplate)FindResource("DefaultContentTemplate") |
|
|
|
|
}); |
|
|
|
|
templateSelector.Mappings.Add(new TemplateMapping { |
|
|
|
|
Type = typeof(LegacyToolPaneModel), |
|
|
|
|
Template = (DataTemplate)FindResource("DefaultContentTemplate") |
|
|
|
|
}); |
|
|
|
|
foreach (var toolPane in toolPanes) { |
|
|
|
|
ToolPaneModel model = toolPane.Value; |
|
|
|
|
templateSelector.Mappings.Add(new TemplateMapping { Type = model.GetType(), Template = model.Template }); |
|
|
|
|
DockWorkspace.Instance.ToolPanes.Add(model); |
|
|
|
|
} |
|
|
|
|
DockManager.LayoutItemTemplateSelector = templateSelector; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void ShowInTopPane(string title, object content) |
|
|
|
|
{ |
|
|
|
|
var model = DockWorkspace.Instance.ToolPanes.OfType<LegacyToolPaneModel>().FirstOrDefault(p => p.Content == content); |
|
|
|
|
if (model == null) { |
|
|
|
|
model = new LegacyToolPaneModel(title, content, LegacyToolPaneLocation.Top); |
|
|
|
|
DockWorkspace.Instance.ToolPanes.Add(model); |
|
|
|
|
} |
|
|
|
|
model.Show(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void ShowInBottomPane(string title, object content) |
|
|
|
|
{ |
|
|
|
|
var model = DockWorkspace.Instance.ToolPanes.OfType<LegacyToolPaneModel>().FirstOrDefault(p => p.Content == content); |
|
|
|
|
if (model == null) { |
|
|
|
|
model = new LegacyToolPaneModel(title, content, LegacyToolPaneLocation.Bottom); |
|
|
|
|
DockWorkspace.Instance.ToolPanes.Add(model); |
|
|
|
|
} |
|
|
|
|
model.Show(); |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Message Hook
|
|
|
|
|
protected override void OnSourceInitialized(EventArgs e) |
|
|
|
|
{ |
|
|
|
@ -337,7 +379,7 @@ namespace ICSharpCode.ILSpy
@@ -337,7 +379,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
async void NavigateOnLaunch(string navigateTo, string[] activeTreeViewPath, ILSpySettings spySettings, List<LoadedAssembly> relevantAssemblies) |
|
|
|
|
{ |
|
|
|
|
var initialSelection = treeView.SelectedItem; |
|
|
|
|
var initialSelection = AssemblyTreeView.SelectedItem; |
|
|
|
|
if (navigateTo != null) { |
|
|
|
|
bool found = false; |
|
|
|
|
if (navigateTo.StartsWith("N:", StringComparison.Ordinal)) { |
|
|
|
@ -351,7 +393,7 @@ namespace ICSharpCode.ILSpy
@@ -351,7 +393,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName); |
|
|
|
|
if (nsNode != null) { |
|
|
|
|
found = true; |
|
|
|
|
if (treeView.SelectedItem == initialSelection) { |
|
|
|
|
if (AssemblyTreeView.SelectedItem == initialSelection) { |
|
|
|
|
SelectNode(nsNode); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
@ -366,12 +408,12 @@ namespace ICSharpCode.ILSpy
@@ -366,12 +408,12 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
IEntity mr = await Task.Run(() => FindEntityInRelevantAssemblies(navigateTo, relevantAssemblies)); |
|
|
|
|
if (mr != null && mr.ParentModule.PEFile != null) { |
|
|
|
|
found = true; |
|
|
|
|
if (treeView.SelectedItem == initialSelection) { |
|
|
|
|
if (AssemblyTreeView.SelectedItem == initialSelection) { |
|
|
|
|
JumpToReference(mr); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!found && treeView.SelectedItem == initialSelection) { |
|
|
|
|
if (!found && AssemblyTreeView.SelectedItem == initialSelection) { |
|
|
|
|
AvalonEditTextOutput output = new AvalonEditTextOutput(); |
|
|
|
|
output.Write(string.Format("Cannot find '{0}' in command line specified assemblies.", navigateTo)); |
|
|
|
|
DockWorkspace.Instance.ShowText(output); |
|
|
|
@ -380,7 +422,7 @@ namespace ICSharpCode.ILSpy
@@ -380,7 +422,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
// NavigateTo == null and an assembly was given on the command-line:
|
|
|
|
|
// Select the newly loaded assembly
|
|
|
|
|
AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(relevantAssemblies[0]); |
|
|
|
|
if (asmNode != null && treeView.SelectedItem == initialSelection) { |
|
|
|
|
if (asmNode != null && AssemblyTreeView.SelectedItem == initialSelection) { |
|
|
|
|
SelectNode(asmNode); |
|
|
|
|
} |
|
|
|
|
} else if (spySettings != null) { |
|
|
|
@ -395,7 +437,7 @@ namespace ICSharpCode.ILSpy
@@ -395,7 +437,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
} |
|
|
|
|
node = FindNodeByPath(activeTreeViewPath, true); |
|
|
|
|
} |
|
|
|
|
if (treeView.SelectedItem == initialSelection) { |
|
|
|
|
if (AssemblyTreeView.SelectedItem == initialSelection) { |
|
|
|
|
if (node != null) { |
|
|
|
|
SelectNode(node); |
|
|
|
|
|
|
|
|
@ -611,7 +653,7 @@ namespace ICSharpCode.ILSpy
@@ -611,7 +653,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
assemblyListTreeNode = new AssemblyListTreeNode(assemblyList); |
|
|
|
|
assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone(); |
|
|
|
|
assemblyListTreeNode.Select = x => SelectNode(x, inNewTabPage: false); |
|
|
|
|
treeView.Root = assemblyListTreeNode; |
|
|
|
|
AssemblyTreeView.Root = assemblyListTreeNode; |
|
|
|
|
|
|
|
|
|
if (assemblyList.ListName == AssemblyListManager.DefaultListName) |
|
|
|
|
#if DEBUG
|
|
|
|
@ -695,12 +737,12 @@ namespace ICSharpCode.ILSpy
@@ -695,12 +737,12 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
LanguageVersion = CurrentLanguageVersion |
|
|
|
|
}); |
|
|
|
|
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); |
|
|
|
|
treeView.SelectedItem = null; |
|
|
|
|
AssemblyTreeView.SelectedItem = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Set both the selection and focus to ensure that keyboard navigation works as expected.
|
|
|
|
|
treeView.FocusNode(obj); |
|
|
|
|
treeView.SelectedItem = obj; |
|
|
|
|
AssemblyTreeView.FocusNode(obj); |
|
|
|
|
AssemblyTreeView.SelectedItem = obj; |
|
|
|
|
} else { |
|
|
|
|
MessageBox.Show("Navigation failed because the target is hidden or a compiler-generated class.\n" + |
|
|
|
|
"Please disable all filters that might hide the item (i.e. activate " + |
|
|
|
@ -722,8 +764,8 @@ namespace ICSharpCode.ILSpy
@@ -722,8 +764,8 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
DockWorkspace.Instance.ActiveTabPage = DockWorkspace.Instance.TabPages.Last(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
treeView.FocusNode(nodes.First()); |
|
|
|
|
treeView.SetSelectedNodes(nodes); |
|
|
|
|
AssemblyTreeView.FocusNode(nodes.First()); |
|
|
|
|
AssemblyTreeView.SetSelectedNodes(nodes); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -734,7 +776,7 @@ namespace ICSharpCode.ILSpy
@@ -734,7 +776,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
{ |
|
|
|
|
if (path == null) |
|
|
|
|
return null; |
|
|
|
|
SharpTreeNode node = treeView.Root; |
|
|
|
|
SharpTreeNode node = AssemblyTreeView.Root; |
|
|
|
|
SharpTreeNode bestMatch = node; |
|
|
|
|
foreach (var element in path) { |
|
|
|
|
if (node == null) |
|
|
|
@ -887,7 +929,7 @@ namespace ICSharpCode.ILSpy
@@ -887,7 +929,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
throw new ArgumentNullException(nameof(fileNames)); |
|
|
|
|
|
|
|
|
|
if (focusNode) |
|
|
|
|
treeView.UnselectAll(); |
|
|
|
|
AssemblyTreeView.UnselectAll(); |
|
|
|
|
|
|
|
|
|
LoadAssemblies(fileNames, focusNode: focusNode); |
|
|
|
|
} |
|
|
|
@ -913,7 +955,7 @@ namespace ICSharpCode.ILSpy
@@ -913,7 +955,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
else { |
|
|
|
|
var node = assemblyListTreeNode.FindAssemblyNode(nugetAsm); |
|
|
|
|
if (node != null && focusNode) { |
|
|
|
|
treeView.SelectedItems.Add(node); |
|
|
|
|
AssemblyTreeView.SelectedItems.Add(node); |
|
|
|
|
lastNode = node; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -931,7 +973,7 @@ namespace ICSharpCode.ILSpy
@@ -931,7 +973,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
else { |
|
|
|
|
var node = assemblyListTreeNode.FindAssemblyNode(asm); |
|
|
|
|
if (node != null && focusNode) { |
|
|
|
|
treeView.SelectedItems.Add(node); |
|
|
|
|
AssemblyTreeView.SelectedItems.Add(node); |
|
|
|
|
lastNode = node; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -940,7 +982,7 @@ namespace ICSharpCode.ILSpy
@@ -940,7 +982,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (lastNode != null && focusNode) |
|
|
|
|
treeView.FocusNode(lastNode); |
|
|
|
|
AssemblyTreeView.FocusNode(lastNode); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -953,7 +995,7 @@ namespace ICSharpCode.ILSpy
@@ -953,7 +995,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
refreshInProgress = true; |
|
|
|
|
var path = GetPathForNode(treeView.SelectedItem as SharpTreeNode); |
|
|
|
|
var path = GetPathForNode(AssemblyTreeView.SelectedItem as SharpTreeNode); |
|
|
|
|
ShowAssemblyList(AssemblyListManager.LoadList(ILSpySettings.Load(), assemblyList.ListName)); |
|
|
|
|
SelectNode(FindNodeByPath(path, true)); |
|
|
|
|
} finally { |
|
|
|
@ -963,7 +1005,7 @@ namespace ICSharpCode.ILSpy
@@ -963,7 +1005,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
void SearchCommandExecuted(object sender, ExecutedRoutedEventArgs e) |
|
|
|
|
{ |
|
|
|
|
SearchPaneModel.Instance.Show(); |
|
|
|
|
DockWorkspace.Instance.ShowToolPane(SearchPaneModel.PaneContentId); |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
@ -983,20 +1025,20 @@ namespace ICSharpCode.ILSpy
@@ -983,20 +1025,20 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
if (ignoreDecompilationRequests) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (treeView.SelectedItems.Count == 0 && refreshInProgress) |
|
|
|
|
if (AssemblyTreeView.SelectedItems.Count == 0 && refreshInProgress) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (recordHistory) { |
|
|
|
|
var currentState = DockWorkspace.Instance.ActiveTabPage.GetState(); |
|
|
|
|
if (currentState != null) |
|
|
|
|
history.UpdateCurrent(new NavigationState(currentState)); |
|
|
|
|
history.Record(new NavigationState(treeView.SelectedItems.OfType<SharpTreeNode>())); |
|
|
|
|
history.Record(new NavigationState(AssemblyTreeView.SelectedItems.OfType<SharpTreeNode>())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DockWorkspace.Instance.ActiveTabPage.SupportsLanguageSwitching = true; |
|
|
|
|
|
|
|
|
|
if (treeView.SelectedItems.Count == 1) { |
|
|
|
|
ILSpyTreeNode node = treeView.SelectedItem as ILSpyTreeNode; |
|
|
|
|
if (AssemblyTreeView.SelectedItems.Count == 1) { |
|
|
|
|
ILSpyTreeNode node = AssemblyTreeView.SelectedItem as ILSpyTreeNode; |
|
|
|
|
if (node != null && node.View(DockWorkspace.Instance.ActiveTabPage)) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -1035,7 +1077,7 @@ namespace ICSharpCode.ILSpy
@@ -1035,7 +1077,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
public IEnumerable<ILSpyTreeNode> SelectedNodes { |
|
|
|
|
get { |
|
|
|
|
return treeView.GetTopLevelSelection().OfType<ILSpyTreeNode>(); |
|
|
|
|
return AssemblyTreeView.GetTopLevelSelection().OfType<ILSpyTreeNode>(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
@ -1077,12 +1119,12 @@ namespace ICSharpCode.ILSpy
@@ -1077,12 +1119,12 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
var newState = forward ? history.GoForward() : history.GoBack(); |
|
|
|
|
|
|
|
|
|
ignoreDecompilationRequests = true; |
|
|
|
|
treeView.SelectedItems.Clear(); |
|
|
|
|
AssemblyTreeView.SelectedItems.Clear(); |
|
|
|
|
foreach (var node in newState.TreeNodes) { |
|
|
|
|
treeView.SelectedItems.Add(node); |
|
|
|
|
AssemblyTreeView.SelectedItems.Add(node); |
|
|
|
|
} |
|
|
|
|
if (newState.TreeNodes.Any()) |
|
|
|
|
treeView.FocusNode(newState.TreeNodes.First()); |
|
|
|
|
AssemblyTreeView.FocusNode(newState.TreeNodes.First()); |
|
|
|
|
ignoreDecompilationRequests = false; |
|
|
|
|
DecompileSelectedNodes(newState.ViewState as DecompilerTextViewState, false); |
|
|
|
|
} |
|
|
|
@ -1142,8 +1184,8 @@ namespace ICSharpCode.ILSpy
@@ -1142,8 +1184,8 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
{ |
|
|
|
|
base.OnClosing(e); |
|
|
|
|
sessionSettings.ActiveAssemblyList = assemblyList.ListName; |
|
|
|
|
sessionSettings.ActiveTreeViewPath = GetPathForNode(treeView.SelectedItem as SharpTreeNode); |
|
|
|
|
sessionSettings.ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode(treeView.SelectedItem as SharpTreeNode); |
|
|
|
|
sessionSettings.ActiveTreeViewPath = GetPathForNode(AssemblyTreeView.SelectedItem as SharpTreeNode); |
|
|
|
|
sessionSettings.ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode(AssemblyTreeView.SelectedItem as SharpTreeNode); |
|
|
|
|
sessionSettings.WindowBounds = this.RestoreBounds; |
|
|
|
|
sessionSettings.DockLayout.Serialize(new XmlLayoutSerializer(DockManager)); |
|
|
|
|
sessionSettings.Save(); |
|
|
|
@ -1167,7 +1209,7 @@ namespace ICSharpCode.ILSpy
@@ -1167,7 +1209,7 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
|
|
|
|
|
public void UnselectAll() |
|
|
|
|
{ |
|
|
|
|
treeView.UnselectAll(); |
|
|
|
|
AssemblyTreeView.UnselectAll(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void SetStatus(string status, Brush foreground) |
|
|
|
|