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 (31)
Praesentation/Screenshot.JPG

84.9 KiB

...@@ -46,13 +46,15 @@ ...@@ -46,13 +46,15 @@
* Besondere (für uns) Lösungen * Besondere (für uns) Lösungen
### Zahlen, Daten, Fakten ### Zahlen, Daten, Fakten
* Zeilen insgesamt: 4120 * Zeilen insgesamt: 3056
* Code: 1596 * Code: 1619 (53%)
* XML: 110 * XML: 110
* Kommentare: * Kommentare: 1076 (35%)
* Leerzeilen: * Leerzeilen: 365 (12%)
* Commits: 373 * Commits: 461
* Merge Requests: 113 * Merge Requests: 146
* Tickets: 29
* Pipelines 471
## Klassendiagram ## 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") ![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")
...@@ -85,12 +87,6 @@ ...@@ -85,12 +87,6 @@
* Dann String (Warum) * Dann String (Warum)
* Vorteile Enum (Warum) * Vorteile Enum (Warum)
## Die GUI der Enigma (Elemente, etc)
* Besondere GUI Elemente
* ControlsFX (ProgressDialog)
## GUI Controller
## Enigma Demo ## Enigma Demo
* Kenngruppe Abfrage * Kenngruppe Abfrage
* Testen Kenngruppe Dialog und Fehler * Testen Kenngruppe Dialog und Fehler
...@@ -105,3 +101,7 @@ ...@@ -105,3 +101,7 @@
* Setzen von Walzen und Ringen * Setzen von Walzen und Ringen
* Setzen von gleichen Walzen und Fehler * Setzen von gleichen Walzen und Fehler
* Senden & Empfangen * Senden & Empfangen
## GUI Controller
![Screenshot](Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
...@@ -17,3 +17,5 @@ Ebenfalls wichtig ist eure Kenngruppe. Dies hat früher den Personenkreis bezeic ...@@ -17,3 +17,5 @@ Ebenfalls wichtig ist eure Kenngruppe. Dies hat früher den Personenkreis bezeic
Wenn ihr also auf mehreren Clients die selbe Kenngruppe nutzt, dann könnt ihr untereinander eure Nachrichten lesen.\ Wenn ihr also auf mehreren Clients die selbe Kenngruppe nutzt, dann könnt ihr untereinander eure Nachrichten lesen.\
\ \
Im [Wiki](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/home) findet ihr auch noch einige Informationen zu dem Projekt. Im [Wiki](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/home) findet ihr auch noch einige Informationen zu dem Projekt.
![Screenshot](Praesentation/Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
File added
...@@ -37,7 +37,7 @@ public class App extends Application { ...@@ -37,7 +37,7 @@ public class App extends Application {
* @param args : String[] : Standard-Kommandozeilen-Argument. * @param args : String[] : Standard-Kommandozeilen-Argument.
*/ */
public static void main(String[] args) { public static void main(String[] args) {
debug = 1; debug = 0;
launch(args); launch(args);
} }
...@@ -60,12 +60,14 @@ public class App extends Application { ...@@ -60,12 +60,14 @@ public class App extends Application {
@Override @Override
public void start(Stage primaryStage) throws IOException { public void start(Stage primaryStage) throws IOException {
primaryStage.setTitle("Enigma"); primaryStage.setTitle("Enigma");
primaryStage.setResizable(false);
Label lblEingbae = new Label("Bitte Kenngruppe eingeben!"); Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
TextField tfEingabe = new TextField(); TextField tfEingabe = new TextField();
Button btnKenngruppe = new Button("Kenngruppe setzen!"); Button btnKenngruppe = new Button("Kenngruppe setzen!");
VBox layout = new VBox(); VBox layout = new VBox();
layout.setSpacing(30); layout.setSpacing(10);
layout.setPadding(new Insets(30, 30, 30, 30)); layout.setPadding(new Insets(20, 30, 10, 30));
btnKenngruppe.setMaxWidth(Double.MAX_VALUE); btnKenngruppe.setMaxWidth(Double.MAX_VALUE);
// baut die Scene fuer die Kenngruppenabfrage auf // baut die Scene fuer die Kenngruppenabfrage auf
......
package projekt.enigma; package projekt.enigma;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task; import javafx.concurrent.Task;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.HPos;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import javafx.stage.StageStyle; import javafx.stage.StageStyle;
import org.apache.http.HttpException;
import org.controlsfx.dialog.ProgressDialog; import org.controlsfx.dialog.ProgressDialog;
import projekt.enigma.model.Codierer; import projekt.enigma.model.Codierer;
import projekt.enigma.model.Fehler; import projekt.enigma.model.Fehler;
import projekt.enigma.view.ChkBoxGridPane;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
public class GuiController { public class GuiController {
//region Klassenvariablen //region Klassenvariablen
private final static String[] walzenNr = {"I", "II", "III", "IV", "V"}; 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[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
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"}; "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 @FXML
private static ToggleButton[] tBtnPort; private static ToggleButton[] tBtnPort;
private String[] empfangeneNachricht; private String[] empfangeneNachricht;
...@@ -34,11 +38,14 @@ public class GuiController { ...@@ -34,11 +38,14 @@ public class GuiController {
private char chiffrierterBuchstabe; private char chiffrierterBuchstabe;
private boolean resetDisplay; private boolean resetDisplay;
private Codierer codierer; private Codierer codierer;
//region GUI-Elemente //region GUI-Elemente
//deklariert die benötigten Buttons //deklariert die benötigten Buttons
@FXML @FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ, 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; btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
@FXML
private Button[] btnArray;
//endregion //endregion
//deklariert die benötigten Kreise //deklariert die benötigten Kreise
@FXML @FXML
...@@ -53,13 +60,14 @@ public class GuiController { ...@@ -53,13 +60,14 @@ public class GuiController {
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3; mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
//deklariert die benötigten Textfelder //deklariert die benötigten Textfelder
@FXML @FXML
private TextField tfCodiert, tfKlartext; private TextArea tfCodiert, tfKlartext;
//deklariert benötigtes pane
@FXML
private Pane portPane0, portPane1, portPane2, portPane3, portPane4, portPane5, portPane6, portPane7, portPane8, portPane9;
//deklariert benötigtes GridPane //deklariert benötigtes GridPane
@FXML @FXML
private ChkBoxGridPane[] chkBoxGridPane;
@FXML
private GridPane mainGrid; private GridPane mainGrid;
@FXML
private AnchorPane anchorPane;
/** /**
* Initialisiert die Elemente GUI und setzt deren Startwerte * Initialisiert die Elemente GUI und setzt deren Startwerte
...@@ -71,7 +79,6 @@ public class GuiController { ...@@ -71,7 +79,6 @@ public class GuiController {
textCodiert = ""; textCodiert = "";
resetDisplay = true; resetDisplay = true;
//Einträge für Walzen //Einträge für Walzen
menu(mBtnWalzPos1, walzenNr); menu(mBtnWalzPos1, walzenNr);
menu(mBtnWalzPos2, walzenNr); menu(mBtnWalzPos2, walzenNr);
...@@ -86,59 +93,18 @@ public class GuiController { ...@@ -86,59 +93,18 @@ public class GuiController {
menu(mBtnStartPos1, position); menu(mBtnStartPos1, position);
menu(mBtnStartPos3, position); menu(mBtnStartPos3, position);
menu(mBtnStartPos2, 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) ->
myToggleButtons(); tfKlartext.setScrollTop(Double.MAX_VALUE));
tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfCodiert.setScrollTop(Double.MAX_VALUE));
} }
//endregion //endregion
//region Init //region Init
/**
* 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) {
// 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) {
sb.append(c);
}
/* // ToggleButton erstellen
tBtnPort[port] = new ToggleButton();
// Den ToggleButton dem GridPane in der Oberfläche zuordnen
mainGrid.add(tBtnPort[port], port + 1, 8);
mainGrid.setMargin(tBtnPort[port], new Insets(0, 15, 0, 15));*/
// 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 * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
* *
...@@ -148,85 +114,86 @@ public class GuiController { ...@@ -148,85 +114,86 @@ public class GuiController {
ArrayList<MenuItem> mItem = new ArrayList<>(); ArrayList<MenuItem> mItem = new ArrayList<>();
for (int i = 0; i < str.length; i++) { for (int i = 0; i < str.length; i++) {
//Eintrag aus str der Arraylist mi hinzufügen // Eintrag aus str der Arraylist mi hinzufügen
mItem.add(new MenuItem(str[i])); mItem.add(new MenuItem(str[i]));
//MenuItem mi dem Button button hinzufügen // MenuItem mi dem Button button hinzufügen
button.getItems().add(mItem.get(i)); button.getItems().add(mItem.get(i));
int finalI = i; int finalI = i;
//Listener für die einzelnen Einträge // Listener für die einzelnen Einträge
mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI))); mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
} }
} }
/** /**
* TODO: Doku * Erzeugt Buttons um die Steckverbindungen zu auszuwählen
*
* @param port : int : Port zu dem das Panel geändert werden soll
* @param status : aktivieren/deaktivieren
*/ */
private void switchPortVisible(int port, boolean status) { private void myToggleButtons() {
switch (port) { if (chkBoxGridPane != null) {
case 0: for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
portPane0.setVisible(status); anchorPane.getChildren().remove(boxGridPane);
break; }
case 1:
portPane1.setVisible(status);
break;
case 2:
portPane2.setVisible(status);
break;
case 3:
portPane3.setVisible(status);
break;
case 4:
portPane4.setVisible(status);
break;
case 5:
portPane5.setVisible(status);
break;
case 6:
portPane6.setVisible(status);
break;
case 7:
portPane7.setVisible(status);
break;
case 8:
portPane8.setVisible(status);
break;
case 9:
portPane9.setVisible(status);
break;
default:
break;
} }
} chkBoxGridPane = new ChkBoxGridPane[10];
/**
* TODO: Doku
*/
private void myToggleButtons() {
final ToggleGroup cabelConnect = new ToggleGroup(); final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[10]; tBtnPort = new ToggleButton[chkBoxGridPane.length];
for (int i = 0; i < 10; i++) {
tBtnPort[i] = new ToggleButton(i + "Port"); for (int i = 0; i < chkBoxGridPane.length; i++) {
tBtnPort[i].setAlignment(Pos.CENTER_RIGHT); tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
this.codierer.fetchSteckverbindungen()[i][1]);
tBtnPort[i].setToggleGroup(cabelConnect); tBtnPort[i].setToggleGroup(cabelConnect);
GridPane.setMargin(tBtnPort[i], new Insets(0, 15, 0, 15)); tBtnPort[i].setMinWidth(50.0);
GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8); 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++) {
cabelConnect.selectedToggleProperty(). if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
addListener((observable, oldValue, newValue) -> { this.createPortPane(j);
//TODO } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
for (int j = 0; j < 10; j++) { if (chkBoxGridPane[j] != null) {
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) { chkBoxGridPane[j].setVisible(false);
switchPortVisible(j, true);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
switchPortVisible(j, 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);
} }
/** /**
...@@ -238,32 +205,9 @@ public class GuiController { ...@@ -238,32 +205,9 @@ public class GuiController {
*/ */
@FXML @FXML
void tasteRauf(MouseEvent e) { void tasteRauf(MouseEvent e) {
if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); for(Button btn : btnArray) {
if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); if (e.getSource() == btn) 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 //endregion
...@@ -280,110 +224,13 @@ public class GuiController { ...@@ -280,110 +224,13 @@ public class GuiController {
*/ */
@FXML @FXML
void tasteRunter(MouseEvent e) { void tasteRunter(MouseEvent e) {
if (e.getSource() == btnA) { for(Button btn : btnArray) {
setText(btnA); if (e.getSource() == btn) {
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN); if (setText(btn)) {
} 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);
}
} }
/** /**
...@@ -514,45 +361,45 @@ public class GuiController { ...@@ -514,45 +361,45 @@ public class GuiController {
this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0)); this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
} }
if (mBtn.getId().equals(mBtnWalzPos1.getId())) { if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText()); setzeWalze(1, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) && if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) { !mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(0, this.codierer.setzeWalzeNr(0,
convertRoemischToZahl(mItm.getText()) + 1, convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos1.getText().charAt(0)); mBtnNotchPos1.getText().charAt(0));
} else { } else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0))); setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
new Fehler().showErrorDialog("error", new Fehler().showErrorDialog("error",
"Walze nicht gefunden", "Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben"); "Es scheint so das wir von jeder Walze nur eine da haben");
} }
} }
if (mBtn.getId().equals(mBtnWalzPos2.getId())) { if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
setzeWalze(2, mItm.getText()); setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) && if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) { !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(1, this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1, convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos2.getText().charAt(0)); mBtnNotchPos2.getText().charAt(0));
} else { } else {
setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1))); setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
new Fehler().showErrorDialog("error", new Fehler().showErrorDialog("error",
"Walze nicht gefunden", "Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben"); "Es scheint so das wir von jeder Walze nur eine da haben");
} }
} }
if (mBtn.getId().equals(mBtnWalzPos3.getId())) { if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText()); setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) && if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) { !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2, this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1, convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0)); mBtnNotchPos3.getText().charAt(0));
} else { } else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2))); setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error", new Fehler().showErrorDialog("error",
"Walze nicht gefunden", "Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben"); "Es scheint so das wir von jeder Walze nur eine da haben");
} }
} }
if (mBtn.getId().equals(mBtnNotchPos1.getId())) { if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
...@@ -571,17 +418,6 @@ public class GuiController { ...@@ -571,17 +418,6 @@ public class GuiController {
tfKlartext.setText(""); tfKlartext.setText("");
} }
/**
* Hier werden die TextFelder der ToggelButtons gesetzt, welche die Steckverbindungen darstellen,
* mit den Werten die von der Klasse Codierer zur Verfügung gestellt werden.
*/
private void setzeSteckverbindungen() {
for (int i = 0; i <= 9; i++) {
tBtnPort[i].setText(codierer.fetchSteckverbindungen()[i][0] + ""
+ codierer.fetchSteckverbindungen()[i][1]);
}
}
/** /**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld, * 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 * der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
...@@ -639,9 +475,10 @@ public class GuiController { ...@@ -639,9 +475,10 @@ public class GuiController {
} }
/** /**
* TODO * Methode die das ProgressDialog Fenster erstellt und verwaltet
* *
* @param strRxTx : String : RX oder TX * @param strRxTx : String : RX => empfangen
* TX => senden
*/ */
private void progressDialogue(String strRxTx) { private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx); Task copyWorker = createWorker(strRxTx);
...@@ -665,9 +502,10 @@ public class GuiController { ...@@ -665,9 +502,10 @@ public class GuiController {
} }
/** /**
* TODO * Thread Worker für Nachricht senden / empfangen
* *
* @param strRxTx : String : RX oder TX * @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean * @return boolean
*/ */
private Task createWorker(String strRxTx) { private Task createWorker(String strRxTx) {
...@@ -698,7 +536,7 @@ public class GuiController { ...@@ -698,7 +536,7 @@ public class GuiController {
* *
* @param pressedButton : gedrückter Knopf * @param pressedButton : gedrückter Knopf
*/ */
private void setText(Button pressedButton) { private boolean setText(Button pressedButton) {
if (textEingabe.length() < 250) { if (textEingabe.length() < 250) {
if (this.resetDisplay) { if (this.resetDisplay) {
this.tfCodiert.setText(""); this.tfCodiert.setText("");
...@@ -718,12 +556,20 @@ public class GuiController { ...@@ -718,12 +556,20 @@ public class GuiController {
textCodiert += chiffrierterBuchstabe; textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe); tfKlartext.setText(textEingabe);
tfKlartext.appendText("");
tfCodiert.setText(textCodiert); tfCodiert.setText(textCodiert);
tfKlartext.appendText("");
// Position der Walzen aktuallisieren // Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0])); mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1])); mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2])); 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;
} }
} }
...@@ -823,7 +669,6 @@ public class GuiController { ...@@ -823,7 +669,6 @@ public class GuiController {
switch (walzenPosition) { switch (walzenPosition) {
case 1: case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]); mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
//codierer.setWalze(walzeNr, walzenPosition)
break; break;
case 2: case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]); mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
...@@ -903,10 +748,7 @@ public class GuiController { ...@@ -903,10 +748,7 @@ public class GuiController {
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2])); mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen // Steckbrett Felder setzen
setzeSteckverbindungen(); myToggleButtons();
// Setzt das Steckbrett
generateSteckbrett();
// Felder zurück setzen // Felder zurück setzen
this.textCodiert = ""; this.textCodiert = "";
...@@ -916,9 +758,9 @@ public class GuiController { ...@@ -916,9 +758,9 @@ public class GuiController {
} }
/** /**
* TODO: Doku * Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
* *
* @param kenngruppe : String : Die Kenngruppe die gesetzt werden soll * @param kenngruppe : String : aktuelle Kenngruppe
*/ */
void setKenngruppe(String kenngruppe) { void setKenngruppe(String kenngruppe) {
...@@ -927,7 +769,7 @@ public class GuiController { ...@@ -927,7 +769,7 @@ public class GuiController {
this.codierer.resetHardware(); this.codierer.resetHardware();
//Setzt die Kenngruppe in der GUI // Setzt die Kenngruppe in der GUI
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe()); lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden. // Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
...@@ -935,7 +777,6 @@ public class GuiController { ...@@ -935,7 +777,6 @@ public class GuiController {
// Einstellungen aus dem Logbuch auslesen und setzen // Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel(); setzeTagesSchluessel();
setzeSteckverbindungen();
} }
private enum BUCHSTABE_LEUCHTET {AN, AUS} private enum BUCHSTABE_LEUCHTET {AN, AUS}
......
...@@ -12,506 +12,496 @@ import java.util.Random; ...@@ -12,506 +12,496 @@ import java.util.Random;
*/ */
public class Codierer { public class Codierer {
//region Variablen //region Variablen
/** /**
* Der Spruchschluessel als Klartext zur Codierung der Nachricht. * Der Spruchschluessel als Klartext zur Codierung der Nachricht.
*/ */
private String spruchschluessel; private String spruchschluessel;
/** /**
* Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert. * Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
*/ */
private String spruchschluesselCodiert; private String spruchschluesselCodiert;
/** /**
* Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind. * Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
* Diese ist relevant fuer den Webservice (Funkraum). * Diese ist relevant fuer den Webservice (Funkraum).
*/ */
private String kenngruppe; private String kenngruppe;
/** /**
* Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert * Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
* und im Laufe der Benutzung ergaenzt. * und im Laufe der Benutzung ergaenzt.
*/ */
private String nachricht; private String nachricht;
/** /**
* Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet. * Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
*/ */
private Hardware hardware; private Hardware hardware;
/** /**
* Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden. * Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
*/ */
private Codebuch codebuch; private Codebuch codebuch;
//endregion //endregion
//region Konstruktor //region Konstruktor
/** /**
* Der Konstruktor des Codierers. * Der Konstruktor des Codierers.
* Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert. * Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
*/ */
public Codierer(String kenngruppe) { public Codierer(String kenngruppe) {
this.nachricht = ""; this.nachricht = "";
this.spruchschluessel = ""; this.spruchschluessel = "";
this.spruchschluesselCodiert = ""; this.spruchschluesselCodiert = "";
this.kenngruppe = kenngruppe; this.kenngruppe = kenngruppe;
this.codebuch = new Codebuch(); this.codebuch = new Codebuch();
this.codebuch.fetchTagesschluessel(); this.codebuch.fetchTagesschluessel();
} }
//endregion //endregion
//region Funktionen & Methoden //region Funktionen & Methoden
//region Reset & Initialisieren //region Reset & Initialisieren
/** /**
* Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch-Objekt. * Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch-Objekt.
* Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend
* in die Hardware gebaut. * in die Hardware gebaut.
* <br> * <br>
* Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und * Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
* deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben. * deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
* <br> * <br>
* Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen * Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
* Codebucheintrag. * Codebucheintrag.
*/ */
private void initialisiereHardware() { private void initialisiereHardware() {
this.nachricht = ""; this.nachricht = "";
// Das Steckbrett initialisieren // Das Steckbrett initialisieren
Steckbrett sb = new Steckbrett(); Steckbrett sb = new Steckbrett();
char[][] verbinder = this.codebuch.getSteckverbindung(); char[][] verbinder = this.codebuch.getSteckverbindung();
// Für jedes Kabel eine Verbindung auf dem Steckbrett setzen // Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
for (char[] kabel : verbinder) { for (char[] kabel : verbinder) {
sb.setzeVertauschung(kabel[0], kabel[1]); sb.setzeVertauschung(kabel[0], kabel[1]);
} }
// Die Hardware aus dem Koffer holen (initialisieren) // Die Hardware aus dem Koffer holen (initialisieren)
this.hardware = new Hardware(); this.hardware = new Hardware();
// Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen // Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen
this.hardware.setWalzen(0, this.codebuch.getWalzenlage()[0], this.codebuch.getRingstellung()[0]); this.hardware.setWalzen(0, this.codebuch.getWalzenlage()[0], this.codebuch.getRingstellung()[0]);
this.hardware.setWalzen(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]); this.hardware.setWalzen(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]);
this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]); this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]);
// Der Hardware das gesetzte Steckbrett zuweisen // Der Hardware das gesetzte Steckbrett zuweisen
this.hardware.setSteckbrett(sb); this.hardware.setSteckbrett(sb);
// Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben // Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
this.hardware.setReflektor(new Reflektor()); this.hardware.setReflektor(new Reflektor());
} }
/** /**
* Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck. * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
*/ */
public void resetHardware() { public void resetHardware() {
this.initialisiereHardware(); this.initialisiereHardware();
} }
/** /**
* Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen. * Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
*/ */
private void resetNachricht() { private void resetNachricht() {
this.nachricht = ""; this.nachricht = "";
} }
//endregion //endregion
//region Nachrichten handler //region Nachrichten handler
/** /**
* Befehl, die Nachricht an den Funker zu uebergeben. * Befehl, die Nachricht an den Funker zu uebergeben.
* *
* @throws IOException : Die Antwort konnte nicht gelesen werden. * @throws IOException : Die Antwort konnte nicht gelesen werden.
*/ */
public void sendeNachricht() throws IOException { public void sendeNachricht() throws IOException {
String kopf = this.generateKopf(); String kopf = this.generateKopf();
new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht), new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
this.kenngruppe); this.kenngruppe);
this.nachricht = ""; this.nachricht = "";
this.resetHardware(); this.resetHardware();
} }
/** /**
* Gibt die letzte empfangene Nachricht zurueck. * Gibt die letzte empfangene Nachricht zurueck.
* <br> * <br>
* nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde. * nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
* nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert. * nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
* nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der * nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
* Tageseinstellungen (nachricht[0]) decodiert. * Tageseinstellungen (nachricht[0]) decodiert.
*/ */
public String[] empfangeNachricht() { public String[] empfangeNachricht() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
Morsecode mc = new Morsecode(); Morsecode mc = new Morsecode();
String[] nachricht = new String[3]; String[] nachricht = new String[3];
// Alte Nachrichten-Variable erstmal leeren // Alte Nachrichten-Variable erstmal leeren
this.nachricht = ""; this.nachricht = "";
// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum // Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe); String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat // Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) { if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
nachricht[0] = codierteNachricht[0]; nachricht[0] = codierteNachricht[0];
nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]); nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0])); nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
sb.append(nachricht[1], 0, 16); sb.append(nachricht[1], 0, 16);
for (int i = 17; i <= nachricht[1].length(); ) { for (int i = 17; i <= nachricht[1].length(); ) {
if ((i + 5) < nachricht[1].length()) { if ((i + 5) < nachricht[1].length()) {
sb.append(nachricht[1], i, i + 5).append(" "); sb.append(nachricht[1], i, i + 5).append(" ");
i += 5; i += 5;
} else { } else {
sb.append(nachricht[1].substring(i)); sb.append(nachricht[1].substring(i));
break; break;
} }
} }
nachricht[1] = sb.toString(); nachricht[1] = sb.toString();
} }
return nachricht; return nachricht;
} }
//endregion //endregion
//region Generatoren //region Generatoren
/** /**
* Hier wird ein neuer Spruchschluessel generiert. * Hier wird ein neuer Spruchschluessel generiert.
* <p> * <p>
* Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
* Tagesschluessel codiert, hinzugefuegt. * Tagesschluessel codiert, hinzugefuegt.
* <br> * <br>
* Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert, * Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
* und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist. * und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
* Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt. * Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
* <br> * <br>
* Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat. * Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
* Die Walzen werden anhand des Spruchschluessels automatisch gestellt. * Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
*/ */
public void generateSpruchschluessel() { public void generateSpruchschluessel() {
String klartext = ""; String klartext = "";
while (klartext.length() < 3) { while (klartext.length() < 3) {
String temp = this.randomBuchstabe(); String temp = this.randomBuchstabe();
if (!klartext.contains(temp)) { if (!klartext.contains(temp)) {
klartext += temp; klartext += temp;
} }
} }
this.spruchschluessel = klartext; this.spruchschluessel = klartext;
this.spruchschluesselCodiert = this.codiere(klartext + klartext, false); this.spruchschluesselCodiert = this.codiere(klartext + klartext, false);
// Walzen auf den Spruchschlüssel stellen // Walzen auf den Spruchschlüssel stellen
this.hardware.setzePosition(0, this.spruchschluessel.charAt(0)); this.hardware.setzePosition(0, this.spruchschluessel.charAt(0));
this.hardware.setzePosition(1, this.spruchschluessel.charAt(1)); this.hardware.setzePosition(1, this.spruchschluessel.charAt(1));
this.hardware.setzePosition(2, this.spruchschluessel.charAt(2)); this.hardware.setzePosition(2, this.spruchschluessel.charAt(2));
// Die Kenngruppe codieren und in der Nachricht speichern // Die Kenngruppe codieren und in der Nachricht speichern
this.codiere(this.kenngruppe, true); this.codiere(this.kenngruppe, true);
} }
/** /**
* Erstellen des Nachrichten-Kopfes. * Erstellen des Nachrichten-Kopfes.
* Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem * Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
* Tagescode codierte, Spruchschluessel. * Tagescode codierte, Spruchschluessel.
* *
* @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel. * @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
*/ */
private String generateKopf() { private String generateKopf() {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " " return String.format("%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)) + " "
+ this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " " + this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
+ this.spruchschluesselCodiert.substring(3, 6) + " "; + this.spruchschluesselCodiert.substring(3, 6) + " ";
} }
/** /**
* Generiert einen zufaelligen Buchstaben aus dem Alphabet. * Generiert einen zufaelligen Buchstaben aus dem Alphabet.
* In der Funktion gibt es den String "Alphabet", in welchem alle zulaessigen Zeichen eingetragen sind. * In der Funktion gibt es den String "Alphabet", in welchem alle zulaessigen Zeichen eingetragen sind.
* Aus diesem String wird nun zufaellig ein Zeichen ausgewaehlt und zurueckgegeben. * Aus diesem String wird nun zufaellig ein Zeichen ausgewaehlt und zurueckgegeben.
* *
* @return String : ein zufaellig generierter Buchstabe. * @return String : ein zufaellig generierter Buchstabe.
*/ */
private String randomBuchstabe() { private String randomBuchstabe() {
return String.valueOf((char) ('A' + new Random().nextInt(26))); return String.valueOf((char) ('A' + new Random().nextInt(26)));
} }
//endregion //endregion
//region setze Funktionen //region setze Funktionen
/** /**
* Setzt den Ring auf der Walze auf einen neuen Umsprungwert. * Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
* *
* @param walzenPosition : int : Walze auf die der Ring gesteckt wird. * @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
* @param umsprungPunkt : int : Umspringpunkt (Signal an linke Walze zum Drehen). * @param umsprungPunkt : int : Umspringpunkt (Signal an linke Walze zum Drehen).
*/ */
public void setzeRing(int walzenPosition, int umsprungPunkt) { public void setzeRing(int walzenPosition, int umsprungPunkt) {
this.hardware.setzeRing(walzenPosition, umsprungPunkt); this.hardware.setzeRing(walzenPosition, umsprungPunkt);
} }
/** /**
* Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein. * Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
* Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an. * Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
* *
* @param walzenPosition : int : Position der Walze in der Enigma (1-2-3). * @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
* @param walzeNr : int : Nummer der Walze die eingesetzt wird. * @param walzeNr : int : Nummer der Walze die eingesetzt wird.
* @param ringstellung : int : Stellung des Ringes. * @param ringstellung : int : Stellung des Ringes.
*/ */
public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) { public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung); this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
} }
/** /**
* Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
* Nachrichten Objekt * Nachrichten Objekt
* *
* @param walze : int : Nummer der Walze * @param walze : int : Nummer der Walze
* @param buchstabe : char : Buchstabe der zugewiesen soll * @param buchstabe : char : Buchstabe der zugewiesen soll
*/ */
public void setzeWalzenPosition(int walze, char buchstabe) { public void setzeWalzenPosition(int walze, char buchstabe) {
this.resetNachricht(); this.resetNachricht();
this.hardware.setzePosition(walze, buchstabe); this.hardware.setzePosition(walze, buchstabe);
} }
/** /**
* TODO: Wird nicht benutzt * Setzt das Kabel in beide Ports ein und fuegt es dem Steckbrett-Array hinzu.
* Setzt das Kabel in beide Ports ein und fuegt es dem Steckbrett-Array hinzu. *
* * @param port : int : Kabel Nummer, welches am Steckbrett eingesteckt wird.
* @param port : int : Kabel Nummer, welches am Steckbrett eingesteckt wird. * @param verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt.
* @param verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt. */
* @return boolean : Wenn true, darf das Kabel gesteckt werden, wenn false, steckt da bereits schon eines. public void setzeSteckbrett(int port, String verbindung) {
*/ if (verbindung.equals("")) {
public boolean setzeSteckbrett(int port, String verbindung) { verbindung = " ";
return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1)); }
}
//endregion this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
}
//region fetch Funktionen //endregion
/** //region fetch Funktionen
* Gibt die Ringstellungen aus dem Codebuch zurueck.
* /**
* @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen. * Gibt die Ringstellungen aus dem Codebuch zurueck.
*/ *
public int[] fetchRingstellung() { * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen.
return this.codebuch.getRingstellung(); */
} public int[] fetchRingstellung() {
return this.codebuch.getRingstellung();
/** }
* Gibt die Walzennummer aus dem Codebuch zurueck.
* /**
* @return int[] : Array mit den Nummern der drei eingesetzten Walzen. * Gibt die Walzennummer aus dem Codebuch zurueck.
*/ *
public int[] fetchWalzenNr() { * @return int[] : Array mit den Nummern der drei eingesetzten Walzen.
return this.codebuch.getWalzenlage(); */
} public int[] fetchWalzenNr() {
return this.codebuch.getWalzenlage();
/** }
* Gibt die Steckverbindungen aus dem Codebuch zurueck.
* /**
* @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett. * Gibt die Steckverbindungen aus dem Codebuch zurueck.
*/ *
public char[][] fetchSteckverbindungen() { * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett.
return this.codebuch.getSteckverbindung(); */
} public char[][] fetchSteckverbindungen() {
return this.codebuch.getSteckverbindung();
/** }
* Gibt die aktuellen Buchstaben auf den Walzen zurueck.
* /**
* @return char[] : Walzen Array mit der aktuellen Positionen. * Gibt die aktuellen Buchstaben auf den Walzen zurueck.
*/ *
public char[] fetchWalzen() { * @return char[] : Walzen Array mit der aktuellen Positionen.
char[] walzen = new char[3]; */
walzen[0] = this.hardware.getWalzen()[0].getPosition(); public char[] fetchWalzen() {
walzen[1] = this.hardware.getWalzen()[1].getPosition(); char[] walzen = new char[3];
walzen[2] = this.hardware.getWalzen()[2].getPosition(); walzen[0] = this.hardware.getWalzen()[0].getPosition();
walzen[1] = this.hardware.getWalzen()[1].getPosition();
return walzen; walzen[2] = this.hardware.getWalzen()[2].getPosition();
}
return walzen;
/** }
* Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
* /**
* @param port: Zahl zwischen 0-9: entspricht der Kabelnummer. * Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
* @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck. *
*/ * @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
public String fetchVerfuegbareBuchstaben(int port) { * @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port); */
} public String fetchVerfuegbareBuchstaben(int port) {
return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port);
/** }
* Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
* /**
* @param walzePos : int : Position der Walze * Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
* @return int : Nummer der eingesetzten Walze *
*/ * @param walzePos : int : Position der Walze
public int fetchWalzenNr(int walzePos) { * @return int : Nummer der eingesetzten Walze
return this.hardware.getWalzen()[walzePos].getWalzenNr(); */
} public int fetchWalzenNr(int walzePos) {
//endregion return this.hardware.getWalzen()[walzePos].getWalzenNr();
}
//region codierer //endregion
/** //region codierer
* Hier wird ein einzelner Buchstabe verschluesselt.
* Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht. /**
* In der Regel ist dies der Fall. * Hier wird ein einzelner Buchstabe verschluesselt.
* * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* @param buchstabe : char : Der zu codierende Buchstabe. * In der Regel ist dies der Fall.
* @param save : boolean : Nachricht speichern oder nicht. *
* @return char : Der codierte Buchstabe. * @param buchstabe : char : Der zu codierende Buchstabe.
*/ * @param save : boolean : Nachricht speichern oder nicht.
public char codiere(char buchstabe, boolean save) { * @return char : Der codierte Buchstabe.
char codiert = this.hardware.codiere(buchstabe); */
public char codiere(char buchstabe, boolean save) {
if (save) { char codiert = this.hardware.codiere(buchstabe);
this.nachricht += codiert;
} if (save) {
this.nachricht += codiert;
return codiert; }
}
return codiert;
/** }
* Codiert den uebergebenen String.
* Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht. /**
* In der Regel ist dies der Fall. * Codiert den uebergebenen String.
* * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* @param klartext : String : Der zu codierende Text. * In der Regel ist dies der Fall.
* @param save : boolean : Nachricht speichern oder nicht. *
* @return String : Der codierte Text zusaetzlich als Rueckgabe. * @param klartext : String : Der zu codierende Text.
*/ * @param save : boolean : Nachricht speichern oder nicht.
public String codiere(String klartext, boolean save) { * @return String : Der codierte Text zusaetzlich als Rueckgabe.
StringBuilder sb = new StringBuilder(); */
public String codiere(String klartext, boolean save) {
for (char buchstabe : klartext.toCharArray()) { StringBuilder sb = new StringBuilder();
sb.append(this.codiere(buchstabe, save));
} for (char buchstabe : klartext.toCharArray()) {
sb.append(this.codiere(buchstabe, save));
return sb.toString(); }
}
return sb.toString();
/** }
* Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma-Nachricht.
* Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum. /**
* In der Regel ist dies der Tag des Nachrichtenempfangs. * Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma-Nachricht.
* * Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum.
* @param codierteNachricht : String : Enigma-codierte Nachricht. * In der Regel ist dies der Tag des Nachrichtenempfangs.
* @param tag : int : Tag der Nachricht. *
* @return String : decodierte Nachricht. * @param codierteNachricht : String : Enigma-codierte Nachricht.
*/ * @param tag : int : Tag der Nachricht.
private String decodiere(String codierteNachricht, int tag) { * @return String : decodierte Nachricht.
*/
// Hardware reseten und Tageseinstellungen aus dem Codebuch laden private String decodiere(String codierteNachricht, int tag) {
this.codebuch.fetchTagesschluessel(tag);
this.initialisiereHardware(); // Hardware reseten und Tageseinstellungen aus dem Codebuch laden
this.codebuch.fetchTagesschluessel(tag);
// Nachricht splitten mit whitespace als delimiter this.initialisiereHardware();
String[] nachricht = codierteNachricht.split(" ");
StringBuilder sb = new StringBuilder(); // Nachricht splitten mit whitespace als delimiter
String[] nachricht = codierteNachricht.split(" ");
// Uhrzeit und Zeichenanzahl der Nachricht StringBuilder sb = new StringBuilder();
sb.append(nachricht[0]).append(" ");
sb.append(nachricht[1]).append(" "); // Uhrzeit und Zeichenanzahl der Nachricht
sb.append(nachricht[0]).append(" ");
// Spruchschluessel sb.append(nachricht[1]).append(" ");
String spruchschluessel = this.decodiereString(nachricht[2]);
// Spruchschluessel
sb.append(spruchschluessel).append(" "); String spruchschluessel = this.decodiereString(nachricht[2]);
sb.append(this.decodiereString(nachricht[3])).append(" ");
sb.append(spruchschluessel).append(" ");
// Walzen neu einstellen mit dem Spruchschluessel sb.append(this.decodiereString(nachricht[3])).append(" ");
this.hardware.setzePosition(0, spruchschluessel.charAt(0));
this.hardware.setzePosition(1, spruchschluessel.charAt(1)); // Walzen neu einstellen mit dem Spruchschluessel
this.hardware.setzePosition(2, spruchschluessel.charAt(2)); this.hardware.setzePosition(0, spruchschluessel.charAt(0));
this.hardware.setzePosition(1, spruchschluessel.charAt(1));
// Nachricht decodieren this.hardware.setzePosition(2, spruchschluessel.charAt(2));
sb.append(this.decodiereString(nachricht[4]));
// Nachricht decodieren
return sb.toString(); sb.append(this.decodiereString(nachricht[4]));
}
return sb.toString();
/** }
* Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
* Der String wird dann decodiert zurueckgegeben. /**
* * Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
* @param nachricht : String : Der zu decodierende Text. * Der String wird dann decodiert zurueckgegeben.
* @return String : Der decodierte Text. *
*/ * @param nachricht : String : Der zu decodierende Text.
private String decodiereString(String nachricht) { * @return String : Der decodierte Text.
StringBuilder sb = new StringBuilder(); */
private String decodiereString(String nachricht) {
for (char buchstabe : nachricht.toCharArray()) { StringBuilder sb = new StringBuilder();
if (buchstabe > 0) {
sb.append(this.hardware.codiere(buchstabe)); for (char buchstabe : nachricht.toCharArray()) {
} if (buchstabe > 0) {
} sb.append(this.hardware.codiere(buchstabe));
}
return sb.toString(); }
}
//endregion return sb.toString();
}
//region Sonstige //endregion
/** //region Sonstige
* TODO: Wird nicht benutzt
* Prueft ob der Port auf dem das Kabel gesteckt werden soll, noch frei ist. /**
* <p> * Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
* setSteckbrett ausfuehren mit beiden Buchstaben als String. *
* * @param empfangeneNachricht : String : Die empfangene Nachricht als String.
* @param buchstabe : char : Der zuletzt eingegebene Buchstabe. * @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
* @return boolean : Wenn der Buchstabe nicht vorhanden ist, wird true zurueckgegeben, ansonsten false. */
*/ public String empfangenerSpruchschluessel(String empfangeneNachricht) {
public boolean pruefeSteckbrettPort(char buchstabe) { String[] nachricht = empfangeneNachricht.split(" ");
return this.hardware.getSteckbrett().ueberpruefeVertauschungen(buchstabe);
} return nachricht[2];
}
/**
* Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck. /**
* * Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
* @param empfangeneNachricht : String : Die empfangene Nachricht als String. */
* @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde. public void letztesZeichenLoeschen() {
*/ this.hardware.dreheWalzen(-1);
public String empfangenerSpruchschluessel(String empfangeneNachricht) { this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
String[] nachricht = empfangeneNachricht.split(" "); }
//endregion
return nachricht[2];
} //endregion
/** //region Getter
* Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
*/ /**
public void letztesZeichenLoeschen() { * Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer,
this.hardware.dreheWalzen(-1); * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1); *
} * @return String : Kenngruppe
//endregion */
//endregion public String getKenngruppe() {
return kenngruppe;
//region Getter }
/** /**
* Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer, * Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
* die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen. * Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
* *
* @return String : Kenngruppe * @return String : Der Klartext des Spruchschluessels
*/ */
public String getKenngruppe() { public String getSpruchschluessel() {
return kenngruppe; return this.spruchschluessel;
} }
//endregion
/**
* Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
* Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
*
* @return String : Der Klartext des Spruchschluessels
*/
public String getSpruchschluessel() {
return this.spruchschluessel;
}
//endregion
} }
...@@ -15,24 +15,24 @@ package projekt.enigma.model; ...@@ -15,24 +15,24 @@ package projekt.enigma.model;
*/ */
public class Hardware { public class Hardware {
//region Variablen //region Variablen
/** /**
* walzen: Walze-Array: erzeugt ein privates Array mit der die Anzahl der Walzen festgelegt wird. * walzen: Walze-Array: erzeugt ein privates Array mit der die Anzahl der Walzen festgelegt wird.
*/ */
private Walze[] walzen; private Walze[] walzen;
/** /**
* steckbrett: Steckbrett: erzeugt ein privates Steckbrett-Objekt * steckbrett: Steckbrett: erzeugt ein privates Steckbrett-Objekt
*/ */
private Steckbrett steckbrett; private Steckbrett steckbrett;
/** /**
* reflektor: Reflektor: erzeugt ein privates Reflektor-Objekt. * reflektor: Reflektor: erzeugt ein privates Reflektor-Objekt.
*/ */
private Reflektor reflektor; private Reflektor reflektor;
//endregion //endregion
//region Konstruktor //region Konstruktor
/** /**
* Im Konstruktor legen wir die Anzahl der Walzen fest, welche die Hardware aufnehmen kann. * Im Konstruktor legen wir die Anzahl der Walzen fest, welche die Hardware aufnehmen kann.
...@@ -43,7 +43,7 @@ public class Hardware { ...@@ -43,7 +43,7 @@ public class Hardware {
} }
//endregion //endregion
//region Funktionen & Methoden //region Funktionen & Methoden
/** /**
* Setzt eine Walze ein. * Setzt eine Walze ein.
...@@ -94,7 +94,7 @@ public class Hardware { ...@@ -94,7 +94,7 @@ public class Hardware {
this.walzen[2].getPosition()); this.walzen[2].getPosition());
debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe; debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe;
this.dreheWalzen(1); this.dreheWalzen(1);
//Codiere Vorgang wird fuer jede Walze bis zum Reflektor mit der codiere Funktion durchgefuehrt. //Codiere Vorgang wird fuer jede Walze bis zum Reflektor mit der codiere Funktion durchgefuehrt.
//Auf dem Rueckweg wird mit der codiere2 Funktion codiert. //Auf dem Rueckweg wird mit der codiere2 Funktion codiert.
...@@ -118,8 +118,8 @@ public class Hardware { ...@@ -118,8 +118,8 @@ public class Hardware {
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
new Fehler().debug(debug, false); new Fehler().debug(debug, false);
return buchstabe; return buchstabe;
} }
/** /**
* Nach jeder Codierung eines Buchstabens muessen die Walzen gedreht werden. * Nach jeder Codierung eines Buchstabens muessen die Walzen gedreht werden.
...@@ -148,7 +148,7 @@ public class Hardware { ...@@ -148,7 +148,7 @@ public class Hardware {
} }
//endregion //endregion
//region Setter //region Setter
/** /**
* Setzt eine Walze ein und speichert das Objekt im Walzen Array. * Setzt eine Walze ein und speichert das Objekt im Walzen Array.
...@@ -180,7 +180,7 @@ public class Hardware { ...@@ -180,7 +180,7 @@ public class Hardware {
} }
//endregion //endregion
//region Getter //region Getter
/** /**
* Setzt den Reflektor ein. * Setzt den Reflektor ein.
......
...@@ -74,12 +74,31 @@ public class Steckbrett { ...@@ -74,12 +74,31 @@ public class Steckbrett {
* @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false. * @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/ */
public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) { public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) {
if (!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) { char[] original;
originalBuchstaben = originalBuchstaben.replace(originalBuchstaben.charAt(steckbrettPort), buchstabe1); char[] getauscht;
getauschteBuchstaben
= getauschteBuchstaben.replace(getauschteBuchstaben.charAt(steckbrettPort), buchstabe2); new Fehler().debug("setzeVertauschung(int " + steckbrettPort + ", char |" + buchstabe1 + "|, char |" + buchstabe2 + "|)", false);
if ((!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) ||
(buchstabe1 == ' ' && buchstabe2 == ' ')) {
new Fehler().debug("-> Original:\t" + originalBuchstaben, false);
new Fehler().debug("-> Getauscht:\t" + getauschteBuchstaben, false);
original = originalBuchstaben.toCharArray();
getauscht = getauschteBuchstaben.toCharArray();
original[steckbrettPort] = buchstabe1;
getauscht[steckbrettPort] = buchstabe2;
originalBuchstaben = String.valueOf(original);
getauschteBuchstaben = String.valueOf(getauscht);
new Fehler().debug("<- Original:\t" + originalBuchstaben, false);
new Fehler().debug("<- Getauscht:\t" + getauschteBuchstaben, false);
new Fehler().debug("true\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return true; return true;
} else { } else {
new Fehler().debug("false\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return false; return false;
} }
} }
...@@ -94,7 +113,7 @@ public class Steckbrett { ...@@ -94,7 +113,7 @@ public class Steckbrett {
* *
* @param buchstabe : Character: zu pruefender Buchstabe. * @param buchstabe : Character: zu pruefender Buchstabe.
* @return result : boolean : Wenn false, dann darf der Buchstabe genutzt werden. Wenn er schon vorhanden ist, * @return result : boolean : Wenn false, dann darf der Buchstabe genutzt werden. Wenn er schon vorhanden ist,
* wird true zurueckgegeben. * wird true zurueckgegeben.
*/ */
public boolean ueberpruefeVertauschungen(Character buchstabe) { public boolean ueberpruefeVertauschungen(Character buchstabe) {
boolean result = false; boolean result = false;
......
...@@ -81,7 +81,7 @@ public class Walze { ...@@ -81,7 +81,7 @@ public class Walze {
if ((richtung == -1) || (richtung == 1)) { if ((richtung == -1) || (richtung == 1)) {
if (richtung == 1) { if (richtung == 1) {
this.turns++; this.turns++;
} else if (richtung == -1) { } else {
korrekturFaktor = 1; korrekturFaktor = 1;
this.turns--; this.turns--;
} }
...@@ -113,7 +113,7 @@ public class Walze { ...@@ -113,7 +113,7 @@ public class Walze {
* @return char : decodierter Buchstabe. * @return char : decodierter Buchstabe.
*/ */
char codiere2(char 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);
} }
/** /**
...@@ -131,7 +131,6 @@ public class Walze { ...@@ -131,7 +131,6 @@ public class Walze {
* *
* @param walzenNr : int : Walzennummer. * @param walzenNr : int : Walzennummer.
*/ */
//TODO: Überprüfung notwendig? Wo findet Überprüfung statt?
private void setWalzenNr(int walzenNr) { private void setWalzenNr(int walzenNr) {
if ((walzenNr > 0) && (walzenNr < 6)) { if ((walzenNr > 0) && (walzenNr < 6)) {
this.walzenNr = walzenNr - 1; this.walzenNr = walzenNr - 1;
......
package projekt.enigma.view; package projekt.enigma.view;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.CheckBox; import javafx.scene.control.CheckBox;
import javafx.scene.control.ContentDisplay; import javafx.scene.control.ToggleButton;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import projekt.enigma.model.Codierer;
import java.util.Arrays;
/**
* Die Klasse ChkBoxGripPane erweitert das GridPane Objekt.
* Wir erstellen ein GridPane in welches Checkboxen gelegt werden.
* Die Anzahl der Checkboxen wird durch die verfuegbarenBuchstaben festgelegt.
* Für jeden Buchstaben in diesem char Array, wird eine Checkbox erstellt und auf das Gridpane gelegt.
*/
public class ChkBoxGridPane extends GridPane { public class ChkBoxGridPane extends GridPane {
/*private static JPanel panel = new JPanel();*/
private static CheckBox[] checkbox;
private static Character[] alphabet;/* = {'A','B','C','D'};*/
private static int charSize;
public ChkBoxGridPane(Character[] alphabet) { // Der globale Checkbox Array
charSize = alphabet.length; private CheckBox[] checkbox;
ChkBoxGridPane.alphabet = alphabet; // Die Buchstaben die für das jeweilige Pane selectiert werden sollen
initializeComponents(); private String checkedBuchstaben;
} // Die Anzahl der möglichen Checkboxen
private int charSize;
// Das Codierer Objekt. Dieses wird benötigt um auf die Funktionen für das Steckbrett zuzugreifen
private Codierer codierer;
// Der Steckbrett Port für welchen das Pane und die Checkboxen erstellt werden sollen
private int port;
// Die verfügbaren Buchstaben für den jeweiligen Port
private char[] verfuegbareBuchstaben;
// Das Button Objekt des Ports über den dieses Pane gesteuert wird
private ToggleButton tBtnPort;
/**
* Hier werfen wir die Checkboxen auf das Gridpane und weißen ihnen die Propertys zu.
* Außerdem wird hier auch der Listener generiert womit wir prüfen ob die maximale Auswahlmöglichkeit
* erreicht ist.
* Es können maximal zwei Checkboxen ausgewählt werden. Wenn zwei erreicht sind, werden die restlichen Checkboxen
* deaktiviert. Wenn nur noch eine oder keine Box ausgewählt ist, werden die restlichen wieder aktiviert.
* Bei null und zwei Boxen, werden die Buchstaben in das Steckbrett geschrieben.
* Andere Auswahlmöglchkeiten stehen nicht zur Verfügung, da ein Kabel nur zwei Enden hat in der Regel.
*
* @param codierer : Codierer Objekt
* @param port : int
* @param tBtnPort : ToogleButton
*/
public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) {
this.codierer = codierer;
this.port = port;
this.tBtnPort = tBtnPort;
this.verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(this.port).toCharArray();
Arrays.sort(this.verfuegbareBuchstaben);
charSize = this.verfuegbareBuchstaben.length;
this.checkedBuchstaben = tBtnPort.getText();
initializeComponents();
}
/**
* Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des
* Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll
* abhängig von deren Index links bzw. recht erzeugt werden
*/
private void initializeComponents() {
checkbox = new CheckBox[charSize];
this.setAlignment(Pos.CENTER);
// Für jeden verfügbaren Buchstaben einen Durchlauf
for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) {
if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') {
checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + "");
checkbox[i].setPadding(new Insets(1, 1, 1, 1));
if (!checkedBuchstaben.equals("")) {
if (!checkedBuchstaben.contains(String.valueOf(this.verfuegbareBuchstaben[i]))) {
checkbox[i].setDisable(true);
} else {
checkbox[i].setSelected(true);
}
} else {
checkbox[i].setSelected(false);
checkbox[i].setDisable(false);
}
// Der Listener für die jeweilige Checkbox
checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
String portSelection = "";
int zaehler = 0;
/** // Die selektierten Chechkboxen zählen
* Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des for (CheckBox cb : checkbox) {
* Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll if (cb != null && cb.isSelected()) {
* abhängig von deren Index links bzw. recht erzeugt werden zaehler++;
*/ }
private void initializeComponents() { }
checkbox = new CheckBox[charSize]; // Wenn nur eine oder keine Checkbox ausgewählt ist
if (zaehler == 1 || zaehler == 0) {
for (CheckBox cb : checkbox) {
if (cb != null && cb.isDisabled()) {
cb.setDisable(false);
}
}
}
// Es ist keine Checkbox ausgewählt
if (zaehler == 0) {
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, "");
// Und den Button neu beschreiben
tBtnPort.setText(portSelection);
}
// Das Maximum an selektierten Checkboxen (2) ist erreicht
if (zaehler == 2) {
for (CheckBox cb : checkbox) {
if (cb != null && !cb.isSelected()) {
cb.setDisable(true);
} else {
if (cb != null) {
portSelection += cb.getText();
}
}
}
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, "");
this.codierer.setzeSteckbrett(this.port, portSelection);
// Und den Button neu beschreiben
tBtnPort.setText(portSelection);
}
});
/* // Eine neue Row im Gridpane anlegen für den nächsten Button
* => bei ungerader Anzahl Buchstaben this.addRow(i + 1);
* CheckBox und deren Label erzeugen, bei geraden Index Zahlen this.add(checkbox[i], 2, i + 1, 1, 1);
* das Label rechts setzen bei ungeraden links }
* => bei gerader Anzahl Buchstaben }
* CheckBox und deren Label erzeugen, bei geraden Index Zahlen // Das Pane anzeigen
* das Label rechts setzen bei ungeraden links this.setVisible(true);
*/ }
for (int i = 0; i < charSize; i++) {
Label lb = new Label(alphabet[i] + "");
lb.setGraphic(checkbox[i] = new CheckBox());
if (i % 2 == 0) lb.setContentDisplay(ContentDisplay.RIGHT);
else if (!(i % 2 == 0)) lb.setContentDisplay(ContentDisplay.LEFT);
if (!(charSize % 2 == 0)) {
this.add(checkbox[i], 2, (charSize + 1) / 2);
} else {
this.add(checkbox[i], 2, (charSize / 2));
}
//if (i==0)checkbox[0].setSelected(true);
}
this.setVisible(true);
}
/** /**
* Prüft welche CheckBox aus gewählt und gibt deren * Gibt den Anzahl der zur Verfügung stehenden Buchstaben zurück.
* Index zurück * Anhang dieses Wertes, wird die Anzahl der Checkboxen festgelegt.
* *
* @return Integer * @return int : Anzahl der möglcihen chars
*/ */
private Integer isCheckedChkBoxIndex() { public int getCharSize() {
for (int i = 0; i < charSize; i++) { return charSize;
if (checkbox[i].isSelected()) { }
return i;
} else {
return null;
}
}
return null;
}
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuButton?> <?import javafx.scene.control.MenuButton?>
<?import javafx.scene.control.ProgressIndicator?> <?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.TextField?> <?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<?import javafx.scene.shape.Circle?> <?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<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"> <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"> <GridPane layoutX="23.0" layoutY="60.0" prefHeight="158.0" prefWidth="237.0" AnchorPane.leftAnchor="23.0" AnchorPane.topAnchor="60.0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<Label fx:id="lblSpruchschluessel" prefHeight="17.0" prefWidth="181.0" GridPane.columnIndex="1" /> <Label fx:id="lblSpruchschluessel" prefHeight="17.0" prefWidth="181.0" GridPane.columnIndex="1" />
<Button fx:id="btnReset" mnemonicParsing="false" onAction="#gedrueckteTaste" text="Zurücksetzen" GridPane.rowIndex="1" /> <Button fx:id="btnReset" mnemonicParsing="false" onAction="#gedrueckteTaste" text="Zurücksetzen" GridPane.rowIndex="1" />
</GridPane> </GridPane>
<GridPane fx:id="mainGrid" layoutX="6.0" layoutY="294.0" prefHeight="377.0" prefWidth="952.0" AnchorPane.bottomAnchor="6.0" AnchorPane.leftAnchor="6.0" AnchorPane.rightAnchor="9.0" AnchorPane.topAnchor="294.0"> <GridPane fx:id="mainGrid" layoutX="6.0" layoutY="294.0" prefHeight="377.0" prefWidth="952.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="300.0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
...@@ -583,38 +583,8 @@ ...@@ -583,38 +583,8 @@
<Insets left="42.0" /> <Insets left="42.0" />
</GridPane.margin> </GridPane.margin>
</Label> </Label>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
<Pane fx:id="portPane0" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="7">
<Pane fx:id="portPane1" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3" GridPane.rowIndex="7">
<Pane fx:id="portPane2" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4" GridPane.rowIndex="7">
<Pane fx:id="portPane3" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="5" GridPane.rowIndex="7">
<Pane fx:id="portPane4" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="6" GridPane.rowIndex="7">
<Pane fx:id="portPane5" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="7" GridPane.rowIndex="7">
<Pane fx:id="portPane6" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="8" GridPane.rowIndex="7">
<Pane fx:id="portPane7" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="9" GridPane.rowIndex="7">
<Pane fx:id="portPane8" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="10" GridPane.rowIndex="7">
<Pane fx:id="portPane9" layoutX="-8.0" layoutY="-307.0" prefHeight="350.0" prefWidth="85.0" style="-fx-background-color: lightgrey;" visible="false" />
</Pane>
</GridPane> </GridPane>
<GridPane layoutX="297.0" layoutY="64.0" prefHeight="168.0" prefWidth="585.0" AnchorPane.leftAnchor="297.0" AnchorPane.rightAnchor="80.0" AnchorPane.topAnchor="64.0"> <GridPane layoutX="297.0" layoutY="64.0" prefHeight="168.0" prefWidth="585.0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
...@@ -623,12 +593,6 @@ ...@@ -623,12 +593,6 @@
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints> </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"> <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> <GridPane.margin>
<Insets left="80.0" /> <Insets left="80.0" />
...@@ -639,8 +603,18 @@ ...@@ -639,8 +603,18 @@
<Insets left="80.0" /> <Insets left="80.0" />
</GridPane.margin> </GridPane.margin>
</Button> </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> </GridPane>
<Label fx:id="lblKenngruppe" layoutX="682.0" layoutY="34.0" prefHeight="17.0" prefWidth="177.0" AnchorPane.leftAnchor="682.0" AnchorPane.rightAnchor="103.0" AnchorPane.topAnchor="34.0" /> <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"> <Pane layoutX="266.0" layoutY="194.0" prefHeight="200.0" prefWidth="354.0" style="-fx-background-color: white; -fx-border-color: black;" visible="false">
<ProgressIndicator layoutX="127.0" layoutY="70.0" prefHeight="99.0" prefWidth="101.0" /> <ProgressIndicator layoutX="127.0" layoutY="70.0" prefHeight="99.0" prefWidth="101.0" />
<Label layoutX="79.0" layoutY="27.0" text="Kommunikation mit Funkraum..."> <Label layoutX="79.0" layoutY="27.0" text="Kommunikation mit Funkraum...">
......