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 @@
* Besondere (für uns) Lösungen
### Zahlen, Daten, Fakten
* Zeilen insgesamt: 4120
* Code: 1596
* Zeilen insgesamt: 3056
* Code: 1619 (53%)
* XML: 110
* Kommentare:
* Leerzeilen:
* Commits: 373
* Merge Requests: 113
* Kommentare: 1076 (35%)
* Leerzeilen: 365 (12%)
* Commits: 461
* Merge Requests: 146
* Tickets: 29
* Pipelines 471
## Klassendiagram
![Ablaufdiagram Enigma](http://plantuml.gitrepo.de/png/U9oTM4jpspOGlkjNyDPaNFhGeoVJIU97aedbU2GrpiJrU21gHI820HO0uzHfyjkx8CK7G81Yh8D4xRTOBFODlbIQI5tcR3RJL3E8xk_d7yxEBtzJqIaZIaLdbAIIvFVtV_FPB8euoK4L986eaE8BxFGnS9hc9FgEO1_EnGROdXf5IINBNd9SiHoVulUwJBAMrtpYI9CqEeaernRrWR17u8oaK8EtTnOiAK-L1iPAddeP44nsNq6kAT_KF4b6vEtTxLt3qsC_YXhTdZsto5lGIRP29PHACbRY3p27HOkbDjeuv1GqhXiIRzfp3R55xr13T6cVwDdp5kvn_epKSEFO48F2AtGWt6NmwFrZDidd52H8n-Sxu3oLPL4OxzRsit1EaapI9DD-M1KIVTMvP1fNhKj090R7ve58ey_R_QE59qtmdhInuWPGTL37RqbDdaI5lDWIdi9LS_W0pa4kdQFvmdOacYhSSJbm7rFjzZ1ovHwumZw2t9QGhj68husUcgm7Ggfp40q7ZeA1_xuDbY4MifN9bt713FIZ1lKPS3NmIm7A_3fCA0AsK5bgBK7hQo7TdIHWTZGXus0A-2ReJZLoCiGUOJ6iAXMzKyU7rdwv5efgAjppT1oEu-Bw77vTusW3lf3jqJqrC6vT_5uKMmUY7DKZZ2gps6izr8ZmZSZR0FgbkdC16GFPBpeeyEAlgzFLkmzNzzUByujtdto50BdcvylbgpVdOqneo4myd4if97PD9ko38smAn07Yf5EKV2T9cLlLioi41gwBd2_kFEYKFHjdE1MxxiTeZIfwVCssYiZANCqV9xws33SJ4baMpREbTI29_CLo8o43RtKoZRIH7-YYlkHfUxCllxs82c-aHZOQ4VS8OtaRgWU3IZp5pNCXbKbUry-6D2S5EcabmJozgCF_ztqQ_6djtqeP-8nZPz5jxgx40SuMNebXmjUQeOD6eA7yALPe_UTac1jpKsHr3dTCYjgH4hkBxZL3_n0Y94qf9soSxoWAnfO_LweemPvSgp4S1mxX9Qn1rgsmp-MV2yPx_nH3Ll7is92m8aD1WU7DkGsOIT--OfIIg-0bevNfLBM7VLuD5XxLHV1NHhq_WkLhM8R2DI2CZ5yTlBDQRwmV8Ds4r_DSzzrT_ZO4_KiKZD__6gxZCvm6-9hmtV8VHZKuMOUQUkzXfYfn3edsAkFTyLLHz8H_noZKDFbXpfpWK68yRdvdtGvfWiGt9JqLN4l1S7ZeWLNdTiAWbNaKvOJsNO8ECLTjYu97EtDc0kpZN5iNXbPaTOjR2A5zO1mnGJONd-QNUtJ43DQ1UWQ9wvolRhPBtuGSZmyPFzi1pWfWT5H6jzjJAXDcqrS4etD1ogs7MZfcC1LpWzKcsMceE2oCGMbAARU9m_4zZdBWfKK8ZKLxUyoH_xNcA_YcNSX7ypRhsDkguzxW7hXnnRrUFfaSKi1xh-ZcSM_xGDz9i43dieEI7oYM1KF-Y8Fxsd5n_kzAf2d3gg-ruCh2C2nJ7AHKFIsNuDdtHiYT4mRxsM0X8AVetfNuJ3Bcup3qbMZuaEDGNimnOttrmSfbixxgLxM86rWha5zf0lN2y8NzA39A0MKEKWdpQVBYlxWiukWB-Kgstuv9KJ2Q4EDOKyUQv-5QK-JsIprIX_nsDV2lH9d3XSwx714FbZbl-4wyRyw6WeEDOSeMlNRnT9NVTkzzikwzppXhKDYYTyUHJnUpx5-drFhfWkf9wcG_oHmAY36RrrR4qUhfbculinWS-yUGi9OrAAoxlfn4UL2fZii8wXBOcAJz4rIYUeNWKy7aoEmbDXFpDlr_rhUkvW00 "Ablaufdiagram der Enigma")
......@@ -85,12 +87,6 @@
* Dann String (Warum)
* Vorteile Enum (Warum)
## Die GUI der Enigma (Elemente, etc)
* Besondere GUI Elemente
* ControlsFX (ProgressDialog)
## GUI Controller
## Enigma Demo
* Kenngruppe Abfrage
* Testen Kenngruppe Dialog und Fehler
......@@ -105,3 +101,7 @@
* Setzen von Walzen und Ringen
* Setzen von gleichen Walzen und Fehler
* 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
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.
![Screenshot](Praesentation/Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
File added
......@@ -37,7 +37,7 @@ public class App extends Application {
* @param args : String[] : Standard-Kommandozeilen-Argument.
*/
public static void main(String[] args) {
debug = 1;
debug = 0;
launch(args);
}
......@@ -66,8 +66,8 @@ public class App extends Application {
TextField tfEingabe = new TextField();
Button btnKenngruppe = new Button("Kenngruppe setzen!");
VBox layout = new VBox();
layout.setSpacing(30);
layout.setPadding(new Insets(30, 30, 30, 30));
layout.setSpacing(10);
layout.setPadding(new Insets(20, 30, 10, 30));
btnKenngruppe.setMaxWidth(Double.MAX_VALUE);
// baut die Scene fuer die Kenngruppenabfrage auf
......
package projekt.enigma;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
......@@ -19,14 +21,15 @@ import projekt.enigma.view.ChkBoxGridPane;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
public class GuiController {
//region Klassenvariablen
private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
@FXML
private static ToggleButton[] tBtnPort;
private String[] empfangeneNachricht;
......@@ -35,11 +38,14 @@ public class GuiController {
private char chiffrierterBuchstabe;
private boolean resetDisplay;
private Codierer codierer;
//region GUI-Elemente
//deklariert die benötigten Buttons
@FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
@FXML
private Button[] btnArray;
//endregion
//deklariert die benötigten Kreise
@FXML
......@@ -54,7 +60,7 @@ public class GuiController {
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
//deklariert die benötigten Textfelder
@FXML
private TextField tfCodiert, tfKlartext;
private TextArea tfCodiert, tfKlartext;
//deklariert benötigtes GridPane
@FXML
private ChkBoxGridPane[] chkBoxGridPane;
......@@ -87,46 +93,18 @@ public class GuiController {
menu(mBtnStartPos1, position);
menu(mBtnStartPos3, position);
menu(mBtnStartPos2, position);
btnArray = new Button[]{btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN,
btnO, btnP, btnQ, btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ};
tfKlartext.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfKlartext.setScrollTop(Double.MAX_VALUE));
tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfCodiert.setScrollTop(Double.MAX_VALUE));
}
//endregion
//region Init
/**
* 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
*
......@@ -147,10 +125,9 @@ public class GuiController {
}
/**
* TODO: Doku
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen
*/
private void myToggleButtons() {
// this.codierer.setzeSteckbrett()
if (chkBoxGridPane != null) {
for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
anchorPane.getChildren().remove(boxGridPane);
......@@ -159,55 +136,64 @@ public class GuiController {
chkBoxGridPane = new ChkBoxGridPane[10];
final ToggleGroup cabelConnect = new ToggleGroup();
tBtnPort = new ToggleButton[10];
tBtnPort = new ToggleButton[chkBoxGridPane.length];
for (int i = 0; i < chkBoxGridPane.length; i++) {
char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(i).toCharArray();
char[] checkedBuchstaben = {
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] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
this.codierer.fetchSteckverbindungen()[i][1]);
tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(tBtnPort[i], i + 1, 8);
chkBoxGridPane[i].setLayoutX(
(anchorPane.getWidth() / 12) * (i + 1) -
((chkBoxGridPane[i].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
chkBoxGridPane[i].setLayoutY(
mainGrid.getLayoutY() + ((anchorPane.getHeight() -
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[i].getPrefHeight() - 15);
new Fehler().debug(
"mg LayoutY " + mainGrid.getLayoutY() +
" mg Height " + mainGrid.getHeight() +
" chkbox Height " + chkBoxGridPane[i].getHeight() +
" AP Height " + anchorPane.getHeight(),
false);
anchorPane.getChildren().add(chkBoxGridPane[i]);
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]) {
this.createPortPane(i);
chkBoxGridPane[i].setVisible(false);
}
// ToggleButtonGroup Listener
cabelConnect.selectedToggleProperty().
addListener((observable, oldValue, newValue) -> {
for (int j = 0; j < chkBoxGridPane.length; j++) {
if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
this.createPortPane(j);
} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
if (chkBoxGridPane[j] != null) {
chkBoxGridPane[j].setVisible(false);
}
}
});
}
}
});
}
/**
* Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
*
* @param port => entspricht der Position des gewählten ToggleButton
*/
private void createPortPane(int port) {
if (chkBoxGridPane[port] != null) {
anchorPane.getChildren().remove(chkBoxGridPane[port]);
}
chkBoxGridPane[port] = new ChkBoxGridPane(
this.codierer,
port,
tBtnPort[port]);
chkBoxGridPane[port].setVisible(false);
chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
chkBoxGridPane[port].setPrefWidth(85.0);
chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
chkBoxGridPane[port].setAlignment(Pos.CENTER);
chkBoxGridPane[port].setLayoutX(
(anchorPane.getWidth() / 12) * (port + 1) -
((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
chkBoxGridPane[port].setLayoutY(
mainGrid.getLayoutY() + ((anchorPane.getHeight() -
mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
anchorPane.getChildren().add(chkBoxGridPane[port]);
chkBoxGridPane[port].setVisible(true);
}
/**
......@@ -219,32 +205,9 @@ public class GuiController {
*/
@FXML
void tasteRauf(MouseEvent e) {
if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
for(Button btn : btnArray) {
if (e.getSource() == btn) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
}
}
//endregion
......@@ -261,110 +224,13 @@ public class GuiController {
*/
@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);
}
for(Button btn : btnArray) {
if (e.getSource() == btn) {
if (setText(btn)) {
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
}
}
}
/**
......@@ -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) {
Task copyWorker = createWorker(strRxTx);
......@@ -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
*/
private Task createWorker(String strRxTx) {
......@@ -668,7 +536,7 @@ public class GuiController {
*
* @param pressedButton : gedrückter Knopf
*/
private void setText(Button pressedButton) {
private boolean setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
......@@ -688,12 +556,20 @@ public class GuiController {
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;
}
}
......@@ -793,7 +669,6 @@ public class GuiController {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
//codierer.setWalze(walzeNr, walzenPosition)
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
......@@ -873,13 +748,8 @@ public class GuiController {
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
//setzeSteckverbindungen();
myToggleButtons();
// Setzt das Steckbrett
//generateSteckbrett();
// Felder zurück setzen
this.textCodiert = "";
this.textEingabe = "";
......@@ -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) {
......@@ -899,7 +769,7 @@ public class GuiController {
this.codierer.resetHardware();
//Setzt die Kenngruppe in der GUI
// 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.
......@@ -907,7 +777,6 @@ public class GuiController {
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
//setzeSteckverbindungen();
}
private enum BUCHSTABE_LEUCHTET {AN, AUS}
......
......@@ -12,493 +12,496 @@ import java.util.Random;
*/
public class Codierer {
//region Variablen
/**
* Der Spruchschluessel als Klartext zur Codierung der Nachricht.
*/
private String spruchschluessel;
/**
* Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
*/
private String spruchschluesselCodiert;
/**
* Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
* Diese ist relevant fuer den Webservice (Funkraum).
*/
private String kenngruppe;
/**
* Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
* und im Laufe der Benutzung ergaenzt.
*/
private String nachricht;
/**
* Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
*/
private Hardware hardware;
/**
* Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
*/
private Codebuch codebuch;
//endregion
//region Konstruktor
/**
* Der Konstruktor des Codierers.
* Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
*/
public Codierer(String kenngruppe) {
this.nachricht = "";
this.spruchschluessel = "";
this.spruchschluesselCodiert = "";
this.kenngruppe = kenngruppe;
this.codebuch = new Codebuch();
this.codebuch.fetchTagesschluessel();
}
//endregion
//region Funktionen & Methoden
//region Reset & Initialisieren
/**
* 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
* in die Hardware gebaut.
* <br>
* Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
* deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
* <br>
* Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
* Codebucheintrag.
*/
private void initialisiereHardware() {
this.nachricht = "";
// Das Steckbrett initialisieren
Steckbrett sb = new Steckbrett();
char[][] verbinder = this.codebuch.getSteckverbindung();
// Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
for (char[] kabel : verbinder) {
sb.setzeVertauschung(kabel[0], kabel[1]);
}
// Die Hardware aus dem Koffer holen (initialisieren)
this.hardware = new Hardware();
// 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(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]);
this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]);
// Der Hardware das gesetzte Steckbrett zuweisen
this.hardware.setSteckbrett(sb);
// Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
this.hardware.setReflektor(new Reflektor());
}
/**
* Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
*/
public void resetHardware() {
this.initialisiereHardware();
}
/**
* Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
*/
private void resetNachricht() {
this.nachricht = "";
}
//endregion
//region Nachrichten handler
/**
* Befehl, die Nachricht an den Funker zu uebergeben.
*
* @throws IOException : Die Antwort konnte nicht gelesen werden.
*/
public void sendeNachricht() throws IOException {
String kopf = this.generateKopf();
new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
this.kenngruppe);
this.nachricht = "";
this.resetHardware();
}
/**
* Gibt die letzte empfangene Nachricht zurueck.
* <br>
* nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
* nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
* nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
* Tageseinstellungen (nachricht[0]) decodiert.
*/
public String[] empfangeNachricht() {
StringBuilder sb = new StringBuilder();
Morsecode mc = new Morsecode();
String[] nachricht = new String[3];
// Alte Nachrichten-Variable erstmal leeren
this.nachricht = "";
// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
nachricht[0] = codierteNachricht[0];
nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
sb.append(nachricht[1], 0, 16);
for (int i = 17; i <= nachricht[1].length(); ) {
if ((i + 5) < nachricht[1].length()) {
sb.append(nachricht[1], i, i + 5).append(" ");
i += 5;
} else {
sb.append(nachricht[1].substring(i));
break;
}
}
nachricht[1] = sb.toString();
}
return nachricht;
}
//endregion
//region Generatoren
/**
* Hier wird ein neuer Spruchschluessel generiert.
* <p>
* Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
* Tagesschluessel codiert, hinzugefuegt.
* <br>
* Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
* und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
* Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
* <br>
* Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
* Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
*/
public void generateSpruchschluessel() {
String klartext = "";
while (klartext.length() < 3) {
String temp = this.randomBuchstabe();
if (!klartext.contains(temp)) {
klartext += temp;
}
}
this.spruchschluessel = klartext;
this.spruchschluesselCodiert = this.codiere(klartext + klartext, false);
// Walzen auf den Spruchschlüssel stellen
this.hardware.setzePosition(0, this.spruchschluessel.charAt(0));
this.hardware.setzePosition(1, this.spruchschluessel.charAt(1));
this.hardware.setzePosition(2, this.spruchschluessel.charAt(2));
// Die Kenngruppe codieren und in der Nachricht speichern
this.codiere(this.kenngruppe, true);
}
/**
* Erstellen des Nachrichten-Kopfes.
* Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
* Tagescode codierte, Spruchschluessel.
*
* @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
*/
private String generateKopf() {
Calendar cal = Calendar.getInstance();
return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " "
+ this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
+ this.spruchschluesselCodiert.substring(3, 6) + " ";
}
/**
* Generiert einen zufaelligen Buchstaben aus dem Alphabet.
* 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.
*
* @return String : ein zufaellig generierter Buchstabe.
*/
private String randomBuchstabe() {
return String.valueOf((char) ('A' + new Random().nextInt(26)));
}
//endregion
//region setze Funktionen
/**
* Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
*
* @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
* @param umsprungPunkt : int : Umspringpunkt (Signal an linke Walze zum Drehen).
*/
public void setzeRing(int walzenPosition, int umsprungPunkt) {
this.hardware.setzeRing(walzenPosition, umsprungPunkt);
}
/**
* Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
* Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
*
* @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
* @param walzeNr : int : Nummer der Walze die eingesetzt wird.
* @param ringstellung : int : Stellung des Ringes.
*/
public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
}
/**
* Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
* Nachrichten Objekt
*
* @param walze : int : Nummer der Walze
* @param buchstabe : char : Buchstabe der zugewiesen soll
*/
public void setzeWalzenPosition(int walze, char buchstabe) {
this.resetNachricht();
this.hardware.setzePosition(walze, buchstabe);
}
/**
* 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 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) {
return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
}
//endregion
//region fetch Funktionen
/**
* Gibt die Ringstellungen aus dem Codebuch zurueck.
*
* @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.
*/
public int[] fetchWalzenNr() {
return this.codebuch.getWalzenlage();
}
/**
* Gibt die Steckverbindungen aus dem Codebuch zurueck.
*
* @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.
*/
public char[] fetchWalzen() {
char[] walzen = new char[3];
walzen[0] = this.hardware.getWalzen()[0].getPosition();
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.
*/
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
*/
public int fetchWalzenNr(int walzePos) {
return this.hardware.getWalzen()[walzePos].getWalzenNr();
}
//endregion
//region codierer
/**
* Hier wird ein einzelner Buchstabe verschluesselt.
* Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* In der Regel ist dies der Fall.
*
* @param buchstabe : char : Der zu codierende Buchstabe.
* @param save : boolean : Nachricht speichern oder nicht.
* @return char : Der codierte Buchstabe.
*/
public char codiere(char buchstabe, boolean save) {
char codiert = this.hardware.codiere(buchstabe);
if (save) {
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.
*
* @param klartext : String : Der zu codierende Text.
* @param save : boolean : Nachricht speichern oder nicht.
* @return String : Der codierte Text zusaetzlich als Rueckgabe.
*/
public String codiere(String klartext, boolean save) {
StringBuilder sb = new StringBuilder();
for (char buchstabe : klartext.toCharArray()) {
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.
*
* @param codierteNachricht : String : Enigma-codierte Nachricht.
* @param tag : int : Tag der Nachricht.
* @return String : decodierte Nachricht.
*/
private String decodiere(String codierteNachricht, int tag) {
// Hardware reseten und Tageseinstellungen aus dem Codebuch laden
this.codebuch.fetchTagesschluessel(tag);
this.initialisiereHardware();
// Nachricht splitten mit whitespace als delimiter
String[] nachricht = codierteNachricht.split(" ");
StringBuilder sb = new StringBuilder();
// Uhrzeit und Zeichenanzahl der Nachricht
sb.append(nachricht[0]).append(" ");
sb.append(nachricht[1]).append(" ");
// Spruchschluessel
String spruchschluessel = this.decodiereString(nachricht[2]);
sb.append(spruchschluessel).append(" ");
sb.append(this.decodiereString(nachricht[3])).append(" ");
// Walzen neu einstellen mit dem Spruchschluessel
this.hardware.setzePosition(0, spruchschluessel.charAt(0));
this.hardware.setzePosition(1, spruchschluessel.charAt(1));
this.hardware.setzePosition(2, spruchschluessel.charAt(2));
// 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.
* @return String : Der decodierte Text.
*/
private String decodiereString(String nachricht) {
StringBuilder sb = new StringBuilder();
for (char buchstabe : nachricht.toCharArray()) {
if (buchstabe > 0) {
sb.append(this.hardware.codiere(buchstabe));
}
}
return sb.toString();
}
//endregion
//region Sonstige
/**
* Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
*
* @param empfangeneNachricht : String : Die empfangene Nachricht als String.
* @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
*/
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);
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
}
//endregion
//endregion
//region Getter
/**
* 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.
*
* @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
*/
public String getSpruchschluessel() {
return this.spruchschluessel;
}
//endregion
//region Variablen
/**
* Der Spruchschluessel als Klartext zur Codierung der Nachricht.
*/
private String spruchschluessel;
/**
* Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
*/
private String spruchschluesselCodiert;
/**
* Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
* Diese ist relevant fuer den Webservice (Funkraum).
*/
private String kenngruppe;
/**
* Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
* und im Laufe der Benutzung ergaenzt.
*/
private String nachricht;
/**
* Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
*/
private Hardware hardware;
/**
* Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
*/
private Codebuch codebuch;
//endregion
//region Konstruktor
/**
* Der Konstruktor des Codierers.
* Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
*/
public Codierer(String kenngruppe) {
this.nachricht = "";
this.spruchschluessel = "";
this.spruchschluesselCodiert = "";
this.kenngruppe = kenngruppe;
this.codebuch = new Codebuch();
this.codebuch.fetchTagesschluessel();
}
//endregion
//region Funktionen & Methoden
//region Reset & Initialisieren
/**
* 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
* in die Hardware gebaut.
* <br>
* Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
* deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
* <br>
* Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
* Codebucheintrag.
*/
private void initialisiereHardware() {
this.nachricht = "";
// Das Steckbrett initialisieren
Steckbrett sb = new Steckbrett();
char[][] verbinder = this.codebuch.getSteckverbindung();
// Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
for (char[] kabel : verbinder) {
sb.setzeVertauschung(kabel[0], kabel[1]);
}
// Die Hardware aus dem Koffer holen (initialisieren)
this.hardware = new Hardware();
// 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(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]);
this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]);
// Der Hardware das gesetzte Steckbrett zuweisen
this.hardware.setSteckbrett(sb);
// Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
this.hardware.setReflektor(new Reflektor());
}
/**
* Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
*/
public void resetHardware() {
this.initialisiereHardware();
}
/**
* Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
*/
private void resetNachricht() {
this.nachricht = "";
}
//endregion
//region Nachrichten handler
/**
* Befehl, die Nachricht an den Funker zu uebergeben.
*
* @throws IOException : Die Antwort konnte nicht gelesen werden.
*/
public void sendeNachricht() throws IOException {
String kopf = this.generateKopf();
new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
this.kenngruppe);
this.nachricht = "";
this.resetHardware();
}
/**
* Gibt die letzte empfangene Nachricht zurueck.
* <br>
* nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
* nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
* nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
* Tageseinstellungen (nachricht[0]) decodiert.
*/
public String[] empfangeNachricht() {
StringBuilder sb = new StringBuilder();
Morsecode mc = new Morsecode();
String[] nachricht = new String[3];
// Alte Nachrichten-Variable erstmal leeren
this.nachricht = "";
// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
nachricht[0] = codierteNachricht[0];
nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
sb.append(nachricht[1], 0, 16);
for (int i = 17; i <= nachricht[1].length(); ) {
if ((i + 5) < nachricht[1].length()) {
sb.append(nachricht[1], i, i + 5).append(" ");
i += 5;
} else {
sb.append(nachricht[1].substring(i));
break;
}
}
nachricht[1] = sb.toString();
}
return nachricht;
}
//endregion
//region Generatoren
/**
* Hier wird ein neuer Spruchschluessel generiert.
* <p>
* Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
* Tagesschluessel codiert, hinzugefuegt.
* <br>
* Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
* und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
* Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
* <br>
* Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
* Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
*/
public void generateSpruchschluessel() {
String klartext = "";
while (klartext.length() < 3) {
String temp = this.randomBuchstabe();
if (!klartext.contains(temp)) {
klartext += temp;
}
}
this.spruchschluessel = klartext;
this.spruchschluesselCodiert = this.codiere(klartext + klartext, false);
// Walzen auf den Spruchschlüssel stellen
this.hardware.setzePosition(0, this.spruchschluessel.charAt(0));
this.hardware.setzePosition(1, this.spruchschluessel.charAt(1));
this.hardware.setzePosition(2, this.spruchschluessel.charAt(2));
// Die Kenngruppe codieren und in der Nachricht speichern
this.codiere(this.kenngruppe, true);
}
/**
* Erstellen des Nachrichten-Kopfes.
* Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
* Tagescode codierte, Spruchschluessel.
*
* @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
*/
private String generateKopf() {
Calendar cal = Calendar.getInstance();
return String.format("%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)) + " "
+ this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
+ this.spruchschluesselCodiert.substring(3, 6) + " ";
}
/**
* Generiert einen zufaelligen Buchstaben aus dem Alphabet.
* 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.
*
* @return String : ein zufaellig generierter Buchstabe.
*/
private String randomBuchstabe() {
return String.valueOf((char) ('A' + new Random().nextInt(26)));
}
//endregion
//region setze Funktionen
/**
* Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
*
* @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
* @param umsprungPunkt : int : Umspringpunkt (Signal an linke Walze zum Drehen).
*/
public void setzeRing(int walzenPosition, int umsprungPunkt) {
this.hardware.setzeRing(walzenPosition, umsprungPunkt);
}
/**
* Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
* Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
*
* @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
* @param walzeNr : int : Nummer der Walze die eingesetzt wird.
* @param ringstellung : int : Stellung des Ringes.
*/
public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
}
/**
* Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
* Nachrichten Objekt
*
* @param walze : int : Nummer der Walze
* @param buchstabe : char : Buchstabe der zugewiesen soll
*/
public void setzeWalzenPosition(int walze, char buchstabe) {
this.resetNachricht();
this.hardware.setzePosition(walze, buchstabe);
}
/**
* 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 verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt.
*/
public void setzeSteckbrett(int port, String verbindung) {
if (verbindung.equals("")) {
verbindung = " ";
}
this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
}
//endregion
//region fetch Funktionen
/**
* Gibt die Ringstellungen aus dem Codebuch zurueck.
*
* @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.
*/
public int[] fetchWalzenNr() {
return this.codebuch.getWalzenlage();
}
/**
* Gibt die Steckverbindungen aus dem Codebuch zurueck.
*
* @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.
*/
public char[] fetchWalzen() {
char[] walzen = new char[3];
walzen[0] = this.hardware.getWalzen()[0].getPosition();
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.
*/
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
*/
public int fetchWalzenNr(int walzePos) {
return this.hardware.getWalzen()[walzePos].getWalzenNr();
}
//endregion
//region codierer
/**
* Hier wird ein einzelner Buchstabe verschluesselt.
* Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* In der Regel ist dies der Fall.
*
* @param buchstabe : char : Der zu codierende Buchstabe.
* @param save : boolean : Nachricht speichern oder nicht.
* @return char : Der codierte Buchstabe.
*/
public char codiere(char buchstabe, boolean save) {
char codiert = this.hardware.codiere(buchstabe);
if (save) {
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.
*
* @param klartext : String : Der zu codierende Text.
* @param save : boolean : Nachricht speichern oder nicht.
* @return String : Der codierte Text zusaetzlich als Rueckgabe.
*/
public String codiere(String klartext, boolean save) {
StringBuilder sb = new StringBuilder();
for (char buchstabe : klartext.toCharArray()) {
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.
*
* @param codierteNachricht : String : Enigma-codierte Nachricht.
* @param tag : int : Tag der Nachricht.
* @return String : decodierte Nachricht.
*/
private String decodiere(String codierteNachricht, int tag) {
// Hardware reseten und Tageseinstellungen aus dem Codebuch laden
this.codebuch.fetchTagesschluessel(tag);
this.initialisiereHardware();
// Nachricht splitten mit whitespace als delimiter
String[] nachricht = codierteNachricht.split(" ");
StringBuilder sb = new StringBuilder();
// Uhrzeit und Zeichenanzahl der Nachricht
sb.append(nachricht[0]).append(" ");
sb.append(nachricht[1]).append(" ");
// Spruchschluessel
String spruchschluessel = this.decodiereString(nachricht[2]);
sb.append(spruchschluessel).append(" ");
sb.append(this.decodiereString(nachricht[3])).append(" ");
// Walzen neu einstellen mit dem Spruchschluessel
this.hardware.setzePosition(0, spruchschluessel.charAt(0));
this.hardware.setzePosition(1, spruchschluessel.charAt(1));
this.hardware.setzePosition(2, spruchschluessel.charAt(2));
// 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.
* @return String : Der decodierte Text.
*/
private String decodiereString(String nachricht) {
StringBuilder sb = new StringBuilder();
for (char buchstabe : nachricht.toCharArray()) {
if (buchstabe > 0) {
sb.append(this.hardware.codiere(buchstabe));
}
}
return sb.toString();
}
//endregion
//region Sonstige
/**
* Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
*
* @param empfangeneNachricht : String : Die empfangene Nachricht als String.
* @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
*/
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);
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
}
//endregion
//endregion
//region Getter
/**
* 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.
*
* @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
*/
public String getSpruchschluessel() {
return this.spruchschluessel;
}
//endregion
}
......@@ -74,12 +74,31 @@ public class Steckbrett {
* @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/
public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) {
if (!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) {
originalBuchstaben = originalBuchstaben.replace(originalBuchstaben.charAt(steckbrettPort), buchstabe1);
getauschteBuchstaben
= getauschteBuchstaben.replace(getauschteBuchstaben.charAt(steckbrettPort), buchstabe2);
char[] original;
char[] getauscht;
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;
} else {
new Fehler().debug("false\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return false;
}
}
......@@ -94,7 +113,7 @@ public class Steckbrett {
*
* @param buchstabe : Character: zu pruefender Buchstabe.
* @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) {
boolean result = false;
......
......@@ -113,7 +113,7 @@ public class Walze {
* @return char : decodierter Buchstabe.
*/
char codiere2(char buchstabe) {
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 260) % 26);
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 520) % 26);
}
/**
......@@ -131,7 +131,6 @@ public class Walze {
*
* @param walzenNr : int : Walzennummer.
*/
//TODO: Überprüfung notwendig? Wo findet Überprüfung statt?
private void setWalzenNr(int walzenNr) {
if ((walzenNr > 0) && (walzenNr < 6)) {
this.walzenNr = walzenNr - 1;
......
package projekt.enigma.view;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ToggleButton;
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 {
private CheckBox[] checkbox;
private char[] alphabet;
private int charSize;
/**
* TODO: Doku
* @param alphabet
*/
public ChkBoxGridPane(char[] alphabet) {
charSize = alphabet.length;
this.alphabet = alphabet;
initializeComponents();
}
// Der globale Checkbox Array
private CheckBox[] checkbox;
// Die Buchstaben die für das jeweilige Pane selectiert werden sollen
private String checkedBuchstaben;
// Die Anzahl der möglichen Checkboxen
private int charSize;
// Das Codierer Objekt. Dieses wird benötigt um auf die Funktionen für das Steckbrett zuzugreifen
private Codierer codierer;
// Der Steckbrett Port für welchen das Pane und die Checkboxen erstellt werden sollen
private int port;
// Die verfügbaren Buchstaben für den jeweiligen Port
private char[] verfuegbareBuchstaben;
// Das Button Objekt des Ports über den dieses Pane gesteuert wird
private ToggleButton tBtnPort;
/**
* Hier werfen wir die Checkboxen auf das Gridpane und weißen ihnen die Propertys zu.
* Außerdem wird hier auch der Listener generiert womit wir prüfen ob die maximale Auswahlmöglichkeit
* erreicht ist.
* Es können maximal zwei Checkboxen ausgewählt werden. Wenn zwei erreicht sind, werden die restlichen Checkboxen
* deaktiviert. Wenn nur noch eine oder keine Box ausgewählt ist, werden die restlichen wieder aktiviert.
* Bei null und zwei Boxen, werden die Buchstaben in das Steckbrett geschrieben.
* Andere Auswahlmöglchkeiten stehen nicht zur Verfügung, da ein Kabel nur zwei Enden hat in der Regel.
*
* @param codierer : Codierer Objekt
* @param port : int
* @param tBtnPort : ToogleButton
*/
public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) {
this.codierer = codierer;
this.port = port;
this.tBtnPort = tBtnPort;
this.verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(this.port).toCharArray();
Arrays.sort(this.verfuegbareBuchstaben);
charSize = this.verfuegbareBuchstaben.length;
this.checkedBuchstaben = tBtnPort.getText();
initializeComponents();
}
/**
* Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des
* Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll
* abhängig von deren Index links bzw. recht erzeugt werden
*/
private void initializeComponents() {
checkbox = new CheckBox[charSize];
this.setAlignment(Pos.CENTER);
// Für jeden verfügbaren Buchstaben einen Durchlauf
for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) {
if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') {
checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + "");
checkbox[i].setPadding(new Insets(1, 1, 1, 1));
/**
* 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);
if (!checkedBuchstaben.equals("")) {
if (!checkedBuchstaben.contains(String.valueOf(this.verfuegbareBuchstaben[i]))) {
checkbox[i].setDisable(true);
} else {
checkbox[i].setSelected(true);
}
} else {
checkbox[i].setSelected(false);
checkbox[i].setDisable(false);
}
for (int i = 0; i < alphabet.length; i++) {
checkbox[i] = new CheckBox(alphabet[i] + "");
// Der Listener für die jeweilige Checkbox
checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
String portSelection = "";
int zaehler = 0;
this.addRow(i + 1);
this.add(checkbox[i], 2, i + 1, 1, 1);
//if (i==0)checkbox[0].setSelected(true);
}
this.setVisible(true);
}
// Die selektierten Chechkboxen zählen
for (CheckBox cb : checkbox) {
if (cb != null && cb.isSelected()) {
zaehler++;
}
}
// 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);
}
});
/**
* Prüft welche CheckBox aus gewählt und gibt deren
* Index zurück
*
* @return Integer
*/
private Integer isCheckedChkBoxIndex() {
for (int i = 0; i < charSize; i++) {
if (checkbox[i].isSelected()) {
return i;
} else {
return null;
}
}
return null;
}
// Eine neue Row im Gridpane anlegen für den nächsten Button
this.addRow(i + 1);
this.add(checkbox[i], 2, i + 1, 1, 1);
}
}
// Das Pane anzeigen
this.setVisible(true);
}
/**
* TODO: Doku
* @return
*/
public int getCharSize() {
return charSize;
}
/**
* Gibt den Anzahl der zur Verfügung stehenden Buchstaben zurück.
* Anhang dieses Wertes, wird die Anzahl der Checkboxen festgelegt.
*
* @return int : Anzahl der möglcihen chars
*/
public int getCharSize() {
return charSize;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuButton?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<GridPane layoutX="23.0" layoutY="60.0" prefHeight="158.0" prefWidth="237.0" AnchorPane.leftAnchor="23.0" AnchorPane.topAnchor="60.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
......@@ -585,12 +593,6 @@
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<TextField fx:id="tfKlartext" editable="false" prefHeight="70.0" prefWidth="293.0">
<GridPane.margin>
<Insets />
</GridPane.margin>
</TextField>
<TextField fx:id="tfCodiert" editable="false" prefHeight="70.0" prefWidth="293.0" GridPane.rowIndex="1" />
<Button fx:id="btnSenden" alignment="CENTER" contentDisplay="RIGHT" mnemonicParsing="false" onAction="#gedrueckteTaste" prefHeight="70.0" prefWidth="195.0" text="An Funker senden" textAlignment="CENTER" GridPane.columnIndex="1">
<GridPane.margin>
<Insets left="80.0" />
......@@ -601,6 +603,16 @@
<Insets left="80.0" />
</GridPane.margin>
</Button>
<TextArea fx:id="tfKlartext" prefHeight="66.0" prefWidth="293.0" wrapText="true">
<GridPane.margin>
<Insets bottom="5.0" top="5.0" />
</GridPane.margin>
</TextArea>
<TextArea fx:id="tfCodiert" prefHeight="200.0" prefWidth="200.0" wrapText="true" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="5.0" top="5.0" />
</GridPane.margin>
</TextArea>
</GridPane>
<Label fx:id="lblKenngruppe" layoutX="682.0" layoutY="34.0" prefHeight="17.0" prefWidth="177.0" />
<Pane layoutX="266.0" layoutY="194.0" prefHeight="200.0" prefWidth="354.0" style="-fx-background-color: white; -fx-border-color: black;" visible="false">
......