diff --git a/src/main/java/de/itstall/App.java b/src/main/java/de/itstall/App.java index 8ff5a51f95ce7467cbd1df26b3c232437bba8e68..0dde899eb355d6f3ca7d30e3eebd7f22f54ea53b 100644 --- a/src/main/java/de/itstall/App.java +++ b/src/main/java/de/itstall/App.java @@ -19,18 +19,7 @@ public class App extends Application { @Override public void start(Stage stage) throws IOException { - - Kontakt kontakt = new Kontakt(); - kontakt.setTelefon("111"); - eintraege.put("111", kontakt); - kontakt = new Kontakt(); - kontakt.setTelefon("222"); - eintraege.put("222", kontakt); - kontakt = new Kontakt(); - kontakt.setTelefon("333"); - eintraege.put("333", kontakt); - - scene = new Scene(loadFXML("Telefonbuch")); + scene = new Scene(loadFXML("Telefonbuch")); stage.setScene(scene); stage.show(); } diff --git a/src/main/java/de/itstall/TelefonbuchController.java b/src/main/java/de/itstall/TelefonbuchController.java index bc8c4c97b03b04d0dea7296f073c09b16853b7a2..5de8b156e86ecc1d45293422ea94e0f47e413b66 100644 --- a/src/main/java/de/itstall/TelefonbuchController.java +++ b/src/main/java/de/itstall/TelefonbuchController.java @@ -1,17 +1,24 @@ package de.itstall; +import de.itstall.model.Fehler; import de.itstall.model.Kontakt; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TextField; - import java.util.ArrayList; +/** + * Der Kontroller für unser Telefonbuch + */ public class TelefonbuchController { + /** Initialisiert die TreeMap für die Kontakte */ private Kontakt kontakt = new Kontakt(); + /** Initialisiert das Fehler Objekt */ + private Fehler fehler = new Fehler(); + @FXML private TextField txtVorname; @@ -45,28 +52,56 @@ public class TelefonbuchController { @FXML private Button btnLoeschen; + /** + * Action Listener für btnLoeschen + * @param event : ActionEvent + */ @FXML void loeschen(ActionEvent event) { - deleteKontakt(); + deleteKontakt(true); + if(App.eintraege.size() != 0) { + kontakt = App.eintraege.get(sucheEintrag(kontakt.getTelefon())[0]); + setKontaktToForm(kontakt); + } } + /** + * Action Listener für btnWeiter + * @param event : ActionEvent + */ @FXML void navWeiter(ActionEvent event) { - kontakt = App.eintraege.get(sucheEintrag(kontakt.getTelefon())[1]); - setForm(kontakt); + if(App.eintraege.size() != 0) { + kontakt = App.eintraege.get(sucheEintrag(kontakt.getTelefon())[1]); + setKontaktToForm(kontakt); + } } + /** + * Action Listener für btnZurueck + * @param event : ActionEvent + */ @FXML void navZurueck(ActionEvent event) { - kontakt = App.eintraege.get(sucheEintrag(kontakt.getTelefon())[0]); - setForm(kontakt); + if(App.eintraege.size() != 0) { + kontakt = App.eintraege.get(sucheEintrag(kontakt.getTelefon())[0]); + setKontaktToForm(kontakt); + } } + /** + * Action Listener für btnNeuerEintrag + * @param event : ActionEvent + */ @FXML void neuerEintrag(ActionEvent event) { neuenKontaktAnlegen(); + deaktiviereButtons(true); } + /** + * Initialisiert die Komponenten + */ @FXML void initialize() { assert txtVorname != null : "fx:id=\"txtVorname\" was not injected: check your FXML file 'telefonbuch.fxml'."; @@ -81,81 +116,129 @@ public class TelefonbuchController { assert btnNeuerEintrag != null : "fx:id=\"btnNeuerEintrag\" was not injected: check your FXML file 'telefonbuch.fxml'."; assert btnLoeschen != null : "fx:id=\"btnLoeschen\" was not injected: check your FXML file 'telefonbuch.fxml'."; + /** Wenn noch keine Einträge vorhanden sind, die Buttons deaktivieren */ + if(App.eintraege.size() == 0) { + deaktiviereButtons(true); + } + + /** Listener für das Vorname Feld */ txtVorname.focusedProperty().addListener((observableValue, aBoolean, t1) -> { - if (!t1) { + /** Prüfen ob das Feld verändert oder ausgefüllt wurde */ + if (txtVorname.getText() != null && !txtVorname.getText().equals("") && !t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setVorname(txtVorname.getText())) { setFieldError(txtVorname, true); - } else { + fehler.showErrorDialog("error", "", "Der Vorname ist auf 50 Zeichen beschränkt"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtVorname, false); } } }); + /** Listener für das Nachname Feld */ txtNachname.focusedProperty().addListener((observableValue, aBoolean, t1) -> { - if (!t1) { + /** Prüfen ob das Feld verändert oder ausgefüllt wurde */ + if (txtNachname.getText() != null && !txtNachname.getText().equals("") && !t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setNachname(txtNachname.getText())) { setFieldError(txtNachname, true); - } else { + fehler.showErrorDialog("error", "", "Der Nachname ist auf 50 Zeichen beschränkt"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtNachname, false); } } }); + /** Listener für das Straßen Feld */ txtStrasse.focusedProperty().addListener((observableValue, aBoolean, t1) -> { - if (!t1) { + /** Prüfen ob das Feld verändert oder ausgefüllt wurde */ + if (txtStrasse.getText() != null && !txtStrasse.getText().equals("") && !t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setStrasse(txtStrasse.getText())) { setFieldError(txtStrasse, true); - } else { + fehler.showErrorDialog("error", "", "Die Straße ist auf 50 Zeichen beschränkt"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtStrasse, false); } } }); + /** Listener für das Hausnummern Feld */ txtHNr.focusedProperty().addListener((observableValue, aBoolean, t1) -> { - if (!t1) { + /** Prüfen ob das Feld verändert oder ausgefüllt wurde */ + if (txtHNr.getText() != null && !txtHNr.getText().equals("") && !t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setHausnummer(txtHNr.getText())) { setFieldError(txtHNr, true); - } else { + fehler.showErrorDialog("error", "", "Die Hausnummer ist auf 10 Zeichen beschränkt"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtHNr, false); } } }); + /** Listener für das Plz Feld */ txtPlz.focusedProperty().addListener((observableValue, aBoolean, t1) -> { + /** Prüfen ob das Feld verändert wurde */ if (!t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setPlz(txtPlz.getText())) { setFieldError(txtPlz, true); - } else { + fehler.showErrorDialog("error", "", "Die Postleitzahl muss 5 Zeichen entsprechen"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtPlz, false); } } }); + /** Listener für das Ort Feld */ txtOrt.focusedProperty().addListener((observableValue, aBoolean, t1) -> { - if (!t1) { + /** Prüfen ob das Feld verändert oder ausgefüllt wurde */ + if (txtOrt.getText() != null && !txtOrt.getText().equals("") && !t1) { + /** Prüfen ob das Feld den Regeln entspricht */ if (!kontakt.setOrt(txtOrt.getText())) { setFieldError(txtOrt, true); - } else { + fehler.showErrorDialog("error", "", "Der Ort ist auf 50 Zeichen beschränkt"); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtOrt, false); } } }); + /** Listener für das Telefon Feld */ txtTelefon.focusedProperty().addListener((observableValue, aBoolean, t1) -> { + /** Prüfen ob das Feld verändert wurde */ if (!t1) { - if (txtTelefon.getText() != kontakt.getTelefon()) { - deleteKontakt(); + /** Wenn die Nummer korrekt ausgefüllt wurde und der Kontakt bereits in der DB enthalten war, den Kontakt löschen und neu anlegen */ + if (!txtTelefon.getText().equals("") && txtTelefon.getText() != null && txtTelefon.getText() != kontakt.getTelefon()) { + deleteKontakt(false); saveKontakt(); } - if (!kontakt.setTelefon(txtTelefon.getText())) { + /** Wenn das Feld noch leer ist oder nicht den Regeln entspricht, Fehler ausgeben */ + if (txtTelefon.getText() == null || !kontakt.setTelefon(txtTelefon.getText())) { setFieldError(txtTelefon, true); - } else { + fehler.showErrorDialog("error", "", "Die Telefonnummer muss mindestens 3 und maximal 30 Ziffern lang sein."); + } + /** Wenn alles korrekt gelaufen ist, Kontakt speichern und Fehler zurück setzen */ + else { saveKontakt(); setFieldError(txtTelefon, false); } @@ -172,23 +255,42 @@ public class TelefonbuchController { /** * Kontakt aus Treemap loeschen + * @param resetForm : boolean : Soll das Formular auch geleert werden? */ - public void deleteKontakt() { + public void deleteKontakt(boolean resetForm) { App.eintraege.remove(txtTelefon.getText()); - resetForm(); + if(resetForm) { + resetForm(); + } } /** * Kontakt in die Treemap speichern */ public void saveKontakt() { - if (kontakt.getTelefon() != "") { + if (!kontakt.getTelefon().equals("")) { App.eintraege.put(kontakt.getTelefon(), kontakt); } } /** - * Background der Felder setzen im Fehler Fall + * Kontrollieren ob alle Felder fehlerfrei sind. Wenn ja, die Buttons wieder aktivieren. + */ + public void checkFieldErrors() { + if(!txtVorname.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtNachname.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtStrasse.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtHNr.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtPlz.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtOrt.getStyle().equals("-fx-control-inner-background: #ff000040;") && + !txtTelefon.getStyle().equals("-fx-control-inner-background: #ff000040;") + ) { + deaktiviereButtons(false); + } + } + + /** + * Background der Felder setzen im Fehler Fall sowie deaktivieren der Buttons * * @param field : Textfeld Object * @param set : true:Fehler false:Kein Fehler @@ -196,8 +298,10 @@ public class TelefonbuchController { public void setFieldError(TextField field, boolean set) { if (set) { field.setStyle("-fx-control-inner-background: #ff000040;"); + deaktiviereButtons(true); } else { field.setStyle("-fx-control-inner-background: WHITE;"); + checkFieldErrors(); } } @@ -263,6 +367,10 @@ public class TelefonbuchController { * Loescht das Formular und erstellt ein neues Kontakt Objekt */ public void resetForm() { + /** Wenn keine Einträge mehr vorhanden sind, auch die Buttons deaktivieren */ + if(App.eintraege.size() == 0) { + deaktiviereButtons(true); + } kontakt = new Kontakt(); txtVorname.setText(""); txtNachname.setText(""); @@ -276,9 +384,9 @@ public class TelefonbuchController { /** * Setzt alle Formular Felder auf die Daten des Objektes * - * @param kontakt + * @param kontakt : Kontakt : Kontakt Objekt */ - public void setForm(Kontakt kontakt) { + public void setKontaktToForm(Kontakt kontakt) { txtVorname.setText(kontakt.getVorname()); txtNachname.setText(kontakt.getNachname()); txtStrasse.setText(kontakt.getStrasse()); @@ -287,4 +395,22 @@ public class TelefonbuchController { txtOrt.setText(kontakt.getOrt()); txtTelefon.setText(kontakt.getTelefon()); } + + /** + * Deaktiviert die Buttons + * @param deaktivieren : boolean + */ + public void deaktiviereButtons(boolean deaktivieren) { + if(deaktivieren) { + btnLoeschen.setDisable(true); + btnNaviLinks.setDisable(true); + btnNaviRechts.setDisable(true); + btnNeuerEintrag.setDisable(true); + } else if (deaktivieren == false && !txtTelefon.getText().equals("") && txtTelefon.getText() != null) { + btnLoeschen.setDisable(false); + btnNaviLinks.setDisable(false); + btnNaviRechts.setDisable(false); + btnNeuerEintrag.setDisable(false); + } + } } diff --git a/src/main/java/de/itstall/model/Fehler.java b/src/main/java/de/itstall/model/Fehler.java new file mode 100644 index 0000000000000000000000000000000000000000..2cea9d3cff05b2aaa7bc769b0f34f19bd9e5a0b0 --- /dev/null +++ b/src/main/java/de/itstall/model/Fehler.java @@ -0,0 +1,50 @@ +package de.itstall.model; + +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; + +/** + * In dieser Klasse werden Fehler behandelt und an den User/Admin/Entwickler ausgegeben + */ +public class Fehler { + + /** + * Zeige Fehler Dialog + * + * @param type : String : Art der Meldung (warning/information/error) + * @param subject : Titel des Dialoges + * @param message : Nachricht der Meldung + */ + public void showErrorDialog(String type, String subject, String message) { + Alert alert; + + /** Der Titel darf auch als leerer String übergeben werden, dann wird ein Default gesetzt */ + if(subject.equals("")) { + subject = "Es ist ein Fehler aufgetreten"; + } + + /** Welcher Fehler Typ wurde übergeben? */ + switch (type) { + case "warning": + alert = new Alert(AlertType.WARNING); + break; + case "information": + alert = new Alert(AlertType.INFORMATION); + break; + case "error": + alert = new Alert(AlertType.ERROR); + break; + default: + alert = new Alert(Alert.AlertType.NONE); + } + /** Setzt den Titel des Dialoges */ + alert.setTitle(subject); + /** Setzt den Headertext des Dialoges */ + alert.setHeaderText(null); + /** Setzt die Nachricht des Dialoges */ + alert.setContentText(message); + + /** Zeige den Dialog an */ + alert.showAndWait(); + } +} diff --git a/src/main/java/de/itstall/model/Kontakt.java b/src/main/java/de/itstall/model/Kontakt.java index 92851212ed855e0dc5a1639a63b5e5f6041448e0..60a44f0bccadaca5bd36dc7990a024fb76b47ec1 100644 --- a/src/main/java/de/itstall/model/Kontakt.java +++ b/src/main/java/de/itstall/model/Kontakt.java @@ -1,13 +1,23 @@ package de.itstall.model; +/** + * Das Model für die Kontakte + */ public class Kontakt { // region 0 Variables private String vorname, nachname, strasse, hausnummer, plz, ort, telefon = ""; //endregion // region 1 Setter + + /** + * Setzt den Vornamen. Dieser darf maximal 50 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param vorname : String + * @return boolean + */ public boolean setVorname(String vorname) { - if (vorname.length() <= 50) { + if (vorname != null && vorname.length() <= 50) { this.vorname = vorname; return true; } else { @@ -15,8 +25,14 @@ public class Kontakt { } } + /** + * Setzt den Nachnamen. Dieser darf maximal 50 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param nachname : String + * @return boolean + */ public boolean setNachname(String nachname) { - if (nachname.length() <= 50) { + if (nachname != null && nachname.length() <= 50) { this.nachname = nachname; return true; } else { @@ -24,8 +40,14 @@ public class Kontakt { } } + /** + * Setzt die Straße. Diese darf maximal 50 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param strasse : String + * @return boolean + */ public boolean setStrasse(String strasse) { - if (strasse.length() <= 50) { + if (strasse != null && strasse.length() <= 50) { this.strasse = strasse; return true; } else { @@ -33,8 +55,14 @@ public class Kontakt { } } + /** + * Setzt die Hausnummer. Diese darf maximal 10 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param hausnummer : String + * @return boolean + */ public boolean setHausnummer(String hausnummer) { - if (hausnummer.length() <= 10) { + if (hausnummer != null && hausnummer.length() <= 10) { this.hausnummer = hausnummer; return true; } else { @@ -42,8 +70,14 @@ public class Kontakt { } } + /** + * Setzt die Postleitzahl. Diese muss genau 5 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param plz : String + * @return boolean + */ public boolean setPlz(String plz) { - if (plz.length() == 5) { + if (plz != null && plz.length() == 5) { this.plz = plz; return true; } else { @@ -51,8 +85,14 @@ public class Kontakt { } } + /** + * Setzt den Ort. Dieser darf maximal 50 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param ort : String + * @return boolean + */ public boolean setOrt(String ort) { - if (ort.length() <= 50) { + if (ort != null && ort.length() <= 50) { this.ort = ort; return true; } else { @@ -60,8 +100,14 @@ public class Kontakt { } } + /** + * Setzt die Telefonnummer. Diese muss zwischen 3 und 50 Zeichen lang sein + * Gibt im erfolgs Fall true und bei einem Fehler false zurück + * @param telefon : String + * @return boolean + */ public boolean setTelefon(String telefon) { - if (telefon.length() <= 30 && telefon.length() > 2 && isNumeric(telefon)) { + if (telefon != null && telefon.length() <= 30 && telefon.length() > 2 && isNumeric(telefon)) { this.telefon = telefon; return true; } else { @@ -71,30 +117,58 @@ public class Kontakt { //endregion // region 2. Getter + /** + * Gibt den Vornamen zurück + * @return : String + */ public String getVorname() { return vorname; } + /** + * Gibt den Nachnamen zurück + * @return : String + */ public String getNachname() { return nachname; } + /** + * Gibt die Straße zurück + * @return : String + */ public String getStrasse() { return strasse; } + /** + * Gibt die Hausnummer zurück + * @return : String + */ public String getHausnummer() { return hausnummer; } + /** + * Gibt die Postleitzahl zurück + * @return : String + */ public String getPlz() { return plz; } + /** + * Gibt den Ort zurück + * @return : String + */ public String getOrt() { return ort; } + /** + * Gibt die Telefonnummer zurück + * @return : String + */ public String getTelefon() { return telefon; } @@ -102,7 +176,7 @@ public class Kontakt { //region 3 Functions /** - * Prueft ob String aus Zahlen besteht + * Prueft ob der String ausschließlich aus Zahlen besteht */ public boolean isNumeric(String s) { return s != null && s.matches("[-+]?\\d*\\.?\\d+");