-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodexVS22Package.cs
More file actions
117 lines (103 loc) · 5.13 KB
/
CodexVS22Package.cs
File metadata and controls
117 lines (103 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
global using Community.VisualStudio.Toolkit;
global using Microsoft.VisualStudio.Shell;
global using System;
global using Task = System.Threading.Tasks.Task;
using System.Runtime.InteropServices;
using System.Threading;
using System.Collections.Generic;
using CodexVS22.Core.Cli;
using CodexVS22.Core.State;
using CodexVS22.Shared.Cli;
using CodexVS22.Shared.Options;
using CodexVS22.Shared.Utilities;
namespace CodexVS22
{
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration(Vsix.Name, Vsix.Description, Vsix.Version)]
[ProvideToolWindow(typeof(MyToolWindow.Pane), Style = VsDockStyle.Tabbed, Window = WindowGuids.SolutionExplorer)]
[ProvideMenuResource("Menus.ctmenu", 1)]
[ProvideOptionPage(typeof(CodexOptions), "Codex", "General", 0, 0, true)]
[Guid(PackageGuids.CodexVS22String)]
public sealed class CodexVS22Package : ToolkitPackage
{
public static CodexOptions OptionsInstance { get; private set; }
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
ConfigureServices();
await this.RegisterCommandsAsync();
this.RegisterToolWindows();
try
{
OptionsInstance = (CodexOptions)GetDialogPage(typeof(CodexOptions));
}
catch
{
OptionsInstance = new CodexOptions();
}
await InitializeEnvironmentAsync(cancellationToken);
if (OptionsInstance != null && OptionsInstance.OpenOnStartup)
{
try
{
await MyToolWindow.ShowAsync();
}
catch
{
// ignore failures opening the tool window on startup
}
}
}
private static void ConfigureServices()
{
ServiceLocator.RegisterSingleton<ICliDiagnosticsSink>(() => new DiagnosticsPaneCliDiagnosticsSink());
ServiceLocator.RegisterSingleton<ICliMessageSerializer>(() => new CliSubmissionFactory());
ServiceLocator.RegisterSingleton<ICliMessageRouter>(() => new DefaultCliMessageRouter());
ServiceLocator.RegisterSingleton<ICodexOptionsProvider>(() => new DefaultCodexOptionsProvider());
ServiceLocator.RegisterSingleton<ICodexCliHost>(() => new ProcessCodexCliHost(ServiceLocator.GetRequiredService<ICliDiagnosticsSink>()));
ServiceLocator.RegisterSingleton(() => new CliSessionService(
ServiceLocator.GetRequiredService<ICodexCliHost>(),
ServiceLocator.GetRequiredService<ICliMessageRouter>(),
ServiceLocator.GetRequiredService<ICliMessageSerializer>(),
ServiceLocator.GetRequiredService<ICodexOptionsProvider>()));
ServiceLocator.RegisterSingleton<ICodexSessionStore>(() => new CodexSessionStore());
ServiceLocator.RegisterSingleton<IWorkspaceContextStore>(() => new WorkspaceContextStore());
ServiceLocator.RegisterSingleton<IOptionsCache>(() => new OptionsCache());
ServiceLocator.RegisterSingleton<ICodexSessionCoordinator>(() =>
{
var coordinator = new CodexSessionCoordinator(
ServiceLocator.GetRequiredService<ICodexCliHost>(),
ServiceLocator.GetRequiredService<CliSessionService>(),
ServiceLocator.GetRequiredService<ICliMessageRouter>(),
ServiceLocator.GetRequiredService<ICodexOptionsProvider>(),
ServiceLocator.GetRequiredService<ICodexSessionStore>(),
ServiceLocator.GetRequiredService<IWorkspaceContextStore>(),
ServiceLocator.GetRequiredService<IOptionsCache>());
coordinator.Initialize();
return coordinator;
});
}
private async Task InitializeEnvironmentAsync(CancellationToken cancellationToken)
{
try
{
await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
var solutionContext = KnownUIContexts.SolutionExistsAndFullyLoadedContext;
var folderContext = MyToolWindowControl.TryGetFolderOpenUIContext();
var tasks = new List<Task>
{
MyToolWindowControl.WaitForUiContextAsync(solutionContext, cancellationToken)
};
if (folderContext != null)
tasks.Add(MyToolWindowControl.WaitForUiContextAsync(folderContext, cancellationToken));
var grace = Task.Delay(TimeSpan.FromSeconds(2), cancellationToken);
await Task.WhenAny(Task.WhenAll(tasks), grace);
var snapshot = await MyToolWindowControl.CaptureEnvironmentSnapshotAsync(cancellationToken);
MyToolWindowControl.SignalEnvironmentReady(snapshot);
}
catch
{
MyToolWindowControl.SignalEnvironmentReady(MyToolWindowControl.EnvironmentSnapshot.Empty);
}
}
}
}