diff --git a/src/HexManiac.WPF/Controls/TextEditor.xaml b/src/HexManiac.WPF/Controls/TextEditor.xaml index 4aec91ad..16ca3869 100644 --- a/src/HexManiac.WPF/Controls/TextEditor.xaml +++ b/src/HexManiac.WPF/Controls/TextEditor.xaml @@ -4,41 +4,42 @@ xmlns:local="clr-namespace:HavenSoft.HexManiac.WPF.Controls"> - + - + - + - + - + - + + diff --git a/src/HexManiac.WPF/Controls/TextEditor.xaml.cs b/src/HexManiac.WPF/Controls/TextEditor.xaml.cs index 606b300d..729f81a9 100644 --- a/src/HexManiac.WPF/Controls/TextEditor.xaml.cs +++ b/src/HexManiac.WPF/Controls/TextEditor.xaml.cs @@ -1,6 +1,8 @@ using HavenSoft.HexManiac.Core.ViewModels; using System; +using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; @@ -51,12 +53,28 @@ namespace HavenSoft.HexManiac.WPF.Controls { public TextEditorViewModel ViewModel => (TextEditorViewModel)DataContext; + private IEnumerable Layers => new[] { BasicLayer, AccentLayer, ConstantsLayer, NumericLayer, CommentLayer, TextLayer }; + public TextEditor() { InitializeComponent(); TransparentLayer.SelectionChanged += (sender, e) => { SelectionChanged?.Invoke(this, e); }; DataContextChanged += HandleDataContextChanged; + // ExtentWidth is not a DependencyProperty, so check for the horizontal scroll bar when the text chanegs + TransparentLayer.TextChanged += (sender, e) => { + // measure the width of the text, since ExtentWidth hasn't been updated yet. + var typeface = new Typeface(TransparentLayer.FontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); + var width = new FormattedText(TransparentLayer.Text, CultureInfo.CurrentCulture, FlowDirection, typeface, TransparentLayer.FontSize, Brushes.Transparent, 1).Width; + foreach (var layer in Layers) layer.Width = width; + if (width > TransparentLayer.ViewportWidth) { + CornerCover.Width = 16; + CornerCover.Height = 17; + } else { + CornerCover.Width = 0; + CornerCover.Height = 0; + } + }; } private void HandleDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { @@ -99,9 +117,11 @@ namespace HavenSoft.HexManiac.WPF.Controls { public void ScrollToVerticalOffset(double offset) => TransparentLayer.ScrollToVerticalOffset(offset); private void TextScrollChanged(object sender, ScrollChangedEventArgs e) { - foreach (var layer in new[] { BasicLayer, AccentLayer, ConstantsLayer, NumericLayer, CommentLayer, TextLayer }) { + foreach (var layer in Layers) { var transform = (TranslateTransform)layer.RenderTransform; transform.Y = -TransparentLayer.VerticalOffset; + transform.X = -TransparentLayer.HorizontalOffset; + layer.Width = TransparentLayer.ExtentWidth; } }