From 751a5ea0ff71d2fcc305a4e587a803dab30b2c67 Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Tue, 3 Dec 2019 22:21:57 +0100 Subject: [PATCH] =?UTF-8?q?CheckComboBoxen=20erstellen=20und=20bef=C3=BCll?= =?UTF-8?q?en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/projekt/enigma/GuiController.java | 120 +++++++++++++----- .../java/projekt/enigma/model/Codierer.java | 9 ++ .../java/projekt/enigma/model/Steckbrett.java | 23 ++++ 3 files changed, 119 insertions(+), 33 deletions(-) diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java index 71d9c5b..a5bdcf7 100644 --- a/src/main/java/projekt/enigma/GuiController.java +++ b/src/main/java/projekt/enigma/GuiController.java @@ -5,18 +5,14 @@ import javafx.collections.ObservableList; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.geometry.Insets; -import javafx.geometry.Pos; -import javafx.scene.Scene; import javafx.scene.control.*; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.MenuItem; +import javafx.scene.control.TextField; import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; -import javafx.scene.layout.Pane; -import javafx.scene.layout.VBox; import javafx.scene.shape.Circle; -import javafx.scene.text.Text; -import javafx.stage.Modality; -import javafx.stage.Stage; import javafx.stage.StageStyle; import org.apache.http.HttpException; import org.controlsfx.control.CheckComboBox; @@ -24,8 +20,11 @@ import org.controlsfx.dialog.ProgressDialog; import projekt.enigma.model.Codierer; import projekt.enigma.model.Fehler; +import java.awt.*; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; public class GuiController { @@ -72,9 +71,12 @@ public class GuiController { @FXML private GridPane mainGrid; + private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + //endregion //region Init + /** * Initialisiert die Elemente GUI und setzt deren Startwerte */ @@ -100,12 +102,57 @@ public class GuiController { menu(mBtnStartPos1, position); menu(mBtnStartPos3, position); menu(mBtnStartPos2, position); + } + + /** + * Für das Steckbrett müssen zehn CheckComboBoxen erstellt werden. + * Hier wird die Funktion zum erstellen und Befüllen der Boxen, die Funktion zehn mal aufgerufen. + */ + private void generateSteckbrett() { + + for (int i = 0; i <= 9; i++) { + this.createSteckbrettPort(i); + } + } + + /** + * Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben, + * die bereits gesteckten Kabel und weißt sie zu. + * Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert. + * + * @param port : int : Kabel Nummer (0-9) + */ + private void createSteckbrettPort(int port) { + + // Item Liste anlegen + ObservableList<Character> items = FXCollections.observableArrayList(); - ObservableList<Character> item = FXCollections.observableArrayList(); - item.addAll(new Character[]{'A','B','C'}); - CheckComboBox<Character> port1 = new CheckComboBox<Character>(item); - mainGrid.add(port1, 1,8); + // 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) { + items.add(c); + sb.append(c); + } + + // Eine CheckComboBox erstellen + CheckComboBox<Character> ccb = new CheckComboBox<Character>(items); + + // Die CheckComboBox dem GridPane in der Oberfläche zuordnen + mainGrid.add(ccb, 1 + port, 8); + + // 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])); } /** @@ -126,7 +173,7 @@ public class GuiController { mItem.get(i).setOnAction(e -> setMenuBtnText(button, finalMi.get(finalI))); } } - //endregion + //endregion //region EventHandler/Listener @@ -293,12 +340,12 @@ public class GuiController { @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 (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(); @@ -308,9 +355,10 @@ public class GuiController { this.setzeTagesSchluessel(); } } - //endregion + //endregion //region Methoden + /** * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau. * @@ -478,6 +526,7 @@ public class GuiController { progressDialogue("tx"); } + private void progressDialogue(String strRxTx) { Task copyWorker = createWorker(strRxTx); @@ -486,9 +535,9 @@ public class GuiController { dialog.setGraphic(null); dialog.initStyle(StageStyle.TRANSPARENT); dialog.setTitle("Kommunikation zum Funkraum"); - if(strRxTx.equals("rx")) { + if (strRxTx.equals("rx")) { dialog.setContentText("Empfange Nachricht"); - } else if(strRxTx.equals("tx")) { + } else if (strRxTx.equals("tx")) { dialog.setContentText("Sende Nachricht"); } dialog.setHeaderText(null); @@ -502,9 +551,9 @@ public class GuiController { return new Task() { @Override protected Object call() throws Exception { - if(strRxTx.equals("rx")) { + if (strRxTx.equals("rx")) { empfangeneNachricht = codierer.empfangeNachricht(); - } else if(strRxTx.equals("tx")) { + } else if (strRxTx.equals("tx")) { try { codierer.sendeNachricht(); } catch (HttpException | IOException e) { @@ -710,6 +759,11 @@ public class GuiController { mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2])); // Steckbrett Felder setzen + + // Setzt das Steckbrett + generateSteckbrett(); + + /* tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" + codierer.fetchSteckverbindungen()[0][1]); tfStecker2.setText(codierer.fetchSteckverbindungen()[1][0] + "" + @@ -729,7 +783,7 @@ public class GuiController { tfStecker9.setText(codierer.fetchSteckverbindungen()[8][0] + "" + codierer.fetchSteckverbindungen()[8][1]); tfStecker10.setText(codierer.fetchSteckverbindungen()[9][0] + "" + - codierer.fetchSteckverbindungen()[9][1]); + codierer.fetchSteckverbindungen()[9][1]);*/ this.textCodiert = ""; this.textEingabe = ""; this.tfKlartext.setText(""); @@ -740,17 +794,17 @@ public class GuiController { public void setKenngruppe(String kenngruppe) { - // Initialisieren des Codierers und setzen der Kenngruppe - codierer = new Codierer(kenngruppe); + // Initialisieren des Codierers und setzen der Kenngruppe + codierer = new Codierer(kenngruppe); - this.codierer.resetHardware(); + this.codierer.resetHardware(); - // Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden. - resetDisplay = true; + // Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden. + resetDisplay = true; - // Einstellungen aus dem Logbuch auslesen und setzen - setzeTagesSchluessel(); - setzeSteckverbindungen(); + // Einstellungen aus dem Logbuch auslesen und setzen + setzeTagesSchluessel(); + setzeSteckverbindungen(); } //endregion } diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java index 9a6a3d7..a7bcb37 100644 --- a/src/main/java/projekt/enigma/model/Codierer.java +++ b/src/main/java/projekt/enigma/model/Codierer.java @@ -342,6 +342,15 @@ public class Codierer { return walzen; } + + /** + * TODO: Doku + * @param port + * @return + */ + public String fetchVerfuegbareBuchstaben(int port) { + return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port); + } //endregion //region codierer diff --git a/src/main/java/projekt/enigma/model/Steckbrett.java b/src/main/java/projekt/enigma/model/Steckbrett.java index b2d698f..426424b 100644 --- a/src/main/java/projekt/enigma/model/Steckbrett.java +++ b/src/main/java/projekt/enigma/model/Steckbrett.java @@ -132,4 +132,27 @@ public class Steckbrett { } } + /** + * TODO: Doku + * @param port + * @return + */ + public String fetchVerfuegbareBuchstaben(int port) { + + String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + for (char c : this.originalBuchstaben.toCharArray()) { + alphabet = alphabet.replace(String.valueOf(c), ""); + } + + for (char c : this.getauschteBuchstaben.toCharArray()) { + alphabet = alphabet.replace(String.valueOf(c), ""); + } + + alphabet += originalBuchstaben.charAt(port); + alphabet += getauschteBuchstaben.charAt(port); + + return alphabet; + } + } \ No newline at end of file -- GitLab