// Spludlow Software // Copyright © Samuel P. Ludlow 2020 All Rights Reserved // Distributed under the terms of the GNU General Public License version 3 // Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE // https://www.spludlow.co.uk/LICENCE.TXT // The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission // v1.14 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; namespace Spludlow { public class ConsoleMenu { public static void Run(DataTable menuTable) { int group = 0; ShowMenu(menuTable, group); string line; while ((line = Console.In.ReadLine()) != null) { int option; if (Int32.TryParse(line, out option) == true) { if (option == 0) { if (group == 0) break; group = (int)ParentRow(menuTable, group)["Group"]; } else { DataRow row = menuTable.Rows.Find(new object[] { group, option }); if (row != null) { int target = (int)row["Target"]; if (target == -1) { DateTime startTime = DateTime.Now; try { object[] parameters = new object[0]; if (row.IsNull("Parameter") == false) { string argText = (string)row["Parameter"]; if (argText.StartsWith("@") == true) { Console.Write(argText.Substring(1) + " >"); argText = Console.ReadLine(); if (argText == "") { Console.WriteLine("----------------"); Console.WriteLine("! Bad Parameter !"); continue; } } Type type = Spludlow.SimpleEncoding.Guess(argText); parameters = new object[] { Spludlow.SimpleEncoding.Decode(argText, type.Name) }; } object result = Spludlow.Reflections.Invoke((string)row["Assembly"], (string)row["Type"], (string)row["Method"], parameters); Console.WriteLine("----------------"); Console.WriteLine("! COMPLETED ! " + Spludlow.Text.TimeTook(startTime)); if (result != null) { Console.WriteLine("----------------"); Console.WriteLine(Convert.ToString(result)); } } catch (Exception ee) { Console.WriteLine("----------------"); Console.WriteLine("! ERROR ! " + Spludlow.Text.TimeTook(startTime)); Console.WriteLine("----------------"); Console.WriteLine(ee.ToString()); } } else { group = target; } } else { option = -1; } } } if (option == -1) { Console.WriteLine("----------------"); Console.WriteLine("! Bad command !"); } ShowMenu(menuTable, group); } Console.WriteLine("----------------"); Console.WriteLine("! EXIT !"); } private static void ShowMenu(DataTable menuTable, int group) { string title = "Root Menu"; if (group > 0) title = (string)ParentRow(menuTable, group)["Text"] + " Menu"; Console.WriteLine("----------------"); Console.WriteLine(title); Console.WriteLine("----------------"); Console.WriteLine(); DataView view = new DataView(menuTable); view.RowFilter = "Group = " + group; foreach (DataRowView rowView in view) { DataRow row = rowView.Row; Console.Write(" "); Console.Write((int)row["Option"]); Console.Write(" : "); Console.Write((string)row["Text"]); if (row.IsNull("Parameter") == false && ((string)row["Parameter"]).StartsWith("@") == true) { Console.Write(" ["); Console.Write(((string)row["Parameter"]).Substring(1)); Console.Write("]"); } Console.WriteLine(); Console.WriteLine(); } Console.WriteLine(" 0 : Exit"); Console.WriteLine("----------------"); Console.Write(">"); } private static DataRow ParentRow(DataTable menuTable, int group) { DataRow[] rows = menuTable.Select("Target = " + group); if (rows.Length != 1) throw new ApplicationException("Menu Inconsisteancy"); return rows[0]; } } }