diff --git a/.gitignore b/.gitignore index 2abc955..8b4d85b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ out/ conf.ini +log/log4j/log.out/ +reports/ diff --git a/.idea/libraries/org_apache_pdfbox_pdfbox_1_8_9.xml b/.idea/libraries/org_apache_pdfbox_pdfbox_1_8_9.xml new file mode 100644 index 0000000..3dbd171 --- /dev/null +++ b/.idea/libraries/org_apache_pdfbox_pdfbox_1_8_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tourplaner.iml b/Tourplaner.iml index 4417e38..ceedf37 100644 --- a/Tourplaner.iml +++ b/Tourplaner.iml @@ -10,5 +10,6 @@ + \ No newline at end of file diff --git a/conf.ini.sample b/conf.ini.sample index 485886a..ed69d71 100644 --- a/conf.ini.sample +++ b/conf.ini.sample @@ -13,6 +13,9 @@ port = 5432 user = pw = +[report] +path = ./reports/ + [hilfe] gitrepo = https://git.dergeorg.at/dergeorg/tourplaner doxygendoc = https://git.dergeorg.at/dergeorg/tourplaner diff --git a/langde.ini b/langde.ini index 0122235..21b9201 100644 --- a/langde.ini +++ b/langde.ini @@ -34,3 +34,9 @@ logtournotselectedmsg = Bitte wählen Sie zuerst eine Tour aus, bevor sie einen keintextimfeld = Bitte tragen Sie einen Text in das Feld ein! nurzahlen = Bitte geben Sie nur Zahlen an! nurpositivezahlen = Bitte geben Sie nur positive Zahlen an! +pause = Pause +pausemsg = Dauer der Pause +hightmeter = Höhenmeter +hightmetermsg = Höhenmeter des Abschnitts +bemerkung = Bemerkung +bemerkungheader = Bitte geben Sie die Bemerkungen zu diesem Log eintrag ein, kann auch leer bleiben. \ No newline at end of file diff --git a/log/log4j/log.out b/log/log4j/log.out index 7a9854b..c2c2b06 100644 --- a/log/log4j/log.out +++ b/log/log4j/log.out @@ -11,3 +11,5 @@ 2021-03-19 11:56:22 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt! 2021-03-19 22:35:19 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt! 2021-03-19 23:23:36 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt! +2021-04-13 18:30:39 ERROR FileNotFoundException:33 - \report\test.pdf (Das System kann den angegebenen Pfad nicht finden) +2021-04-13 18:31:11 ERROR FileNotFoundException:33 - \reports\test.pdf (Das System kann den angegebenen Pfad nicht finden) diff --git a/src/tourplaner/Main.java b/src/tourplaner/Main.java index 31a48eb..fee0c1c 100644 --- a/src/tourplaner/Main.java +++ b/src/tourplaner/Main.java @@ -23,7 +23,7 @@ public class Main extends Application { Parent root = FXMLLoader.load(Main.class.getResource("tourplaner.fxml")); primaryStage.setTitle(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "apptitle")); primaryStage.getIcons().add(new Image("file:"+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "logo"))); - primaryStage.setScene(new Scene(root, 600, 600)); + primaryStage.setScene(new Scene(root, 1500, 1000)); primaryStage.show(); } } diff --git a/src/tourplaner/business/Reporter.java b/src/tourplaner/business/Reporter.java new file mode 100644 index 0000000..ff599f9 --- /dev/null +++ b/src/tourplaner/business/Reporter.java @@ -0,0 +1,2 @@ +package tourplaner.business;public class Reporter { +} diff --git a/src/tourplaner/object/Log.java b/src/tourplaner/object/Log.java index d7d0fac..f9e1b70 100644 --- a/src/tourplaner/object/Log.java +++ b/src/tourplaner/object/Log.java @@ -6,15 +6,60 @@ import java.time.LocalDate; import java.util.Date; public class Log { - private String id, dauer; + private String id, bemerkung; private LocalDate datum; - private double strecke; + private double strecke, avgspeed, hightmeter, pause, dauer, gegangen; - public Log(String id, String dauer, LocalDate datum, double strecke) { + public Log(String id, double dauer, LocalDate datum, double strecke, String bemerkung, double hightmeter, double pause) { this.id = id; this.dauer = dauer; this.datum = datum; this.strecke = strecke; + this.bemerkung = bemerkung; + this.hightmeter = hightmeter; + this.pause = pause; + this.gegangen = this.dauer - this.pause; + this.avgspeed = this.strecke / (this.gegangen); + } + + public String getBemerkung() { + return bemerkung; + } + + public void setBemerkung(String bemerkung) { + this.bemerkung = bemerkung; + } + + public double getAvgspeed() { + return avgspeed; + } + + public void setAvgspeed(double avgspeed) { + this.avgspeed = avgspeed; + } + + public double getHightmeter() { + return hightmeter; + } + + public void setHightmeter(double hightmeter) { + this.hightmeter = hightmeter; + } + + public double getPause() { + return pause; + } + + public void setPause(double pause) { + this.pause = pause; + } + + public double getGegangen() { + return gegangen; + } + + public void setGegangen(double gegangen) { + this.gegangen = gegangen; } public String getId() { @@ -25,11 +70,11 @@ public class Log { this.id = id; } - public String getDauer() { + public double getDauer() { return dauer; } - public void setDauer(String dauer) { + public void setDauer(double dauer) { this.dauer = dauer; } diff --git a/src/tourplaner/tourplaner.fxml b/src/tourplaner/tourplaner.fxml index d224ce0..48ba22c 100644 --- a/src/tourplaner/tourplaner.fxml +++ b/src/tourplaner/tourplaner.fxml @@ -54,6 +54,7 @@ + @@ -82,7 +83,7 @@ - + @@ -119,7 +120,7 @@ - + @@ -142,7 +143,7 @@ - + @@ -169,13 +170,18 @@ - + - - + + + + + + + diff --git a/src/tourplaner/ui/AlertHelper.java b/src/tourplaner/ui/AlertHelper.java index 329289b..f870164 100644 --- a/src/tourplaner/ui/AlertHelper.java +++ b/src/tourplaner/ui/AlertHelper.java @@ -109,13 +109,25 @@ public class AlertHelper { } /** - * Texteingabe + * Texteingabe die nicht leer sein darf * @param title Title des Dialogs * @param header Header des Dialogs * @param msg Nachricht des Dialogs * @return Null bei keiner eingabe */ - public static String inputText(String title, String header, String msg, String content) { + public static String inputText(String title, String header, String msg, String content){ + return inputTextNotNull(title, header, msg, content, true); + } + + /** + * Texteingabe + * @param title Title des Dialogs + * @param header Header des Dialogs + * @param msg Nachricht des Dialogs + * @param notNull true wenn der input nicht leer sein darf + * @return Null bei keiner eingabe + */ + public static String inputTextNotNull(String title, String header, String msg, String content, boolean notNull) { String returnStr = null; while (returnStr == null) { Optional result = inputHelper(title, header, msg, content); @@ -124,7 +136,7 @@ public class AlertHelper { if(result.isPresent()) { result.ifPresent(returnText::set); returnStr = returnText.get(); - if (returnStr.isEmpty()) { + if (returnStr.isEmpty() && notNull) { AlertHelper.warn(ConfigHelper.getLangIniString("tournametitle"), ConfigHelper.getLangIniString("achtung"), ConfigHelper.getLangIniString("keintextimfeld")); diff --git a/src/tourplaner/ui/TourplanerController.java b/src/tourplaner/ui/TourplanerController.java index d993449..aa3a267 100644 --- a/src/tourplaner/ui/TourplanerController.java +++ b/src/tourplaner/ui/TourplanerController.java @@ -38,7 +38,12 @@ public class TourplanerController implements Initializable { public TextField titleTextView, sucheInput; //Log -> rechts unten public TableView logTableView; - public TableColumn logDauerCol, logStreckeCol, logDatumCol; + public TableColumn logDauerCol, logStreckeCol, logDatumCol, logAvgCol, logHightCol, logPauseCol, logGegangenCol, logBemerkungCol; + + @FXML + private void tourReport(){ + this.viewModel.tourReport(); + } @FXML @@ -102,6 +107,12 @@ public class TourplanerController implements Initializable { logDauerCol.setCellValueFactory(new PropertyValueFactory("dauer")); logStreckeCol.setCellValueFactory(new PropertyValueFactory("strecke")); logDatumCol.setCellValueFactory(new PropertyValueFactory("datum")); + logAvgCol.setCellValueFactory(new PropertyValueFactory("avgspeed")); + logHightCol.setCellValueFactory(new PropertyValueFactory("hightmeter")); + logPauseCol.setCellValueFactory(new PropertyValueFactory("pause")); + logGegangenCol.setCellValueFactory(new PropertyValueFactory("gegangen")); + logBemerkungCol.setCellValueFactory(new PropertyValueFactory("bemerkung")); + } /** diff --git a/src/tourplaner/viewmodels/ViewModel.java b/src/tourplaner/viewmodels/ViewModel.java index 46b84ba..7749d5b 100644 --- a/src/tourplaner/viewmodels/ViewModel.java +++ b/src/tourplaner/viewmodels/ViewModel.java @@ -2,6 +2,8 @@ package tourplaner.viewmodels; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import org.apache.pdfbox.exceptions.COSVisitorException; +import tourplaner.business.Reporter; import tourplaner.ui.AlertHelper; import tourplaner.business.ConfigHelper; import tourplaner.business.LogHelper; @@ -22,7 +24,7 @@ public class ViewModel { private final ObservableList tourData = FXCollections.observableArrayList(new Tour("Test 1", "120", "json dings", 22.3, "Wien", "Graz"),new Tour("Test 2", "210", "json dings", 42.3, "Da", "Dort")); private final ObservableList tourNamen = FXCollections.observableArrayList("Test 1", "Test 2"); private Tour selectedTour; - private String neueTourName, neueTourStart, neueTourZiel; + private String neueTourName, neueTourStart, neueTourZiel, neueBemerkung; //Log private final ObservableList logData = FXCollections.observableArrayList(); private Log selectedLog; @@ -184,22 +186,35 @@ public class ViewModel { }); double dauer = dauerInput(this.selectedLog.getDauer()); double strecke = -1; + double pause = -1.0; + double hightmeter = -1.0; + boolean bemerkung = false; LocalDate datum = null; if (dauer >= 0) { strecke = streckeInput(this.selectedLog.getStrecke() + ""); if (strecke >= 0) { - datum = dateInput(this.selectedLog.getDatum()); - if(datum != null){ - Log newLog = new Log(this.selectedLog.getId(), dauer + "", datum,strecke); - this.logData.removeIf(ld -> ld.getId().equals(this.selectedLog.getId())); - this.logData.add(newLog); - tourAkt.get().delLog(this.selectedLog.getId()); - tourAkt.get().addLog(newLog); - this.tourData.removeIf(td -> td.getName().equals(this.selectedTour.getName())); - this.tourData.add(tourAkt.get()); + pause = pauseInput(""); + if(pause >= 0.0) { + hightmeter = hightmeterInput(""); + if (hightmeter >= 0.0) { + bemerkung = bemerkungInput(""); + if (bemerkung) { + datum = dateInput(this.selectedLog.getDatum()); + if (datum != null) { + Log newLog = new Log(this.selectedLog.getId(), dauer, datum, strecke, this.neueBemerkung, hightmeter, pause); + this.logData.removeIf(ld -> ld.getId().equals(this.selectedLog.getId())); + this.logData.add(newLog); + tourAkt.get().delLog(this.selectedLog.getId()); + tourAkt.get().addLog(newLog); + this.tourData.removeIf(td -> td.getName().equals(this.selectedTour.getName())); + this.tourData.add(tourAkt.get()); + } + } + } } } } + this.neueBemerkung = null; } /** @@ -215,13 +230,18 @@ public class ViewModel { /** * Eingabe der Dauer bis sie korrekt ist + * @param content Wenn der Content -1.0 ist, wird er nicht in das input feld eingeschleust, sonst schon * @return Die eingegebene Dauer */ - private double dauerInput(String content){ + private double dauerInput(double content){ + String realcontent = ""; + if (content != -1){ + realcontent = content + ""; + } return AlertHelper.inputNumber(ConfigHelper.getLangIniString("dauer"), ConfigHelper.getLangIniString("dauermsg"), ConfigHelper.getLangIniString("dauer") + - ConfigHelper.getLangIniString("doppelpunkt"), content); + ConfigHelper.getLangIniString("doppelpunkt"), realcontent); } /** @@ -235,6 +255,38 @@ public class ViewModel { return neuesDatum; } + /** + * Bemerkung input, darf auch leer bleiben + * @param content Startwert im Input feld + * @return True bei erfolg, wenn es abgebrochen wird ist es false + */ + private boolean bemerkungInput(String content){ + this.neueBemerkung = AlertHelper.inputTextNotNull(ConfigHelper.getLangIniString("bemerkung"), + ConfigHelper.getLangIniString("bemerkungheader"), + ConfigHelper.getLangIniString("bemerkung")+ + ConfigHelper.getLangIniString("doppelpunkt"), content, false); + return !(this.neueBemerkung == null); + } + + private double hightmeterInput(String content) { + return AlertHelper.inputNumber(ConfigHelper.getLangIniString("hightmeter"), + ConfigHelper.getLangIniString("hightmetermsg"), + ConfigHelper.getLangIniString("hightmeter") + + ConfigHelper.getLangIniString("doppelpunkt"), content); + } + + /** + * Pause eingabe bis diese Korrekt ist + * @param content Default value für das Input Feld + * @return -1 bei error + */ + private double pauseInput(String content){ + return AlertHelper.inputNumber(ConfigHelper.getLangIniString("pause"), + ConfigHelper.getLangIniString("pausemsg"), + ConfigHelper.getLangIniString("pause") + + ConfigHelper.getLangIniString("doppelpunkt"), content); + } + /** * Fügt einen Log eintrag zu einer Tour hinzu. * Ist keine Tour ausgewählt, dann kommt eine Warnung an den User! @@ -250,22 +302,33 @@ public class ViewModel { newId.set(UUID.randomUUID().toString()); } }); - double dauer = dauerInput(""); - double strecke; + double dauer = dauerInput(-1.0); + double strecke, pause, hightmeter; + boolean bemerkung = false; LocalDate date = null; if(dauer >= 0) { strecke = streckeInput(""); if (strecke >= 0.0) { - date = dateInput(LocalDate.now()); - if (date != null){ - Log newLog = new Log(newId.get(), dauer + "", date, strecke); - this.logData.add(newLog); - s.addLog(newLog); + pause = pauseInput(""); + if(pause >= 0.0) { + hightmeter = hightmeterInput(""); + if (hightmeter >= 0.0) { + bemerkung = bemerkungInput(""); + if (bemerkung){ + date = dateInput(LocalDate.now()); + if (date != null) { + Log newLog = new Log(newId.get(), dauer, date, strecke, this.neueBemerkung, hightmeter, pause); + this.logData.add(newLog); + s.addLog(newLog); + } + } } + } } } } }); + this.neueBemerkung = null; } } @@ -495,4 +558,24 @@ public class ViewModel { ConfigHelper.getLangIniString("fktnichtimplementiert"), ConfigHelper.getLangIniString("vergessenodernochnichtsoweit")); } + + /** + * Startet den Tour Report + */ + public void tourReport() { + if (this.selectedTour == null){ + AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), + ConfigHelper.getLangIniString("keinetourselected"), + ConfigHelper.getLangIniString("logtournotselectedmsg")); + }else { + try { + Reporter.createTourReport(this.selectedTour.getName()); + } catch (IOException e) { + LogHelper.error(e.getMessage(), e.getClass().getName()); + } catch (COSVisitorException e) { + LogHelper.error(e.getMessage(), e.getClass().getName()); + } + + } + } }