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