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 (27)
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);
} }
...@@ -66,8 +66,8 @@ public class App extends Application { ...@@ -66,8 +66,8 @@ public class App extends Application {
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;
...@@ -19,14 +21,15 @@ import projekt.enigma.view.ChkBoxGridPane; ...@@ -19,14 +21,15 @@ 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;
...@@ -35,11 +38,14 @@ public class GuiController { ...@@ -35,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
...@@ -54,7 +60,7 @@ public class GuiController { ...@@ -54,7 +60,7 @@ 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 GridPane //deklariert benötigtes GridPane
@FXML @FXML
private ChkBoxGridPane[] chkBoxGridPane; private ChkBoxGridPane[] chkBoxGridPane;
...@@ -87,46 +93,18 @@ public class GuiController { ...@@ -87,46 +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) ->
tfKlartext.setScrollTop(Double.MAX_VALUE));
tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfCodiert.setScrollTop(Double.MAX_VALUE));
} }
//endregion //endregion
//region Init //region Init
/**
* 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
* *
...@@ -147,10 +125,9 @@ public class GuiController { ...@@ -147,10 +125,9 @@ public class GuiController {
} }
/** /**
* TODO: Doku * Erzeugt Buttons um die Steckverbindungen zu auszuwählen
*/ */
private void myToggleButtons() { private void myToggleButtons() {
// this.codierer.setzeSteckbrett()
if (chkBoxGridPane != null) { if (chkBoxGridPane != null) {
for (ChkBoxGridPane boxGridPane : chkBoxGridPane) { for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
anchorPane.getChildren().remove(boxGridPane); anchorPane.getChildren().remove(boxGridPane);
...@@ -159,55 +136,64 @@ public class GuiController { ...@@ -159,55 +136,64 @@ public class GuiController {
chkBoxGridPane = new ChkBoxGridPane[10]; chkBoxGridPane = new ChkBoxGridPane[10];
final ToggleGroup cabelConnect = new ToggleGroup(); final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[10]; tBtnPort = new ToggleButton[chkBoxGridPane.length];
for (int i = 0; i < chkBoxGridPane.length; i++) { for (int i = 0; i < chkBoxGridPane.length; i++) {
char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(i).toCharArray(); tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
char[] checkedBuchstaben = { this.codierer.fetchSteckverbindungen()[i][1]);
this.codierer.fetchSteckverbindungen()[i][0],
this.codierer.fetchSteckverbindungen()[i][1]
};
Arrays.sort(verfuegbareBuchstaben);
chkBoxGridPane[i] = new ChkBoxGridPane(verfuegbareBuchstaben);
chkBoxGridPane[i].setVisible(false);
chkBoxGridPane[i].setStyle("-fx-background-color: white; -fx-border-color: black;");
chkBoxGridPane[i].setPrefHeight(chkBoxGridPane[i].getCharSize() * 20);
chkBoxGridPane[i].setPrefWidth(85.0);
chkBoxGridPane[i].setPadding(new Insets(10, 10, 10, 10));
chkBoxGridPane[i].setAlignment(Pos.CENTER);
tBtnPort[i] = new ToggleButton(checkedBuchstaben[0] + "" + checkedBuchstaben[1]);
tBtnPort[i].setToggleGroup(cabelConnect); tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
GridPane.setHalignment(tBtnPort[i], HPos.CENTER); GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8); mainGrid.add(tBtnPort[i], i + 1, 8);
chkBoxGridPane[i].setLayoutX( this.createPortPane(i);
(anchorPane.getWidth() / 12) * (i + 1) - chkBoxGridPane[i].setVisible(false);
((chkBoxGridPane[i].getPrefWidth() - anchorPane.getWidth() / 12) / 2)); }
chkBoxGridPane[i].setLayoutY( // ToggleButtonGroup Listener
mainGrid.getLayoutY() + ((anchorPane.getHeight() - cabelConnect.selectedToggleProperty().
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[i].getPrefHeight() - 15); addListener((observable, oldValue, newValue) -> {
new Fehler().debug(
"mg LayoutY " + mainGrid.getLayoutY() + for (int j = 0; j < chkBoxGridPane.length; j++) {
" mg Height " + mainGrid.getHeight() +
" chkbox Height " + chkBoxGridPane[i].getHeight() + if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
" AP Height " + anchorPane.getHeight(), this.createPortPane(j);
false); } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
anchorPane.getChildren().add(chkBoxGridPane[i]); if (chkBoxGridPane[j] != null) {
cabelConnect.selectedToggleProperty().
addListener((observable, oldValue, newValue) -> {
//TODO
for (int j = 0; j < 10; j++) {
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
chkBoxGridPane[j].setVisible(true);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
chkBoxGridPane[j].setVisible(false); 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);
} }
/** /**
...@@ -219,32 +205,9 @@ public class GuiController { ...@@ -219,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
...@@ -261,110 +224,13 @@ public class GuiController { ...@@ -261,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);
}
} }
/** /**
...@@ -609,9 +475,10 @@ public class GuiController { ...@@ -609,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);
...@@ -635,9 +502,10 @@ public class GuiController { ...@@ -635,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) {
...@@ -668,7 +536,7 @@ public class GuiController { ...@@ -668,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("");
...@@ -688,12 +556,20 @@ public class GuiController { ...@@ -688,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;
} }
} }
...@@ -793,7 +669,6 @@ public class GuiController { ...@@ -793,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]);
...@@ -873,13 +748,8 @@ public class GuiController { ...@@ -873,13 +748,8 @@ 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(); myToggleButtons();
// Setzt das Steckbrett
//generateSteckbrett();
// Felder zurück setzen // Felder zurück setzen
this.textCodiert = ""; this.textCodiert = "";
this.textEingabe = ""; this.textEingabe = "";
...@@ -888,9 +758,9 @@ public class GuiController { ...@@ -888,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) {
...@@ -899,7 +769,7 @@ public class GuiController { ...@@ -899,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.
...@@ -907,7 +777,6 @@ public class GuiController { ...@@ -907,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,493 +12,496 @@ import java.util.Random; ...@@ -12,493 +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);
} }
/** /**
* 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) {
public boolean setzeSteckbrett(int port, String verbindung) { if (verbindung.equals("")) {
return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1)); verbindung = " ";
} }
//endregion
this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
//region fetch Funktionen }
//endregion
/**
* Gibt die Ringstellungen aus dem Codebuch zurueck. //region fetch Funktionen
*
* @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen. /**
*/ * Gibt die Ringstellungen aus dem Codebuch zurueck.
public int[] fetchRingstellung() { *
return this.codebuch.getRingstellung(); * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen.
} */
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 this.codebuch.getWalzenlage(); * @return int[] : Array mit den Nummern der drei eingesetzten Walzen.
} */
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 this.codebuch.getSteckverbindung(); * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett.
} */
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() { *
char[] walzen = new char[3]; * @return char[] : Walzen Array mit der aktuellen Positionen.
walzen[0] = this.hardware.getWalzen()[0].getPosition(); */
walzen[1] = this.hardware.getWalzen()[1].getPosition(); public char[] fetchWalzen() {
walzen[2] = this.hardware.getWalzen()[2].getPosition(); char[] walzen = new char[3];
walzen[0] = this.hardware.getWalzen()[0].getPosition();
return walzen; walzen[1] = this.hardware.getWalzen()[1].getPosition();
} 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. /**
* @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck. * Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
*/ *
public String fetchVerfuegbareBuchstaben(int port) { * @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port); * @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
} */
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 /**
* @return int : Nummer der eingesetzten Walze * Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
*/ *
public int fetchWalzenNr(int walzePos) { * @param walzePos : int : Position der Walze
return this.hardware.getWalzen()[walzePos].getWalzenNr(); * @return int : Nummer der eingesetzten Walze
} */
//endregion public int fetchWalzenNr(int walzePos) {
return this.hardware.getWalzen()[walzePos].getWalzenNr();
//region codierer }
//endregion
/**
* Hier wird ein einzelner Buchstabe verschluesselt. //region codierer
* 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.
* @param buchstabe : char : Der zu codierende Buchstabe. * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* @param save : boolean : Nachricht speichern oder nicht. * In der Regel ist dies der Fall.
* @return char : Der codierte Buchstabe. *
*/ * @param buchstabe : char : Der zu codierende Buchstabe.
public char codiere(char buchstabe, boolean save) { * @param save : boolean : Nachricht speichern oder nicht.
char codiert = this.hardware.codiere(buchstabe); * @return char : Der codierte Buchstabe.
*/
if (save) { public char codiere(char buchstabe, boolean save) {
this.nachricht += codiert; char codiert = this.hardware.codiere(buchstabe);
}
if (save) {
return codiert; this.nachricht += 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.
* @param klartext : String : Der zu codierende Text. * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* @param save : boolean : Nachricht speichern oder nicht. * In der Regel ist dies der Fall.
* @return String : Der codierte Text zusaetzlich als Rueckgabe. *
*/ * @param klartext : String : Der zu codierende Text.
public String codiere(String klartext, boolean save) { * @param save : boolean : Nachricht speichern oder nicht.
StringBuilder sb = new StringBuilder(); * @return String : Der codierte Text zusaetzlich als Rueckgabe.
*/
for (char buchstabe : klartext.toCharArray()) { public String codiere(String klartext, boolean save) {
sb.append(this.codiere(buchstabe, save)); StringBuilder sb = new StringBuilder();
}
for (char buchstabe : klartext.toCharArray()) {
return sb.toString(); sb.append(this.codiere(buchstabe, save));
} }
/** 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.
* @param codierteNachricht : String : Enigma-codierte Nachricht. * Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum.
* @param tag : int : Tag der Nachricht. * In der Regel ist dies der Tag des Nachrichtenempfangs.
* @return String : decodierte Nachricht. *
*/ * @param codierteNachricht : String : Enigma-codierte Nachricht.
private String decodiere(String codierteNachricht, int tag) { * @param tag : int : Tag der Nachricht.
* @return String : decodierte Nachricht.
// Hardware reseten und Tageseinstellungen aus dem Codebuch laden */
this.codebuch.fetchTagesschluessel(tag); private String decodiere(String codierteNachricht, int tag) {
this.initialisiereHardware();
// Hardware reseten und Tageseinstellungen aus dem Codebuch laden
// Nachricht splitten mit whitespace als delimiter this.codebuch.fetchTagesschluessel(tag);
String[] nachricht = codierteNachricht.split(" "); this.initialisiereHardware();
StringBuilder sb = new StringBuilder();
// Nachricht splitten mit whitespace als delimiter
// Uhrzeit und Zeichenanzahl der Nachricht String[] nachricht = codierteNachricht.split(" ");
sb.append(nachricht[0]).append(" "); StringBuilder sb = new StringBuilder();
sb.append(nachricht[1]).append(" ");
// Uhrzeit und Zeichenanzahl der Nachricht
// Spruchschluessel sb.append(nachricht[0]).append(" ");
String spruchschluessel = this.decodiereString(nachricht[2]); sb.append(nachricht[1]).append(" ");
sb.append(spruchschluessel).append(" "); // Spruchschluessel
sb.append(this.decodiereString(nachricht[3])).append(" "); String spruchschluessel = this.decodiereString(nachricht[2]);
// Walzen neu einstellen mit dem Spruchschluessel sb.append(spruchschluessel).append(" ");
this.hardware.setzePosition(0, spruchschluessel.charAt(0)); sb.append(this.decodiereString(nachricht[3])).append(" ");
this.hardware.setzePosition(1, spruchschluessel.charAt(1));
this.hardware.setzePosition(2, spruchschluessel.charAt(2)); // Walzen neu einstellen mit dem Spruchschluessel
this.hardware.setzePosition(0, spruchschluessel.charAt(0));
// Nachricht decodieren this.hardware.setzePosition(1, spruchschluessel.charAt(1));
sb.append(this.decodiereString(nachricht[4])); this.hardware.setzePosition(2, spruchschluessel.charAt(2));
return sb.toString(); // Nachricht decodieren
} 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.
* /**
* @param nachricht : String : Der zu decodierende Text. * Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
* @return String : Der decodierte Text. * Der String wird dann decodiert zurueckgegeben.
*/ *
private String decodiereString(String nachricht) { * @param nachricht : String : Der zu decodierende Text.
StringBuilder sb = new StringBuilder(); * @return String : Der decodierte Text.
*/
for (char buchstabe : nachricht.toCharArray()) { private String decodiereString(String nachricht) {
if (buchstabe > 0) { StringBuilder sb = new StringBuilder();
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
/**
* Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck. //region Sonstige
*
* @param empfangeneNachricht : String : Die empfangene Nachricht als String. /**
* @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde. * Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
*/ *
public String empfangenerSpruchschluessel(String empfangeneNachricht) { * @param empfangeneNachricht : String : Die empfangene Nachricht als String.
String[] nachricht = empfangeneNachricht.split(" "); * @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
*/
return nachricht[2]; public String empfangenerSpruchschluessel(String empfangeneNachricht) {
} String[] nachricht = empfangeneNachricht.split(" ");
/** return nachricht[2];
* Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck. }
*/
public void letztesZeichenLoeschen() { /**
this.hardware.dreheWalzen(-1); * Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1); */
} public void letztesZeichenLoeschen() {
//endregion this.hardware.dreheWalzen(-1);
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
//endregion }
//endregion
//region Getter
//endregion
/**
* Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer, //region Getter
* die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
* /**
* @return String : Kenngruppe * Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer,
*/ * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
public String getKenngruppe() { *
return kenngruppe; * @return String : Kenngruppe
} */
public String getKenngruppe() {
/** return kenngruppe;
* 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 * Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
*/ * Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
public String getSpruchschluessel() { *
return this.spruchschluessel; * @return String : Der Klartext des Spruchschluessels
} */
//endregion public String getSpruchschluessel() {
return this.spruchschluessel;
}
//endregion
} }
...@@ -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;
......
...@@ -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.geometry.Pos;
import javafx.scene.control.CheckBox; import javafx.scene.control.CheckBox;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import projekt.enigma.model.Codierer;
import java.util.Arrays;
/** /**
* TODO: Doku * 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 CheckBox[] checkbox;
private char[] alphabet;
private int charSize;
/** // Der globale Checkbox Array
* TODO: Doku private CheckBox[] checkbox;
* @param alphabet // Die Buchstaben die für das jeweilige Pane selectiert werden sollen
*/ private String checkedBuchstaben;
public ChkBoxGridPane(char[] alphabet) { // Die Anzahl der möglichen Checkboxen
charSize = alphabet.length; private int charSize;
this.alphabet = alphabet; // Das Codierer Objekt. Dieses wird benötigt um auf die Funktionen für das Steckbrett zuzugreifen
initializeComponents(); 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("")) {
* Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des if (!checkedBuchstaben.contains(String.valueOf(this.verfuegbareBuchstaben[i]))) {
* Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll checkbox[i].setDisable(true);
* abhängig von deren Index links bzw. recht erzeugt werden } else {
*/ checkbox[i].setSelected(true);
private void initializeComponents() { }
checkbox = new CheckBox[charSize]; } else {
this.setAlignment(Pos.CENTER); checkbox[i].setSelected(false);
checkbox[i].setDisable(false);
}
for (int i = 0; i < alphabet.length; i++) { // Der Listener für die jeweilige Checkbox
checkbox[i] = new CheckBox(alphabet[i] + ""); checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
String portSelection = "";
int zaehler = 0;
this.addRow(i + 1); // Die selektierten Chechkboxen zählen
this.add(checkbox[i], 2, i + 1, 1, 1); for (CheckBox cb : checkbox) {
//if (i==0)checkbox[0].setSelected(true); if (cb != null && cb.isSelected()) {
} zaehler++;
this.setVisible(true); }
} }
// 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
* Prüft welche CheckBox aus gewählt und gibt deren this.addRow(i + 1);
* Index zurück this.add(checkbox[i], 2, i + 1, 1, 1);
* }
* @return Integer }
*/ // Das Pane anzeigen
private Integer isCheckedChkBoxIndex() { this.setVisible(true);
for (int i = 0; i < charSize; i++) { }
if (checkbox[i].isSelected()) {
return i;
} else {
return null;
}
}
return null;
}
/** /**
* TODO: Doku * Gibt den Anzahl der zur Verfügung stehenden Buchstaben zurück.
* @return * Anhang dieses Wertes, wird die Anzahl der Checkboxen festgelegt.
*/ *
public int getCharSize() { * @return int : Anzahl der möglcihen chars
return charSize; */
} public int getCharSize() {
return charSize;
}
} }
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.Button?>
<?import javafx.scene.layout.*?> <?import javafx.scene.control.Label?>
<?import javafx.scene.shape.*?> <?import javafx.scene.control.MenuButton?>
<?import javafx.scene.text.*?> <?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"> <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" />
...@@ -585,12 +593,6 @@ ...@@ -585,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" />
...@@ -601,6 +603,16 @@ ...@@ -601,6 +603,16 @@
<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" /> <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">
......