def mainWindow()

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
  }