diff --git a/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java b/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java index c644865..ab76e34 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java @@ -31,6 +31,9 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Controller class for the CropDetail.fxml file + */ public class CropDetailController { private Crop crop; @@ -63,15 +66,9 @@ public class CropDetailController { @FXML private Label description_label; - @FXML - private Label location_label; - @FXML private Label light_label; - @FXML - private Button location_button; - @FXML private Label soil_label; @@ -106,15 +103,7 @@ public class CropDetailController { */ @FXML void setArea() throws IOException { - openTextFieldDialog("set Text Area", "Text Area", area_label.getText(), false); - } - - /** - * open dialog to set location - */ - @FXML - void setLocation() throws IOException { - openTextFieldDialog("set Location", "Location", location_label.getText(), true); + openTextFieldDialog(); } /** @@ -138,7 +127,6 @@ public class CropDetailController { imageView.setImage(plant.image()); } area_label.setText(String.valueOf(crop.getArea())); - location_label.setText(""); setTaskListProperty(crop); taskList_listView.itemsProperty().bind(taskListProperty); @@ -152,11 +140,13 @@ public class CropDetailController { } setIconToButton(addTask_button, "addIcon.png"); setIconToButton(area_button, "areaIcon.png"); - setIconToButton(location_button, "locationIcon.png"); setCellFactoryPests(); setCellFactoryTasks(); } + /** + * cell Factory for TaskListView + */ private void setCellFactoryTasks() { taskList_listView.setCellFactory(param -> new ListCell<>() { @Override @@ -174,6 +164,9 @@ public class CropDetailController { }); } + /** + * cell Factory for PestListView + */ private void setCellFactoryPests() { pests_listView.setCellFactory(param -> new ListCell<>() { @Override @@ -191,6 +184,10 @@ public class CropDetailController { }); } + /** + * update task list + * @param crop {@link Crop} that is selected + */ private void setTaskListProperty(Crop crop) { crop.getCropId().ifPresent(id -> { List taskList; @@ -205,6 +202,11 @@ public class CropDetailController { }); } + /** + * Creates a {@link HBox} for the given {@link Task}. + * @param task {@link Task} which is selected + * @return {@link HBox} that was created + */ private HBox createTaskHBox(Task task) { HBox hBox = new HBox(10); Label taskName = new Label(task.getName()+": "); @@ -231,6 +233,11 @@ public class CropDetailController { return hBox; } + /** + * Creates a {@link HBox} for the given {@link Pest}. + * @param pest {@link Pest} which is selected + * @return {@link HBox} that was created + */ private HBox createPestHBox(Pest pest) { Label label = new Label(pest.name() + ": "); label.setStyle("-fx-font-weight: bold"); @@ -239,12 +246,8 @@ public class CropDetailController { Label description = new Label(pest.description()); description.setAlignment(Pos.TOP_LEFT); description.setWrapText(true); - description.setMaxWidth(600); - Pane puffer = new Pane(); - HBox.setHgrow(puffer, Priority.ALWAYS); - Button button = new Button("Get Counter Measures"); - HBox.setHgrow(button, Priority.NEVER); - hBox.getChildren().addAll(label, description, puffer, button); + description.setMaxWidth(800); + hBox.getChildren().addAll(label, description); return hBox; } @@ -261,6 +264,11 @@ public class CropDetailController { button.setGraphic(imageView); } + /** + * opens dialog of {@link Task} edit. + * @param task {@link Task} + * @return {@link EventHandler} for the case of editing a {@link Task} + */ private EventHandler getEditTaskEvent(Task task) { return (event) -> { try { @@ -271,12 +279,24 @@ public class CropDetailController { }; } + /** + * opens alert of {@link Task} deletion. + * @param task {@link Task} + * @return {@link EventHandler} for the case of deleting a {@link Task} + */ private EventHandler deleteTask(Task task) { return (event) -> { showDeleteTask(task); }; } + /** + * opens a dialog to create a new Task or edit the given Task + * @param newTask boolean if it is a new Task + * @param givenTask {@link Task} which was selected + * @throws IOException Exception + * @throws HardinessZoneNotSetException Exception + */ private void createTaskDialog(boolean newTask, Task givenTask) throws IOException, HardinessZoneNotSetException { Dialog dialog = new Dialog<>(); dialog.setTitle("Set Task"); @@ -319,10 +339,14 @@ public class CropDetailController { } - private void openTextFieldDialog(String title, String labelDescription, String value, boolean isLocation) throws IOException { + /** + * opens TextField Dialog to enter the plant area. + * @throws IOException Exception + */ + private void openTextFieldDialog() throws IOException { Dialog dialog = new Dialog<>(); - dialog.setTitle(title); - dialog.setHeaderText(title); + dialog.setTitle("set Text Area"); + dialog.setHeaderText("set Text Area"); dialog.setResizable(false); DialogPane dialogPane = dialog.getDialogPane(); @@ -331,30 +355,28 @@ public class CropDetailController { dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL); if (appLoader.loadPaneToDialog("TextFieldFormular.fxml", dialogPane) instanceof TextFieldFormularController controller) { - controller.setDescription_label(labelDescription); - controller.setValueTextArea(value); + controller.setDescription_label("Text Area"); + controller.setValueTextArea(area_label.getText()); controller.initSaveButton((Button) dialogPane.lookupButton(save)); dialog.setResultConverter(button -> button.equals(save) ? controller.getValue() : null); dialog.showAndWait() .ifPresent(string -> { - if (isLocation) { - System.out.println(string); - //ToDo method to set location - location_label.setText(string); - } else { - try { - garden.updateCrop(this.crop.withArea(Double.parseDouble(string))); - } catch (IOException e) { - e.printStackTrace(); - } - area_label.setText(string); + try { + garden.updateCrop(this.crop.withArea(Double.parseDouble(string))); + } catch (IOException e) { + e.printStackTrace(); } + area_label.setText(string); }); } } + /** + * Alert to delete Task. + * @param task {@link Task} which is being deleted + */ private void showDeleteTask(Task task) { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Delete " + task.getName()); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/HomeController.java b/src/main/java/ch/zhaw/gartenverwaltung/HomeController.java index 5c9014c..cccaa3a 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/HomeController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/HomeController.java @@ -8,6 +8,9 @@ import javafx.scene.image.ImageView; import java.net.URL; import java.util.ResourceBundle; +/** + * Controller class for the Home.fxml file + */ public class HomeController implements Initializable { @FXML @@ -34,6 +37,11 @@ public class HomeController implements Initializable { setImages(imageViewPhilippe, ""); } + /** + * set image to image view + * @param imageView the imageView to update + * @param photoName the file name of the photo + */ private void setImages(ImageView imageView, String photoName) { Image img; if (photoName.equals("")) { diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java index 33a67c5..9877d22 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java @@ -19,6 +19,9 @@ import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Controller class for the MainFXML.fxml file + */ public class MainFXMLController { private static final Logger LOG = Logger.getLogger(MainFXMLController.class.getName()); @@ -176,6 +179,10 @@ public class MainFXMLController { tutorial_button.visibleProperty().bind(Settings.getInstance().getShowTutorialProperty()); } + /** + * close Tutorial Window + * @param windowEvent event + */ private void closeWindowHandler(WindowEvent windowEvent) { tutorialModal.close(); } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java b/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java index 34cf1a7..49fc9a0 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java @@ -27,6 +27,9 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Controller class for the MyGarden.fxml file + */ public class MyGardenController { private static final Logger LOG = Logger.getLogger(MyGardenController.class.getName()); @Inject diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MyScheduleController.java b/src/main/java/ch/zhaw/gartenverwaltung/MyScheduleController.java index f73feb2..768b3aa 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MyScheduleController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MyScheduleController.java @@ -12,6 +12,8 @@ import ch.zhaw.gartenverwaltung.types.Task; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleListProperty; import javafx.collections.FXCollections; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.HBox; @@ -25,6 +27,9 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Controller class for the MySchedule.fxml file + */ public class MyScheduleController { private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName()); private final ListProperty> taskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList()); @@ -63,6 +68,9 @@ public class MyScheduleController { } } + /** + * sort scheduler to selected crop + */ private void lookForSelectedListEntries() { scheduledPlants_listview.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { selectedCrop = newValue; @@ -74,6 +82,9 @@ public class MyScheduleController { }); } + /** + * set cellFactory for the crops. + */ private void setCellFactoryCropListView() { scheduledPlants_listview.setCellFactory(param -> new ListCell<>() { @Override @@ -96,6 +107,9 @@ public class MyScheduleController { }); } + /** + * set CallFactory for the given Tasks + */ private void setCellFactoryTaskListView() { week_listView.setCellFactory(param -> new ListCell<>() { @Override @@ -113,6 +127,10 @@ public class MyScheduleController { }); } + /** + * update task list + * @throws IOException exception + */ private void loadTaskList() throws IOException { List> taskLists; if (selectedCrop != null) { @@ -124,6 +142,12 @@ public class MyScheduleController { taskListProperty.addAll(taskLists); } + /** + * Create a {@link VBox} of the given TaskList. + * @param tasks List of {@link Task}s + * @param dayIndex index of the day + * @return {@link VBox} of the given Task of the day + */ private VBox weekTaskVBox(List tasks, int dayIndex) { VBox vBox = new VBox(10); LocalDate today = LocalDate.now(); @@ -144,14 +168,15 @@ public class MyScheduleController { taskDescription.setMaxSize(600, Double.MAX_VALUE); Pane puffer = new Pane(); HBox.setHgrow(puffer, Priority.ALWAYS); - CheckBox checkBox = new CheckBox("Task completed?"); - checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> { - if (newValue) { - showConfirmation(task, checkBox); + Button button = new Button("Task completed!"); + button.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + showConfirmation(task); } }); - HBox.setHgrow(checkBox, Priority.NEVER); - hBoxDescription.getChildren().addAll(taskDescription, puffer, checkBox); + HBox.setHgrow(button, Priority.NEVER); + hBoxDescription.getChildren().addAll(taskDescription, puffer, button); vBox.getChildren().addAll(hBox, hBoxDescription); } return vBox; @@ -161,7 +186,7 @@ public class MyScheduleController { * Alert to confirm that task has been completed. * @param task {@link Task} which is selected */ - private void showConfirmation(Task task, CheckBox checkBox) { + private void showConfirmation(Task task) { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Task Completed?"); alert.setHeaderText("Are you sure you have completed this task?"); @@ -176,8 +201,6 @@ public class MyScheduleController { } catch (IOException e) { e.printStackTrace(); } - } else { - checkBox.setSelected(false); } }); } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java b/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java index 2acee0d..cc8e997 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java @@ -28,6 +28,9 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +/** + * Controller class for the Plants.fxml file + */ public class PlantsController { private static final Logger LOG = Logger.getLogger(PlantsController.class.getName()); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/SelectSowDayController.java b/src/main/java/ch/zhaw/gartenverwaltung/SelectSowDayController.java index c6ff944..a26246c 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/SelectSowDayController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/SelectSowDayController.java @@ -8,6 +8,10 @@ import javafx.util.Callback; import java.time.LocalDate; +/** + * Controller class for the SelectSowDay.fxml file + * Gets opened with a dialog. + */ public class SelectSowDayController { private Plant selectedPlant; diff --git a/src/main/java/ch/zhaw/gartenverwaltung/Settings.java b/src/main/java/ch/zhaw/gartenverwaltung/Settings.java index 462237c..8433dce 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/Settings.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/Settings.java @@ -19,6 +19,8 @@ public class Settings { private String mailNotificationSubjectTemplate = "Task %s is due!"; // {0} = Task Name private String mailNotificationTextTemplate = "Dear user\nYour gardentask %s for plant %s is due at %tF. Don't forget to confirm in your application if the task is done.\nTask description:\n%s"; // {0} = Task Name, {1} = plantname, {2} = nextExecution, {3} = Task description + private String location = ""; + static { instance = new Settings(); } @@ -49,6 +51,14 @@ public class Settings { return this.showTutorial.get(); } + public void setLocation(String location) { + this.location = location; + } + + public String getLocation() { + return this.location; + } + public SmtpCredentials getSmtpCredentials() { return smtpCredentials; } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java b/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java index 9a8158f..e9301e2 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java @@ -1,23 +1,49 @@ package ch.zhaw.gartenverwaltung; +import ch.zhaw.gartenverwaltung.bootstrap.AppLoader; +import ch.zhaw.gartenverwaltung.bootstrap.Inject; import ch.zhaw.gartenverwaltung.types.HardinessZone; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ComboBox; +import javafx.scene.control.*; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; +/** + * Controller class for the Settings.fxml file + */ public class SettingsController implements Initializable { Settings settings = Settings.getInstance(); + @Inject + AppLoader appLoader; @FXML private ComboBox selectHardinessZone_comboBox; @FXML private CheckBox showTutorial_checkBox; + @FXML + private Button location_button; + + @FXML + private Label location_label; + + /** + * open dialog to set location + * @param event event + * @throws IOException exception + */ + @FXML + void setLocation(ActionEvent event) throws IOException { + openTextFieldDialog(); + } + /** * save selected values to {@link Settings} */ @@ -36,5 +62,50 @@ public class SettingsController implements Initializable { showTutorial_checkBox.setSelected(settings.getShowTutorial()); selectHardinessZone_comboBox.getItems().addAll(HardinessZone.values()); selectHardinessZone_comboBox.setValue(settings.getCurrentHardinessZone()); + setIconToButton(location_button, "locationIcon.png"); + location_label.setText(settings.getLocation()); + } + + /** + * adds icon to button + * @param button the button which get the icon + * @param iconFileName file name of icon + */ + private void setIconToButton(Button button, String iconFileName) { + Image img = new Image(String.valueOf(getClass().getResource("icons/" + iconFileName))); + ImageView imageView = new ImageView(img); + imageView.setFitHeight(20); + imageView.setPreserveRatio(true); + button.setGraphic(imageView); + } + + /** + * opens Dialog to set exception + * @throws IOException exception + */ + private void openTextFieldDialog() throws IOException { + Dialog dialog = new Dialog<>(); + dialog.setTitle("Set Location of your Garden"); + dialog.setHeaderText("set Location of your Garden!"); + dialog.setResizable(false); + + DialogPane dialogPane = dialog.getDialogPane(); + + ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE); + dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL); + + if (appLoader.loadPaneToDialog("TextFieldFormular.fxml", dialogPane) instanceof TextFieldFormularController controller) { + controller.setDescription_label("Set"); + controller.setValueTextArea(settings.getLocation()); + controller.initSaveButton((Button) dialogPane.lookupButton(save)); + + dialog.setResultConverter(button -> button.equals(save) ? controller.getValue() : null); + + dialog.showAndWait() + .ifPresent(string -> { + settings.setLocation(string); + location_label.setText(settings.getLocation()); + }); + } } } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/TaskFormularController.java b/src/main/java/ch/zhaw/gartenverwaltung/TaskFormularController.java index b4bb93b..2344995 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/TaskFormularController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/TaskFormularController.java @@ -19,6 +19,9 @@ import java.net.URL; import java.time.LocalDate; import java.util.ResourceBundle; +/** + * Controller class for the TaskFormular.fxml file + */ public class TaskFormularController implements Initializable { private Crop crop; private Plant plant; @@ -49,6 +52,11 @@ public class TaskFormularController implements Initializable { @AfterInject @SuppressWarnings("unused") + /** + * returns the edited or added {@link Task} + * @param crop {@link Crop} which was selected + * @return {@link Task} which was edited or added + */ public Task returnResult(Crop crop) { int interval = 0; if (!(interval_field.getText().isEmpty() || interval_field.getText().equals(""))) { @@ -61,11 +69,21 @@ public class TaskFormularController implements Initializable { return task; } + /** + * set selected crop and get the plant from the crop. + * @param crop {@link Crop} which was selected + * @throws HardinessZoneNotSetException exception + * @throws IOException exception + */ public void setCorp(Crop crop) throws HardinessZoneNotSetException, IOException { this.crop = crop; this.plant = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get(); } + /** + * set the values of task into the labels and datePicker. + * @param task {@link Task} which was given + */ public void setTaskValue(Task task) { this.task = task; taskName_field.setText(task.getName()); @@ -79,6 +97,10 @@ public class TaskFormularController implements Initializable { } } + /** + * dayCellFactory of the start date + * @return {@link Callback} of the dayCellFactory + */ private Callback getDayCellFactoryStartDate() { return (datePicker) -> new DateCell() { @@ -103,6 +125,10 @@ public class TaskFormularController implements Initializable { }; } + /** + * dayCellFactory of the end date + * @return {@link Callback} of the dayCellFactory + */ private Callback getDayCellFactoryEndDate() { return (datePicker) -> new DateCell() { @@ -127,6 +153,10 @@ public class TaskFormularController implements Initializable { }; } + /** + * disable button until condition meet. + * @param button {@link Button} which was given + */ public void initSaveButton(Button button) { interval_field.textProperty().addListener((observable, oldValue, newValue) -> { if (!newValue.matches("\\d*")) { @@ -139,6 +169,16 @@ public class TaskFormularController implements Initializable { .or(description_area.textProperty().isEmpty())); } + /** + * initialize dayCellFactories + * @param location + * The location used to resolve relative paths for the root object, or + * {@code null} if the location is not known. + * + * @param resources + * The resources used to localize the root object, or {@code null} if + * the root object was not localized. + */ @Override public void initialize(URL location, ResourceBundle resources) { start_datePicker.setDayCellFactory(getDayCellFactoryStartDate()); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/TextFieldFormularController.java b/src/main/java/ch/zhaw/gartenverwaltung/TextFieldFormularController.java index 97742d9..f045ae5 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/TextFieldFormularController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/TextFieldFormularController.java @@ -5,6 +5,9 @@ import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; +/** + * Controller class for the TexFieldFormular.fxml file + */ public class TextFieldFormularController { @FXML @@ -14,18 +17,34 @@ public class TextFieldFormularController { private TextField text_area; + /** + * set description label + * @param string string of the description + */ public void setDescription_label(String string) { description_label.setText(string); } + /** + * set text area value + * @param string string of text area value + */ public void setValueTextArea(String string) { text_area.setText(string); } + /** + * return value of text area + * @return string of the tex area + */ public String getValue() { return text_area.getText(); } + /** + * Disable Button until condition meet + * @param button {@link Button} which is gets dissabled + */ public void initSaveButton(Button button) { text_area.textProperty().addListener((observable, oldValue, newValue) -> { if (newValue.matches("\\d*\\.?\\d*")) { diff --git a/src/main/java/ch/zhaw/gartenverwaltung/TutorialController.java b/src/main/java/ch/zhaw/gartenverwaltung/TutorialController.java index a1de10b..eb4ad5d 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/TutorialController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/TutorialController.java @@ -8,6 +8,9 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.stage.Stage; +/** + * Controller class for the Tutorial.fxml file + */ public class TutorialController { @FXML @@ -44,16 +47,25 @@ public class TutorialController { setButtonAbilities(); } + /** + * disable next or close button according to the location of button + */ private void setButtonAbilities() { previousPageButton.setDisable(page <= 0); nextPageButton.setDisable(page >= tourPages.getChildren().size() - 1); } + /** + * switch to next view + */ private void switchViews() { tourPages.getChildren().forEach(node -> node.setOpacity(0)); tourPages.getChildren().get(page).setOpacity(1); } + /** + * close Tutorial + */ public void closeTutorial() { Stage root = (Stage) tourPages.getScene().getWindow(); root.close(); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java index 5b1cb96..8183afb 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java @@ -71,7 +71,7 @@ public class JsonTaskList implements TaskList { if(taskMap.isEmpty()) { loadTaskListFromFile(); } - return taskMap.values().stream().filter(task -> task.isInTimePeriode(start, end)).toList(); + return taskMap.values().stream().filter(task -> task.isInTimePeriod(start, end)).toList(); } /** diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Crop.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Crop.java index 58cd453..e5ea19b 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/Crop.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Crop.java @@ -1,12 +1,12 @@ package ch.zhaw.gartenverwaltung.types; -import ch.zhaw.gartenverwaltung.io.JsonPlantList; -import ch.zhaw.gartenverwaltung.io.PlantList; - import java.time.LocalDate; import java.util.Objects; import java.util.Optional; +/** + * Represents a crop, meaning a specific plant growing at a specific time. + */ public class Crop { private Long cropId = null; private final long plantId; diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhase.java b/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhase.java index 6efcc44..c5c80cd 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhase.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhase.java @@ -7,7 +7,19 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.MonthDay; import java.util.List; - +/** + * Represents a growth phase of a plant. + * Plants go through several phases during their life (sowing, germinating, growing, ..., harvest). + * These phases are characterized by what kinds of tasks need to be executed by the gardener to stay alive. + * This class represents one such phase. + * + * @param startDate The earliest date on which this phase can start + * @param endDate The latest date on which this phase can start + * @param group Which group this phase belongs to (if the growth phase can occur multiple times a year, default: 0) + * @param type What {@link GrowthPhaseType} this represents + * @param zone The hardiness zone for which this growth phase is valid + * @param taskTemplates The (undated) tasks required to be performed by the gardener + */ public record GrowthPhase( MonthDay startDate, MonthDay endDate, diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhaseType.java b/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhaseType.java index 96609cc..4a3ef38 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhaseType.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/GrowthPhaseType.java @@ -1,5 +1,9 @@ package ch.zhaw.gartenverwaltung.types; +/** + * Enumerates the different possible types of {@link GrowthPhase}. + * (Subject to later expansion) + */ public enum GrowthPhaseType { SOW, PLANT, REPLANT, HARVEST } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Pest.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Pest.java index cfbcb81..a1dbc2d 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/Pest.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Pest.java @@ -1,4 +1,11 @@ package ch.zhaw.gartenverwaltung.types; +/** + * Represents a pest or pathogen which may afflict a plant. + * + * @param name The name of the pest + * @param description A description of the pest + * @param measures Measures that can be taken against the pest. + */ public record Pest(String name, String description, String measures) { } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Plant.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Plant.java index d602f51..dd92412 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/Plant.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Plant.java @@ -9,6 +9,20 @@ import java.util.stream.Collectors; import static java.time.temporal.ChronoUnit.DAYS; +/** + * Represents a plant + * + * @param id A unique identifier + * @param name The name of the plant + * @param description A description of the plant + * @param image An image representing the plant + * @param spacing The amount of space needed between individual plants of this type + * @param light The amount of light preferred by the plant (h/d) + * @param soil The type of soil required for the plant + * @param pests {@link Pest}s that may afflict the plant + * @param wateringCycle The {@link WateringCycle} required by the plant + * @param lifecycle A list of {@link GrowthPhase}s constituting the plants lifecycle + */ public record Plant( long id, String name, @@ -30,9 +44,10 @@ public record Plant( } /** - * get all growthPhases of lifecycle group - * @param group lifecycle group - * @return list of growthPhases + * Get all {@link GrowthPhase}s of a lifecycle group + * + * @param group The lifecycle group + * @return A list of {@link GrowthPhase}s */ public List lifecycleForGroup(int group) { return lifecycle.stream() @@ -40,6 +55,12 @@ public record Plant( .collect(Collectors.toList()); } + /** + * Given a {@link LocalDate}, determines which lifecycle group contains it. + * + * @param date The date to look for + * @return Which lifecycle group the date is in + */ public int getGrowphaseGroupForDate(LocalDate date) { for(GrowthPhase growthPhase : lifecycle){ MonthDay plantingDate = MonthDay.of(date.getMonth().getValue(), date.getDayOfMonth()); @@ -51,16 +72,18 @@ public record Plant( } /** - * get sow date from given harvest day from lifecycle group + * Get sow date from given harvest date from lifecycle group + * * @param harvestDate date of the harvest - * @return LocaleDate of sow date + * @return {@link LocalDate} of sow date */ public LocalDate sowDateFromHarvestDate(LocalDate harvestDate) { return harvestDate.minusDays(timeToHarvest(lifecycleGroupFromHarvestDate(harvestDate))); } /** - * calculate the days between sow and harvest day for lifecycle group + * Calculate the number of days between sow and harvest date for lifecycle group + * * @param group the lifecycle group * @return Integer number of dates between sow and harvest day */ @@ -79,6 +102,12 @@ public record Plant( return (int) DAYS.between(sow.startDate().atYear(currentYear),harvest.startDate().atYear(currentYear)); } + /** + * Given a harvest date, determines which lifecycle group it belongs to. + * + * @param harvestDate The harvest date + * @return Which lifecycle group the harvest date is in + */ public int lifecycleGroupFromHarvestDate(LocalDate harvestDate) { return lifecycle.stream() .filter(growthPhase -> growthPhase.type().equals(GrowthPhaseType.HARVEST) && diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java index fd2601c..311c078 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java @@ -2,6 +2,10 @@ package ch.zhaw.gartenverwaltung.types; import java.time.MonthDay; +/** + * Describes the 4 Seasons in terms of {@link java.time.LocalDate}s + * Also describes "All Seasons" as the full year. + */ public enum Seasons { ALLSEASONS("--01-01", "--12-31", "All Seasons"), SPRING("--03-01", "--05-30", "Spring"), diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Task.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Task.java index 204ca22..7b8a78e 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/Task.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Task.java @@ -1,11 +1,10 @@ package ch.zhaw.gartenverwaltung.types; - import java.time.LocalDate; import java.util.Optional; /** - * Models a Task + * Represents a Task * May be created using the builder pattern. */ public class Task { @@ -18,10 +17,9 @@ public class Task { private LocalDate nextExecution; private LocalDate nextNotification; private long cropId; - private boolean done; /** - * default constructor + * Default constructor * (used by Json deserializer) */ public Task(){ @@ -32,6 +30,14 @@ public class Task { nextExecution = startDate; } + /** + * Constructor for a non-repeating task related to a {@link Crop} + * + * @param name The name of the task + * @param description A description of the task + * @param startDate The start date of the task + * @param cropId The id of the crop to which the task belongs + */ public Task(String name, String description, LocalDate startDate, long cropId) { this.name = name; this.description = description; @@ -43,7 +49,12 @@ public class Task { /** * Constructor for weather events - */ + * + * @param name The name of the task + * @param description A description of the task + * @param startDate The start date of the task + * @param endDate The maximum date on which the task should be executed + */ public Task(String name, String description, LocalDate startDate, LocalDate endDate, long cropId) { this.name = name; this.description = description; @@ -52,6 +63,16 @@ public class Task { this.endDate = endDate; } + /** + * Full constructor (without id) + * + * @param name The name of the task + * @param description A description of the task + * @param startDate The start date of the task + * @param endDate The maximum date on which the task should be executed + * @param interval The number of days between executions + * @param cropId The id of the crop to which the task belongs + */ public Task(String name, String description, LocalDate startDate, LocalDate endDate, int interval, long cropId) { this.name = name; this.description = description; @@ -76,10 +97,20 @@ public class Task { return this; } - public boolean isInTimePeriode(LocalDate searchStartDate, LocalDate searchEndDate){ + /** + * Checks if the Task is within a specific date range. + * + * @param searchStartDate The minimum date + * @param searchEndDate The maximum date + * @return Whether the Task is within the given range + */ + public boolean isInTimePeriod(LocalDate searchStartDate, LocalDate searchEndDate) { return endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate); } + /** + * Marks a specific execution of a Task as done. + */ public void done(){ if(interval != null && interval != 0 && !nextExecution.plusDays(interval).isAfter(endDate)){ nextExecution = nextExecution.plusDays(interval); @@ -118,6 +149,12 @@ public class Task { return Optional.ofNullable(endDate); } + /** + * Updates the fields of this Task using the values of the given Task + * + * @param task The task whose fields to copy + * @return This task with the fields already updated + */ public Task updateTask(Task task) { this.name = task.getName(); this.description = task.getDescription(); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/TaskTemplate.java b/src/main/java/ch/zhaw/gartenverwaltung/types/TaskTemplate.java index 39e349f..6e5fc7a 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/TaskTemplate.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/TaskTemplate.java @@ -41,6 +41,13 @@ public class TaskTemplate { this.relativeStartDate = relativeStartDate; } + /** + * Create a concrete {@link Task} given a concrete start date + * + * @param realStartDate The start date of the {@link GrowthPhase} to which the {@link #relativeStartDate} is relative. + * @param cropId The crop for which the task should be generated. + * @return The created {@link Task} + */ public Task generateTask(LocalDate realStartDate, long cropId) { LocalDate endDate = relativeEndDate != null ? realStartDate.plusDays(relativeEndDate) : realStartDate; diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/WateringCycle.java b/src/main/java/ch/zhaw/gartenverwaltung/types/WateringCycle.java index 9d7c7d0..5ac9778 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/types/WateringCycle.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/WateringCycle.java @@ -1,5 +1,12 @@ package ch.zhaw.gartenverwaltung.types; +/** + * Describes the cycle in which a {@link Plant} should be watered + * + * @param litersPerSqM How many litres of water per square metre of ground + * @param interval The interval (days) + * @param notes Notes on the cycle + */ public record WateringCycle( int litersPerSqM, int interval, diff --git a/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml b/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml index 1ee27fb..86303a7 100644 --- a/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml +++ b/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml @@ -15,12 +15,9 @@ - + - - - - + - + + + diff --git a/src/main/resources/ch/zhaw/gartenverwaltung/MySchedule.fxml b/src/main/resources/ch/zhaw/gartenverwaltung/MySchedule.fxml index d09db93..1e31955 100644 --- a/src/main/resources/ch/zhaw/gartenverwaltung/MySchedule.fxml +++ b/src/main/resources/ch/zhaw/gartenverwaltung/MySchedule.fxml @@ -5,46 +5,56 @@ - - - + - - - - - + + - - - - + + + + - + - - - - - - + - + - + + + + diff --git a/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml b/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml index 39303a0..24c5d4b 100644 --- a/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml +++ b/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml @@ -4,91 +4,109 @@ - + - + - - - + + + + - + - - - + - - + + + + + + + + + + + + + + + +