예제 #1
0
        /// <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;
        }
예제 #2
0
 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();
         }
     }
 }
예제 #3
0
 static ConsoleMenu()
 {
     MainMenu = new ConsoleMenu()
                .AddItem(new MenuItem("Load module", Program.LoadModuleInRS));
 }
예제 #4
0
        /// <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);
            }
        }