diff --git a/Shared/Models/VisualizerData.cs b/Shared/Models/VisualizerData.cs index 8ec2a10..7e69742 100644 --- a/Shared/Models/VisualizerData.cs +++ b/Shared/Models/VisualizerData.cs @@ -83,7 +83,7 @@ T createInstance(string typename, object[] args = null) => break; case IParseTree tree1: tree = tree1; - Source = tree.GetText(); + Source = tree.GetPositionedText(); break; default: throw new ArgumentException("Unhandled type"); diff --git a/Shared/Util/Extensions/IParseTree.cs b/Shared/Util/Extensions/IParseTree.cs index 1b8406c..b463c5a 100644 --- a/Shared/Util/Extensions/IParseTree.cs +++ b/Shared/Util/Extensions/IParseTree.cs @@ -25,14 +25,14 @@ public static IEnumerable Descendants(this IParseTree tree) { public static string GetPositionedText(this IParseTree tree, char filler = ' ') { var sb = new StringBuilder(); - foreach (var descendant in tree.Descendants()) { - + foreach (var descendant in tree.Descendants().OfType()) { + var fillerCharCount = descendant.Payload.StartIndex - sb.Length; + if (fillerCharCount > 0) { + sb.Append(filler, fillerCharCount); + } + sb.Append(descendant.Payload.Text); } - // get string length of tree, from last node - // create string with length of string length - // create string builder from string - // walk tree, filling in each node - throw new NotImplementedException(); + return sb.ToString(); } } } diff --git a/Shared/ViewModels/ParseTreeNodeViewModel.cs b/Shared/ViewModels/ParseTreeNodeViewModel.cs index b57e544..24e8a15 100644 --- a/Shared/ViewModels/ParseTreeNodeViewModel.cs +++ b/Shared/ViewModels/ParseTreeNodeViewModel.cs @@ -9,6 +9,11 @@ namespace ParseTreeVisualizer { public class ParseTreeNodeViewModel : Selectable { + public static ParseTreeNodeViewModel Create(ParseTreeNode model) => + model is null ? + null : + new ParseTreeNodeViewModel(model); + public ParseTreeNodeViewModel(ParseTreeNode model) : base(model) => Children = (model?.Children.Select(x => new ParseTreeNodeViewModel(x)) ?? Enumerable.Empty()).ToList().AsReadOnly(); diff --git a/Shared/ViewModels/VisualizerDataViewModel.cs b/Shared/ViewModels/VisualizerDataViewModel.cs index 51c0ff6..5b8558b 100644 --- a/Shared/ViewModels/VisualizerDataViewModel.cs +++ b/Shared/ViewModels/VisualizerDataViewModel.cs @@ -30,8 +30,16 @@ public int SourceSelectionLength { public ReadOnlyCollection Tokens { get; } public VisualizerDataViewModel(VisualizerData visualizerData) : base(visualizerData) { - Root = new ParseTreeNodeViewModel(visualizerData.Root); - Tokens = visualizerData.Tokens.OrderBy(x => x.Index).Select(x => new TokenViewModel(x)).ToList().AsReadOnly(); + Root = ParseTreeNodeViewModel.Create(visualizerData.Root); + Tokens = visualizerData.Tokens?.OrderBy(x => x.Index).Select(x => new TokenViewModel(x)).ToList().AsReadOnly(); + + if (!(Root is null)) { + if (visualizerData.Config.HasTreeFilter()) { + Root.SetSubtreeExpanded(true); + } else { + Root.IsExpanded = true; + } + } } private bool inUpdateSelection; diff --git a/Shared/VisualizerControl.xaml b/Shared/VisualizerControl.xaml index 90093b0..de6ea3d 100644 --- a/Shared/VisualizerControl.xaml +++ b/Shared/VisualizerControl.xaml @@ -21,6 +21,10 @@ + @@ -69,7 +73,7 @@ - + @@ -85,19 +89,13 @@ - + - - - @@ -251,6 +249,11 @@ + diff --git a/Shared/VisualizerControl.xaml.cs b/Shared/VisualizerControl.xaml.cs index e664b01..e702e5e 100644 --- a/Shared/VisualizerControl.xaml.cs +++ b/Shared/VisualizerControl.xaml.cs @@ -18,6 +18,11 @@ public VisualizerControl() { )) { e.Cancel = true; } + + if (e.PropertyName == nameof(TokenViewModel.Text)) { + e.Column.Width = 150; + (e.Column as DataGridTextColumn).ElementStyle = FindResource("TextTrimmedTextbox") as Style; + } }; // scrolls the tree view item into view when selected @@ -50,8 +55,6 @@ public VisualizerControl() { tokens.ScrollIntoView(firstSelected); }; - data.Root.IsExpanded = true; - source.LostFocus += (s1, e1) => e1.Handled = true; source.Focus(); source.SelectionChanged += (s1, e1) => { @@ -72,11 +75,6 @@ private void LoadDataContext() { throw new InvalidOperationException("Unspecified error while serializing/deserializing"); } DataContext = new VisualizerDataViewModel(response); - if (Config.HasTreeFilter()) { - data.Root.SetSubtreeExpanded(true); - } else { - data.Root.IsExpanded = true; - } config = data.Model.Config; Config.Write(); diff --git a/Shared/VisualizerWindow.xaml.cs b/Shared/VisualizerWindow.xaml.cs index 9ba6104..11fecb1 100644 --- a/Shared/VisualizerWindow.xaml.cs +++ b/Shared/VisualizerWindow.xaml.cs @@ -17,7 +17,10 @@ public VisualizerWindow() { // if we could find out which is the current monitor, that would be better var workingAreas = Monitor.AllMonitors.Select(x => x.WorkingArea).ToList(); MaxWidth = workingAreas.Min(x => x.Width) * .90; - MaxHeight = workingAreas.Min(x => x.Height) * .90; + MinWidth = MaxWidth; + MaxHeight= workingAreas.Min(x => x.Height) * .90; + MinHeight = MaxHeight; + PreviewKeyDown += (s, e) => { if (e.Key == Key.Escape) { Close(); }