package com.narrowtux.fmm.gui;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ConsoleWindow extends Stage {
private Scene scene;
private TabPane tabs = new TabPane();
private ObservableList<Process> processes = FXCollections.observableArrayList();
public ConsoleWindow() {
super(StageStyle.DECORATED);
init();
}
public void init() {
setWidth(640);
setHeight(480);
scene = new Scene(tabs);
this.setScene(scene);
getProcesses().addListener((ListChangeListener<Process>) change -> {
while (change.next()) {
if (change.wasAdded()) {
for (Process added : change.getAddedSubList()) {
ProcessTab tab = new ProcessTab(added);
tabs.getTabs().add(tab);
tabs.getSelectionModel().select(tab);
}
}
if (change.wasRemoved()) {
// TODO
}
}
});
}
public ObservableList<Process> getProcesses() {
return processes;
}
private class ProcessTab extends Tab {
private final Process process;
private final VBox vbox;
private TextArea log = new TextArea();
private final Thread reader;
private final HBox hbox;
public ProcessTab(Process process) {
this.process = process;
hbox = new HBox();
vbox = new VBox(log, hbox);
Button killButton = new Button("Kill");
killButton.setOnAction((e) -> {
process.destroyForcibly();
});
hbox.setAlignment(Pos.CENTER_RIGHT);
hbox.getChildren().add(killButton);
VBox.setVgrow(log, Priority.ALWAYS);
this.setContent(vbox);
log.setWrapText(true);
log.setFont(Font.font("Courier", 12));
reader = new Thread(() -> {
BufferedReader stream = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
try {
while ((line = stream.readLine()) != null) {
final String tmpLine = line;
Platform.runLater(() -> {
String old = log.getText();
old += tmpLine;
old += "\n";
log.setText(old);
log.setScrollTop(Double.MAX_VALUE);
});
}
} catch (IOException e) {
e.printStackTrace();
}
});
reader.start();
}
public Process getProcess() {
return process;
}
}
}