blob: c9682a984a298b21142d7ab3a904423273409826 [file] [log] [blame]
package org.apache.clerezza.shell
import scala.tools.jline.Terminal
import scala.tools.jline.TerminalFactory
import scala.tools.jline.console.completer.CandidateListCompletionHandler
import scala.tools.jline.console.completer.Completer
import scala.tools.jline.console.completer.CompletionHandler
import scala.tools.jline.console.history.History
import scala.tools.jline.console.history.MemoryHistory
import scala.tools.jline.internal.Configuration
import scala.tools.jline.internal.Log
import org.fusesource.jansi.AnsiOutputStream
import java.awt.Toolkit
import java.awt.datatransfer.Clipboard
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.Transferable
import java.awt.datatransfer.UnsupportedFlavorException
import java.awt.event.ActionListener
import scala.tools.jline.console.ConsoleReader
import scala.tools.jline.console.completer._
import scala.tools.nsc.interpreter.session._
import scala.collection.JavaConverters._
import scala.tools.nsc.interpreter.Completion._
import scala.tools.nsc.io.Streamable.slurp
import scala.tools.nsc.interpreter._
import java.io.OutputStream
//a modified version of scala.tools.nsc.interpreter.JLineReader
/**
* Reads from the console using JLine.
*/
class StreamJLineReader(_completion: => Completion, in: InputStream, out: OutputStream, terminal: Terminal) extends InteractiveReader {
val interactive = false
class StreamJLineConsoleReader extends ConsoleReader(in, out, null, terminal) with ConsoleReaderHelper {
// working around protected/trait/java insufficiencies.
def goBack(num: Int): Unit = back(num)
def readOneKey(prompt: String) = {
this.print(prompt)
this.flush()
this.readVirtualKey()
}
def eraseLine() = consoleReader.resetPromptLine("", "", 0)
def redrawLineAndFlush(): Unit = { flush() ; drawLine() ; flush() }
// override def readLine(prompt: String): String
// A hook for running code after the repl is done initializing.
lazy val postInit: Unit = {
this setBellEnabled false
if (history ne NoHistory)
this setHistory history
if (completion ne NoCompletion) {
val argCompletor: ArgumentCompleter =
new ArgumentCompleter(new JLineDelimiter, scalaToJline(completion.completer()))
argCompletor setStrict false
this addCompleter argCompletor
this setAutoprintThreshold 400 // max completion candidates without warning
}
}
}
val consoleReader = new StreamJLineConsoleReader()
lazy val completion = _completion
lazy val history: JLineHistory = JLineHistory()
private def term = consoleReader.getTerminal()
def reset() = term.reset()
def init() = term.init()
def scalaToJline(tc: ScalaCompleter): Completer = new Completer {
def complete(_buf: String, cursor: Int, candidates: JList[CharSequence]): Int = {
val buf = if (_buf == null) "" else _buf
val Candidates(newCursor, newCandidates) = tc.complete(buf, cursor)
newCandidates foreach (candidates add _)
newCursor
}
}
class JLineConsoleReader extends ConsoleReader with ConsoleReaderHelper {
if ((history: History) ne NoHistory)
this setHistory history
// working around protected/trait/java insufficiencies.
def goBack(num: Int): Unit = back(num)
def readOneKey(prompt: String) = {
this.print(prompt)
this.flush()
this.readVirtualKey()
}
def eraseLine() = consoleReader.resetPromptLine("", "", 0)
def redrawLineAndFlush(): Unit = { flush() ; drawLine() ; flush() }
// override def readLine(prompt: String): String
// A hook for running code after the repl is done initializing.
lazy val postInit: Unit = {
this setBellEnabled false
if (completion ne NoCompletion) {
val argCompletor: ArgumentCompleter =
new ArgumentCompleter(new JLineDelimiter, scalaToJline(completion.completer()))
argCompletor setStrict false
this addCompleter argCompletor
this setAutoprintThreshold 400 // max completion candidates without warning
}
}
}
def currentLine = consoleReader.getCursorBuffer.buffer.toString
def redrawLine() = consoleReader.redrawLineAndFlush()
def eraseLine() = consoleReader.eraseLine()
// Alternate implementation, not sure if/when I need this.
// def eraseLine() = while (consoleReader.delete()) { }
def readOneLine(prompt: String) = consoleReader readLine prompt
def readOneKey(prompt: String) = consoleReader readOneKey prompt
}