#define THAI
using System.Reflection;
using System;
using System.IO;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Data;
using System.Diagnostics;
using System.Globalization;
using System.Windows.Controls;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
using agree;
using agree.itsdb;
using agree.Wpf.Util;
using SysFile = System.IO.File;
using SysType = System.Type;
using ActiproSoftware.Windows.Controls.Ribbon;
namespace agree.Wpf
{
public class CommandResultResponder
{
readonly public ISysObj so;
public CommandResultResponder(ISysObj so)
{
this.so = so;
}
//public void QueueSynchronousAction(CommandToken ct, Action a)
//{
// Application.Current.Dispatcher.BeginInvoke(new Action(() =>
// {
// List<Action> la;
// if (!continuations.TryGetValue(ct, out la))
// continuations.Add(ct, la = new List<Action>());
// la.Add(a);
// CheckContinuation(ct);
// }), null);
//}
//void CheckContinuation(CommandToken ct)
//{
// Application.Current.Dispatcher.BeginInvoke(new Action(() =>
// {
// if (ct.Task.IsCompleted)
// {
// List<Action> la = continuations[ct];
// continuations.Remove(ct);
// foreach (Action a in la)
// a();
// }
// }), null);
//}
//Dictionary<CommandToken, List<Action>> continuations = new Dictionary<CommandToken, List<Action>>();
public void QueueResultContinuation(CommandToken ct)
{
MainWindow w = MainWindow.w;
if (ct is SysCommands.CmdTokInteractive)
ct = (ct as SysCommands.CmdTokInteractive).Task.Result;
if (ct.ErrorMessage != null)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
w.log_window.WriteLine(ct.ErrorMessage);
}),
DispatcherPriority.Normal,
null);
return;
}
if (ct is SysCommands.CmdTokLoadGrammar)
{
((Task<Grammar>)ct.Task).ContinueWith(
t =>
{
Grammar g = t.Result;
if (!g.IsLoaded)
return;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CommandResultResponder cr = new CommandResultResponder(g);
w.cmd_responders.Add(g, cr);
w.object_browser.AddSysObj(g);
w.log_window.CurrentHandler = cr;
}),
DispatcherPriority.Normal,
null);
}, TaskContinuationOptions.ExecuteSynchronously);
}
else if (ct is SysCommands.CmdTokClearConsole)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
w.log_window.Clear();
}),
DispatcherPriority.Normal,
null);
}
else if (ct is SysCommands.CmdTokDisplayMessage)
{
}
else if (ct is SysCommands.CmdTokQueryNamePrefix)
{
var z = ct as SysCommands.CmdTokQueryNamePrefix;
z.Task.ContinueWith(
t =>
{
ISysObj[] rgso = t.Result;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
if (rgso.Length == 0)
w.log_window.WriteLine("No names.");
else
foreach (ISysObj _s in rgso)
{
w.log_window.WriteLine("{0}", _s.SysObjName);
}
}),
DispatcherPriority.Normal,
null);
});
}
else if (ct is SysCommands.CmdTokShowItem)
{
var z = ct as SysCommands.CmdTokShowItem;
z.Task.ContinueWith(
t =>
{
ISysObj o = t.Result;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
//CommandBinding q = MyDockSite.g_docksite.CommandBindings.OfType<CommandBinding>().First(cb => cb.Command is ShowItemCommand);
//q.Command.Execute(o);
ShowItemCommand.BetterExecute(z.iso, o);
}),
DispatcherPriority.Normal,
null);
});
}
else if (ct is SysCommands.CmdTokShowHighlightedItem)
{
var z = ct as SysCommands.CmdTokShowHighlightedItem;
z.Task.ContinueWith(
t =>
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
//new ShowHighlightedItemCommand(w, z.obj_parent, z.obj_highlight).Execute(null, w);
MyDockSite mds = MyDockSite.g_docksite;
var etw = new ExpandedWindow((Tfs)z.obj_parent, (Tfs)z.obj_highlight);
mds.wksp.tmc.Items.Add(etw);
etw.Activate();
}),
DispatcherPriority.Normal,
null);
});
}
else if (ct is SysCommands.CmdTokUnloadGrammar)
{
var z = ct as SysCommands.CmdTokUnloadGrammar;
z.Task.ContinueWith(
t =>
{
bool b = t.Result;
if (b)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CommandResultResponder cr;
if (w.cmd_responders.TryGetValue(z.g, out cr))
{
if (w.log_window.CurrentHandler == cr)
w.log_window.CurrentHandler = w.cmd_responders.Values.First(crx => crx.so != z.g);
//w.object_browser.RemoveSysObj(cr.so);
w.cmd_responders.Remove(z.g);
}
}),
DispatcherPriority.Normal,
null);
}
});
}
else if (ct is SysCommands.CmdTokParse)
{
var z = ct as SysCommands.CmdTokParse;
z.Task.ContinueWith(
t =>
{
ParseControl pc = t.Result;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
var cr = new CommandResultResponder(pc);
w.cmd_responders.Add(pc, cr);
w.object_browser.AddSysObj(pc);
w.log_window.WriteLine("{0}: {1} parse(s)", pc.SysObjName, pc.chart.CompletedEdges.Count());
}),
DispatcherPriority.Normal,
null);
});
}
else if (ct is SysCommands.CmdTokChangeDefaultObject)
{
((Task<ISysObj>)ct.Task).ContinueWith(
t =>
{
ISysObj so_new = t.Result;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CommandResultResponder cr;
if (w.cmd_responders.TryGetValue(so_new, out cr))
w.log_window.CurrentHandler = cr;
}),
DispatcherPriority.Normal,
null);
});
}
//CheckContinuation(ct);
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public partial class MainWindow : RibbonWindow
{
const String build_type =
#if DEBUG
"debug";
#else
"release";
#endif
public String ClientVersionInfo()
{
return String.Format("aɢʀee :: another ɢʀammar enɢineerinɢ environment {0} {1} {2}-bit",
new DateTime(2000, 1, 1).AddDays(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build),
build_type,
IntPtr.Size * 8);
}
public static MainWindow w;
[STAThread()]
static void Main(String[] args)
{
Application app = new Application();
Uri pageUri = new Uri("/Dictionary1.xaml", UriKind.Relative);
app.Resources.Source = pageUri;
w = new MainWindow(args);
w.Title = "aɢʀee :: another ɢʀammar enɢineerinɢ environment";
app.Run(w);
}
private void DoNothingCommand(object target, ExecutedRoutedEventArgs args)
{
}
//public Grammar g;
public static OptionSetting3d optionSetting3d;
//public static ShowCommand Show = new ShowCommand();
String[] args;
public MainWindow(String[] args)
{
this.args = args;
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
this.FontSize = 13;
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.New, DoNothingCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, OpenFileCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, SaveCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.SaveAs, DoNothingCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Print, PrintCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, DoNothingCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy, DoNothingCommand));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, DoNothingCommand));
// this.CommandBindings.Add(new LoadGrammar(this).CommandBinding);
// this.CommandBindings.Add(new SaveGrammarBinary(this).CommandBinding);
//this.CommandBindings.Add(Show.CommandBinding);
optionSetting3d = new OptionSetting3d(this);
this.CommandBindings.Add(optionSetting3d.CommandBinding);
//CommandManager.regi
this.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
this.Width = 1024;
this.Height = 800;
this.Content = new MyDockPanel(this);
this.ApplicationName = "aɢʀee :: another ɢʀammar enɢineerinɢ environment";
}
public InteractiveWindow log_window;
public ObjectBrowserToolWindow object_browser;
//public List<CommandResultResponder> rgso = new List<CommandResultResponder>();
public Dictionary<ISysObj, CommandResultResponder> cmd_responders = new Dictionary<ISysObj, CommandResultResponder>();
public SysObj so;
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
so = agree.SysObj.Instance;
CommandResultResponder cr = new CommandResultResponder(so);
cmd_responders.Add(so, cr);
new SysCommands.CmdTokDisplayVersionInfo(so);
/// Create a status log window
log_window = new InteractiveWindow(this, so);
MyDockSite.g_docksite.wksp.tmc.Items.Add(log_window);
log_window.Activate();
so.TransactionStatusEvent += (x, msg) => Application.Current.Dispatcher.BeginInvoke(
new Action(() => log_window.WriteLine(x, msg)),
DispatcherPriority.Normal,
null);
so.AdditionalTransactionEvent += (x, tx_add) => Application.Current.Dispatcher.BeginInvoke(
new Action(() => cmd_responders[x.iso].QueueResultContinuation(tx_add)),
DispatcherPriority.Normal,
null);
log_window.WriteLine("Application started.");
log_window.WriteLine(ClientVersionInfo());
Config cfg = new Config();
int arg_ix;
if ((arg_ix = Array.IndexOf<String>(args, "-singlethreaded")) != -1)
{
log_window.WriteLine("disabling multi-threading");
args = args.Where((_e, x) => x != arg_ix).ToArray();
cfg.system.MultiThreading = false;
}
try
{
SysCommands.CmdTokLoadGrammar lg_cmd = null;
for (int i = 0; i < args.Length; i++)
{
String arg = args[i];
if (arg[0] != '-' && SysFile.Exists(arg))
{
//ExecuteCommand<LoadGrammar>(Path.GetFullPath(arg));
lg_cmd = new SysCommands.CmdTokLoadGrammar(so, Path.GetFullPath(arg), null, cfg);
cr.QueueResultContinuation(lg_cmd);
}
if (i < args.Length - 1 && arg.StartsWith("-c"))
{
String s_cmd = args[i + 1].Trim('\"');
if (lg_cmd != null)
lg_cmd.QueueResultInteraction(s_cmd).ContinueWith(q => cr.QueueResultContinuation(q.Result));
else
{
var x = new SysCommands.CmdTokInteractive(cr.so, s_cmd);
cr.QueueResultContinuation(x);
};
}
}
}
catch (DebuggingTfsDisplayException ex)
{
foreach (var te in ex.Tfs)
ShowItemCommand.BetterExecute(null, te);
}
log_window.Focus();
}
public void ExecuteCommand<T>(Object param) where T : CommandBase
{
ExecuteCommand<T>(this, param);
}
public void ExecuteCommand<T>(IInputElement source, Object param) where T : CommandBase
{
CommandBindings
.OfType<CommandBinding>()
.Select(cb => cb.Command as T)
.First(c => c != null)
.Execute(param, source);
}
};
#if false
public class LoadGrammar : CommandBase
{
public LoadGrammar(MainWindow w)
: base(w, "Load Grammar", "LoadGrammar", typeof(LoadGrammar))
{
}
protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
{
String filename = args.Parameter as String;
if (filename == null)
{
MessageBox.Show("Incorrect argument 'null' for LoadGrammar command.", "Command Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
else if (!System.IO.File.Exists(filename))
{
String msg = String.Format("The file '{0}' could not be found.", filename);
MessageBox.Show(msg, "File not found", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
String file_base = Path.GetFileNameWithoutExtension(filename);
w.so.Commands.LoadGrammar(file_base, filename).Task.ContinueWith(t =>
{
Grammar g = t.Result;
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
w.object_browser.AddSysObj(g);
w.log_window.Default = g;
}),
DispatcherPriority.Normal,
null);
});
}
args.Handled = true;
}
};
public class SaveGrammarBinary : CommandBase
{
public SaveGrammarBinary(MainWindow w)
: base(w, "Save grammar in binary format", "SaveGrammarBinary", typeof(SaveGrammarBinary))
{
}
protected override void OnExecute(object target, ExecutedRoutedEventArgs args)
{
Grammar g = args.Parameter as Grammar;
if (g == null)
return;
//String filename = args.Parameter as String;
//if (filename == null)
//{
// MessageBox.Show("Incorrect argument 'null' for LoadGrammar command.", "Command Error", MessageBoxButton.OK, MessageBoxImage.Error);
//}
//else if (!System.IO.File.Exists(filename))
//{
// String msg = String.Format("The file '{0}' could not be found.", filename);
// MessageBox.Show(msg, "File not found", MessageBoxButton.OK, MessageBoxImage.Error);
//}
//else
//Grammar g = args. as Grammar;
String filename = Path.GetFullPath(g.Name + ".bg");
// Task.Factory.StartNew(() => g.Save(filename));
args.Handled = true;
}
};
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#if false
class My3dGrid : Grid
{
public My3dGrid(Grammar g, Edge ce)
{
#if true
Zoom3D m3d = new Zoom3D(g, ce, this);
#else
Main3D m3d = new Main3D(g, ce, this);
#endif
#if true
this.ColumnDefinitions.Add(new ColumnDefinition());
m3d.SetValue(Grid.ColumnProperty, 0);
this.Children.Add(m3d);
#else
this.Children.Add(m3d);
#endif
}
};
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
abstract class MainGrid : Grid
{
public MainGrid()
{
this.HorizontalAlignment = HorizontalAlignment.Left;
this.VerticalAlignment = VerticalAlignment.Top;
this.ShowGridLines = true;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class HorizontalTfsGrid : MainGrid
{
Random rnd = new Random();
public HorizontalTfsGrid(Grammar g, IEnumerable<Tfs> ce)
{
int j = 0;
foreach (Tfs te in ce)
{
TfsControl tc = new TfsControl();
tc._TfsEdge = te;
tc.FontFamily = new FontFamily("Arial");
tc.Margin = new Thickness(10);
this.ColumnDefinitions.Add(new ColumnDefinition());
tc.SetValue(Grid.ColumnProperty, j);
this.Children.Add(tc);
j++;
//tc.Background = new SolidColorBrush(Color.FromArgb((byte)rnd.Next(), (byte)rnd.Next(), (byte)rnd.Next(), (byte)rnd.Next()));
}
this.ShowGridLines = true;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class SingleTfsGrid : Grid
{
Random rnd = new Random();
public SingleTfsGrid(Grammar g, Tfs ce)
{
TfsControl tc = new TfsControl();
tc._TfsEdge = ce;
tc.FontFamily = new FontFamily("Arial");
tc.Margin = new Thickness(10);
this.Children.Add(tc);
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class TwoColumnDefinitionExpandedGrid : MainGrid
{
public TwoColumnDefinitionExpandedGrid(Grammar g, IEnumerable<Tfs> ce)
{
this.Margin = new Thickness(20);
this.ColumnDefinitions.Add(new ColumnDefinition());
this.ColumnDefinitions.Add(new ColumnDefinition());
this.ColumnDefinitions.Add(new ColumnDefinition());
this.ColumnDefinitions.Add(new ColumnDefinition());
this.RowDefinitions.Add(new RowDefinition());
int j = 1;
foreach (Tfs e in ce)
{
this.RowDefinitions.Add(new RowDefinition());
TfsControl tc0 = new TfsControl();
tc0._TfsEdge = e;
tc0.FontFamily = new FontFamily("Arial");
tc0.Margin = new Thickness(10);
tc0.SetValue(Grid.RowProperty, j);
tc0.SetValue(Grid.ColumnProperty, 1);
TfsControl tc1 = new TfsControl();
tc1._TfsEdge = e.Type.Expanded;
tc1.FontFamily = new FontFamily("Arial");
tc1.Margin = new Thickness(10);
tc1.SetValue(Grid.ColumnProperty, 2);
tc1.SetValue(Grid.RowProperty, j);
this.Children.Add(tc0);
this.Children.Add(tc1);
j++;
}
this.RowDefinitions.Add(new RowDefinition());
this.ShowGridLines = true;
}
};
/// <summary> /// Converter to use in WPF triggers that returns true when /// 'value' is less than 'parameter'. /// </summary>
public class LessThanConverter : IValueConverter
{
public object Convert(object value, SysType targetType, object parameter, System.Globalization.CultureInfo culture)
{
int v1 = System.Convert.ToInt32(value);
int v2 = System.Convert.ToInt32(parameter);
return (object)(bool)(v1 < v2);
}
public object ConvertBack(object value, SysType targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
};
}