public override string ReadLine(string p, bool isCommand, bool e) { m_cursorXPosition = 0; prompt = p; m_echo = e; int historyLine = m_history.Count; SetCursorLeft(0); // Needed for mono System.Console.Write(" "); // Needed for mono lock (m_commandLine) { m_cursorYPosition = System.Console.CursorTop; m_commandLine.Remove(0, m_commandLine.Length); } while (true) { Show(); ConsoleKeyInfo key = System.Console.ReadKey(true); char enteredChar = key.KeyChar; if (!Char.IsControl(enteredChar)) { if (m_cursorXPosition >= 318) { continue; } if (enteredChar == '?' && isCommand) { if (ContextHelp()) { continue; } } m_commandLine.Insert(m_cursorXPosition, enteredChar); m_cursorXPosition++; } else { switch (key.Key) { case ConsoleKey.Backspace: if (m_cursorXPosition == 0) { break; } m_commandLine.Remove(m_cursorXPosition - 1, 1); m_cursorXPosition--; SetCursorLeft(0); m_cursorYPosition = SetCursorTop(m_cursorYPosition); if (m_echo) { System.Console.Write("{0}{1} ", prompt, m_commandLine); } else { System.Console.Write("{0}", prompt); } break; case ConsoleKey.Delete: if (m_cursorXPosition == m_commandLine.Length) { break; } m_commandLine.Remove(m_cursorXPosition, 1); SetCursorLeft(0); m_cursorYPosition = SetCursorTop(m_cursorYPosition); if (m_echo) { System.Console.Write("{0}{1} ", prompt, m_commandLine); } else { System.Console.Write("{0}", prompt); } break; case ConsoleKey.End: m_cursorXPosition = m_commandLine.Length; break; case ConsoleKey.Home: m_cursorXPosition = 0; break; case ConsoleKey.UpArrow: if (historyLine < 1) { break; } historyLine--; LockOutput(); m_commandLine.Remove(0, m_commandLine.Length); m_commandLine.Append(m_history[historyLine]); m_cursorXPosition = m_commandLine.Length; UnlockOutput(); break; case ConsoleKey.DownArrow: if (historyLine >= m_history.Count) { break; } historyLine++; LockOutput(); if (historyLine == m_history.Count) { m_commandLine.Remove(0, m_commandLine.Length); } else { m_commandLine.Remove(0, m_commandLine.Length); m_commandLine.Append(m_history[historyLine]); } m_cursorXPosition = m_commandLine.Length; UnlockOutput(); break; case ConsoleKey.LeftArrow: if (m_cursorXPosition > 0) { m_cursorXPosition--; } break; case ConsoleKey.RightArrow: if (m_cursorXPosition < m_commandLine.Length) { m_cursorXPosition++; } break; case ConsoleKey.Enter: SetCursorLeft(0); m_cursorYPosition = SetCursorTop(m_cursorYPosition); System.Console.WriteLine(); //Show(); lock (m_commandLine) { m_cursorYPosition = -1; } string commandLine = m_commandLine.ToString(); if (isCommand) { string[] cmd = Commands.Resolve(Parser.Parse(commandLine)); if (cmd.Length != 0) { int index; for (index = 0; index < cmd.Length; index++) { if (cmd[index].Contains(" ")) { cmd[index] = "\"" + cmd[index] + "\""; } } AddToHistory(String.Join(" ", cmd)); return(String.Empty); } } // If we're not echoing to screen (e.g. a password) then we probably don't want it in history if (m_echo && commandLine != "") { AddToHistory(commandLine); } return(commandLine); default: break; } } } }