118 lines
3.2 KiB
C#
118 lines
3.2 KiB
C#
using System.ComponentModel;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Interactivity;
|
|
using AvaloniaEdit;
|
|
using AvaloniaEdit.TextMate;
|
|
using GsaEditor.ViewModels;
|
|
using TextMateSharp.Grammars;
|
|
|
|
namespace GsaEditor.Views;
|
|
|
|
public partial class MainWindow : Window
|
|
{
|
|
private bool _forceClose;
|
|
private TextEditor? _textEditor;
|
|
private TextMate.Installation? _textMateInstall;
|
|
private readonly RegistryOptions _registryOptions;
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
|
|
_registryOptions = new RegistryOptions(ThemeName.DarkPlus);
|
|
|
|
_textEditor = this.FindControl<TextEditor>("TextEditor");
|
|
if (_textEditor != null)
|
|
{
|
|
_textMateInstall = _textEditor.InstallTextMate(_registryOptions);
|
|
}
|
|
}
|
|
|
|
protected override void OnLoaded(RoutedEventArgs e)
|
|
{
|
|
base.OnLoaded(e);
|
|
|
|
if (DataContext is MainWindowViewModel vm)
|
|
{
|
|
vm.SetWindow(this);
|
|
vm.PropertyChanged += ViewModel_PropertyChanged;
|
|
}
|
|
}
|
|
|
|
private void ViewModel_PropertyChanged(object? sender, PropertyChangedEventArgs e)
|
|
{
|
|
if (sender is not MainWindowViewModel vm) return;
|
|
|
|
if (e.PropertyName == nameof(MainWindowViewModel.PreviewText))
|
|
{
|
|
if (_textEditor != null && vm.PreviewText != null)
|
|
{
|
|
_textEditor.Text = vm.PreviewText;
|
|
}
|
|
else if (_textEditor != null)
|
|
{
|
|
_textEditor.Text = string.Empty;
|
|
}
|
|
}
|
|
|
|
if (e.PropertyName == nameof(MainWindowViewModel.SelectedEntry))
|
|
{
|
|
ApplySyntaxHighlighting(vm);
|
|
}
|
|
}
|
|
|
|
private void ApplySyntaxHighlighting(MainWindowViewModel vm)
|
|
{
|
|
if (_textMateInstall == null || vm.SelectedEntry == null) return;
|
|
|
|
var alias = vm.SelectedEntry.Alias;
|
|
var ext = System.IO.Path.GetExtension(alias).ToLowerInvariant();
|
|
|
|
// Map file extension to a TextMate language scope
|
|
var language = _registryOptions.GetLanguageByExtension(ext);
|
|
if (language != null)
|
|
{
|
|
_textMateInstall.SetGrammar(_registryOptions.GetScopeByLanguageId(language.Id));
|
|
}
|
|
else
|
|
{
|
|
_textMateInstall.SetGrammar(null);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called by the ViewModel to retrieve the current text from the editor.
|
|
/// </summary>
|
|
public string? GetEditorText()
|
|
{
|
|
return _textEditor?.Text;
|
|
}
|
|
|
|
private void TreeView_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (DataContext is MainWindowViewModel vm && sender is TreeView tree)
|
|
{
|
|
vm.SelectedNode = tree.SelectedItem as EntryTreeNodeViewModel;
|
|
}
|
|
}
|
|
|
|
protected override async void OnClosing(WindowClosingEventArgs e)
|
|
{
|
|
base.OnClosing(e);
|
|
|
|
if (_forceClose) return;
|
|
|
|
if (DataContext is MainWindowViewModel vm && vm.IsDirty)
|
|
{
|
|
e.Cancel = true;
|
|
var confirmed = await Helpers.Dialogs.ConfirmAsync(this, "Unsaved Changes",
|
|
"You have unsaved changes. Close without saving?");
|
|
if (confirmed)
|
|
{
|
|
_forceClose = true;
|
|
Close();
|
|
}
|
|
}
|
|
}
|
|
}
|