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 (24)
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
...@@ -64,11 +64,10 @@ public class App extends Application { ...@@ -64,11 +64,10 @@ public class App extends Application {
Label lblEingbae = new Label("Bitte Kenngruppe eingeben!"); Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
TextField tfEingabe = new TextField(); TextField tfEingabe = new TextField();
tfEingabe.setText("Enigma");
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,874 +21,764 @@ import projekt.enigma.view.ChkBoxGridPane; ...@@ -19,874 +21,764 @@ 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"};
@FXML private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
private static ToggleButton[] tBtnPort; "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
private String[] empfangeneNachricht; @FXML
private String textEingabe; private static ToggleButton[] tBtnPort;
private String textCodiert; private String[] empfangeneNachricht;
private char chiffrierterBuchstabe; private String textEingabe;
private boolean resetDisplay; private String textCodiert;
private Codierer codierer; private char chiffrierterBuchstabe;
//region GUI-Elemente private boolean resetDisplay;
//deklariert die benötigten Buttons private Codierer codierer;
@FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ, //region GUI-Elemente
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset; //deklariert die benötigten Buttons
//endregion @FXML
//deklariert die benötigten Kreise private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
@FXML btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN, @FXML
circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ; private Button[] btnArray;
//deklariert die benötigten Label //endregion
@FXML //deklariert die benötigten Kreise
private Label lblSpruchschluessel, lblKenngruppe; @FXML
//deklariert die MenueButtons private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
@FXML circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3, //deklariert die benötigten Label
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3; @FXML
//deklariert die benötigten Textfelder private Label lblSpruchschluessel, lblKenngruppe;
@FXML //deklariert die MenueButtons
private TextField tfCodiert, tfKlartext; @FXML
//deklariert benötigtes GridPane private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
@FXML mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
private ChkBoxGridPane[] chkBoxGridPane; //deklariert die benötigten Textfelder
@FXML @FXML
private GridPane mainGrid; private TextArea tfCodiert, tfKlartext;
@FXML //deklariert benötigtes GridPane
private AnchorPane anchorPane; @FXML
private ChkBoxGridPane[] chkBoxGridPane;
/** @FXML
* Initialisiert die Elemente GUI und setzt deren Startwerte private GridPane mainGrid;
*/ @FXML
@FXML private AnchorPane anchorPane;
void initialize() {
// Variablen setzen /**
textEingabe = ""; * Initialisiert die Elemente GUI und setzt deren Startwerte
textCodiert = ""; */
resetDisplay = true; @FXML
void initialize() {
//Einträge für Walzen // Variablen setzen
menu(mBtnWalzPos1, walzenNr); textEingabe = "";
menu(mBtnWalzPos2, walzenNr); textCodiert = "";
menu(mBtnWalzPos3, walzenNr); resetDisplay = true;
//Einträge für die Ringe //Einträge für Walzen
menu(mBtnNotchPos1, ringNr); menu(mBtnWalzPos1, walzenNr);
menu(mBtnNotchPos2, ringNr); menu(mBtnWalzPos2, walzenNr);
menu(mBtnNotchPos3, ringNr); menu(mBtnWalzPos3, walzenNr);
//Einträge für die Startpositionen //Einträge für die Ringe
menu(mBtnStartPos1, position); menu(mBtnNotchPos1, ringNr);
menu(mBtnStartPos3, position); menu(mBtnNotchPos2, ringNr);
menu(mBtnStartPos2, position); menu(mBtnNotchPos3, ringNr);
}
//endregion //Einträge für die Startpositionen
menu(mBtnStartPos1, position);
//region Init menu(mBtnStartPos3, position);
menu(mBtnStartPos2, position);
/** btnArray = new Button[]{btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN,
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs btnO, btnP, btnQ, btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ};
*
* @param button : Button für die die Einträge erstellt werden sollen tfKlartext.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
*/ tfKlartext.setScrollTop(Double.MAX_VALUE));
private void menu(MenuButton button, String[] str) { tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
ArrayList<MenuItem> mItem = new ArrayList<>(); tfCodiert.setScrollTop(Double.MAX_VALUE));
}
for (int i = 0; i < str.length; i++) { //endregion
// Eintrag aus str der Arraylist mi hinzufügen
mItem.add(new MenuItem(str[i])); //region Init
// MenuItem mi dem Button button hinzufügen
button.getItems().add(mItem.get(i)); /**
int finalI = i; * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
// Listener für die einzelnen Einträge *
mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI))); * @param button : Button für die die Einträge erstellt werden sollen
} */
} private void menu(MenuButton button, String[] str) {
ArrayList<MenuItem> mItem = new ArrayList<>();
/**
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen for (int i = 0; i < str.length; i++) {
*/ // Eintrag aus str der Arraylist mi hinzufügen
private void myToggleButtons() { mItem.add(new MenuItem(str[i]));
if (chkBoxGridPane != null) { // MenuItem mi dem Button button hinzufügen
for (ChkBoxGridPane boxGridPane : chkBoxGridPane) { button.getItems().add(mItem.get(i));
anchorPane.getChildren().remove(boxGridPane); int finalI = i;
} // Listener für die einzelnen Einträge
} mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
chkBoxGridPane = new ChkBoxGridPane[10]; }
}
final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[chkBoxGridPane.length]; /**
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen
for (int i = 0; i < chkBoxGridPane.length; i++) { */
tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" + this.codierer.fetchSteckverbindungen()[i][1]); private void myToggleButtons() {
tBtnPort[i].setToggleGroup(cabelConnect); if (chkBoxGridPane != null) {
tBtnPort[i].setMinWidth(50.0); for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
GridPane.setHalignment(tBtnPort[i], HPos.CENTER); anchorPane.getChildren().remove(boxGridPane);
mainGrid.add(tBtnPort[i], i + 1, 8); }
this.createPortPane(i); }
chkBoxGridPane[i].setVisible(false); chkBoxGridPane = new ChkBoxGridPane[10];
}
/* final ToggleGroup cabelConnect = new ToggleGroup();
* ToggleButtonGroup Listener tBtnPort = new ToggleButton[chkBoxGridPane.length];
*/
cabelConnect.selectedToggleProperty(). for (int i = 0; i < chkBoxGridPane.length; i++) {
addListener((observable, oldValue, newValue) -> { tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
this.codierer.fetchSteckverbindungen()[i][1]);
for (int j = 0; j < chkBoxGridPane.length; j++) { tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
//tBtnPort[j].setText(this.codierer.fetchSteckverbindungen()[j][0] + "" + this.codierer.fetchSteckverbindungen()[j][1]); GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8);
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) { this.createPortPane(i);
this.createPortPane(j); chkBoxGridPane[i].setVisible(false);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) { }
if (chkBoxGridPane[j] != null) { // ToggleButtonGroup Listener
chkBoxGridPane[j].setVisible(false); cabelConnect.selectedToggleProperty().
} addListener((observable, oldValue, newValue) -> {
}
} for (int j = 0; j < chkBoxGridPane.length; j++) {
});
} if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
this.createPortPane(j);
/** } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
* Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port if (chkBoxGridPane[j] != null) {
* @param port => entspricht der Position des gewählten ToggleButton chkBoxGridPane[j].setVisible(false);
*/ }
private void createPortPane(int port) { }
}
if (chkBoxGridPane[port] != null) { });
anchorPane.getChildren().remove(chkBoxGridPane[port]); }
}
chkBoxGridPane[port] = new ChkBoxGridPane( /**
this.codierer, * Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
port, *
tBtnPort[port]); * @param port => entspricht der Position des gewählten ToggleButton
chkBoxGridPane[port].setVisible(false); */
chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;"); private void createPortPane(int port) {
chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
chkBoxGridPane[port].setPrefWidth(85.0); if (chkBoxGridPane[port] != null) {
chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10)); anchorPane.getChildren().remove(chkBoxGridPane[port]);
chkBoxGridPane[port].setAlignment(Pos.CENTER); }
chkBoxGridPane[port].setLayoutX( chkBoxGridPane[port] = new ChkBoxGridPane(
(anchorPane.getWidth() / 12) * (port + 1) - this.codierer,
((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2)); port,
chkBoxGridPane[port].setLayoutY( tBtnPort[port]);
mainGrid.getLayoutY() + ((anchorPane.getHeight() - chkBoxGridPane[port].setVisible(false);
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15); chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
anchorPane.getChildren().add(chkBoxGridPane[port]); chkBoxGridPane[port].setPrefWidth(85.0);
chkBoxGridPane[port].setVisible(true); chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
} chkBoxGridPane[port].setAlignment(Pos.CENTER);
chkBoxGridPane[port].setLayoutX(
/** (anchorPane.getWidth() / 12) * (port + 1) -
* Wird ausgelöst wenn der gedrückte Button losgelassen wird. ((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau, chkBoxGridPane[port].setLayoutY(
* durch Aufruf der Methode leuchten. mainGrid.getLayoutY() + ((anchorPane.getHeight() -
* mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
* @param e => übergibt den zuletzt losgelassenen Button
*/ anchorPane.getChildren().add(chkBoxGridPane[port]);
@FXML chkBoxGridPane[port].setVisible(true);
void tasteRauf(MouseEvent e) { }
if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); /**
if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * durch Aufruf der Methode leuchten.
if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); *
if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * @param e => übergibt den zuletzt losgelassenen Button
if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); */
if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); @FXML
if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); void tasteRauf(MouseEvent e) {
if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); for(Button btn : btnArray) {
if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); if (e.getSource() == btn) 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); //endregion
if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); //region EventHandler/Listener
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); * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Auswertung welche Buchstaben-Taste gedrückt ist.
if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); *
if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * @param e => übergibt den momentan gedrückten Buttons
} */
//endregion @FXML
void tasteRunter(MouseEvent e) {
//region EventHandler/Listener for(Button btn : btnArray) {
if (e.getSource() == btn) {
/** if (setText(btn)) {
* Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
* Auswertung welche Buchstaben-Taste gedrückt ist.
* Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
* in der Klassen-Variablen chiffrierterBuchstabe ablegt.
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
*
* @param e => übergibt den momentan gedrückten Buttons
*/
@FXML
void tasteRunter(MouseEvent e) {
if (e.getSource() == btnA) {
setText(btnA);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnB) {
setText(btnB);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnC) {
setText(btnC);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnD) {
setText(btnD);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnE) {
setText(btnE);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnF) {
setText(btnF);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnG) {
setText(btnG);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnH) {
setText(btnH);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnI) {
setText(btnI);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnJ) {
setText(btnJ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnK) {
setText(btnK);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnL) {
setText(btnL);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnM) {
setText(btnM);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnN) {
setText(btnN);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnO) {
setText(btnO);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnP) {
setText(btnP);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnQ) {
setText(btnQ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnR) {
setText(btnR);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnS) {
setText(btnS);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnT) {
setText(btnT);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnU) {
setText(btnU);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnV) {
setText(btnV);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnW) {
setText(btnW);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnX) {
setText(btnX);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnY) {
setText(btnY);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnZ) {
setText(btnZ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
}
/**
* Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
* Funktionsaufruf entsprechend des gedrückten Button
*
* @param e => ActionEvent des auslösenden Button
*/
@FXML
private void gedrueckteTaste(ActionEvent e) {
if (e.getSource() == btnSenden) {
if (tfCodiert.getText().equals("")) {
new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
"Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
} else {
sendeFunkspruch();
}
}
if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
if (e.getSource() == btnDelete) loeschen();
if (e.getSource() == btnReset) {
codierer.resetHardware();
this.resetDisplay = true;
this.lblSpruchschluessel.setText("");
this.setzeTagesSchluessel();
}
}
/**
* Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
*
* @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
* @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
* "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
*/
private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
leuchte.setStyle("-fx-background-color: grey");
leuchte.setStyle("-fx-border-color: #000000");
}
}
//endregion
//region Methoden
/**
* Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
*
* @param chiffLetter => chiffrierter Buchstabe
* @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
*/
private Circle chiffCircle(char chiffLetter) {
switch (chiffLetter) {
case 'A':
return circA;
case 'B':
return circB;
case 'C':
return circC;
case 'D':
return circD;
case 'E':
return circE;
case 'F':
return circF;
case 'G':
return circG;
case 'H':
return circH;
case 'I':
return circI;
case 'J':
return circJ;
case 'K':
return circK;
case 'L':
return circL;
case 'M':
return circM;
case 'N':
return circN;
case 'O':
return circO;
case 'P':
return circP;
case 'Q':
return circQ;
case 'R':
return circR;
case 'S':
return circS;
case 'T':
return circT;
case 'U':
return circU;
case 'V':
return circV;
case 'W':
return circW;
case 'X':
return circX;
case 'Y':
return circY;
case 'Z':
return circZ;
}
return null;
}
/**
* Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
*
* @param mBtn : MenuButton der Walze
* @param mItm : MenuItem
*/
private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
if (mBtn.getId().equals(mBtnStartPos1.getId())) {
setzePosition(1, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos2.getId())) {
setzePosition(2, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos3.getId())) {
setzePosition(3, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(0,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos1.getText().charAt(0));
} else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos2.getText().charAt(0));
} else {
setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0));
} else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
}
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
try {
if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
setzeTagesSchluessel();
tfKlartext.setText(this.empfangeneNachricht[2]);
tfCodiert.setText(this.empfangeneNachricht[1]);
resetDisplay = true;
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
/**
* Methode die das ProgressDialog Fenster erstellt und verwaltet
*
* @param strRxTx : String : RX => empfangen
* TX => senden
*/
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressIndicator pi = new ProgressIndicator();
pi.setProgress(-1);
ProgressDialog dialog = new ProgressDialog(copyWorker);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Kommunikation zum Funkraum");
if (strRxTx.equals("rx")) {
dialog.setContentText("Empfange Nachricht");
} else if (strRxTx.equals("tx")) {
dialog.setContentText("Sende Nachricht");
}
dialog.setHeaderText(null);
dialog.setGraphic(pi);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
/**
* Thread Worker für Nachricht senden / empfangen
*
* @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean
*/
private Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (IOException e) {
e.printStackTrace();
}
} }
return true;
}
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private void setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.lblSpruchschluessel.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
} }
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Konvertiert eine rämische Zahl in eine arabische Zahl
*
* @param nummer : String : Römische Zahl
* @return int : arabische Zahl
*/
private int convertRoemischToZahl(String nummer) {
int result = 0;
switch (nummer) {
case "I":
result = 0;
break;
case "II":
result = 1;
break;
case "III":
result = 2;
break;
case "IV":
result = 3;
break;
case "V":
result = 4;
break;
default:
break;
}
return result;
}
/**
* Konvertiert eine arabische Zahl in eine rämische Zahl
*
* @param nummer : int : arabische Zahl
* @return String : römische Zahl
*/
private String convertZahlToRoemisch(int nummer) {
String result = "";
switch (nummer) {
case 0:
result = "I";
break;
case 1:
result = "II";
break;
case 2:
result = "III";
break;
case 3:
result = "IV";
break;
case 4:
result = "V";
break;
default:
break;
} }
return result; }
}
/**
/** * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze * Funktionsaufruf entsprechend des gedrückten Button
* ->d.h. welche Walze sitzt auf welcher Position *
* * @param e => ActionEvent des auslösenden Button
* @param walzeRoemischNr => gibt die Walzennummer an */
* @param walzenPosition => gibt die Position der Walze @FXML
*/ private void gedrueckteTaste(ActionEvent e) {
private void setzeWalze(int walzenPosition, String walzeRoemischNr) { if (e.getSource() == btnSenden) {
switch (walzenPosition) { if (tfCodiert.getText().equals("")) {
case 1: new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]); "Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
break; } else {
case 2: sendeFunkspruch();
mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]); }
break; }
case 3: if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]); if (e.getSource() == btnDelete) loeschen();
break; if (e.getSource() == btnReset) {
default: codierer.resetHardware();
break; this.resetDisplay = true;
} this.lblSpruchschluessel.setText("");
} this.setzeTagesSchluessel();
}
/** }
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position /**
* * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
* @param walzenPosition => gibt die Position der Walze *
* @param walzeNr => gibt die Walzennummer an * @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
*/ * @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
private void setzeWalze(int walzenPosition, int walzeNr) { * "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
switch (walzenPosition) { */
case 1: private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]); if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
//codierer.setWalze(walzeNr, walzenPosition) else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
break; leuchte.setStyle("-fx-background-color: grey");
case 2: leuchte.setStyle("-fx-border-color: #000000");
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]); }
break; }
case 3: //endregion
mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
break; //region Methoden
default:
break; /**
} * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
} *
* @param chiffLetter => chiffrierter Buchstabe
/** * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest */
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch) private Circle chiffCircle(char chiffLetter) {
* um eine Stelle versetzt switch (chiffLetter) {
* case 'A':
* @param ringStellung => gibt die walze an return circA;
* @param walzenPosition => gibt den notch der Walze (walze) an case 'B':
*/ return circB;
private void setzeRing(int walzenPosition, int ringStellung) { case 'C':
switch (walzenPosition) { return circC;
case 1: case 'D':
mBtnNotchPos1.setText(ringNr[ringStellung]); return circD;
break; case 'E':
case 2: return circE;
mBtnNotchPos2.setText(ringNr[ringStellung]); case 'F':
break; return circF;
case 3: case 'G':
mBtnNotchPos3.setText(ringNr[ringStellung]); return circG;
break; case 'H':
default: return circH;
break; case 'I':
} return circI;
} case 'J':
return circJ;
/** case 'K':
* Setzt die Startposition/ aktuelle Position der Walze return circK;
* case 'L':
* @param walze => gibt die walze an return circL;
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an case 'M':
*/ return circM;
private void setzePosition(int walze, char buchstabe) { case 'N':
switch (walze) { return circN;
case 1: case 'O':
mBtnStartPos1.setText(String.valueOf(buchstabe)); return circO;
break; case 'P':
case 2: return circP;
mBtnStartPos2.setText(buchstabe + ""); case 'Q':
break; return circQ;
case 3: case 'R':
mBtnStartPos3.setText(buchstabe + ""); return circR;
break; case 'S':
default: return circS;
break; case 'T':
} return circT;
} case 'U':
return circU;
/** case 'V':
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an return circV;
*/ case 'W':
private void setzeTagesSchluessel() { return circW;
case 'X':
// Umsprungpunkte anzeigen return circX;
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0])); case 'Y':
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1])); return circY;
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2])); case 'Z':
return circZ;
// Walzennummern anzeigen }
setzeWalze(1, codierer.fetchWalzenNr()[0]); return null;
setzeWalze(2, codierer.fetchWalzenNr()[1]); }
setzeWalze(3, codierer.fetchWalzenNr()[2]);
/**
// Position der Walzen anzeigen * Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0])); *
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1])); * @param mBtn : MenuButton der Walze
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2])); * @param mItm : MenuItem
*/
// Steckbrett Felder setzen private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
//setzeSteckverbindungen(); if (mBtn.getId().equals(mBtnStartPos1.getId())) {
setzePosition(1, mItm.getText().charAt(0));
myToggleButtons(); this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
}
// Setzt das Steckbrett if (mBtn.getId().equals(mBtnStartPos2.getId())) {
//generateSteckbrett(); setzePosition(2, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
// Felder zurück setzen }
this.textCodiert = ""; if (mBtn.getId().equals(mBtnStartPos3.getId())) {
this.textEingabe = ""; setzePosition(3, mItm.getText().charAt(0));
this.tfKlartext.setText(""); this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
this.tfCodiert.setText(""); }
} if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText());
/** if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
* Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui !mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
* this.codierer.setzeWalzeNr(0,
* @param kenngruppe : String : aktuelle Kenngruppe convertRoemischToZahl(mItm.getText()) + 1,
*/ mBtnNotchPos1.getText().charAt(0));
void setKenngruppe(String kenngruppe) { } else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
// Initialisieren des Codierers und setzen der Kenngruppe new Fehler().showErrorDialog("error",
codierer = new Codierer(kenngruppe.toUpperCase()); "Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
this.codierer.resetHardware(); }
}
//Setzt die Kenngruppe in der GUI if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe()); setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden. !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
resetDisplay = true; this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1,
// Einstellungen aus dem Logbuch auslesen und setzen mBtnNotchPos2.getText().charAt(0));
setzeTagesSchluessel(); } else {
//setzeSteckverbindungen(); setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
} new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
private enum BUCHSTABE_LEUCHTET {AN, AUS} "Es scheint so das wir von jeder Walze nur eine da haben");
//endregion }
}
if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0));
} else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
}
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
try {
if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
setzeTagesSchluessel();
tfKlartext.setText(this.empfangeneNachricht[2]);
tfCodiert.setText(this.empfangeneNachricht[1]);
resetDisplay = true;
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
/**
* Methode die das ProgressDialog Fenster erstellt und verwaltet
*
* @param strRxTx : String : RX => empfangen
* TX => senden
*/
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressIndicator pi = new ProgressIndicator();
pi.setProgress(-1);
ProgressDialog dialog = new ProgressDialog(copyWorker);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Kommunikation zum Funkraum");
if (strRxTx.equals("rx")) {
dialog.setContentText("Empfange Nachricht");
} else if (strRxTx.equals("tx")) {
dialog.setContentText("Sende Nachricht");
}
dialog.setHeaderText(null);
dialog.setGraphic(pi);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
/**
* Thread Worker für Nachricht senden / empfangen
*
* @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean
*/
private Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private boolean setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.lblSpruchschluessel.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
}
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfKlartext.appendText("");
tfCodiert.setText(textCodiert);
tfKlartext.appendText("");
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
return true;
} else {
new Fehler().showErrorDialog("error", "Wir wussten das du das testen wirst", "250 Zeichen sind " +
"selbst für die Wehrmacht zu viel!");
return false;
}
}
/**
* Konvertiert eine rämische Zahl in eine arabische Zahl
*
* @param nummer : String : Römische Zahl
* @return int : arabische Zahl
*/
private int convertRoemischToZahl(String nummer) {
int result = 0;
switch (nummer) {
case "I":
result = 0;
break;
case "II":
result = 1;
break;
case "III":
result = 2;
break;
case "IV":
result = 3;
break;
case "V":
result = 4;
break;
default:
break;
}
return result;
}
/**
* Konvertiert eine arabische Zahl in eine rämische Zahl
*
* @param nummer : int : arabische Zahl
* @return String : römische Zahl
*/
private String convertZahlToRoemisch(int nummer) {
String result = "";
switch (nummer) {
case 0:
result = "I";
break;
case 1:
result = "II";
break;
case 2:
result = "III";
break;
case 3:
result = "IV";
break;
case 4:
result = "V";
break;
default:
break;
}
return result;
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* ->d.h. welche Walze sitzt auf welcher Position
*
* @param walzeRoemischNr => gibt die Walzennummer an
* @param walzenPosition => gibt die Position der Walze
*/
private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
default:
break;
}
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position
*
* @param walzenPosition => gibt die Position der Walze
* @param walzeNr => gibt die Walzennummer an
*/
private void setzeWalze(int walzenPosition, int walzeNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
break;
default:
break;
}
}
/**
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
* um eine Stelle versetzt
*
* @param ringStellung => gibt die walze an
* @param walzenPosition => gibt den notch der Walze (walze) an
*/
private void setzeRing(int walzenPosition, int ringStellung) {
switch (walzenPosition) {
case 1:
mBtnNotchPos1.setText(ringNr[ringStellung]);
break;
case 2:
mBtnNotchPos2.setText(ringNr[ringStellung]);
break;
case 3:
mBtnNotchPos3.setText(ringNr[ringStellung]);
break;
default:
break;
}
}
/**
* Setzt die Startposition/ aktuelle Position der Walze
*
* @param walze => gibt die walze an
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
*/
private void setzePosition(int walze, char buchstabe) {
switch (walze) {
case 1:
mBtnStartPos1.setText(String.valueOf(buchstabe));
break;
case 2:
mBtnStartPos2.setText(buchstabe + "");
break;
case 3:
mBtnStartPos3.setText(buchstabe + "");
break;
default:
break;
}
}
/**
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
*/
private void setzeTagesSchluessel() {
// Umsprungpunkte anzeigen
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
// Walzennummern anzeigen
setzeWalze(1, codierer.fetchWalzenNr()[0]);
setzeWalze(2, codierer.fetchWalzenNr()[1]);
setzeWalze(3, codierer.fetchWalzenNr()[2]);
// Position der Walzen anzeigen
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
myToggleButtons();
// Felder zurück setzen
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
this.tfCodiert.setText("");
}
/**
* Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
*
* @param kenngruppe : String : aktuelle Kenngruppe
*/
void setKenngruppe(String kenngruppe) {
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe.toUpperCase());
this.codierer.resetHardware();
// Setzt die Kenngruppe in der GUI
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
}
private enum BUCHSTABE_LEUCHTET {AN, AUS}
//endregion
} }
...@@ -283,14 +283,13 @@ public class Codierer { ...@@ -283,14 +283,13 @@ public class Codierer {
* *
* @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 boolean setzeSteckbrett(int port, String verbindung) { public void setzeSteckbrett(int port, String verbindung) {
if (verbindung.equals("")) { if (verbindung.equals("")) {
verbindung = " "; verbindung = " ";
} }
return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1)); this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
} }
//endregion //endregion
......
...@@ -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;
......
...@@ -10,22 +10,40 @@ import projekt.enigma.model.Codierer; ...@@ -10,22 +10,40 @@ import projekt.enigma.model.Codierer;
import java.util.Arrays; 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 {
// Der globale Checkbox Array
private CheckBox[] checkbox; private CheckBox[] checkbox;
// Die Buchstaben die für das jeweilige Pane selectiert werden sollen
private String checkedBuchstaben; private String checkedBuchstaben;
// Die Anzahl der möglichen Checkboxen
private int charSize; private int charSize;
// Das Codierer Objekt. Dieses wird benötigt um auf die Funktionen für das Steckbrett zuzugreifen
private Codierer codierer; private Codierer codierer;
// Der Steckbrett Port für welchen das Pane und die Checkboxen erstellt werden sollen
private int port; private int port;
// Die verfügbaren Buchstaben für den jeweiligen Port
private char[] verfuegbareBuchstaben; private char[] verfuegbareBuchstaben;
// Das Button Objekt des Ports über den dieses Pane gesteuert wird
private ToggleButton tBtnPort; private ToggleButton tBtnPort;
/** /**
* TODO: Doku * 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 * @param codierer : Codierer Objekt
* @param port : int * @param port : int
* @param tBtnPort : ToogleButton
*/ */
public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) { public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) {
this.codierer = codierer; this.codierer = codierer;
...@@ -48,8 +66,7 @@ public class ChkBoxGridPane extends GridPane { ...@@ -48,8 +66,7 @@ public class ChkBoxGridPane extends GridPane {
this.setAlignment(Pos.CENTER); this.setAlignment(Pos.CENTER);
System.out.println("----->>>>>" + String.valueOf(this.verfuegbareBuchstaben)); // Für jeden verfügbaren Buchstaben einen Durchlauf
for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) { for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) {
if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') { if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') {
checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + ""); checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + "");
...@@ -66,15 +83,18 @@ public class ChkBoxGridPane extends GridPane { ...@@ -66,15 +83,18 @@ public class ChkBoxGridPane extends GridPane {
checkbox[i].setDisable(false); checkbox[i].setDisable(false);
} }
// Der Listener für die jeweilige Checkbox
checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> { checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
String portSelection = ""; String portSelection = "";
int zaehler = 0; int zaehler = 0;
// Die selektierten Chechkboxen zählen
for (CheckBox cb : checkbox) { for (CheckBox cb : checkbox) {
if (cb != null && cb.isSelected()) { if (cb != null && cb.isSelected()) {
zaehler++; zaehler++;
} }
} }
// Wenn nur eine oder keine Checkbox ausgewählt ist
if (zaehler == 1 || zaehler == 0) { if (zaehler == 1 || zaehler == 0) {
for (CheckBox cb : checkbox) { for (CheckBox cb : checkbox) {
if (cb != null && cb.isDisabled()) { if (cb != null && cb.isDisabled()) {
...@@ -82,10 +102,14 @@ public class ChkBoxGridPane extends GridPane { ...@@ -82,10 +102,14 @@ public class ChkBoxGridPane extends GridPane {
} }
} }
} }
// Es ist keine Checkbox ausgewählt
if (zaehler == 0) { if (zaehler == 0) {
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, ""); this.codierer.setzeSteckbrett(this.port, "");
// Und den Button neu beschreiben
tBtnPort.setText(portSelection); tBtnPort.setText(portSelection);
} }
// Das Maximum an selektierten Checkboxen (2) ist erreicht
if (zaehler == 2) { if (zaehler == 2) {
for (CheckBox cb : checkbox) { for (CheckBox cb : checkbox) {
if (cb != null && !cb.isSelected()) { if (cb != null && !cb.isSelected()) {
...@@ -96,40 +120,28 @@ public class ChkBoxGridPane extends GridPane { ...@@ -96,40 +120,28 @@ public class ChkBoxGridPane extends GridPane {
} }
} }
} }
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, ""); this.codierer.setzeSteckbrett(this.port, "");
this.codierer.setzeSteckbrett(this.port, portSelection); this.codierer.setzeSteckbrett(this.port, portSelection);
// Und den Button neu beschreiben
tBtnPort.setText(portSelection); tBtnPort.setText(portSelection);
} }
}); });
// Eine neue Row im Gridpane anlegen für den nächsten Button
this.addRow(i + 1); this.addRow(i + 1);
this.add(checkbox[i], 2, i + 1, 1, 1); this.add(checkbox[i], 2, i + 1, 1, 1);
} }
} }
// Das Pane anzeigen
this.setVisible(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
*/
private Integer isCheckedChkBoxIndex() {
for (int i = 0; i < charSize; i++) {
if (checkbox[i].isSelected()) {
return i;
} else {
return null;
}
}
return null;
}
/**
* TODO: Doku
* *
* @return * @return int : Anzahl der möglcihen chars
*/ */
public int getCharSize() { public int getCharSize() {
return charSize; 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">
......