package control; import javafx.fxml.FXML; import javafx.scene.control.TextArea; import javafx.scene.control.TreeView; import javafx.scene.control.TreeItem; import javafx.scene.input.MouseEvent; import javafx.event.ActionEvent; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; import java.util.List; import java.util.ArrayList; import javafx.stage.*; import java.util.ConcurrentModificationException; import javafx.application.Platform; import graph.*; /** * Die Klasse Hilfefenster stellt ein Hilfefenster für die Simulation eines * Algorithmus bereit. * * @author Thomas Schaller * @version v6.7 (9.12.2020) */ public class Hilfefenster extends Stage implements Hilfe{ @FXML private TreeView tvAblauf; private List> stufen; private List> zustaende; private TreeItem last; private GraphPlotter gp; private List aktuell; private boolean reviewAllowed; public void initialize() { loescheAlles(); zustaende = new ArrayList>(); aktuell = null; reviewAllowed = false; tvAblauf.getSelectionModel().selectedIndexProperty().addListener((obs,oldValue, newValue)->showState()); } public void setGraphPlotter(GraphPlotter gp) { this.gp = gp; } public void loescheAlles() { Platform.runLater(new Runnable() { @Override public void run() { stufen = new ArrayList>(); zustaende = new ArrayList>(); TreeItem root = new TreeItem("Algorithmus"); root.setExpanded(true); last = root; tvAblauf.setRoot(root); tvAblauf.setShowRoot(false); stufen.add(root); } }); } public void append(String text) { List status = gp.getGraph().getStatus(); Platform.runLater(new Runnable() { @Override public void run() { last = new TreeItem(text); stufen.get(stufen.size()-1).getChildren().add(last); zustaende.add(status); } }); } public void indentMore() { Platform.runLater(new Runnable() { @Override public void run() { if(stufen.size() == 1) { // Hauptknoten TreeItem parent = stufen.get(0); List children = parent.getChildren(); for(int i=children.size()-1; i >= 0; i--) { TreeItem t = children.get(i); if(t.isExpanded()) { t.setExpanded(false); break; } } } stufen.add(last); last.setExpanded(true); last.expandedProperty().addListener((b, o, n) -> showState()); } }); } public void indentLess() { Platform.runLater(new Runnable() { @Override public void run() { if(stufen.size() > 1) stufen.remove(stufen.size()-1); } }); } public void setReviewAllowed(boolean a) { this.reviewAllowed = a; if(!reviewAllowed) tvAblauf.getSelectionModel().clearSelection(); } public void showState() { Platform.runLater(new Runnable() { @Override public void run() { if(reviewAllowed && tvAblauf.getSelectionModel().getSelectedIndex()>=0) { TreeItem s = tvAblauf.getSelectionModel().getSelectedItem(); if(!s.isExpanded()) { // suche das letzte Kind while(s.getChildren().size()>0){ List c = s.getChildren(); s = c.get(c.size()-1); } } gp.getGraph().setStatus(zustaende.get(calculateIndex(tvAblauf.getRoot(), s ,0)-1)); gp.updateImage(); } } }); } private int calculateIndex(TreeItem t, TreeItem search, int nr) { if(t == search) return nr; nr++; List children = t.getChildren(); for(TreeItem c : children) { int i = calculateIndex(c, search, nr); if(i>0) return i; nr = -i; } return -nr; } @FXML void bCopyClicked(ActionEvent event) { final Clipboard clipboard = Clipboard.getSystemClipboard(); final ClipboardContent content = new ClipboardContent(); String s = ""; for(Object c : tvAblauf.getRoot().getChildren()) { if(c instanceof TreeItem) { s += generateClipboardContent((TreeItem) c, ""); } } content.putString(s); clipboard.setContent(content); } private String generateClipboardContent(TreeItem t, String tab) { String s = tab+t.getValue(); for(Object c : t.getChildren()) { if(c instanceof TreeItem) { s += generateClipboardContent((TreeItem) c, tab+" "); } } return s; } }