zpg-graphentester/control/Controller.java
2021-07-12 14:04:20 +02:00

480 lines
16 KiB
Java

package control;
import imp.*;
import graph.*;
import algorithmen.*;
import javafx.fxml.*;
import javafx.scene.control.*;
import javafx.scene.control.Alert.AlertType;
import javafx.event.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.Node;
import javafx.scene.text.*;
import javafx.geometry.Pos;
import javafx.stage.*; // Dateiöffnen / Speichern-Dialog
import java.io.File;
import java.nio.file.*;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.scene.image.Image;
import java.util.List;
import java.util.ArrayList;
import javafx.collections.ObservableList;
/**
* Die Klasse Controller stellt den Controller des Hauptfensters / Menu dar.
*
* @author Thomas Schaller
* @version v6.7 (9.12.2020)
*/
public class Controller {
private String version = "6.8 (Februar 2021)";
@FXML
private TabPane tpRekursionen;
@FXML
private CheckMenuItem mOptionKnotenwerte;
@FXML
private CheckMenuItem mOptionKnotenname;
@FXML
private CheckMenuItem mOptionKantengewichte;
@FXML
private CheckMenuItem mOptionKnoteninfo;
@FXML
private CheckMenuItem mOptionBild;
@FXML
private CheckMenuItem mHilfefenster;
@FXML
private MenuItem mmSpeichern;
@FXML
private Menu mmBearbeiten;
@FXML
private Menu mmExperimentieren;
@FXML
private Menu mmSimulieren;
@FXML
private Menu mmZuruecksetzen;
@FXML
private Menu mmAnsicht;
private FileChooser dateidialog;
private Graph graph;
private GraphOptions options;
public void initialize() {
dateidialog = new FileChooser();
dateidialog.setInitialDirectory(new File("beispielgraphen"));
oeffneHauptTab();
mNeuerGraph(null);
tpRekursionen.getSelectionModel().selectedItemProperty().
addListener((value, tabOld, tabNew) -> changeTab(tabOld, tabNew));
}
private void changeTab(Tab tabOld, Tab tabNew) {
if(tpRekursionen.getTabs().indexOf(tabNew)<tpRekursionen.getTabs().size()-2) {
tpRekursionen.getSelectionModel().select(tabOld);
} else {
if(tpRekursionen.getTabs().indexOf(tabNew)==tpRekursionen.getTabs().size()-2) {
tpRekursionen.getTabs().remove(tpRekursionen.getTabs().size()-1);
}
((TabMitController) tabNew).update();
this.menuChangeAnsicht();
}
}
private void oeffneHauptTab() {
try { // try-catch ist notwendig, um Fehler durch fehlende Dateien abzufangen.
HauptTabMitController newtab = new HauptTabMitController(graph, options);
newtab.setText("Graph");
tpRekursionen.getTabs().add(newtab);
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/haupttab.fxml"));
loader.setController(newtab);
newtab.setContent((Node) loader.load());
tpRekursionen.getSelectionModel().select(newtab);
}
catch(Exception e) {
System.out.println(e);
}
}
@FXML
void mNeuerGraph(ActionEvent event) {
while(tpRekursionen.getTabs().size()>1) tpRekursionen.getTabs().remove(1);
TabMitController tc = (TabMitController) (tpRekursionen.getTabs().get(0));
options = new GraphOptions();
graph = new Graph();
tc.setGraph(graph, options);
menuChangeAnsicht();
}
void schliesseTabs() {
while(tpRekursionen.getTabs().size()>1) {
TabMitController tc = (TabMitController) (tpRekursionen.getTabs().get(1));
if(tc instanceof SimulationTabMitController) {
((SimulationTabMitController) tc).showHilfe(false);
}
tpRekursionen.getTabs().remove(1);
}
}
@FXML
void mBearbeiten(MouseEvent event) {
try { // try-catch ist notwendig, um Fehler durch fehlende Dateien abzufangen.
schliesseTabs();
EditTabMitController newtab = new EditTabMitController(graph, options);
newtab.setText("Bearbeiten");
tpRekursionen.getTabs().add(newtab);
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/edittab.fxml"));
loader.setController(newtab);
newtab.setContent((Node) loader.load());
tpRekursionen.getSelectionModel().select(newtab);
}
catch(Exception e) {
System.out.println(e);
}
}
@FXML
void mSimuliere(MouseEvent event) {
try { // try-catch ist notwendig, um Fehler durch fehlende Dateien abzufangen.
schliesseTabs();
SimulationTabMitController newtab = new SimulationTabMitController(graph, options);
newtab.setText("Algorithmen-Simulation");
tpRekursionen.getTabs().add(newtab);
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/simulationstab.fxml"));
loader.setController(newtab);
newtab.setContent((Node) loader.load());
tpRekursionen.getSelectionModel().select(newtab);
}
catch(Exception e) {
System.out.println(e);
}
}
@FXML
void mExperimentiereKanten(ActionEvent event) {
schliesseTabs();
GraphOptions neu = options.copy();
neu.bildAnzeigen = false;
neu.auswahl = 0;
neu.fokusArt = 1;
neu.parent = null;
// neu.markiert = Auswahl.BELIEBIG;
// neu.geloescht = Auswahl.BELIEBIG;
// neu.besucht = Auswahl.BELIEBIG;
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.tabOeffnen(neu);
}
@FXML
void mExperimentiereKnoten(ActionEvent event) {
schliesseTabs();
GraphOptions neu = options.copy();
neu.bildAnzeigen = false;
neu.auswahl = 0;
neu.fokusArt = 0;
neu.parent = null;
if(neu.farbenKanten[0].equals("invisible")) neu.farbenKanten[0]="808080";
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.tabOeffnen(neu);
}
@FXML
void mExperimentiereAuswahl(ActionEvent event) {
schliesseTabs();
GraphOptions neu = options.copy();
neu.bildAnzeigen = false;
neu.auswahl = 2;
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
if(tc.viewer.getSelectedKnoten() != null) {
neu.fokusArt = 0; // Knoten
neu.parent = tc.viewer.getSelectedKnoten();
tc.tabOeffnen(neu);
} else {
if(tc.viewer.getSelectedKante() != null) {
neu.fokusArt = 1; //Kante
neu.parent = tc.viewer.getSelectedKante();
tc.tabOeffnen(neu);
}
}
}
@FXML
public void mBeenden(ActionEvent event) {
schliesseTabs();
((Stage)tpRekursionen.getScene().getWindow()).close();
}
void menuChangeAnsicht() {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
mOptionBild.setSelected(options.bildAnzeigen);
mOptionKantengewichte.setSelected(options.showEdgeWeights);
mOptionKnotenname.setSelected(options.showVertexText);
mOptionKnotenwerte.setSelected(options.showVertexValue);
mOptionKnoteninfo.setSelected(options.showVertexInfo);
mmSpeichern.setDisable(!tc.getText().equals("Bearbeiten"));
/* mmBearbeiten.setDisabled(!tc.getText().equals("Graph"));
mmExperimentieren.setVisible(tc.getText().equals("Graph"));
mmSimulieren.setVisible(tc.getText().equals("Graph"));
mmZuruecksetzen.setVisible(!tc.getText().equals("Bearbeiten"));
*/
mmAnsicht.setDisable(tc.getText().equals("Bearbeiten"));
if(tc.getText().equals("Algorithmen-Simulation")) {
mHilfefenster.setDisable(false);
} else
{
mHilfefenster.setSelected(false);
mHilfefenster.setDisable(true);
}
}
@FXML
void mChangeOptionBild(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
options.bildAnzeigen = mOptionBild.isSelected();
tc.update();
}
@FXML
void mChangeOptionKantengewichte(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
options.showEdgeWeights = mOptionKantengewichte.isSelected();
tc.update();
}
@FXML
void mChangeOptionKnoteninfo(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
options.showVertexInfo = mOptionKnoteninfo.isSelected();
tc.update();
}
@FXML
void mChangeOptionKnotenname(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
options.showVertexText = mOptionKnotenname.isSelected();
if(options.showVertexText) {
options.showVertexValue = false;
mOptionKnotenwerte.setSelected(false);
}
tc.update();
}
@FXML
void mChangeOptionKnotenwerte(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
options.showVertexValue = mOptionKnotenwerte.isSelected();
if(options.showVertexValue) {
options.showVertexText = false;
mOptionKnotenname.setSelected(false);
}
tc.update();
}
@FXML
void mChangeHilfefenster(ActionEvent event) {
TabMitController tc = (TabMitController) (tpRekursionen.getTabs().get(tpRekursionen.getTabs().size()-1));
if(tc instanceof SimulationTabMitController) {
((SimulationTabMitController) tc).showHilfe(mHilfefenster.isSelected());
}
}
@FXML
void mOeffnen(ActionEvent event) {
File file = dateidialog.showOpenDialog(null);
if (file != null) {
graphLaden(file.getAbsolutePath());
}
}
void graphLaden(String dateiname) {
while(tpRekursionen.getTabs().size()>2) tpRekursionen.getTabs().remove(1);
TabMitController tc = (TabMitController) (tpRekursionen.getTabs().get(0));
options = new GraphOptions();
Table csvParser = new Table(dateiname,"",',','"');
options.ladeGraph(csvParser);
graph = new Graph();
graph.ladeGraph(csvParser);
tc.setGraph(graph, options);
if(tpRekursionen.getTabs().size()>1){
tc = (TabMitController) (tpRekursionen.getTabs().get(1));
tc.setGraph(graph, options);
}
menuChangeAnsicht();
}
@FXML
void mSchliessen(ActionEvent event) {
mNeuerGraph(event);
}
@FXML
void mSpeichern(ActionEvent event) {
dateidialog.getExtensionFilters().clear();
dateidialog.getExtensionFilters().add(new ExtensionFilter("Graph-Datei (*.csv)", "*.csv"));
File file = dateidialog.showSaveDialog(null);
if (file != null) {
try{
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
GraphOptions options = tc.getGraphOptions();
String text = options.getText();
text += "#\n# Graph:\n";
text +=graph.toCSVString(options.saveAsMatrix);
String dateiName = file.getAbsolutePath();
String name = dateiName.substring(dateiName.lastIndexOf("\\")+1);
if(name.contains(".")) dateiName = dateiName.substring(0, dateiName.lastIndexOf("."));
Files.write(Paths.get(file.getAbsolutePath()), text.getBytes());
} catch(Exception e) {
}
}
}
@FXML
void mBildExportieren(ActionEvent event) {
dateidialog.getExtensionFilters().clear();
dateidialog.getExtensionFilters().add(new ExtensionFilter("Bild des Graphen", "*.png","*.gif"));
File file = dateidialog.showSaveDialog(null);
if (file != null) {
try{
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
Picture p = tc.getViewer().updateImage();
String dateiName = file.getAbsolutePath();
p.save(dateiName);
} catch(Exception e) {
}
}
}
@FXML
void mUeber(ActionEvent event) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Graphtester");
alert.setHeaderText(null);
alert.setContentText("Mit diesem Programm können Sie Graphen modellieren, Graphenalgorithmen von Hand durchspielen oder implementierte Algorithmen schrittweise ausführen.\n\n"+
"Version: "+version+"\nThomas Schaller\nLandesfachgruppe Informatik (ZSL BW)\n"+
"Lizenz: CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/deed.de)\n\n"+
"3rd Party:\n CommonsIO.jar, csv.jar, JDom.jar\n Lizenzinfo: siehe Ordner '+libs'" );
Image icon = new Image("view/icon.png");
Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
stage.getIcons().add(icon);
alert.showAndWait();
}
@FXML
void mResetAlles(ActionEvent event) {
graph.initialisiereAlleKanten();
graph.initialisiereAlleKnoten();
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetBesucht(ActionEvent event) {
for(Knoten k : graph.getAlleKnoten()) {
k.setBesucht(false);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetFarbe(ActionEvent event) {
for(Knoten k : graph.getAlleKnoten()) {
k.setFarbeAutomatisch(true);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetGeloescht(ActionEvent event) {
for(Kante k : graph.getAlleKanten()) {
k.setGeloescht(false);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetKantenmarkierung(ActionEvent event) {
for(Kante k : graph.getAlleKanten()) {
k.setMarkiert(false);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetMarkierung(ActionEvent event) {
for(Knoten k : graph.getAlleKnoten()) {
k.setMarkiert(false);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
@FXML
void mResetWert(ActionEvent event) {
for(Knoten k : graph.getAlleKnoten()) {
k.setWert(0.0);
}
TabMitController tc = (TabMitController) (tpRekursionen.getSelectionModel().getSelectedItem());
tc.update();
}
}