using System; using System.Diagnostics; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Threading; using System.Resources; using System.Threading.Tasks; using System.Collections.ObjectModel; using Resources = agree.Properties.Resources; using miew.ReadOnly; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public interface ISysObj { String SysObjName { get; } String SysObjDescription { get; } IReadOnlyDictionary<String, ISysObj> SysObjChildren { get; } ISysObj SysObjParent { get; } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public class SysObj : ISysObj { public const String build_type = #if DEBUG "debug"; #else "release"; #endif public static String GetObjectTypeName(ISysObj o) { if (o is SysObj) return "System"; if (o is Grammar) return "Grammar"; if (o is Type) return "Type"; if (o is LexicalEntry) return "Lexical Entry"; if (o is GrammarRule) return "Grammar Rule"; if (o is MorphologicalRule) return "Inflection Rule"; if (o is LexicalRule) return "Lexical Rule"; if (o is StartSymbol) return "Start Symbol"; if (o is NodeLabel) return "Node Label"; throw new Exception(); } public String VersionInfo() { return String.Format("aɢʀee engine {0} {1} {2}-bit", new DateTime(2000, 1, 1).AddDays(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build), build_type, IntPtr.Size * 8); } SysObj() { sc = new SysCommands(this); } SysCommands sc; static SysObj _singleton = new SysObj(); public static SysObj Instance { get { return _singleton; } } public SysCommands Commands { get { return sc; } } public event Action<CommandToken, String> TransactionStatusEvent = null; public event Action<CommandToken, CommandToken> AdditionalTransactionEvent = null; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// internal void AddTransaction(CommandToken tx, CommandToken additional) { Action<CommandToken, CommandToken> ev = AdditionalTransactionEvent; if (ev != null) ev.Invoke(tx, additional); } internal void TransactionStatus(CommandToken tx) { TransactionStatus(tx, default(String)); } internal void TransactionStatus(CommandToken tx, String fmt, params Object[] args) { Action<CommandToken, String> ev = TransactionStatusEvent; if (ev != null) { if (fmt != null) fmt = String.Format(fmt, args); ev.Invoke(tx, fmt); } } internal ResourceManager ResourceManager { get { return Resources.ResourceManager; } } internal SysObjHelper<ISysObj> sys_objs = new SysObjHelper<ISysObj>(); public string SysObjName { get { return "sys"; } } public string SysObjDescription { get { return "agree grammar engineering environment system instance"; } } public IReadOnlyDictionary<String, ISysObj> SysObjChildren { get { return sys_objs; } } public ISysObj SysObjParent { get { return this; } } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public class SysObjHelper<T> : KeyedCollection<String, T>, IReadOnlyDictionary<String, ISysObj> where T : class, ISysObj { public SysObjHelper() : base(StringComparer.OrdinalIgnoreCase) { } public static IEnumerable<ISysObj> GetNamePrefixMatches(ISysObj sys_obj, String s_pfx) { if (s_pfx == "*") s_pfx = ""; foreach (var kvp in sys_obj.SysObjChildren) { Debug.Assert(kvp.Value.SysObjName == kvp.Key); if (kvp.Key.StartsWith(s_pfx)) yield return kvp.Value; } } static Dictionary<String, T> _ed = null; static SysObjHelper<T> _empty = null; static public SysObjHelper<T> Empty { get { return _empty = _empty ?? new SysObjHelper<T>(); } } protected override String GetKeyForItem(T item) { return item.SysObjName; } public new IDictionary<String, T> Dictionary { get { if (base.Dictionary == null) return _ed = _ed ?? new Dictionary<String, T>(); return base.Dictionary; } } bool IReadOnlyDictionary<String, ISysObj>.ContainsKey(String key) { if (base.Dictionary == null) return false; return base.Dictionary.ContainsKey(key); } ICollection<String> IReadOnlyDictionary<String, ISysObj>.Keys { get { return base.Dictionary.Keys; } } ICollection<ISysObj> IReadOnlyDictionary<String, ISysObj>.Values { get { return ((IEnumerable<T>)this).Cast<ISysObj>().ToArray(); } } bool IReadOnlyDictionary<String, ISysObj>.TryGetValue(String key, out ISysObj value) { T v; if (base.Dictionary == null || !base.Dictionary.TryGetValue(key, out v)) { value = null; return false; } value = v; return true; } ISysObj IReadOnlyDictionary<String, ISysObj>.this[String key] { get { if (base.Dictionary == null) throw new KeyNotFoundException(); return base.Dictionary[key]; } } bool IReadOnlyDictionary<String, ISysObj>.IsReadOnly { get { return true; } } int IReadOnlyDictionary<String, ISysObj>.Count { get { return base.Count; } } IEnumerator<KeyValuePair<String, ISysObj>> IEnumerable<KeyValuePair<String, ISysObj>>.GetEnumerator() { if (base.Dictionary == null) yield break; foreach (var kvp in base.Dictionary) yield return new KeyValuePair<String, ISysObj>(kvp.Key, kvp.Value); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } }; }