package nl.utwente.viskell.ui; import javafx.fxml.FXML; import javafx.scene.Scene; import javafx.scene.control.ListView; import javafx.scene.control.TextArea; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import nl.utwente.viskell.ghcj.HaskellException; import nl.utwente.viskell.haskell.expr.Expression; import nl.utwente.viskell.ui.components.Block; import nl.utwente.viskell.ui.serialize.Exporter; /** * This class provides a developer interface to inspect the current state * of the Viskell expr tree and give details on the used Haskell source code. */ public class InspectorWindow extends BorderPane implements ComponentLoader { private Stage stage; private MainOverlay overlay; @FXML private TreeView<String> tree; @FXML private ListView<String> errors; @FXML private TextArea hs; @FXML private TextArea json; public InspectorWindow(MainOverlay overlay) { loadFXML("InspectorWindow"); this.overlay = overlay; stage = new Stage(); stage.setTitle("Inspect"); stage.setScene(new Scene(this, 450, 450)); Stage stage = Main.getStage(); if (! (stage.isMaximized() || stage.isFullScreen())) { stage.setX(stage.getX() + stage.getWidth()); stage.setY(stage.getY()); } } public void show() { stage.show(); this.update(); } public void hide() { stage.hide(); } public void update() { ToplevelPane pane = this.overlay.getToplevelPane(); json.setText(Exporter.export(pane)); TreeItem<String> root = new TreeItem<>("all blocks"); root.setExpanded(true); // show information on all bottom most blocks StringBuilder haskell = new StringBuilder(); pane.streamChildren().forEach(node -> { if (node instanceof Block && ((Block)node).isBottomMost()) { Block block = (Block)node; Expression expr = block.getFullExpr(); haskell.append(expr.toHaskell()); haskell.append("\n\n"); String label = String.format("%s: %s", block.getClass().getSimpleName(), haskell).trim(); TreeItem<String> part = new TreeItem<>(label); part.setExpanded(true); this.walk(part, expr); root.getChildren().add(part); } }); tree.setRoot(root); hs.setText(haskell.toString()); errors.getItems().setAll(pane.getGhciSession().getErrors()); } /** * Walks the expr tree, walk recursively calls itself on its children. */ private void walk(TreeItem<String> treeItem, Expression expr) { String type; try { type = expr.inferType().prettyPrint(); } catch (HaskellException e) { type = "?"; } TreeItem<String> subTree = new TreeItem<>(String.format("%s :: %s", expr, type)); subTree.setExpanded(true); for (Expression child : expr.getChildren()) { walk(subTree, child); } treeItem.getChildren().add(subTree); } }