Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • d.eisold/enigma
  • Janschubi1993/enigma
  • TsunamiKlaus/enigma
  • alfatrainingkurse/java/enigma
  • FloriN/enigma
  • PaoloPinkel/enigma
6 results
Show changes
Commits on Source (7)
......@@ -46,15 +46,15 @@
* Besondere (für uns) Lösungen
### Zahlen, Daten, Fakten
* Zeilen insgesamt: 3158
* Code: 1719 (54%)
* Zeilen insgesamt: 3056
* Code: 1619 (53%)
* XML: 110
* Kommentare: 1076 (34%)
* Leerzeilen: 363 (11%)
* Commits: 462
* Merge Requests: 143
* Kommentare: 1076 (35%)
* Leerzeilen: 365 (12%)
* Commits: 461
* Merge Requests: 146
* Tickets: 29
* Pipelines 462
* Pipelines 471
## Klassendiagram
![Ablaufdiagram Enigma](http://plantuml.gitrepo.de/png/U9oTM4jpspOGlkjNyDPaNFhGeoVJIU97aedbU2GrpiJrU21gHI820HO0uzHfyjkx8CK7G81Yh8D4xRTOBFODlbIQI5tcR3RJL3E8xk_d7yxEBtzJqIaZIaLdbAIIvFVtV_FPB8euoK4L986eaE8BxFGnS9hc9FgEO1_EnGROdXf5IINBNd9SiHoVulUwJBAMrtpYI9CqEeaernRrWR17u8oaK8EtTnOiAK-L1iPAddeP44nsNq6kAT_KF4b6vEtTxLt3qsC_YXhTdZsto5lGIRP29PHACbRY3p27HOkbDjeuv1GqhXiIRzfp3R55xr13T6cVwDdp5kvn_epKSEFO48F2AtGWt6NmwFrZDidd52H8n-Sxu3oLPL4OxzRsit1EaapI9DD-M1KIVTMvP1fNhKj090R7ve58ey_R_QE59qtmdhInuWPGTL37RqbDdaI5lDWIdi9LS_W0pa4kdQFvmdOacYhSSJbm7rFjzZ1ovHwumZw2t9QGhj68husUcgm7Ggfp40q7ZeA1_xuDbY4MifN9bt713FIZ1lKPS3NmIm7A_3fCA0AsK5bgBK7hQo7TdIHWTZGXus0A-2ReJZLoCiGUOJ6iAXMzKyU7rdwv5efgAjppT1oEu-Bw77vTusW3lf3jqJqrC6vT_5uKMmUY7DKZZ2gps6izr8ZmZSZR0FgbkdC16GFPBpeeyEAlgzFLkmzNzzUByujtdto50BdcvylbgpVdOqneo4myd4if97PD9ko38smAn07Yf5EKV2T9cLlLioi41gwBd2_kFEYKFHjdE1MxxiTeZIfwVCssYiZANCqV9xws33SJ4baMpREbTI29_CLo8o43RtKoZRIH7-YYlkHfUxCllxs82c-aHZOQ4VS8OtaRgWU3IZp5pNCXbKbUry-6D2S5EcabmJozgCF_ztqQ_6djtqeP-8nZPz5jxgx40SuMNebXmjUQeOD6eA7yALPe_UTac1jpKsHr3dTCYjgH4hkBxZL3_n0Y94qf9soSxoWAnfO_LweemPvSgp4S1mxX9Qn1rgsmp-MV2yPx_nH3Ll7is92m8aD1WU7DkGsOIT--OfIIg-0bevNfLBM7VLuD5XxLHV1NHhq_WkLhM8R2DI2CZ5yTlBDQRwmV8Ds4r_DSzzrT_ZO4_KiKZD__6gxZCvm6-9hmtV8VHZKuMOUQUkzXfYfn3edsAkFTyLLHz8H_noZKDFbXpfpWK68yRdvdtGvfWiGt9JqLN4l1S7ZeWLNdTiAWbNaKvOJsNO8ECLTjYu97EtDc0kpZN5iNXbPaTOjR2A5zO1mnGJONd-QNUtJ43DQ1UWQ9wvolRhPBtuGSZmyPFzi1pWfWT5H6jzjJAXDcqrS4etD1ogs7MZfcC1LpWzKcsMceE2oCGMbAARU9m_4zZdBWfKK8ZKLxUyoH_xNcA_YcNSX7ypRhsDkguzxW7hXnnRrUFfaSKi1xh-ZcSM_xGDz9i43dieEI7oYM1KF-Y8Fxsd5n_kzAf2d3gg-ruCh2C2nJ7AHKFIsNuDdtHiYT4mRxsM0X8AVetfNuJ3Bcup3qbMZuaEDGNimnOttrmSfbixxgLxM86rWha5zf0lN2y8NzA39A0MKEKWdpQVBYlxWiukWB-Kgstuv9KJ2Q4EDOKyUQv-5QK-JsIprIX_nsDV2lH9d3XSwx714FbZbl-4wyRyw6WeEDOSeMlNRnT9NVTkzzikwzppXhKDYYTyUHJnUpx5-drFhfWkf9wcG_oHmAY36RrrR4qUhfbculinWS-yUGi9OrAAoxlfn4UL2fZii8wXBOcAJz4rIYUeNWKy7aoEmbDXFpDlr_rhUkvW00 "Ablaufdiagram der Enigma")
......@@ -87,12 +87,6 @@
* Dann String (Warum)
* Vorteile Enum (Warum)
## Die GUI der Enigma (Elemente, etc)
* Besondere GUI Elemente
* ControlsFX (ProgressDialog)
## GUI Controller
## Enigma Demo
* Kenngruppe Abfrage
* Testen Kenngruppe Dialog und Fehler
......@@ -108,4 +102,6 @@
* Setzen von gleichen Walzen und Fehler
* Senden & Empfangen
## GUI Controller
![Screenshot](Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
File added
package projekt.enigma;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
......@@ -22,861 +24,761 @@ import java.util.ArrayList;
public class GuiController {
//region Klassenvariablen
private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
@FXML
private static ToggleButton[] tBtnPort;
private String[] empfangeneNachricht;
private String textEingabe;
private String textCodiert;
private char chiffrierterBuchstabe;
private boolean resetDisplay;
private Codierer codierer;
//region GUI-Elemente
//deklariert die benötigten Buttons
@FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
//endregion
//deklariert die benötigten Kreise
@FXML
private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
//deklariert die benötigten Label
@FXML
private Label lblSpruchschluessel, lblKenngruppe;
//deklariert die MenueButtons
@FXML
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
//deklariert die benötigten Textfelder
@FXML
private TextField tfCodiert, tfKlartext;
//deklariert benötigtes GridPane
@FXML
private ChkBoxGridPane[] chkBoxGridPane;
@FXML
private GridPane mainGrid;
@FXML
private AnchorPane anchorPane;
/**
* Initialisiert die Elemente GUI und setzt deren Startwerte
*/
@FXML
void initialize() {
// Variablen setzen
textEingabe = "";
textCodiert = "";
resetDisplay = true;
//Einträge für Walzen
menu(mBtnWalzPos1, walzenNr);
menu(mBtnWalzPos2, walzenNr);
menu(mBtnWalzPos3, walzenNr);
//Einträge für die Ringe
menu(mBtnNotchPos1, ringNr);
menu(mBtnNotchPos2, ringNr);
menu(mBtnNotchPos3, ringNr);
//Einträge für die Startpositionen
menu(mBtnStartPos1, position);
menu(mBtnStartPos3, position);
menu(mBtnStartPos2, position);
}
//endregion
//region Init
/**
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
*
* @param button : Button für die die Einträge erstellt werden sollen
*/
private void menu(MenuButton button, String[] str) {
ArrayList<MenuItem> mItem = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
// Eintrag aus str der Arraylist mi hinzufügen
mItem.add(new MenuItem(str[i]));
// MenuItem mi dem Button button hinzufügen
button.getItems().add(mItem.get(i));
int finalI = i;
// Listener für die einzelnen Einträge
mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
}
}
/**
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen
*/
private void myToggleButtons() {
if (chkBoxGridPane != null) {
for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
anchorPane.getChildren().remove(boxGridPane);
}
}
chkBoxGridPane = new ChkBoxGridPane[10];
final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[chkBoxGridPane.length];
for (int i = 0; i < chkBoxGridPane.length; i++) {
tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" + this.codierer.fetchSteckverbindungen()[i][1]);
tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8);
this.createPortPane(i);
chkBoxGridPane[i].setVisible(false);
}
// ToggleButtonGroup Listener
cabelConnect.selectedToggleProperty().
addListener((observable, oldValue, newValue) -> {
for (int j = 0; j < chkBoxGridPane.length; j++) {
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
this.createPortPane(j);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
if (chkBoxGridPane[j] != null) {
chkBoxGridPane[j].setVisible(false);
}
}
}
});
}
/**
* Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
*
* @param port => entspricht der Position des gewählten ToggleButton
*/
private void createPortPane(int port) {
if (chkBoxGridPane[port] != null) {
anchorPane.getChildren().remove(chkBoxGridPane[port]);
}
chkBoxGridPane[port] = new ChkBoxGridPane(
this.codierer,
port,
tBtnPort[port]);
chkBoxGridPane[port].setVisible(false);
chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
chkBoxGridPane[port].setPrefWidth(85.0);
chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
chkBoxGridPane[port].setAlignment(Pos.CENTER);
chkBoxGridPane[port].setLayoutX(
(anchorPane.getWidth() / 12) * (port + 1) -
((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
chkBoxGridPane[port].setLayoutY(
mainGrid.getLayoutY() + ((anchorPane.getHeight() -
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
anchorPane.getChildren().add(chkBoxGridPane[port]);
chkBoxGridPane[port].setVisible(true);
}
/**
* Wird ausgelöst wenn der gedrückte Button losgelassen wird.
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
* durch Aufruf der Methode leuchten.
*
* @param e => übergibt den zuletzt losgelassenen Button
*/
@FXML
void tasteRauf(MouseEvent e) {
if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
}
//endregion
//region EventHandler/Listener
/**
* Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
* Auswertung welche Buchstaben-Taste gedrückt ist.
* Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
* in der Klassen-Variablen chiffrierterBuchstabe ablegt.
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
*
* @param e => übergibt den momentan gedrückten Buttons
*/
@FXML
void tasteRunter(MouseEvent e) {
if (e.getSource() == btnA) {
setText(btnA);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnB) {
setText(btnB);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnC) {
setText(btnC);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnD) {
setText(btnD);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnE) {
setText(btnE);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnF) {
setText(btnF);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnG) {
setText(btnG);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnH) {
setText(btnH);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnI) {
setText(btnI);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnJ) {
setText(btnJ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnK) {
setText(btnK);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnL) {
setText(btnL);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnM) {
setText(btnM);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnN) {
setText(btnN);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnO) {
setText(btnO);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnP) {
setText(btnP);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnQ) {
setText(btnQ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnR) {
setText(btnR);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnS) {
setText(btnS);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnT) {
setText(btnT);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnU) {
setText(btnU);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnV) {
setText(btnV);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnW) {
setText(btnW);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnX) {
setText(btnX);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnY) {
setText(btnY);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnZ) {
setText(btnZ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
}
/**
* Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
* Funktionsaufruf entsprechend des gedrückten Button
*
* @param e => ActionEvent des auslösenden Button
*/
@FXML
private void gedrueckteTaste(ActionEvent e) {
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) {
codierer.resetHardware();
this.resetDisplay = true;
this.lblSpruchschluessel.setText("");
this.setzeTagesSchluessel();
}
}
/**
* Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
*
* @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
* @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
* "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
*/
private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
leuchte.setStyle("-fx-background-color: grey");
leuchte.setStyle("-fx-border-color: #000000");
}
}
//endregion
//region Methoden
/**
* Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
*
* @param chiffLetter => chiffrierter Buchstabe
* @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
*/
private Circle chiffCircle(char chiffLetter) {
switch (chiffLetter) {
case 'A':
return circA;
case 'B':
return circB;
case 'C':
return circC;
case 'D':
return circD;
case 'E':
return circE;
case 'F':
return circF;
case 'G':
return circG;
case 'H':
return circH;
case 'I':
return circI;
case 'J':
return circJ;
case 'K':
return circK;
case 'L':
return circL;
case 'M':
return circM;
case 'N':
return circN;
case 'O':
return circO;
case 'P':
return circP;
case 'Q':
return circQ;
case 'R':
return circR;
case 'S':
return circS;
case 'T':
return circT;
case 'U':
return circU;
case 'V':
return circV;
case 'W':
return circW;
case 'X':
return circX;
case 'Y':
return circY;
case 'Z':
return circZ;
}
return null;
}
/**
* Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
*
* @param mBtn : MenuButton der Walze
* @param mItm : MenuItem
*/
private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
if (mBtn.getId().equals(mBtnStartPos1.getId())) {
setzePosition(1, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos2.getId())) {
setzePosition(2, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos3.getId())) {
setzePosition(3, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(0,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos1.getText().charAt(0));
} else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos2.getText().charAt(0));
} else {
setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0));
} else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
}
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
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(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
/**
* Methode die das ProgressDialog Fenster erstellt und verwaltet
*
* @param strRxTx : String : RX => empfangen
* TX => senden
*/
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressIndicator pi = new ProgressIndicator();
pi.setProgress(-1);
ProgressDialog dialog = new ProgressDialog(copyWorker);
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(pi);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
/**
* Thread Worker für Nachricht senden / empfangen
*
* @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean
*/
private Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (IOException e) {
e.printStackTrace();
}
//region Klassenvariablen
private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
@FXML
private static ToggleButton[] tBtnPort;
private String[] empfangeneNachricht;
private String textEingabe;
private String textCodiert;
private char chiffrierterBuchstabe;
private boolean resetDisplay;
private Codierer codierer;
//region GUI-Elemente
//deklariert die benötigten Buttons
@FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
@FXML
private Button[] btnArray;
//endregion
//deklariert die benötigten Kreise
@FXML
private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
//deklariert die benötigten Label
@FXML
private Label lblSpruchschluessel, lblKenngruppe;
//deklariert die MenueButtons
@FXML
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
//deklariert die benötigten Textfelder
@FXML
private TextArea tfCodiert, tfKlartext;
//deklariert benötigtes GridPane
@FXML
private ChkBoxGridPane[] chkBoxGridPane;
@FXML
private GridPane mainGrid;
@FXML
private AnchorPane anchorPane;
/**
* Initialisiert die Elemente GUI und setzt deren Startwerte
*/
@FXML
void initialize() {
// Variablen setzen
textEingabe = "";
textCodiert = "";
resetDisplay = true;
//Einträge für Walzen
menu(mBtnWalzPos1, walzenNr);
menu(mBtnWalzPos2, walzenNr);
menu(mBtnWalzPos3, walzenNr);
//Einträge für die Ringe
menu(mBtnNotchPos1, ringNr);
menu(mBtnNotchPos2, ringNr);
menu(mBtnNotchPos3, ringNr);
//Einträge für die Startpositionen
menu(mBtnStartPos1, position);
menu(mBtnStartPos3, position);
menu(mBtnStartPos2, position);
btnArray = new Button[]{btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN,
btnO, btnP, btnQ, btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ};
tfKlartext.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfKlartext.setScrollTop(Double.MAX_VALUE));
tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfCodiert.setScrollTop(Double.MAX_VALUE));
}
//endregion
//region Init
/**
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
*
* @param button : Button für die die Einträge erstellt werden sollen
*/
private void menu(MenuButton button, String[] str) {
ArrayList<MenuItem> mItem = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
// Eintrag aus str der Arraylist mi hinzufügen
mItem.add(new MenuItem(str[i]));
// MenuItem mi dem Button button hinzufügen
button.getItems().add(mItem.get(i));
int finalI = i;
// Listener für die einzelnen Einträge
mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
}
}
/**
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen
*/
private void myToggleButtons() {
if (chkBoxGridPane != null) {
for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
anchorPane.getChildren().remove(boxGridPane);
}
}
chkBoxGridPane = new ChkBoxGridPane[10];
final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[chkBoxGridPane.length];
for (int i = 0; i < chkBoxGridPane.length; i++) {
tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
this.codierer.fetchSteckverbindungen()[i][1]);
tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8);
this.createPortPane(i);
chkBoxGridPane[i].setVisible(false);
}
// ToggleButtonGroup Listener
cabelConnect.selectedToggleProperty().
addListener((observable, oldValue, newValue) -> {
for (int j = 0; j < chkBoxGridPane.length; j++) {
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
this.createPortPane(j);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
if (chkBoxGridPane[j] != null) {
chkBoxGridPane[j].setVisible(false);
}
}
}
});
}
/**
* Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
*
* @param port => entspricht der Position des gewählten ToggleButton
*/
private void createPortPane(int port) {
if (chkBoxGridPane[port] != null) {
anchorPane.getChildren().remove(chkBoxGridPane[port]);
}
chkBoxGridPane[port] = new ChkBoxGridPane(
this.codierer,
port,
tBtnPort[port]);
chkBoxGridPane[port].setVisible(false);
chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
chkBoxGridPane[port].setPrefWidth(85.0);
chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
chkBoxGridPane[port].setAlignment(Pos.CENTER);
chkBoxGridPane[port].setLayoutX(
(anchorPane.getWidth() / 12) * (port + 1) -
((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
chkBoxGridPane[port].setLayoutY(
mainGrid.getLayoutY() + ((anchorPane.getHeight() -
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
anchorPane.getChildren().add(chkBoxGridPane[port]);
chkBoxGridPane[port].setVisible(true);
}
/**
* Wird ausgelöst wenn der gedrückte Button losgelassen wird.
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
* durch Aufruf der Methode leuchten.
*
* @param e => übergibt den zuletzt losgelassenen Button
*/
@FXML
void tasteRauf(MouseEvent e) {
for(Button btn : btnArray) {
if (e.getSource() == btn) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
}
}
//endregion
//region EventHandler/Listener
/**
* Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
* Auswertung welche Buchstaben-Taste gedrückt ist.
* Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
* in der Klassen-Variablen chiffrierterBuchstabe ablegt.
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
*
* @param e => übergibt den momentan gedrückten Buttons
*/
@FXML
void tasteRunter(MouseEvent e) {
for(Button btn : btnArray) {
if (e.getSource() == btn) {
if (setText(btn)) {
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
return true;
}
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private void setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.lblSpruchschluessel.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
}
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Konvertiert eine rämische Zahl in eine arabische Zahl
*
* @param nummer : String : Römische Zahl
* @return int : arabische Zahl
*/
private int convertRoemischToZahl(String nummer) {
int result = 0;
switch (nummer) {
case "I":
result = 0;
break;
case "II":
result = 1;
break;
case "III":
result = 2;
break;
case "IV":
result = 3;
break;
case "V":
result = 4;
break;
default:
break;
}
return result;
}
/**
* Konvertiert eine arabische Zahl in eine rämische Zahl
*
* @param nummer : int : arabische Zahl
* @return String : römische Zahl
*/
private String convertZahlToRoemisch(int nummer) {
String result = "";
switch (nummer) {
case 0:
result = "I";
break;
case 1:
result = "II";
break;
case 2:
result = "III";
break;
case 3:
result = "IV";
break;
case 4:
result = "V";
break;
default:
break;
}
return result;
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* ->d.h. welche Walze sitzt auf welcher Position
*
* @param walzeRoemischNr => gibt die Walzennummer an
* @param walzenPosition => gibt die Position der Walze
*/
private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
default:
break;
}
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position
*
* @param walzenPosition => gibt die Position der Walze
* @param walzeNr => gibt die Walzennummer an
*/
private void setzeWalze(int walzenPosition, int walzeNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
break;
default:
break;
}
}
/**
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
* um eine Stelle versetzt
*
* @param ringStellung => gibt die walze an
* @param walzenPosition => gibt den notch der Walze (walze) an
*/
private void setzeRing(int walzenPosition, int ringStellung) {
switch (walzenPosition) {
case 1:
mBtnNotchPos1.setText(ringNr[ringStellung]);
break;
case 2:
mBtnNotchPos2.setText(ringNr[ringStellung]);
break;
case 3:
mBtnNotchPos3.setText(ringNr[ringStellung]);
break;
default:
break;
}
}
/**
* Setzt die Startposition/ aktuelle Position der Walze
*
* @param walze => gibt die walze an
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
*/
private void setzePosition(int walze, char buchstabe) {
switch (walze) {
case 1:
mBtnStartPos1.setText(String.valueOf(buchstabe));
break;
case 2:
mBtnStartPos2.setText(buchstabe + "");
break;
case 3:
mBtnStartPos3.setText(buchstabe + "");
break;
default:
break;
}
}
/**
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
*/
private void setzeTagesSchluessel() {
// Umsprungpunkte anzeigen
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
// Walzennummern anzeigen
setzeWalze(1, codierer.fetchWalzenNr()[0]);
setzeWalze(2, codierer.fetchWalzenNr()[1]);
setzeWalze(3, codierer.fetchWalzenNr()[2]);
// Position der Walzen anzeigen
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
myToggleButtons();
// Felder zurück setzen
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
this.tfCodiert.setText("");
}
/**
* Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
*
* @param kenngruppe : String : aktuelle Kenngruppe
*/
void setKenngruppe(String kenngruppe) {
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe.toUpperCase());
this.codierer.resetHardware();
// Setzt die Kenngruppe in der GUI
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
}
private enum BUCHSTABE_LEUCHTET {AN, AUS}
//endregion
}
/**
* Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
* Funktionsaufruf entsprechend des gedrückten Button
*
* @param e => ActionEvent des auslösenden Button
*/
@FXML
private void gedrueckteTaste(ActionEvent e) {
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) {
codierer.resetHardware();
this.resetDisplay = true;
this.lblSpruchschluessel.setText("");
this.setzeTagesSchluessel();
}
}
/**
* Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
*
* @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
* @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
* "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
*/
private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
leuchte.setStyle("-fx-background-color: grey");
leuchte.setStyle("-fx-border-color: #000000");
}
}
//endregion
//region Methoden
/**
* Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
*
* @param chiffLetter => chiffrierter Buchstabe
* @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
*/
private Circle chiffCircle(char chiffLetter) {
switch (chiffLetter) {
case 'A':
return circA;
case 'B':
return circB;
case 'C':
return circC;
case 'D':
return circD;
case 'E':
return circE;
case 'F':
return circF;
case 'G':
return circG;
case 'H':
return circH;
case 'I':
return circI;
case 'J':
return circJ;
case 'K':
return circK;
case 'L':
return circL;
case 'M':
return circM;
case 'N':
return circN;
case 'O':
return circO;
case 'P':
return circP;
case 'Q':
return circQ;
case 'R':
return circR;
case 'S':
return circS;
case 'T':
return circT;
case 'U':
return circU;
case 'V':
return circV;
case 'W':
return circW;
case 'X':
return circX;
case 'Y':
return circY;
case 'Z':
return circZ;
}
return null;
}
/**
* Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
*
* @param mBtn : MenuButton der Walze
* @param mItm : MenuItem
*/
private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
if (mBtn.getId().equals(mBtnStartPos1.getId())) {
setzePosition(1, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos2.getId())) {
setzePosition(2, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos3.getId())) {
setzePosition(3, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(0,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos1.getText().charAt(0));
} else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos2.getText().charAt(0));
} else {
setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0));
} else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
}
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
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(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
/**
* Methode die das ProgressDialog Fenster erstellt und verwaltet
*
* @param strRxTx : String : RX => empfangen
* TX => senden
*/
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressIndicator pi = new ProgressIndicator();
pi.setProgress(-1);
ProgressDialog dialog = new ProgressDialog(copyWorker);
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(pi);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
/**
* Thread Worker für Nachricht senden / empfangen
*
* @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean
*/
private Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private boolean setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.lblSpruchschluessel.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
}
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfKlartext.appendText("");
tfCodiert.setText(textCodiert);
tfKlartext.appendText("");
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
return true;
} else {
new Fehler().showErrorDialog("error", "Wir wussten das du das testen wirst", "250 Zeichen sind " +
"selbst für die Wehrmacht zu viel!");
return false;
}
}
/**
* Konvertiert eine rämische Zahl in eine arabische Zahl
*
* @param nummer : String : Römische Zahl
* @return int : arabische Zahl
*/
private int convertRoemischToZahl(String nummer) {
int result = 0;
switch (nummer) {
case "I":
result = 0;
break;
case "II":
result = 1;
break;
case "III":
result = 2;
break;
case "IV":
result = 3;
break;
case "V":
result = 4;
break;
default:
break;
}
return result;
}
/**
* Konvertiert eine arabische Zahl in eine rämische Zahl
*
* @param nummer : int : arabische Zahl
* @return String : römische Zahl
*/
private String convertZahlToRoemisch(int nummer) {
String result = "";
switch (nummer) {
case 0:
result = "I";
break;
case 1:
result = "II";
break;
case 2:
result = "III";
break;
case 3:
result = "IV";
break;
case 4:
result = "V";
break;
default:
break;
}
return result;
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* ->d.h. welche Walze sitzt auf welcher Position
*
* @param walzeRoemischNr => gibt die Walzennummer an
* @param walzenPosition => gibt die Position der Walze
*/
private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
default:
break;
}
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position
*
* @param walzenPosition => gibt die Position der Walze
* @param walzeNr => gibt die Walzennummer an
*/
private void setzeWalze(int walzenPosition, int walzeNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
break;
default:
break;
}
}
/**
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
* um eine Stelle versetzt
*
* @param ringStellung => gibt die walze an
* @param walzenPosition => gibt den notch der Walze (walze) an
*/
private void setzeRing(int walzenPosition, int ringStellung) {
switch (walzenPosition) {
case 1:
mBtnNotchPos1.setText(ringNr[ringStellung]);
break;
case 2:
mBtnNotchPos2.setText(ringNr[ringStellung]);
break;
case 3:
mBtnNotchPos3.setText(ringNr[ringStellung]);
break;
default:
break;
}
}
/**
* Setzt die Startposition/ aktuelle Position der Walze
*
* @param walze => gibt die walze an
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
*/
private void setzePosition(int walze, char buchstabe) {
switch (walze) {
case 1:
mBtnStartPos1.setText(String.valueOf(buchstabe));
break;
case 2:
mBtnStartPos2.setText(buchstabe + "");
break;
case 3:
mBtnStartPos3.setText(buchstabe + "");
break;
default:
break;
}
}
/**
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
*/
private void setzeTagesSchluessel() {
// Umsprungpunkte anzeigen
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
// Walzennummern anzeigen
setzeWalze(1, codierer.fetchWalzenNr()[0]);
setzeWalze(2, codierer.fetchWalzenNr()[1]);
setzeWalze(3, codierer.fetchWalzenNr()[2]);
// Position der Walzen anzeigen
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
myToggleButtons();
// Felder zurück setzen
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
this.tfCodiert.setText("");
}
/**
* Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
*
* @param kenngruppe : String : aktuelle Kenngruppe
*/
void setKenngruppe(String kenngruppe) {
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe.toUpperCase());
this.codierer.resetHardware();
// Setzt die Kenngruppe in der GUI
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
}
private enum BUCHSTABE_LEUCHTET {AN, AUS}
//endregion
}
......@@ -113,7 +113,7 @@ public class Walze {
* @return char : decodierter Buchstabe.
*/
char codiere2(char buchstabe) {
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 260) % 26);
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 520) % 26);
}
/**
......
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuButton?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<GridPane layoutX="23.0" layoutY="60.0" prefHeight="158.0" prefWidth="237.0" AnchorPane.leftAnchor="23.0" AnchorPane.topAnchor="60.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
......@@ -585,12 +593,6 @@
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<TextField fx:id="tfKlartext" editable="false" prefHeight="70.0" prefWidth="293.0">
<GridPane.margin>
<Insets />
</GridPane.margin>
</TextField>
<TextField fx:id="tfCodiert" editable="false" prefHeight="70.0" prefWidth="293.0" GridPane.rowIndex="1" />
<Button fx:id="btnSenden" alignment="CENTER" contentDisplay="RIGHT" mnemonicParsing="false" onAction="#gedrueckteTaste" prefHeight="70.0" prefWidth="195.0" text="An Funker senden" textAlignment="CENTER" GridPane.columnIndex="1">
<GridPane.margin>
<Insets left="80.0" />
......@@ -601,6 +603,16 @@
<Insets left="80.0" />
</GridPane.margin>
</Button>
<TextArea fx:id="tfKlartext" prefHeight="66.0" prefWidth="293.0" wrapText="true">
<GridPane.margin>
<Insets bottom="5.0" top="5.0" />
</GridPane.margin>
</TextArea>
<TextArea fx:id="tfCodiert" prefHeight="200.0" prefWidth="200.0" wrapText="true" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="5.0" top="5.0" />
</GridPane.margin>
</TextArea>
</GridPane>
<Label fx:id="lblKenngruppe" layoutX="682.0" layoutY="34.0" prefHeight="17.0" prefWidth="177.0" />
<Pane layoutX="266.0" layoutY="194.0" prefHeight="200.0" prefWidth="354.0" style="-fx-background-color: white; -fx-border-color: black;" visible="false">
......