Commit baaa9f25 authored by Jan Schubert's avatar Jan Schubert
parents 92ac5184 e2914134
......@@ -56,6 +56,12 @@
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.controlsfx/controlsfx -->
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>11.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
......
package projekt.enigma;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import projekt.enigma.model.Fehler;
......@@ -25,85 +22,64 @@ public class App extends Application {
private static String kenngruppe;
private static GuiController gc;
private static int debug;
Scene sce1, sce2;
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
Parent result = fxmlLoader.load();
if (fxml.equals("gui")) {
gc = fxmlLoader.getController();
gc.setKenngruppe(kenngruppe);
}
return result;
}
private static int debug;
public static void main(String[] args) {
debug = 1;
debug = 1;
launch(args);
}
public static int getDebug() {
return debug;
}
public static void setDebug(int debug) {
App.debug = debug;
}
public static int getDebug() {
return debug;
}
@Override
@Override
public void start(Stage primaryStage) throws IOException {
primaryStage.setTitle("Kenngruppenabfrage");
//Scene 1
Label label1 = new Label("Bitte Kenngruppe eingeben!");
label1.setTranslateX(55);
Label l1 = new Label("");
Label l2 = new Label("");
TextField tfield = new TextField();
Button button1 = new Button("Kenngruppe setzen!");
VBox layout1 = new VBox();
VBox layout1 = new VBox();
tfield.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
if(enter(tfield.getText())) {
kenngruppe = tfield.getText();
try {
primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677));
} catch (IOException ex) {
ex.printStackTrace();
}
} else {
tfield.setStyle("-fx-background-color:#FF0000");
tfield.setText("Fehlerhafte Kenngruppe!");
}
}
});
layout1.getChildren().addAll(label1, l1, tfield, l2, button1);
Scene sceKenngruppe = new Scene(layout1, 234, 137);
FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml"));
Scene sceApp = new Scene(guiLoader.load(), 962, 677);
tfield.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
if (enter(tfield.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfield.getText());
primaryStage.setScene(sceApp);
} else {
tfield.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z.");
}
}
});
button1.setOnAction(e -> {
if(enter(tfield.getText())) {
try {
primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677));
} catch (IOException ex) {
ex.printStackTrace();
}
if (enter(tfield.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfield.getText());
primaryStage.setScene(sceApp);
} else {
tfield.setStyle("-fx-background-color:#FF0000");
tfield.setText("Fehlerhafte Kenngruppe!");
tfield.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z.");
}
});
});
layout1.getChildren().addAll(label1, l1, tfield, l2, button1);
sce1 = new Scene(layout1, 234, 137);
primaryStage.setScene(sce1);
primaryStage.setScene(sceKenngruppe);
primaryStage.show();
}
......@@ -112,20 +88,19 @@ public class App extends Application {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
boolean result = true;
for (char c :kenngruppe.toUpperCase().toCharArray()) {
for (char c : kenngruppe.toUpperCase().toCharArray()) {
if (!alphabet.contains(String.valueOf(c))) {
result = false;
break;
}
}
if (kenngruppe.length() >= 9) {
if (kenngruppe.length() > 8 || kenngruppe.length() < 4) {
result = false;
}
return result;
}
// /**
// * TODO Dokumentieren
// */
......
package projekt.enigma;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.shape.Circle;
import javafx.stage.StageStyle;
import org.apache.http.HttpException;
import org.controlsfx.control.CheckComboBox;
import org.controlsfx.dialog.ProgressDialog;
import projekt.enigma.model.Codierer;
import projekt.enigma.model.Fehler;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
public class GuiController {
......@@ -23,6 +36,7 @@ public class GuiController {
private boolean resetDisplay;
private Codierer codierer;
private char chiffrierterBuchstabe;
private String[] empfangeneNachricht;
//deklariert die benötigten Textfelder
@FXML
private TextField tfStecker1, tfStecker2, tfStecker3, tfStecker4, tfStecker5, tfStecker6, tfStecker7, tfStecker8,
......@@ -52,9 +66,15 @@ public class GuiController {
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
@FXML
private GridPane mainGrid;
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//endregion
//region Init
/**
* Initialisiert die Elemente GUI und setzt deren Startwerte
*/
......@@ -82,6 +102,57 @@ public class GuiController {
menu(mBtnStartPos2, position);
}
/**
* Für das Steckbrett müssen zehn CheckComboBoxen erstellt werden.
* Hier wird die Funktion zum erstellen und Befüllen der Boxen, die Funktion zehn mal aufgerufen.
*/
private void generateSteckbrett() {
for (int i = 0; i <= 9; i++) {
this.createSteckbrettPort(i);
}
}
/**
* Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben,
* die bereits gesteckten Kabel und weißt sie zu.
* Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert.
*
* @param port : int : Kabel Nummer (0-9)
*/
private void createSteckbrettPort(int port) {
// Item Liste anlegen
ObservableList<Character> items = FXCollections.observableArrayList();
// Holt die verfügbaren Buchstaben für diesen Port ab und erstellt ein char Array daraus
char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(port).toCharArray();
// Sortiert das Array nach dem Alphabet
Arrays.sort(verfuegbareBuchstaben);
StringBuilder sb = new StringBuilder();
/**
* Die Buchstaben in die CheckComboBox laden und zusätzlich in einen String um später den
* Index des Buchstaben auslesen zu können
*/
for (char c : verfuegbareBuchstaben) {
items.add(c);
sb.append(c);
}
// Eine CheckComboBox erstellen
CheckComboBox<Character> ccb = new CheckComboBox<Character>(items);
// Die CheckComboBox dem GridPane in der Oberfläche zuordnen
mainGrid.add(ccb, 1 + port, 8);
// Die Gesteckten Buchstaben in der CheckComboBox selektieren
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][0]));
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][1]));
}
/**
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
*
......@@ -100,7 +171,7 @@ public class GuiController {
mItem.get(i).setOnAction(e -> setMenuBtnText(button, finalMi.get(finalI)));
}
}
//endregion
//endregion
//region EventHandler/Listener
......@@ -266,7 +337,14 @@ public class GuiController {
*/
@FXML
private void gedrueckteTaste(ActionEvent e) {
if (e.getSource() == btnSenden && !tfCodiert.getText().equals("")) sendeFunkspruch();
if (e.getSource() == btnSenden) {
if (tfCodiert.getText().equals("")) {
new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
"Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
} else {
sendeFunkspruch();
}
}
if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
if (e.getSource() == btnDelete) loeschen();
if (e.getSource() == btnReset) {
......@@ -275,9 +353,10 @@ public class GuiController {
this.setzeTagesSchluessel();
}
}
//endregion
//endregion
//region Methoden
/**
* Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
*
......@@ -423,16 +502,23 @@ public class GuiController {
*/
private void empfangeFunkspruch() {
String[] empfangeneNachricht = codierer.empfangeNachricht();
progressDialogue("rx");
if (empfangeneNachricht[2] != null) {
setzeTagesSchluessel();
tfKlartext.setText(empfangeneNachricht[2]);
tfCodiert.setText(empfangeneNachricht[1]);
resetDisplay = true;
try {
if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
setzeTagesSchluessel();
tfKlartext.setText(this.empfangeneNachricht[2]);
tfCodiert.setText(this.empfangeneNachricht[1]);
resetDisplay = true;
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(empfangeneNachricht[2]));
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
......@@ -442,15 +528,50 @@ public class GuiController {
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfKlartext.setText("");
this.tfCodiert.setText("");
try {
this.codierer.sendeNachricht();
} catch (HttpException | IOException e) {
e.printStackTrace();
}
progressDialogue("tx");
}
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressDialog dialog = new ProgressDialog(copyWorker);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setGraphic(null);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Kommunikation zum Funkraum");
if (strRxTx.equals("rx")) {
dialog.setContentText("Empfange Nachricht");
} else if (strRxTx.equals("tx")) {
dialog.setContentText("Sende Nachricht");
}
dialog.setHeaderText(null);
dialog.setGraphic(null);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
public Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() throws Exception {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (HttpException | IOException e) {
e.printStackTrace();
}
}
return true;
}
};
}
/**
......@@ -646,6 +767,11 @@ public class GuiController {
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
// Setzt das Steckbrett
generateSteckbrett();
/*
tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" +
codierer.fetchSteckverbindungen()[0][1]);
tfStecker2.setText(codierer.fetchSteckverbindungen()[1][0] + "" +
......@@ -665,7 +791,7 @@ public class GuiController {
tfStecker9.setText(codierer.fetchSteckverbindungen()[8][0] + "" +
codierer.fetchSteckverbindungen()[8][1]);
tfStecker10.setText(codierer.fetchSteckverbindungen()[9][0] + "" +
codierer.fetchSteckverbindungen()[9][1]);
codierer.fetchSteckverbindungen()[9][1]);*/
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
......@@ -676,17 +802,17 @@ public class GuiController {
public void setKenngruppe(String kenngruppe) {
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe);
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe);
this.codierer.resetHardware();
this.codierer.resetHardware();
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
setzeSteckverbindungen();
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
setzeSteckverbindungen();
}
//endregion
}
......@@ -9,70 +9,70 @@ import projekt.enigma.App;
*/
public class Fehler {
private String functionPrefix = "- ";
private String messagePrefix = "--> ";
private String functionPrefix = "- ";
private String messagePrefix = "--> ";
/**
* Zeige Fehler Dialog
*
* @param type : String : Art der Meldung (warning/information/error)
* @param subject : Titel des Dialoges
* @param message : Nachricht der Meldung
*/
public void showErrorDialog(String type, String subject, String message) {
/**
* Zeige Fehler Dialog
*
* @param type : String : Art der Meldung (warning/information/error)
* @param subject : Titel des Dialoges
* @param message : Nachricht der Meldung
*/
public void showErrorDialog(String type, String subject, String message) {
new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true);
new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true);
Alert alert;
Alert alert;
/* Der Titel darf auch als leerer String übergeben werden, dann wird ein Default gesetzt */
if (subject.equals("")) {
subject = "Es ist ein Fehler aufgetreten";
}
/* Der Titel darf auch als leerer String übergeben werden, dann wird ein Default gesetzt */
if (subject.equals("")) {
subject = "Es ist ein Fehler aufgetreten";
}
/* Welcher Fehler Typ wurde übergeben? */
switch (type) {
case "warning":
alert = new Alert(AlertType.WARNING);
break;
case "information":
alert = new Alert(AlertType.INFORMATION);
break;
case "error":
alert = new Alert(AlertType.ERROR);
break;
default:
alert = new Alert(AlertType.NONE);
}
/* Setzt den Titel des Dialoges */
alert.setTitle(subject);
/* Setzt den Headertext des Dialoges */
alert.setHeaderText(null);
/* Setzt die Nachricht des Dialoges */
alert.setContentText(message);
/* Zeige den Dialog an */
alert.showAndWait();
}
/* Welcher Fehler Typ wurde übergeben? */
switch (type) {
case "warning":
alert = new Alert(AlertType.WARNING);
break;
case "info":
alert = new Alert(AlertType.INFORMATION);
break;
case "error":
alert = new Alert(AlertType.ERROR);
break;
default:
alert = new Alert(AlertType.NONE);
}
/* Setzt den Titel des Dialoges */
alert.setTitle(subject);
/* Setzt den Headertext des Dialoges */
alert.setHeaderText(null);
/* Setzt die Nachricht des Dialoges */
alert.setContentText(message);
/* Zeige den Dialog an */
alert.showAndWait();
}
public void debug(String message, boolean isFunction) {
public void debug(String message, boolean isFunction) {
if (App.getDebug() != 0) {
if (isFunction) {
System.out.println(functionPrefix + message);
} else {
System.out.println(messagePrefix + message);
}
}
}
if (App.getDebug() != 0) {
if (isFunction) {
System.out.println(functionPrefix + message);
} else {
System.out.println(messagePrefix + message);
}
}
}
public void debug(String message, boolean isFunction, int debugLevel) {
public void debug(String message, boolean isFunction, int debugLevel) {
if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3) ) {
if (isFunction) {
System.out.println(functionPrefix + message);
} else {
System.out.println(messagePrefix + message);
}
}
}
if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3)) {
if (isFunction) {
System.out.println(functionPrefix + message);
} else {
System.out.println(messagePrefix + message);
}
}
}
}
\ No newline at end of file
......@@ -69,7 +69,7 @@ public class Funkraum {
new Fehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich",
"Bitte wenden Sie sich an ihren Vorgesetzten.");
} catch (NullPointerException e) {
new Fehler().showErrorDialog("error", "Keiner schreibt dir...",
new Fehler().showErrorDialog("info", "Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
......
......@@ -132,4 +132,27 @@ public class Steckbrett {
}
}
/**
* TODO: Doku
* @param port
* @return
*/
public String fetchVerfuegbareBuchstaben(int port) {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";