예제 #1
0
        public static void RunMenuItem(string[] args, MenuItem callingMenuItem)
        {
            MenuItem[]      menuItems;
            ConsoleKeyInfo  keyInput;
            string          availableChoices, choiceChar;
            MenuItem        choiceMenuItem, parent;
            IMenuCommand    menuCommand;
            AsciiBoxOptions menuOptions = callingMenuItem.GetMenuOptions();
            bool            drawMenu    = true;

            menuOptions.HeaderJustification = AsciiLineJustification.Left;

            // check the menu item for a sub menu
            menuItems = callingMenuItem.GetSubMenu();
            if (menuItems.Length > 0)
            {
                List <string> menuLines   = new List <string>();
                List <string> headerLines = new List <string>();

                headerLines.Add(callingMenuItem.MenuText);
                parent = callingMenuItem.ActiveParent;
                while (parent != null)
                {
                    headerLines.Add(parent.MenuText);
                    parent = parent.ActiveParent;
                }
                headerLines.Reverse();
                for (int i = 1; i < headerLines.Count; i++)
                {
                    headerLines[i] = string.Concat(new string(' ', 2 * i), "└─", headerLines[i]);
                }
                for (int i = 0; i < menuItems.Length; i++)
                {
                    menuLines.Add(string.Format("({0}) {1}", CHOICES[i], menuItems[i].MenuText));
                }
                availableChoices = CHOICES.Substring(0, menuLines.Count);
                menuLines.Add(string.Format("(ESC) {0}", callingMenuItem.EscapeText));
                while (true)
                {
                    if (drawMenu)
                    {
                        ConsoleExt.WriteAsciiMenu(menuOptions, headerLines.ToArray(), menuLines.ToArray());
                        Sys.Console.Write(" > ");
                        drawMenu = false;
                    }
                    keyInput   = Sys.Console.ReadKey(true);
                    choiceChar = keyInput.KeyChar.ToString().ToUpper();
                    if (availableChoices.Contains(choiceChar) || keyInput.Key == ConsoleKey.Escape)
                    {
                        if (keyInput.Key == ConsoleKey.Escape)
                        {
                            Sys.Console.WriteLine();
                            return;
                        }
                        Sys.Console.WriteLine(keyInput.KeyChar);
                        // a menu item has been chosen, run it
                        choiceMenuItem = menuItems[availableChoices.IndexOf(choiceChar)];
                        choiceMenuItem.ActiveParent = callingMenuItem;
                        RunMenuItem(args, choiceMenuItem);
                        choiceMenuItem.ActiveParent = null;
                        drawMenu = true;
                    }
                }
            }
            else
            {
                // this menu item doesn't have any sub menu, run its command
                menuCommand = callingMenuItem.GetCommand();
                if (menuCommand == null)
                {
                    Sys.Console.Error.WriteLine(string.Format("!! The menu item {0} does not provide a command to process or a sub menu to display. !!", callingMenuItem.GetType().Name));
                    return;
                }
                menuCommand.Run(args, callingMenuItem);
            }
        }