Skip to content

Commit 61b0714

Browse files
committed
Get rid of singletons, replace with DI: DockWorkspace
1 parent 560d89a commit 61b0714

29 files changed

+154
-186
lines changed

ILSpy/App.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public App()
8686
if (!InitializeDependencyInjection(settingsService))
8787
{
8888
// There is something completely wrong with DI, probably some service registration is missing => nothing we can do to recover, so stop and shut down.
89-
Exit += (_, _) => MessageBox.Show(StartupExceptions.FormatExceptions(), "Sorry we crashed!");
89+
Exit += (_, _) => MessageBox.Show(StartupExceptions.FormatExceptions(), "Sorry we crashed!", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK, MessageBoxOptions.DefaultDesktopOnly);
9090
Shutdown(1);
9191
return;
9292
}

ILSpy/AssemblyTree/AssemblyTreeModel.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private async Task NavigateOnLaunch(string? navigateTo, string[]? activeTreeView
264264
{
265265
AvalonEditTextOutput output = new AvalonEditTextOutput();
266266
output.Write($"Cannot find '{navigateTo}' in command line specified assemblies.");
267-
DockWorkspace.Instance.ShowText(output);
267+
DockWorkspace.ShowText(output);
268268
}
269269
}
270270
else if (relevantAssemblies.Count == 1)
@@ -304,7 +304,7 @@ private async Task NavigateOnLaunch(string? navigateTo, string[]? activeTreeView
304304
}
305305
else
306306
{
307-
DockWorkspace.Instance.ActiveTabPage.ShowTextView(aboutPage.Display);
307+
DockWorkspace.ActiveTabPage.ShowTextView(aboutPage.Display);
308308
}
309309
}
310310
}
@@ -405,8 +405,8 @@ private async Task OpenAssemblies()
405405
{
406406
output.Title = "Startup errors";
407407

408-
DockWorkspace.Instance.AddTabPage();
409-
DockWorkspace.Instance.ShowText(output);
408+
DockWorkspace.AddTabPage();
409+
DockWorkspace.ShowText(output);
410410
}
411411
}
412412

@@ -524,7 +524,7 @@ public void SelectNode(SharpTreeNode? node, bool inNewTabPage = false)
524524

525525
if (inNewTabPage)
526526
{
527-
DockWorkspace.Instance.AddTabPage();
527+
DockWorkspace.AddTabPage();
528528
SelectedItem = null;
529529
}
530530

@@ -739,7 +739,7 @@ private void TreeView_SelectionChanged()
739739
}
740740
else
741741
{
742-
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
742+
var activeTabPage = DockWorkspace.ActiveTabPage;
743743

744744
if (!isNavigatingHistory)
745745
{
@@ -787,7 +787,7 @@ void ContextMenuClosed(object? sender, EventArgs e)
787787

788788
public void DecompileSelectedNodes(DecompilerTextViewState? newState = null)
789789
{
790-
var activeTabPage = DockWorkspace.Instance.ActiveTabPage;
790+
var activeTabPage = DockWorkspace.ActiveTabPage;
791791

792792
activeTabPage.SupportsLanguageSwitching = true;
793793

@@ -809,7 +809,7 @@ public void DecompileSelectedNodes(DecompilerTextViewState? newState = null)
809809

810810
public void RefreshDecompiledView()
811811
{
812-
DecompileSelectedNodes(DockWorkspace.Instance.ActiveTabPage.GetState() as DecompilerTextViewState);
812+
DecompileSelectedNodes(DockWorkspace.ActiveTabPage.GetState() as DecompilerTextViewState);
813813
}
814814

815815
public Language CurrentLanguage => languageService.Language;
@@ -830,18 +830,18 @@ public void NavigateHistory(bool forward)
830830
{
831831
isNavigatingHistory = true;
832832

833-
TabPageModel tabPage = DockWorkspace.Instance.ActiveTabPage;
833+
TabPageModel tabPage = DockWorkspace.ActiveTabPage;
834834
var state = tabPage.GetState();
835835
if (state != null)
836836
history.UpdateCurrent(new NavigationState(tabPage, state));
837837
var newState = forward ? history.GoForward() : history.GoBack();
838838

839839
TabPageModel activeTabPage = newState.TabPage;
840840

841-
if (!DockWorkspace.Instance.TabPages.Contains(activeTabPage))
842-
DockWorkspace.Instance.AddTabPage(activeTabPage);
841+
if (!DockWorkspace.TabPages.Contains(activeTabPage))
842+
DockWorkspace.AddTabPage(activeTabPage);
843843
else
844-
DockWorkspace.Instance.ActiveTabPage = activeTabPage;
844+
DockWorkspace.ActiveTabPage = activeTabPage;
845845

846846
SelectNodes(newState.TreeNodes);
847847
}
@@ -861,13 +861,13 @@ public void NavigateTo(RequestNavigateEventArgs e, bool inNewTabPage = false)
861861
{
862862
if (inNewTabPage)
863863
{
864-
DockWorkspace.Instance.AddTabPage();
864+
DockWorkspace.AddTabPage();
865865
}
866866

867867
if (e.Uri.Host == "aboutpage")
868868
{
869869
RecordHistory();
870-
DockWorkspace.Instance.ActiveTabPage.ShowTextView(aboutPage.Display);
870+
DockWorkspace.ActiveTabPage.ShowTextView(aboutPage.Display);
871871
e.Handled = true;
872872
return;
873873
}
@@ -891,15 +891,15 @@ public void NavigateTo(RequestNavigateEventArgs e, bool inNewTabPage = false)
891891
}
892892
}
893893
RecordHistory();
894-
DockWorkspace.Instance.ShowText(output);
894+
DockWorkspace.ShowText(output);
895895
e.Handled = true;
896896
}
897897

898898
void RecordHistory()
899899
{
900900
if (isNavigatingHistory)
901901
return;
902-
TabPageModel tabPage = DockWorkspace.Instance.ActiveTabPage;
902+
TabPageModel tabPage = DockWorkspace.ActiveTabPage;
903903
var currentState = tabPage.GetState();
904904
if (currentState != null)
905905
history.UpdateCurrent(new NavigationState(tabPage, currentState));

ILSpy/Commands/DecompileAllCommand.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ namespace ICSharpCode.ILSpy
3838
{
3939
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._File), Header = nameof(Resources.DEBUGDecompile), MenuCategory = nameof(Resources.Open), MenuOrder = 2.5)]
4040
[Shared]
41-
sealed class DecompileAllCommand(AssemblyTreeModel assemblyTreeModel, LanguageService languageService) : SimpleCommand
41+
sealed class DecompileAllCommand(AssemblyTreeModel assemblyTreeModel, DockWorkspace dockWorkspace) : SimpleCommand
4242
{
4343
public override bool CanExecute(object parameter)
4444
{
@@ -47,7 +47,7 @@ public override bool CanExecute(object parameter)
4747

4848
public override void Execute(object parameter)
4949
{
50-
Docking.DockWorkspace.Instance.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
50+
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
5151
AvalonEditTextOutput output = new AvalonEditTextOutput();
5252
Parallel.ForEach(
5353
Partitioner.Create(assemblyTreeModel.AssemblyList.GetAssemblies(), loadBalance: true),
@@ -61,7 +61,7 @@ public override void Execute(object parameter)
6161
{
6262
try
6363
{
64-
var options = DockWorkspace.Instance.ActiveTabPage.CreateDecompilationOptions();
64+
var options = dockWorkspace.ActiveTabPage.CreateDecompilationOptions();
6565
options.CancellationToken = ct;
6666
options.FullDecompilation = true;
6767
new CSharpLanguage().DecompileAssembly(asm, new PlainTextOutput(writer), options);
@@ -85,20 +85,19 @@ public override void Execute(object parameter)
8585
}
8686
});
8787
return output;
88-
}, ct)).Then(output => Docking.DockWorkspace.Instance.ShowText(output)).HandleExceptions();
88+
}, ct)).Then(dockWorkspace.ShowText).HandleExceptions();
8989
}
9090
}
9191

9292
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._File), Header = nameof(Resources.DEBUGDecompile100x), MenuCategory = nameof(Resources.Open), MenuOrder = 2.6)]
9393
[Shared]
94-
sealed class Decompile100TimesCommand(AssemblyTreeModel assemblyTreeModel, LanguageService languageService) : SimpleCommand
94+
sealed class Decompile100TimesCommand(AssemblyTreeModel assemblyTreeModel, LanguageService languageService, DockWorkspace dockWorkspace) : SimpleCommand
9595
{
9696
public override void Execute(object parameter)
9797
{
9898
const int numRuns = 100;
9999
var language = languageService.Language;
100100
var nodes = assemblyTreeModel.SelectedNodes.ToArray();
101-
DockWorkspace dockWorkspace = DockWorkspace.Instance;
102101
var options = dockWorkspace.ActiveTabPage.CreateDecompilationOptions();
103102
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
104103
options.CancellationToken = ct;

ILSpy/Commands/DecompileInNewViewCommand.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,8 @@ namespace ICSharpCode.ILSpy.Commands
3535
{
3636
[ExportContextMenuEntry(Header = nameof(Resources.DecompileToNewPanel), InputGestureText = "MMB", Icon = "images/Search", Category = nameof(Resources.Analyze), Order = 90)]
3737
[Shared]
38-
internal sealed class DecompileInNewViewCommand : IContextMenuEntry
38+
internal sealed class DecompileInNewViewCommand(AssemblyTreeModel assemblyTreeModel, DockWorkspace dockWorkspace) : IContextMenuEntry
3939
{
40-
private readonly AssemblyTreeModel assemblyTreeModel;
41-
42-
public DecompileInNewViewCommand(AssemblyTreeModel assemblyTreeModel)
43-
{
44-
this.assemblyTreeModel = assemblyTreeModel;
45-
}
46-
4740
public bool IsVisible(TextViewContext context)
4841
{
4942
return context.SelectedTreeNodes != null || context.Reference?.Reference is IEntity;
@@ -56,11 +49,11 @@ public bool IsEnabled(TextViewContext context)
5649

5750
public void Execute(TextViewContext context)
5851
{
59-
var activePane = DockWorkspace.Instance.ActivePane;
52+
var activePane = dockWorkspace.ActivePane;
6053

6154
DecompileNodes(GetNodes(context).ToArray());
6255

63-
DockWorkspace.Instance.ActivePane = activePane;
56+
dockWorkspace.ActivePane = activePane;
6457
}
6558

6659
IEnumerable<ILSpyTreeNode> GetNodes(TextViewContext context)
@@ -98,7 +91,7 @@ void DecompileNodes(ILSpyTreeNode[] nodes)
9891
if (nodes.Length == 0)
9992
return;
10093

101-
DockWorkspace.Instance.AddTabPage();
94+
dockWorkspace.AddTabPage();
10295

10396
if (assemblyTreeModel.SelectedItems.SequenceEqual(nodes))
10497
assemblyTreeModel.DecompileSelectedNodes();

ILSpy/Commands/DisassembleAllCommand.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
using System.Threading.Tasks;
2626

2727
using ICSharpCode.ILSpy.AssemblyTree;
28+
using ICSharpCode.ILSpy.Docking;
2829
using ICSharpCode.ILSpy.Properties;
2930
using ICSharpCode.ILSpy.TextView;
3031
using ICSharpCode.ILSpy.ViewModels;
@@ -33,7 +34,7 @@ namespace ICSharpCode.ILSpy
3334
{
3435
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._File), Header = nameof(Resources.DEBUGDisassemble), MenuCategory = nameof(Resources.Open), MenuOrder = 2.5)]
3536
[Shared]
36-
sealed class DisassembleAllCommand(AssemblyTreeModel assemblyTreeModel, LanguageService languageService) : SimpleCommand
37+
sealed class DisassembleAllCommand(AssemblyTreeModel assemblyTreeModel, DockWorkspace dockWorkspace) : SimpleCommand
3738
{
3839
public override bool CanExecute(object parameter)
3940
{
@@ -42,8 +43,6 @@ public override bool CanExecute(object parameter)
4243

4344
public override void Execute(object parameter)
4445
{
45-
var dockWorkspace = Docking.DockWorkspace.Instance;
46-
4746
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
4847
AvalonEditTextOutput output = new();
4948
Parallel.ForEach(
@@ -61,7 +60,7 @@ public override void Execute(object parameter)
6160
var options = dockWorkspace.ActiveTabPage.CreateDecompilationOptions();
6261
options.FullDecompilation = true;
6362
options.CancellationToken = ct;
64-
new ILLanguage().DecompileAssembly(asm, new Decompiler.PlainTextOutput(writer), options);
63+
new ILLanguage(dockWorkspace).DecompileAssembly(asm, new Decompiler.PlainTextOutput(writer), options);
6564
}
6665
catch (Exception ex)
6766
{

ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
using ICSharpCode.Decompiler;
2727
using ICSharpCode.Decompiler.CSharp.ProjectDecompiler;
28+
using ICSharpCode.ILSpy.Docking;
2829
using ICSharpCode.ILSpy.Properties;
2930
using ICSharpCode.ILSpy.TextView;
3031
using ICSharpCode.ILSpy.TreeNodes;
@@ -36,7 +37,7 @@ namespace ICSharpCode.ILSpy
3637
{
3738
[ExportContextMenuEntry(Header = nameof(Resources.ExtractPackageEntry), Category = nameof(Resources.Save), Icon = "Images/Save")]
3839
[Shared]
39-
sealed class ExtractPackageEntryContextMenuEntry : IContextMenuEntry
40+
sealed class ExtractPackageEntryContextMenuEntry(DockWorkspace dockWorkspace) : IContextMenuEntry
4041
{
4142
public void Execute(TextViewContext context)
4243
{
@@ -61,7 +62,7 @@ public void Execute(TextViewContext context)
6162
if (selectedNodes.Length > 1)
6263
outputFolderOrFileName = Path.GetDirectoryName(outputFolderOrFileName);
6364

64-
Docking.DockWorkspace.Instance.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
65+
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
6566
AvalonEditTextOutput output = new AvalonEditTextOutput();
6667
Stopwatch stopwatch = Stopwatch.StartNew();
6768
stopwatch.Stop();
@@ -83,7 +84,7 @@ public void Execute(TextViewContext context)
8384
output.AddButton(null, Resources.OpenExplorer, delegate { Process.Start("explorer", "/select,\"" + fileName + "\""); });
8485
output.WriteLine();
8586
return output;
86-
}, ct)).Then(output => Docking.DockWorkspace.Instance.ShowText(output)).HandleExceptions();
87+
}, ct)).Then(dockWorkspace.ShowText).HandleExceptions();
8788
}
8889

8990
void SaveEntry(ITextOutput output, PackageEntry entry, string targetFileName)

ILSpy/Commands/GeneratePdbContextMenuEntry.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ namespace ICSharpCode.ILSpy
4343
{
4444
[ExportContextMenuEntry(Header = nameof(Resources.GeneratePortable))]
4545
[Shared]
46-
class GeneratePdbContextMenuEntry(LanguageService languageService) : IContextMenuEntry
46+
class GeneratePdbContextMenuEntry(LanguageService languageService, DockWorkspace dockWorkspace) : IContextMenuEntry
4747
{
4848
public void Execute(TextViewContext context)
4949
{
5050
var assembly = (context.SelectedTreeNodes?.FirstOrDefault() as AssemblyTreeNode)?.LoadedAssembly;
5151
if (assembly == null)
5252
return;
53-
GeneratePdbForAssembly(assembly, languageService);
53+
GeneratePdbForAssembly(assembly, languageService, dockWorkspace);
5454
}
5555

5656
public bool IsEnabled(TextViewContext context) => true;
@@ -62,7 +62,7 @@ public bool IsVisible(TextViewContext context)
6262
&& tn.LoadedAssembly.IsLoadedAsValidAssembly;
6363
}
6464

65-
internal static void GeneratePdbForAssembly(LoadedAssembly assembly, LanguageService languageService)
65+
internal static void GeneratePdbForAssembly(LoadedAssembly assembly, LanguageService languageService, DockWorkspace dockWorkspace)
6666
{
6767
var file = assembly.GetMetadataFileOrNull() as PEFile;
6868
if (!PortablePdbWriter.HasCodeViewDebugDirectoryEntry(file))
@@ -76,7 +76,6 @@ internal static void GeneratePdbForAssembly(LoadedAssembly assembly, LanguageSer
7676
dlg.InitialDirectory = Path.GetDirectoryName(assembly.FileName);
7777
if (dlg.ShowDialog() != true)
7878
return;
79-
DockWorkspace dockWorkspace = DockWorkspace.Instance;
8079
DecompilationOptions options = dockWorkspace.ActiveTabPage.CreateDecompilationOptions();
8180
string fileName = dlg.FileName;
8281
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
@@ -104,13 +103,13 @@ internal static void GeneratePdbForAssembly(LoadedAssembly assembly, LanguageSer
104103
output.AddButton(null, Resources.OpenExplorer, delegate { Process.Start("explorer", "/select,\"" + fileName + "\""); });
105104
output.WriteLine();
106105
return output;
107-
}, ct)).Then(output => Docking.DockWorkspace.Instance.ShowText(output)).HandleExceptions();
106+
}, ct)).Then(dockWorkspace.ShowText).HandleExceptions();
108107
}
109108
}
110109

111110
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._File), Header = nameof(Resources.GeneratePortable), MenuCategory = nameof(Resources.Save))]
112111
[Shared]
113-
class GeneratePdbMainMenuEntry(AssemblyTreeModel assemblyTreeModel, LanguageService languageService) : SimpleCommand
112+
class GeneratePdbMainMenuEntry(AssemblyTreeModel assemblyTreeModel, LanguageService languageService, DockWorkspace dockWorkspace) : SimpleCommand
114113
{
115114
public override bool CanExecute(object parameter)
116115
{
@@ -124,7 +123,7 @@ public override void Execute(object parameter)
124123
var assembly = (assemblyTreeModel.SelectedNodes?.FirstOrDefault() as AssemblyTreeNode)?.LoadedAssembly;
125124
if (assembly == null)
126125
return;
127-
GeneratePdbContextMenuEntry.GeneratePdbForAssembly(assembly, languageService);
126+
GeneratePdbContextMenuEntry.GeneratePdbForAssembly(assembly, languageService, dockWorkspace);
128127
}
129128
}
130129
}

0 commit comments

Comments
 (0)