/// <summary>Handle the 'Load module' item from main menu.</summary> /// <param name="tag"></param> /// <param name="newMenu"></param> internal static void LoadModuleInRS(string tag, out ConsoleMenu newMenu) { newMenu = null; Console.Write(Messages.InputFilePath); string candidatePath = Helpers.AnswerQuestionOrEscape(); FileInfo candidateFile = new FileInfo(candidatePath); if (!candidateFile.Exists) { Console.WriteLine(Messages.FileDoesntExist); Console.Write("Hit ENTER"); Console.ReadLine(); return; } FileStream candidateStream; try { candidateStream = File.Open(candidateFile.FullName, FileMode.Open, FileAccess.Read); } catch (Exception e) { Console.WriteLine(Messages.CantOpenFile, e.Message); Console.Write("Hit ENTER"); Console.ReadLine(); return; } List <ILoader> validLoaders = new List <ILoader>(); foreach (ILoaderDescriptor descriptor in _rsCore.EnumerateKnownLoaders()) { ILoader candidateLoader = descriptor.Get(); if (candidateLoader.CanLoad(candidateStream)) { validLoaders.Add(candidateLoader); } } switch (validLoaders.Count) { case 0: Console.WriteLine(Messages.NoSuitableLoaderFound); Console.Write("Hit ENTER"); Console.ReadLine(); return; case 1: break; default: Console.WriteLine(Messages.SeveralLoadersFound); Console.Write("Hit ENTER"); Console.ReadLine(); return; } _analyzedFile = candidateFile; _analyzedStream = candidateStream; validLoaders[0].Load(null, candidateStream); return; }
private static void Run() { while (true) { if (0 >= _menus.Count) { return; } ConsoleMenu currentMenu = _menus.Peek(); ConsoleMenu newMenu; if (currentMenu.Display(out newMenu)) { if (null != newMenu) { throw new AssertionException(); } _menus.Pop(); } } }
static ConsoleMenu() { MainMenu = new ConsoleMenu() .AddItem(new MenuItem("Load module", Program.LoadModuleInRS)); }
/// <summary></summary> /// <returns>true if menu is complete and should be popped.</returns> internal bool Display(out ConsoleMenu newMenu) { int menuIndex; while (true) { Console.Clear(); for (menuIndex = 0; _items.Count > menuIndex; menuIndex++) { MenuItem displayedItem = _items[menuIndex]; Console.WriteLine("{0,-2} : {1}", menuIndex + 1, displayedItem.Title); } Console.WriteLine("Q : quit"); Console.WriteLine(); Console.Write("Choice : "); string answer = string.Empty; while (true) { ConsoleKeyInfo nextKey = Console.ReadKey(true); int nextCharacter = nextKey.KeyChar; if (0 != (nextKey.Modifiers & ConsoleModifiers.Alt & ConsoleModifiers.Control)) { continue; } if (8 == nextCharacter) { bool erase = true; switch (answer.Length) { case 0: erase = false; break; case 1: answer = string.Empty; break; default: answer = answer.Substring(0, answer.Length - 1); break; } if (erase) { Console.CursorLeft -= 1; Console.Write(" "); Console.CursorLeft -= 1; } continue; } if ('Q' == char.ToUpper((char)nextCharacter)) { if (string.Empty == answer) { answer = "Q"; Console.Write((char)nextCharacter); } continue; } if (char.IsDigit((char)nextCharacter)) { if (2 <= answer.Length) { continue; } if ("Q" == answer) { continue; } answer += (char)nextCharacter; Console.Write((char)nextCharacter); } if ((0 < answer.Length) && (0x0D == (char)nextCharacter)) { Console.WriteLine(); break; } continue; } // Got an answer. newMenu = null; if ("Q" == answer) { return(true); } int choice = int.Parse(answer) - 1; if ((0 > choice) || (_items.Count < choice)) { continue; } MenuItem selectedItem = _items[choice]; selectedItem.Handler(selectedItem.Tag, out newMenu); return(false); } }