diff --git a/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs b/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs
index f70a1fba..3c8f31c4 100644
--- a/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs
+++ b/JavaToCSharpGui/Infrastructure/HostStorageProvider.cs
@@ -3,33 +3,44 @@
namespace JavaToCSharpGui.Infrastructure;
///
-public class HostStorageProvider : IHostStorageProvider
+public class HostStorageProvider(IStorageProvider storageProvider) : IHostStorageProvider
{
- private readonly IStorageProvider _storageProvider;
-
- public HostStorageProvider(IStorageProvider storageProvider) => _storageProvider = storageProvider;
+ ///
+ public bool CanPickFolder => storageProvider.CanPickFolder;
///
- public bool CanPickFolder => _storageProvider.CanPickFolder;
+ public bool CanOpen => storageProvider.CanOpen;
///
- public bool CanOpen => _storageProvider.CanOpen;
+ public bool CanSave => storageProvider.CanSave;
///
public async Task> OpenFilePickerAsync(FilePickerOpenOptions options)
{
- return await _storageProvider.OpenFilePickerAsync(options);
+ return await storageProvider.OpenFilePickerAsync(options);
}
///
public async Task> OpenFolderPickerAsync(FolderPickerOpenOptions options)
{
- return await _storageProvider.OpenFolderPickerAsync(options);
+ return await storageProvider.OpenFolderPickerAsync(options);
}
-
+
///
public async Task TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder)
{
- return await _storageProvider.TryGetWellKnownFolderAsync(wellKnownFolder);
+ return await storageProvider.TryGetWellKnownFolderAsync(wellKnownFolder);
+ }
+
+ ///
+ public async Task OpenSaveFileDialogAsync(FilePickerSaveOptions options)
+ {
+ return await storageProvider.SaveFilePickerAsync(options);
+ }
+
+ ///
+ public async Task TryGetFolderFromPathAsync(string path)
+ {
+ return await storageProvider.TryGetFolderFromPathAsync(path);
}
}
diff --git a/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs b/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs
index 6bb0d994..2773e2d8 100644
--- a/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs
+++ b/JavaToCSharpGui/Infrastructure/IHostStorageProvider.cs
@@ -17,6 +17,11 @@ public interface IHostStorageProvider
///
bool CanOpen { get; }
+ ///
+ /// Can the save file picker be opened on the current platform.
+ ///
+ bool CanSave { get; }
+
///
/// Gets the path to a well known folder.
///
@@ -37,4 +42,18 @@ public interface IHostStorageProvider
/// The file picker configuration.
/// A list of selected files.
Task> OpenFilePickerAsync(FilePickerOpenOptions options);
+
+ ///
+ /// Opens the save file picker dialog.
+ ///
+ /// The file picker configuration.
+ /// The selected file.
+ Task OpenSaveFileDialogAsync(FilePickerSaveOptions options);
+
+ ///
+ /// Tries to get a folder from a path.
+ ///
+ /// The path to the folder.
+ /// The folder, or null if not found.
+ Task TryGetFolderFromPathAsync(string path);
}
diff --git a/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs b/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs
index 8b44f406..d167c731 100644
--- a/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs
+++ b/JavaToCSharpGui/ViewModels/MainWindowViewModel.cs
@@ -324,6 +324,42 @@ private async Task CopyOutput()
await _dispatcher.InvokeAsync(() => { ConversionStateLabel = ""; }, DispatcherPriority.Background);
}
+ [RelayCommand]
+ private async Task SaveOutput()
+ {
+ if (_storageProvider?.CanSave is true)
+ {
+ IStorageFolder? startLocation = null;
+
+ if (Path.GetDirectoryName(OpenPath) is string dir)
+ {
+ startLocation = await _storageProvider.TryGetFolderFromPathAsync(dir);
+ }
+
+ startLocation ??= await _storageProvider.TryGetWellKnownFolderAsync(WellKnownFolder.Documents);
+
+ var filePickerSaveOptions = new FilePickerSaveOptions
+ {
+ SuggestedFileName = Path.GetFileNameWithoutExtension(OpenPath) + ".cs",
+ SuggestedStartLocation = startLocation,
+ Title = "Save C# File"
+ };
+
+ var result = await _storageProvider.OpenSaveFileDialogAsync(filePickerSaveOptions);
+
+ if (result is not null)
+ {
+ await File.WriteAllTextAsync(result.Path.LocalPath, CSharpText);
+
+ ConversionStateLabel = "Saved C# code to file!";
+
+ await Task.Delay(2000);
+
+ await _dispatcher.InvokeAsync(() => { ConversionStateLabel = ""; }, DispatcherPriority.Background);
+ }
+ }
+ }
+
[RelayCommand]
private static void ForkMeOnGitHub() => Process.Start(new ProcessStartInfo
{
diff --git a/JavaToCSharpGui/Views/MainWindow.axaml b/JavaToCSharpGui/Views/MainWindow.axaml
index 78e318e8..95c3039c 100644
--- a/JavaToCSharpGui/Views/MainWindow.axaml
+++ b/JavaToCSharpGui/Views/MainWindow.axaml
@@ -93,6 +93,7 @@
+