|
|
@ -1,32 +1,128 @@
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
using System.Linq;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Avalonia.Controls;
|
|
|
|
using Avalonia.Controls;
|
|
|
|
using Avalonia.Interactivity;
|
|
|
|
using Avalonia.Interactivity;
|
|
|
|
using Avalonia.Platform.Storage;
|
|
|
|
using Avalonia.Platform.Storage;
|
|
|
|
|
|
|
|
using Avalonia.Rendering;
|
|
|
|
|
|
|
|
using Avalonia.Threading;
|
|
|
|
|
|
|
|
using Avalonia.VisualTree;
|
|
|
|
|
|
|
|
using AvaloniaEdit;
|
|
|
|
|
|
|
|
using AvaloniaEdit.Highlighting;
|
|
|
|
|
|
|
|
using AvaloniaEdit.Rendering;
|
|
|
|
|
|
|
|
using Irony.Interpreter;
|
|
|
|
|
|
|
|
using Irony.Parsing;
|
|
|
|
|
|
|
|
using irules.core;
|
|
|
|
|
|
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
|
|
|
|
|
|
using Avalonia.Media;
|
|
|
|
|
|
|
|
|
|
|
|
namespace red;
|
|
|
|
namespace red;
|
|
|
|
|
|
|
|
|
|
|
|
public partial class MainWindow : Window
|
|
|
|
public partial class MainWindow : Window
|
|
|
|
{
|
|
|
|
{
|
|
|
|
public MainWindow()
|
|
|
|
ClauseChecker checker;
|
|
|
|
|
|
|
|
public MainWindow(ClauseChecker checker)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
this.checker = checker;
|
|
|
|
InitializeComponent();
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
SetupTheme();
|
|
|
|
src.Text = "Hello !";
|
|
|
|
src.Text = "Hello !";
|
|
|
|
|
|
|
|
src.TextChanged += OnTextChanged;
|
|
|
|
|
|
|
|
src.TextArea.TextView.VisualLinesChanged += TextView_VisualLinesChanged;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void TextView_VisualLinesChanged(object sender, EventArgs e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//throw new NotImplementedException();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void SetupTheme()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
HighlightingColor keywork = new HighlightingColor
|
|
|
|
|
|
|
|
{ Foreground = new SimpleHighlightingBrush(Color.FromRgb(255,155,50)) };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HighlightingColor comment = new HighlightingColor
|
|
|
|
|
|
|
|
{ FontStyle = Avalonia.Media.FontStyle.Italic,
|
|
|
|
|
|
|
|
Foreground = new SimpleHighlightingBrush(Color.FromRgb(150,150,150)) };
|
|
|
|
|
|
|
|
HighlightingColor identifier = new HighlightingColor
|
|
|
|
|
|
|
|
{ Foreground = new SimpleHighlightingBrush(Color.FromRgb(255,195,255)) };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ColorTheme = new Dictionary<TokenColor, HighlightingColor>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
{ TokenColor.Text, keywork},
|
|
|
|
|
|
|
|
{ TokenColor.Keyword, keywork},
|
|
|
|
|
|
|
|
{ TokenColor.Comment, comment},
|
|
|
|
|
|
|
|
{ TokenColor.Identifier, identifier},
|
|
|
|
|
|
|
|
{ TokenColor.String, comment},
|
|
|
|
|
|
|
|
{ TokenColor.Number, identifier}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dictionary<TokenColor, HighlightingColor> ColorTheme;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void OnTextChanged(object sender, EventArgs e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var appstatus = checker.Parse(src.Text);
|
|
|
|
|
|
|
|
statusMessage.Text = "Parsing :" +
|
|
|
|
|
|
|
|
appstatus.ToString();
|
|
|
|
|
|
|
|
switch (appstatus)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
case AppStatus.Ready:
|
|
|
|
|
|
|
|
case AppStatus.SyntaxError:
|
|
|
|
|
|
|
|
case AppStatus.WaitingMoreInput:
|
|
|
|
|
|
|
|
src.TextArea.TextView.LineTransformers.Clear();
|
|
|
|
|
|
|
|
RichTextModel model = new RichTextModel();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checker.LatestParsedTree.Tokens?.ForEach (
|
|
|
|
|
|
|
|
token =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
switch(token.Category)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
case TokenCategory.Error:
|
|
|
|
|
|
|
|
case TokenCategory.Directive:
|
|
|
|
|
|
|
|
case TokenCategory.Content:
|
|
|
|
|
|
|
|
case TokenCategory.Comment:
|
|
|
|
|
|
|
|
// token.Location.Line
|
|
|
|
|
|
|
|
model.ApplyHighlighting(token.Location.Position, token.Length,
|
|
|
|
|
|
|
|
ColorTheme[token.EditorInfo.Color]);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
transformer = new RichTextColorizer(model);
|
|
|
|
|
|
|
|
src.TextArea.TextView.LineTransformers.Add(transformer);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void OnExit(object sender, RoutedEventArgs e)
|
|
|
|
public void OnExit(object sender, RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string sourceFileName=null;
|
|
|
|
|
|
|
|
private ITextRunConstructionContext context;
|
|
|
|
|
|
|
|
private RichTextColorizer transformer;
|
|
|
|
|
|
|
|
private ITextRunConstructionContext transformerContext;
|
|
|
|
|
|
|
|
|
|
|
|
public void OnOpen(object sender, RoutedEventArgs e)
|
|
|
|
public void OnOpen(object sender, RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Task.Run(async () =>
|
|
|
|
Task.Run(async () =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
FilePickerOpenOptions options = new FilePickerOpenOptions
|
|
|
|
FilePickerOpenOptions options = new FilePickerOpenOptions
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AllowMultiple = true,
|
|
|
|
AllowMultiple = false,
|
|
|
|
Title = "Red"
|
|
|
|
Title = "Open a red file"
|
|
|
|
};
|
|
|
|
};
|
|
|
|
options.FileTypeFilter = new FilePickerFileType[]
|
|
|
|
options.FileTypeFilter = new FilePickerFileType[]
|
|
|
|
{ new("red"){ Patterns = new string[] { "*.red" } } };
|
|
|
|
{ new("red"){ Patterns = new string[] { "*.red" } } };
|
|
|
@ -35,11 +131,27 @@ public partial class MainWindow : Window
|
|
|
|
|
|
|
|
|
|
|
|
if (result != null)
|
|
|
|
if (result != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
foreach (var item in result)
|
|
|
|
var item = result.First();
|
|
|
|
|
|
|
|
sourceFileName =
|
|
|
|
|
|
|
|
item.Path.AbsolutePath;
|
|
|
|
|
|
|
|
Dispatcher.UIThread.Post(() => src.Text = File.ReadAllText(sourceFileName));
|
|
|
|
|
|
|
|
System.Diagnostics.Debug.WriteLine($"Opened: {sourceFileName}");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void OnSave(object sender, RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
System.Diagnostics.Debug.WriteLine($"Opened: {item.Path}");
|
|
|
|
if (sourceFileName==null) OnSaveTo(sender, e);
|
|
|
|
|
|
|
|
File.WriteAllText(sourceFileName, src.Text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void OnSaveTo(object sender, RoutedEventArgs e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
public void OnRun(object sender, RoutedEventArgs e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|