in src/main/scala/com/gu/ssm/Interactive.scala [66:147]
def mainWindow(instances: List[InstanceId], username: String, extendedResults: ResultsWithInstancesNotFound): BasicWindow = {
val window = new BasicWindow(username)
val initialSize = screen.getTerminal.getTerminalSize
val contentPanel = new Panel(new LinearLayout())
.setPreferredSize(fullscreenPanelSize(initialSize))
val layoutManager = contentPanel.getLayoutManager.asInstanceOf[LinearLayout]
layoutManager.setSpacing(0)
val resizer = new TerminalResizeListener {
override def onResized(terminal: Terminal, newSize: TerminalSize): Unit =
contentPanel.setPreferredSize(fullscreenPanelSize(newSize))
}
if (instances.nonEmpty) {
contentPanel.addComponent(new Label("Command to run"))
val cmdInput = new TextBox(new TerminalSize(40, 1)) {
override def handleKeyStroke(keyStroke: KeyStroke): Result = {
keyStroke.getKeyType match {
case KeyType.Enter =>
program.executeCommand(this.getText, instances, username, extendedResults.instancesNotFound)
val loading = WaitingDialog.createDialog("Executing...", "Executing command on instances")
textGUI.addWindow(loading)
Result.HANDLED
case _ =>
super.handleKeyStroke(keyStroke)
}
}
}
contentPanel.addComponent(cmdInput)
}
if (extendedResults.instancesNotFound.nonEmpty) {
contentPanel.addComponent(new EmptySpace())
contentPanel.addComponent(new Label(s"The following instance(s) could not be found: ${extendedResults.instancesNotFound.map(_.id).mkString(", ")}").setForegroundColor(TextColor.ANSI.RED))
contentPanel.addComponent(new EmptySpace())
}
// show results, if present
if (extendedResults.results.nonEmpty) {
val outputs = extendedResults.results.zipWithIndex.map { case ((_, result), i) =>
val outputStreams = result match {
case Right(cmdResult) =>
cmdResult
case Left(status) =>
CommandResult("", status.toString, commandFailed = true)
}
i -> outputStreams
}.toMap
val errOutputBox = new Label(outputs(0).stdErr)
errOutputBox.setForegroundColor(TextColor.ANSI.RED)
val stdOutputBox = new Label(outputs(0).stdOut)
val listener = new ComboBox.Listener {
override def onSelectionChanged(selectedIndex: Int, previousSelection: Int, changedByUserInteraction: Boolean): Unit = {
errOutputBox.setText(outputs(selectedIndex).stdErr)
stdOutputBox.setText(outputs(selectedIndex).stdOut)
}
}
val instancesComboBox: ComboBox[String] = new ComboBox(instances.map(_.id):_*).addListener(listener)
contentPanel.addComponent(instancesComboBox)
contentPanel.addComponent(new EmptySpace())
contentPanel.addComponent(new Separator(Direction.HORIZONTAL))
contentPanel.addComponent(errOutputBox)
contentPanel.addComponent(stdOutputBox)
}
// close button
contentPanel.addComponent(new EmptySpace())
contentPanel.addComponent(new Separator(Direction.HORIZONTAL))
contentPanel.addComponent(new Button("Close", () => {
window.close()
program.exit()
}))
window.setComponent(contentPanel)
window
}