using System; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Interactivity; using Avalonia.Media; using AvaloniaEdit; using AvaloniaEdit.Document; using AvaloniaEdit.Editing; namespace SourceGit.Views { public class RevisionTextFileView : TextEditor { protected override Type StyleKeyOverride => typeof(TextEditor); public RevisionTextFileView() : base(new TextArea(), new TextDocument()) { IsReadOnly = true; ShowLineNumbers = true; WordWrap = false; HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; VerticalScrollBarVisibility = ScrollBarVisibility.Auto; TextArea.LeftMargins[0].Margin = new Thickness(8, 0); TextArea.TextView.Margin = new Thickness(4, 0); TextArea.TextView.Options.EnableHyperlinks = false; TextArea.TextView.Options.EnableEmailHyperlinks = false; } protected override void OnLoaded(RoutedEventArgs e) { base.OnLoaded(e); TextArea.TextView.ContextRequested += OnTextViewContextRequested; } protected override void OnUnloaded(RoutedEventArgs e) { base.OnUnloaded(e); TextArea.TextView.ContextRequested -= OnTextViewContextRequested; GC.Collect(); } protected override void OnDataContextChanged(EventArgs e) { base.OnDataContextChanged(e); if (DataContext is Models.RevisionTextFile source) Text = source.Content; else Text = string.Empty; } private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs e) { var selected = SelectedText; if (string.IsNullOrEmpty(selected)) return; var copy = new MenuItem() { Header = App.Text("Copy") }; copy.Click += (_, ev) => { App.CopyText(selected); ev.Handled = true; }; if (this.FindResource("Icons.Copy") is Geometry geo) { copy.Icon = new Avalonia.Controls.Shapes.Path() { Width = 10, Height = 10, Stretch = Stretch.Uniform, Data = geo, }; } var menu = new ContextMenu(); menu.Items.Add(copy); TextArea.TextView.OpenContextMenu(menu); e.Handled = true; } } public partial class RevisionFiles : UserControl { public RevisionFiles() { InitializeComponent(); } } }