Compare commits
No commits in common. "3bda390708a038c44df9bacbf689655c47236cef" and "c9baf4dfb1dff3c2ec0548e57315ad9d7cd1f31f" have entirely different histories.
3bda390708
...
c9baf4dfb1
|
@ -3,7 +3,6 @@ package ch.zhaw.gartenverwaltung;
|
||||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||||
import ch.zhaw.gartenverwaltung.io.PlantList;
|
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||||
import ch.zhaw.gartenverwaltung.io.TaskList;
|
|
||||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||||
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||||
|
@ -29,7 +28,6 @@ import javafx.stage.Stage;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
@ -130,14 +128,7 @@ public class CropDetailController {
|
||||||
}
|
}
|
||||||
area_label.setText(String.valueOf(crop.getArea()));
|
area_label.setText(String.valueOf(crop.getArea()));
|
||||||
|
|
||||||
initializeTaskListProperty(crop);
|
setTaskListProperty(crop);
|
||||||
|
|
||||||
TaskList.TaskListObserver taskListObserver = newTaskList -> {
|
|
||||||
taskListProperty.clear();
|
|
||||||
taskListProperty.addAll(gardenSchedule.getTaskListForCrop(crop.getCropId().get()));
|
|
||||||
};
|
|
||||||
gardenSchedule.setTaskListObserver(taskListObserver);
|
|
||||||
|
|
||||||
taskList_listView.itemsProperty().bind(taskListProperty);
|
taskList_listView.itemsProperty().bind(taskListProperty);
|
||||||
|
|
||||||
pestListProperty.addAll(plant.pests());
|
pestListProperty.addAll(plant.pests());
|
||||||
|
@ -194,10 +185,10 @@ public class CropDetailController {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initialize task list
|
* update task list
|
||||||
* @param crop {@link Crop} that is selected
|
* @param crop {@link Crop} that is selected
|
||||||
*/
|
*/
|
||||||
private void initializeTaskListProperty(Crop crop) {
|
private void setTaskListProperty(Crop crop) {
|
||||||
crop.getCropId().ifPresent(id -> {
|
crop.getCropId().ifPresent(id -> {
|
||||||
List<Task> taskList;
|
List<Task> taskList;
|
||||||
try {
|
try {
|
||||||
|
@ -231,8 +222,6 @@ public class CropDetailController {
|
||||||
|
|
||||||
Button edit = new Button();
|
Button edit = new Button();
|
||||||
Button delete = new Button();
|
Button delete = new Button();
|
||||||
edit.getStyleClass().add("button-class");
|
|
||||||
delete.getStyleClass().add("button-class");
|
|
||||||
HBox.setHgrow(edit, Priority.NEVER);
|
HBox.setHgrow(edit, Priority.NEVER);
|
||||||
HBox.setHgrow(delete, Priority.NEVER);
|
HBox.setHgrow(delete, Priority.NEVER);
|
||||||
setIconToButton(edit, "editIcon.png");
|
setIconToButton(edit, "editIcon.png");
|
||||||
|
@ -316,10 +305,6 @@ public class CropDetailController {
|
||||||
|
|
||||||
DialogPane dialogPane = dialog.getDialogPane();
|
DialogPane dialogPane = dialog.getDialogPane();
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
ButtonType saveTask;
|
ButtonType saveTask;
|
||||||
if(newTask) {
|
if(newTask) {
|
||||||
saveTask = new ButtonType("Add", ButtonBar.ButtonData.OK_DONE);
|
saveTask = new ButtonType("Add", ButtonBar.ButtonData.OK_DONE);
|
||||||
|
@ -341,15 +326,13 @@ public class CropDetailController {
|
||||||
if (newTask) {
|
if (newTask) {
|
||||||
try {
|
try {
|
||||||
gardenSchedule.addTask(task);
|
gardenSchedule.addTask(task);
|
||||||
|
setTaskListProperty(this.crop);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
//ToDo method to edit task
|
||||||
gardenSchedule.addTask(givenTask.updateTask(task));
|
setTaskListProperty(this.crop);
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -368,10 +351,6 @@ public class CropDetailController {
|
||||||
|
|
||||||
DialogPane dialogPane = dialog.getDialogPane();
|
DialogPane dialogPane = dialog.getDialogPane();
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
||||||
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
|
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
|
||||||
|
|
||||||
|
@ -403,18 +382,12 @@ public class CropDetailController {
|
||||||
alert.setTitle("Delete " + task.getName());
|
alert.setTitle("Delete " + task.getName());
|
||||||
alert.setHeaderText("Are you sure want to delete this Task?");
|
alert.setHeaderText("Are you sure want to delete this Task?");
|
||||||
|
|
||||||
DialogPane dialogPane = alert.getDialogPane();
|
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
alert.showAndWait()
|
alert.showAndWait()
|
||||||
.ifPresent(buttonType -> {
|
.ifPresent(buttonType -> {
|
||||||
if (buttonType == ButtonType.OK) {
|
if (buttonType == ButtonType.OK) {
|
||||||
try {
|
try {
|
||||||
gardenSchedule.removeTask(task);
|
gardenSchedule.removeTask(task);
|
||||||
//setTaskListProperty(this.crop);
|
setTaskListProperty(this.crop);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// TODO: Show error alert
|
// TODO: Show error alert
|
||||||
LOG.log(Level.SEVERE, "Could not remove crop.", e);
|
LOG.log(Level.SEVERE, "Could not remove crop.", e);
|
||||||
|
|
|
@ -22,14 +22,13 @@ public class Main extends Application {
|
||||||
AppLoader appLoader = new AppLoader();
|
AppLoader appLoader = new AppLoader();
|
||||||
|
|
||||||
backgroundTasks = new BackgroundTasks((TaskList) appLoader.getAppDependency(TaskList.class),(CropList) appLoader.getAppDependency(CropList.class), (PlantList) appLoader.getAppDependency(PlantList.class));
|
backgroundTasks = new BackgroundTasks((TaskList) appLoader.getAppDependency(TaskList.class),(CropList) appLoader.getAppDependency(CropList.class), (PlantList) appLoader.getAppDependency(PlantList.class));
|
||||||
|
// TODO reduce period
|
||||||
|
backGroundTaskTimer.scheduleAtFixedRate(backgroundTasks, 0, 1000);
|
||||||
|
|
||||||
appLoader.loadSceneToStage("MainFXML.fxml", stage);
|
appLoader.loadSceneToStage("MainFXML.fxml", stage);
|
||||||
|
|
||||||
stage.setTitle("Gartenverwaltung");
|
stage.setTitle("Gartenverwaltung");
|
||||||
stage.show();
|
stage.show();
|
||||||
|
|
||||||
backGroundTaskTimer.scheduleAtFixedRate(backgroundTasks, 0, 60000);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,7 +16,6 @@ import javafx.stage.Stage;
|
||||||
import javafx.stage.WindowEvent;
|
import javafx.stage.WindowEvent;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
@ -90,10 +89,6 @@ public class MainFXMLController {
|
||||||
|
|
||||||
DialogPane dialogPane = dialog.getDialogPane();
|
DialogPane dialogPane = dialog.getDialogPane();
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
ButtonType saveSettings = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
ButtonType saveSettings = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
||||||
dialogPane.getButtonTypes().addAll(saveSettings, ButtonType.CANCEL);
|
dialogPane.getButtonTypes().addAll(saveSettings, ButtonType.CANCEL);
|
||||||
|
|
||||||
|
@ -161,12 +156,7 @@ public class MainFXMLController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void styleChangeButton(Button button) {
|
private void styleChangeButton(Button button) {
|
||||||
/*home_button.setStyle("-fx-background-color: rgb(0,128,0)");
|
//ToDo changeStyle of the menu buttons
|
||||||
myGarden_button.setStyle("-fx-background-color: rgb(0,128,0)");
|
|
||||||
mySchedule_button.setStyle("-fx-background-color: rgb(0,128,0)");
|
|
||||||
settings_button.setStyle("-fx-background-color: rgb(0,128,0)");
|
|
||||||
tutorial_button.setStyle("-fx-background-color: rgb(0,128,0)");
|
|
||||||
button.setStyle("-fx-background-color: darkgreen");*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -117,9 +117,6 @@ public class MyGardenController {
|
||||||
|
|
||||||
Button details = new Button();
|
Button details = new Button();
|
||||||
Button delete = new Button();
|
Button delete = new Button();
|
||||||
details.getStyleClass().add("button-class");
|
|
||||||
delete.getStyleClass().add("button-class");
|
|
||||||
|
|
||||||
setIconToButton(details, "detailsIcon.png");
|
setIconToButton(details, "detailsIcon.png");
|
||||||
setIconToButton(delete, "deleteIcon.png");
|
setIconToButton(delete, "deleteIcon.png");
|
||||||
details.setOnAction(getGoToCropDetailEvent(crop));
|
details.setOnAction(getGoToCropDetailEvent(crop));
|
||||||
|
@ -189,12 +186,6 @@ public class MyGardenController {
|
||||||
Plant plant = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get();
|
Plant plant = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get();
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||||
alert.setTitle("Delete " + plant.name());
|
alert.setTitle("Delete " + plant.name());
|
||||||
DialogPane dialogPane = alert.getDialogPane();
|
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
alert.setHeaderText("Are you sure want to delete this Crop?");
|
alert.setHeaderText("Are you sure want to delete this Crop?");
|
||||||
alert.setContentText("Deleting this crop will remove all associated tasks from your schedule.");
|
alert.setContentText("Deleting this crop will remove all associated tasks from your schedule.");
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.logging.Logger;
|
||||||
*/
|
*/
|
||||||
public class MyScheduleController {
|
public class MyScheduleController {
|
||||||
private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName());
|
private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName());
|
||||||
|
private final ListProperty<List<Task>> taskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
|
||||||
|
|
||||||
private Crop selectedCrop = null;
|
private Crop selectedCrop = null;
|
||||||
|
|
||||||
|
@ -57,10 +58,14 @@ public class MyScheduleController {
|
||||||
setCellFactoryCropListView();
|
setCellFactoryCropListView();
|
||||||
setCellFactoryTaskListView();
|
setCellFactoryTaskListView();
|
||||||
scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops());
|
scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops());
|
||||||
ListProperty<List<Task>> taskListProperty = gardenSchedule.getWeeklyTaskListProperty();
|
|
||||||
week_listView.itemsProperty().bind(taskListProperty);
|
week_listView.itemsProperty().bind(taskListProperty);
|
||||||
lookForSelectedListEntries();
|
lookForSelectedListEntries();
|
||||||
information_label.setText("");
|
information_label.setText("");
|
||||||
|
try {
|
||||||
|
loadTaskList();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,8 +117,8 @@ public class MyScheduleController {
|
||||||
super.updateItem(taskList, empty);
|
super.updateItem(taskList, empty);
|
||||||
|
|
||||||
if (empty || taskList == null) {
|
if (empty || taskList == null) {
|
||||||
setText(null);
|
|
||||||
setGraphic(null);
|
setGraphic(null);
|
||||||
|
setText(null);
|
||||||
} else {
|
} else {
|
||||||
setText("");
|
setText("");
|
||||||
setGraphic(weekTaskVBox(taskList, this.getIndex()));
|
setGraphic(weekTaskVBox(taskList, this.getIndex()));
|
||||||
|
@ -129,12 +134,12 @@ public class MyScheduleController {
|
||||||
private void loadTaskList() throws IOException {
|
private void loadTaskList() throws IOException {
|
||||||
List<List<Task>> taskLists;
|
List<List<Task>> taskLists;
|
||||||
if (selectedCrop != null) {
|
if (selectedCrop != null) {
|
||||||
gardenSchedule.getTasksUpcomingWeekForCrop(selectedCrop.getCropId().get());
|
taskLists = gardenSchedule.getTasksUpcomingWeekForCrop(selectedCrop.getCropId().get());
|
||||||
} else {
|
} else {
|
||||||
gardenSchedule.getTasksUpcomingWeek();
|
taskLists = gardenSchedule.getTasksUpcomingWeek();
|
||||||
}
|
}
|
||||||
//taskListProperty.clear();
|
taskListProperty.clear();
|
||||||
//taskListProperty.addAll(taskLists);
|
taskListProperty.addAll(taskLists);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -164,8 +169,6 @@ public class MyScheduleController {
|
||||||
Pane puffer = new Pane();
|
Pane puffer = new Pane();
|
||||||
HBox.setHgrow(puffer, Priority.ALWAYS);
|
HBox.setHgrow(puffer, Priority.ALWAYS);
|
||||||
Button button = new Button("Task completed!");
|
Button button = new Button("Task completed!");
|
||||||
button.getStyleClass().add("button-class");
|
|
||||||
|
|
||||||
button.setOnAction(new EventHandler<ActionEvent>() {
|
button.setOnAction(new EventHandler<ActionEvent>() {
|
||||||
@Override
|
@Override
|
||||||
public void handle(ActionEvent event) {
|
public void handle(ActionEvent event) {
|
||||||
|
|
|
@ -25,7 +25,6 @@ import javafx.scene.layout.VBox;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
@ -83,10 +82,6 @@ public class PlantsController {
|
||||||
|
|
||||||
DialogPane dialogPane = dateSelection.getDialogPane();
|
DialogPane dialogPane = dateSelection.getDialogPane();
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
ButtonType sowButton = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
ButtonType sowButton = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
||||||
dialogPane.getButtonTypes().addAll(sowButton, ButtonType.CANCEL);
|
dialogPane.getButtonTypes().addAll(sowButton, ButtonType.CANCEL);
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@ import javafx.scene.image.ImageView;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,10 +91,6 @@ public class SettingsController implements Initializable {
|
||||||
|
|
||||||
DialogPane dialogPane = dialog.getDialogPane();
|
DialogPane dialogPane = dialog.getDialogPane();
|
||||||
|
|
||||||
dialogPane.getStylesheets().add(
|
|
||||||
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
|
|
||||||
dialogPane.getStyleClass().add("myDialog");
|
|
||||||
|
|
||||||
ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
||||||
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
|
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ public class TaskFormularController implements Initializable {
|
||||||
*/
|
*/
|
||||||
public Task returnResult(Crop crop) {
|
public Task returnResult(Crop crop) {
|
||||||
int interval = 0;
|
int interval = 0;
|
||||||
if (interval_field.getText() != null && !(interval_field.getText().isEmpty() || interval_field.getText().equals(""))) {
|
if (!(interval_field.getText().isEmpty() || interval_field.getText().equals(""))) {
|
||||||
interval = Integer.parseInt(interval_field.getText());
|
interval = Integer.parseInt(interval_field.getText());
|
||||||
}
|
}
|
||||||
Task task = new Task(taskName_field.getText(), description_area.getText(),
|
Task task = new Task(taskName_field.getText(), description_area.getText(),
|
||||||
|
@ -159,7 +159,7 @@ public class TaskFormularController implements Initializable {
|
||||||
*/
|
*/
|
||||||
public void initSaveButton(Button button) {
|
public void initSaveButton(Button button) {
|
||||||
interval_field.textProperty().addListener((observable, oldValue, newValue) -> {
|
interval_field.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
if (newValue != null && !newValue.matches("\\d*")) {
|
if (!newValue.matches("\\d*")) {
|
||||||
interval_field.setText(newValue.replaceAll("[^\\d]", ""));
|
interval_field.setText(newValue.replaceAll("[^\\d]", ""));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -25,12 +25,11 @@ public class BackgroundTasks extends TimerTask {
|
||||||
|
|
||||||
private void movePastTasks() throws IOException {
|
private void movePastTasks() throws IOException {
|
||||||
List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1));
|
List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1));
|
||||||
for (Task task : taskList) {
|
taskList.forEach(task -> {
|
||||||
if (!task.isDone()) {
|
if (!task.isDone()) {
|
||||||
task.setNextExecution(LocalDate.now());
|
task.setNextExecution(LocalDate.now());
|
||||||
this.taskList.saveTask(task);
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
|
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
|
||||||
|
|
|
@ -9,12 +9,8 @@ import ch.zhaw.gartenverwaltung.types.*;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days
|
* The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days
|
||||||
*
|
*
|
||||||
|
@ -66,27 +62,11 @@ public class WeatherGradenTaskPlanner {
|
||||||
*/
|
*/
|
||||||
private void createPreHailTask() throws IOException {
|
private void createPreHailTask() throws IOException {
|
||||||
|
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
Task preHailTask = new Task("Hail",
|
||||||
|
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
||||||
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
|
taskList.saveTask(preHailTask);
|
||||||
|
|
||||||
for (Crop crop : actualCrops) {
|
|
||||||
Task preHailTask = new Task("Hail",
|
|
||||||
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
|
||||||
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
|
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> hailTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Hail")).toList();
|
|
||||||
|
|
||||||
List<Task> hailTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : hailTasklist) {
|
|
||||||
if (task.getStartDate() == (preHailTask.getStartDate())) {
|
|
||||||
hailTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hailTaskListAtDate.isEmpty() && hailTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preHailTask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -94,26 +74,10 @@ public class WeatherGradenTaskPlanner {
|
||||||
* @throws IOException If the database cannot be accessed
|
* @throws IOException If the database cannot be accessed
|
||||||
*/
|
*/
|
||||||
private void createPreFrostTask() throws IOException {
|
private void createPreFrostTask() throws IOException {
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
Task preFrostTask = new Task("Frost",
|
||||||
for (Crop crop : actualCrops) {
|
"The temperatur falls below zero degrees, cover especially the root with wool",
|
||||||
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
Task preFrostTask = new Task("Frost",
|
taskList.saveTask(preFrostTask);
|
||||||
"The temperatur falls below zero degrees, cover especially the root with wool",
|
|
||||||
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
|
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> frostTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Frost")).toList();
|
|
||||||
|
|
||||||
List<Task> frostTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : frostTasklist) {
|
|
||||||
if (task.getStartDate() == preFrostTask.getStartDate()) {
|
|
||||||
frostTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(frostTaskListAtDate.isEmpty() && frostTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preFrostTask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,27 +85,10 @@ public class WeatherGradenTaskPlanner {
|
||||||
* @throws IOException If the database cannot be accessed
|
* @throws IOException If the database cannot be accessed
|
||||||
*/
|
*/
|
||||||
private void createPreSnowTask() throws IOException {
|
private void createPreSnowTask() throws IOException {
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
Task preSnowTask = new Task("Snow",
|
||||||
for (Crop crop : actualCrops) {
|
"The weather brings little snowfall. Cover your crops",
|
||||||
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
Task preSnowTask = new Task("Snow",
|
taskList.saveTask(preSnowTask);
|
||||||
"The weather brings little snowfall. Cover your crops",
|
|
||||||
dateSevereWeather, dateSevereWeather.plusDays(1L), crop.getCropId().orElse(-1L));
|
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> snowTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Snow")).toList();
|
|
||||||
|
|
||||||
List<Task> snowTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : snowTasklist) {
|
|
||||||
if (task.getStartDate() == preSnowTask.getStartDate()) {
|
|
||||||
snowTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(snowTaskListAtDate .isEmpty() && snowTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preSnowTask);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -67,7 +67,7 @@ public class JsonTaskList implements TaskList {
|
||||||
* @see TaskList#getTaskList(LocalDate, LocalDate)
|
* @see TaskList#getTaskList(LocalDate, LocalDate)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public synchronized List<Task> getTaskList(LocalDate start, LocalDate end) throws IOException{
|
public List<Task> getTaskList(LocalDate start, LocalDate end) throws IOException{
|
||||||
if(taskMap.isEmpty()) {
|
if(taskMap.isEmpty()) {
|
||||||
loadTaskListFromFile();
|
loadTaskListFromFile();
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ public class JsonTaskList implements TaskList {
|
||||||
* @return List of Tasks for given Crop
|
* @return List of Tasks for given Crop
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public synchronized List<Task> getTaskForCrop(long cropId) throws IOException {
|
public List<Task> getTaskForCrop(long cropId) throws IOException {
|
||||||
if(taskMap.isEmpty()) {
|
if(taskMap.isEmpty()) {
|
||||||
loadTaskListFromFile();
|
loadTaskListFromFile();
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ public class JsonTaskList implements TaskList {
|
||||||
* @see TaskList#saveTask(Task)
|
* @see TaskList#saveTask(Task)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public synchronized void saveTask(Task task) throws IOException {
|
public void saveTask(Task task) throws IOException {
|
||||||
if(taskMap.isEmpty()) {
|
if(taskMap.isEmpty()) {
|
||||||
loadTaskListFromFile();
|
loadTaskListFromFile();
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ public class JsonTaskList implements TaskList {
|
||||||
/**
|
/**
|
||||||
* Calls the change handler method on all registered observers.
|
* Calls the change handler method on all registered observers.
|
||||||
*/
|
*/
|
||||||
private void notifySubscribers() throws IOException {
|
private void notifySubscribers() {
|
||||||
for (TaskListObserver subscriber : subscribers) {
|
for (TaskListObserver subscriber : subscribers) {
|
||||||
subscriber.onChange(taskMap.values().stream().toList());
|
subscriber.onChange(taskMap.values().stream().toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,6 @@ public interface TaskList {
|
||||||
* Method which will be called when changes occur.
|
* Method which will be called when changes occur.
|
||||||
* @param newTaskList The new values
|
* @param newTaskList The new values
|
||||||
*/
|
*/
|
||||||
void onChange(List<Task> newTaskList) throws IOException;
|
void onChange(List<Task> newTaskList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,6 @@ package ch.zhaw.gartenverwaltung.models;
|
||||||
import ch.zhaw.gartenverwaltung.Settings;
|
import ch.zhaw.gartenverwaltung.Settings;
|
||||||
import ch.zhaw.gartenverwaltung.io.*;
|
import ch.zhaw.gartenverwaltung.io.*;
|
||||||
import ch.zhaw.gartenverwaltung.types.*;
|
import ch.zhaw.gartenverwaltung.types.*;
|
||||||
import javafx.application.Platform;
|
|
||||||
import javafx.beans.property.ListProperty;
|
|
||||||
import javafx.beans.property.SimpleListProperty;
|
|
||||||
import javafx.collections.FXCollections;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
@ -24,36 +20,13 @@ public class GardenSchedule {
|
||||||
*/
|
*/
|
||||||
static final Comparator<Task> sortByStartDate = Comparator.comparing(Task::getStartDate);
|
static final Comparator<Task> sortByStartDate = Comparator.comparing(Task::getStartDate);
|
||||||
static final Comparator<Task> sortByNextExecution = Comparator.comparing(Task::getNextExecution);
|
static final Comparator<Task> sortByNextExecution = Comparator.comparing(Task::getNextExecution);
|
||||||
private final ListProperty<List<Task>> weeklyTaskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor to create Database Objects.
|
* Constructor to create Database Objects.
|
||||||
*/
|
*/
|
||||||
public GardenSchedule(TaskList taskList, PlantList plantList) throws IOException {
|
public GardenSchedule(TaskList taskList, PlantList plantList) {
|
||||||
this.taskList = taskList;
|
this.taskList = taskList;
|
||||||
this.plantList = plantList;
|
this.plantList = plantList;
|
||||||
TaskList.TaskListObserver taskListObserver = newTaskList -> {
|
|
||||||
Platform.runLater(() -> {
|
|
||||||
try {
|
|
||||||
getTasksUpcomingWeek();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
setTaskListObserver(taskListObserver);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListProperty<List<Task>> getWeeklyTaskListProperty() {
|
|
||||||
return weeklyTaskListProperty;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* subscribe task list observer to get notifications
|
|
||||||
* @param observer the task list which will be ovserved
|
|
||||||
*/
|
|
||||||
public void setTaskListObserver(TaskList.TaskListObserver observer) {
|
|
||||||
taskList.subscribe(observer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -190,20 +163,18 @@ public class GardenSchedule {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
weeklyTaskListProperty.clear();
|
|
||||||
weeklyTaskListProperty.addAll(dayTaskList);
|
|
||||||
return dayTaskList;
|
return dayTaskList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to get an List of 7 Tasklists for the next 7 days. (Filtered Index 0 is Tasklist for Today.
|
* Method to get an List of 7 Tasklists for the next 7 days. (Filtered Index 0 is Tasklist for Today.
|
||||||
|
* @return List with length 7 (List<List<Task>>)
|
||||||
* @throws IOException If the database cannot be accessed
|
* @throws IOException If the database cannot be accessed
|
||||||
*/
|
*/
|
||||||
public void getTasksUpcomingWeekForCrop(Long cropId) throws IOException {
|
public List<List<Task>> getTasksUpcomingWeekForCrop(Long cropId) throws IOException {
|
||||||
List<List<Task>> dayTaskList = getTasksUpcomingWeek();
|
List<List<Task>> dayTaskList = getTasksUpcomingWeek();
|
||||||
dayTaskList.forEach(taskList -> taskList.removeIf(task -> task.getCropId() != cropId));
|
dayTaskList.forEach(taskList -> taskList.removeIf(task -> task.getCropId() != cropId));
|
||||||
weeklyTaskListProperty.clear();
|
return dayTaskList;
|
||||||
weeklyTaskListProperty.addAll(dayTaskList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package ch.zhaw.gartenverwaltung.types;
|
package ch.zhaw.gartenverwaltung.types;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@ -63,7 +61,6 @@ public class Task {
|
||||||
this.startDate = startDate;
|
this.startDate = startDate;
|
||||||
nextExecution = startDate;
|
nextExecution = startDate;
|
||||||
this.endDate = endDate;
|
this.endDate = endDate;
|
||||||
this.cropId = cropId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,7 +105,7 @@ public class Task {
|
||||||
* @return Whether the Task is within the given range
|
* @return Whether the Task is within the given range
|
||||||
*/
|
*/
|
||||||
public boolean isInTimePeriod(LocalDate searchStartDate, LocalDate searchEndDate) {
|
public boolean isInTimePeriod(LocalDate searchStartDate, LocalDate searchEndDate) {
|
||||||
return endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate) || (nextExecution != null && nextExecution.isBefore(searchEndDate) && nextExecution.isAfter(searchStartDate));
|
return endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,7 +121,6 @@ public class Task {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
|
||||||
public boolean isDone(){
|
public boolean isDone(){
|
||||||
return nextExecution == null;
|
return nextExecution == null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,19 +19,19 @@
|
||||||
<content>
|
<content>
|
||||||
<VBox fx:id="cropDetailVBox" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="781.0" prefWidth="897.0" spacing="5.0">
|
<VBox fx:id="cropDetailVBox" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="781.0" prefWidth="897.0" spacing="5.0">
|
||||||
<children>
|
<children>
|
||||||
<Button styleClass="button-class" mnemonicParsing="false" onAction="#goBack" prefHeight="25.0" prefWidth="91.0" text="Go Back">
|
<Button mnemonicParsing="false" onAction="#goBack" prefHeight="25.0" prefWidth="91.0" text="Go Back">
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets bottom="10.0" />
|
<Insets bottom="10.0" />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</Button>
|
</Button>
|
||||||
<Label styleClass="page-title" fx:id="cropName_label" text="Label">
|
<Label fx:id="cropName_label" text="Label">
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets bottom="10.0" />
|
<Insets bottom="10.0" />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</Label>
|
</Label>
|
||||||
<HBox maxHeight="1.7976931348623157E308" prefHeight="268.0" prefWidth="855.0" spacing="10.0" VBox.vgrow="NEVER">
|
<HBox maxHeight="1.7976931348623157E308" prefHeight="268.0" prefWidth="855.0" spacing="10.0" VBox.vgrow="NEVER">
|
||||||
<children>
|
<children>
|
||||||
<GridPane styleClass="custom-container" maxWidth="1.7976931348623157E308" prefHeight="231.0" prefWidth="555.0" HBox.hgrow="ALWAYS">
|
<GridPane maxWidth="1.7976931348623157E308" prefHeight="231.0" prefWidth="555.0" HBox.hgrow="ALWAYS">
|
||||||
<columnConstraints>
|
<columnConstraints>
|
||||||
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" maxWidth="284.0" minWidth="10.0" prefWidth="97.33334350585938" />
|
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" maxWidth="284.0" minWidth="10.0" prefWidth="97.33334350585938" />
|
||||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="488.99999237060547" minWidth="10.0" prefWidth="481.9999898274739" />
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="488.99999237060547" minWidth="10.0" prefWidth="481.9999898274739" />
|
||||||
|
@ -72,9 +72,6 @@
|
||||||
</GridPane.margin>
|
</GridPane.margin>
|
||||||
</Label>
|
</Label>
|
||||||
</children>
|
</children>
|
||||||
<padding>
|
|
||||||
<Insets bottom="5.0" left="10.0" right="5.0" top="5.0" />
|
|
||||||
</padding>
|
|
||||||
</GridPane>
|
</GridPane>
|
||||||
<ImageView fx:id="imageView" fitHeight="250.0" fitWidth="250.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER" />
|
<ImageView fx:id="imageView" fitHeight="250.0" fitWidth="250.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER" />
|
||||||
</children>
|
</children>
|
||||||
|
@ -89,7 +86,7 @@
|
||||||
<Insets bottom="10.0" />
|
<Insets bottom="10.0" />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</ListView>
|
</ListView>
|
||||||
<Button styleClass="button-class" fx:id="addTask_button" mnemonicParsing="false" onAction="#addTask" prefHeight="25.0" prefWidth="45.0" VBox.vgrow="NEVER">
|
<Button fx:id="addTask_button" mnemonicParsing="false" onAction="#addTask" prefHeight="25.0" prefWidth="45.0" VBox.vgrow="NEVER">
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets />
|
<Insets />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
|
@ -112,7 +109,7 @@
|
||||||
<Insets right="10.0" />
|
<Insets right="10.0" />
|
||||||
</HBox.margin>
|
</HBox.margin>
|
||||||
</Label>
|
</Label>
|
||||||
<Button styleClass="button-class" fx:id="area_button" mnemonicParsing="false" onAction="#setArea" prefHeight="25.0" prefWidth="116.0" text="Set Area" />
|
<Button fx:id="area_button" mnemonicParsing="false" onAction="#setArea" prefHeight="25.0" prefWidth="116.0" text="Set Area" />
|
||||||
</children>
|
</children>
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets />
|
<Insets />
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<content>
|
<content>
|
||||||
<VBox fx:id="homeVBox" prefHeight="1047.0" prefWidth="1019.0" spacing="10.0">
|
<VBox fx:id="homeVBox" prefHeight="1047.0" prefWidth="1019.0" spacing="10.0">
|
||||||
<children>
|
<children>
|
||||||
<Label styleClass="page-title" text="Garden Management">
|
<Label text="Garden Management">
|
||||||
<font>
|
<font>
|
||||||
<Font size="34.0" />
|
<Font size="34.0" />
|
||||||
</font>
|
</font>
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
<Insets />
|
<Insets />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</Label>
|
</Label>
|
||||||
<VBox styleClass="vbox" prefHeight="200.0" prefWidth="100.0" spacing="5.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" style="-fx-background-color: white; -fx-border-color: black;">
|
||||||
<children>
|
<children>
|
||||||
<Label text="Base Functionalities:">
|
<Label text="Base Functionalities:">
|
||||||
<font>
|
<font>
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||||
</padding>
|
</padding>
|
||||||
</VBox>
|
</VBox>
|
||||||
<VBox styleClass="vbox" prefHeight="200.0" prefWidth="100.0" spacing="5.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" style="-fx-background-color: white; -fx-border-color: black;">
|
||||||
<children>
|
<children>
|
||||||
<Label text="Advanced Functionalities:">
|
<Label text="Advanced Functionalities:">
|
||||||
<font>
|
<font>
|
||||||
|
@ -114,7 +114,7 @@
|
||||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||||
</padding>
|
</padding>
|
||||||
</VBox>
|
</VBox>
|
||||||
<VBox styleClass="vbox" prefHeight="200.0" prefWidth="100.0" spacing="5.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" style="-fx-background-color: white; -fx-border-color: black;">
|
||||||
<children>
|
<children>
|
||||||
<Label text="Weather Forcast:">
|
<Label text="Weather Forcast:">
|
||||||
<font>
|
<font>
|
||||||
|
@ -139,7 +139,7 @@
|
||||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||||
</padding>
|
</padding>
|
||||||
</VBox>
|
</VBox>
|
||||||
<VBox styleClass="vbox" prefHeight="200.0" prefWidth="100.0" spacing="15.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="15.0" style="-fx-background-color: white; -fx-border-color: black;">
|
||||||
<children>
|
<children>
|
||||||
<Label text="Created by:">
|
<Label text="Created by:">
|
||||||
<font>
|
<font>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<children>
|
<children>
|
||||||
<VBox layoutY="49.0" prefHeight="655.0" prefWidth="1175.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
<VBox layoutY="49.0" prefHeight="655.0" prefWidth="1175.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
<children>
|
<children>
|
||||||
<Label styleClass="page-title" text="My Garden">
|
<Label text="My Garden">
|
||||||
<font>
|
<font>
|
||||||
<Font name="System Bold" size="28.0" />
|
<Font name="System Bold" size="28.0" />
|
||||||
</font>
|
</font>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</Label>
|
</Label>
|
||||||
<ListView fx:id="myGarden_listView" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
|
<ListView fx:id="myGarden_listView" maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
|
||||||
<Button styleClass="button-class" fx:id="addPlant_button" mnemonicParsing="false" onAction="#addPlant" prefHeight="45.0" prefWidth="155.0" text="Add new Plant">
|
<Button fx:id="addPlant_button" mnemonicParsing="false" onAction="#addPlant" prefHeight="45.0" prefWidth="155.0" text="Add new Plant">
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets />
|
<Insets />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<children>
|
<children>
|
||||||
<VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
<children>
|
<children>
|
||||||
<Label styleClass="page-title" text="MySchedule" VBox.vgrow="NEVER">
|
<Label text="MySchedule" VBox.vgrow="NEVER">
|
||||||
<font>
|
<font>
|
||||||
<Font size="24.0" />
|
<Font size="24.0" />
|
||||||
</font>
|
</font>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<Insets />
|
<Insets />
|
||||||
</VBox.margin>
|
</VBox.margin>
|
||||||
</ListView>
|
</ListView>
|
||||||
<VBox styleClass="custom-container" prefHeight="131.0" prefWidth="603.0" spacing="5.0" VBox.vgrow="NEVER">
|
<VBox prefHeight="131.0" prefWidth="603.0" spacing="5.0" style="-fx-background-color: white; -fx-border-color: black;" VBox.vgrow="NEVER">
|
||||||
<children>
|
<children>
|
||||||
<Label alignment="TOP_LEFT" maxWidth="1.7976931348623157E308" prefHeight="17.0" prefWidth="558.0" text="Importants Information:" wrapText="true" VBox.vgrow="NEVER">
|
<Label alignment="TOP_LEFT" maxWidth="1.7976931348623157E308" prefHeight="17.0" prefWidth="558.0" text="Importants Information:" wrapText="true" VBox.vgrow="NEVER">
|
||||||
<font>
|
<font>
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<children>
|
<children>
|
||||||
<VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
<VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
<children>
|
<children>
|
||||||
<Label styleClass="page-title" prefHeight="45.0" prefWidth="903.0" text="Plants" VBox.vgrow="NEVER">
|
<Label prefHeight="45.0" prefWidth="903.0" text="Plants" VBox.vgrow="NEVER">
|
||||||
<font>
|
<font>
|
||||||
<Font name="System Bold" size="30.0" />
|
<Font name="System Bold" size="30.0" />
|
||||||
</font>
|
</font>
|
||||||
|
@ -32,14 +32,14 @@
|
||||||
<HBox alignment="CENTER_LEFT" minHeight="300.0" prefHeight="480.0" prefWidth="881.0" spacing="10.0" VBox.vgrow="ALWAYS">
|
<HBox alignment="CENTER_LEFT" minHeight="300.0" prefHeight="480.0" prefWidth="881.0" spacing="10.0" VBox.vgrow="ALWAYS">
|
||||||
<children>
|
<children>
|
||||||
<ListView fx:id="list_plants" maxWidth="1.7976931348623157E308" prefHeight="497.0" prefWidth="400.0" HBox.hgrow="ALWAYS" />
|
<ListView fx:id="list_plants" maxWidth="1.7976931348623157E308" prefHeight="497.0" prefWidth="400.0" HBox.hgrow="ALWAYS" />
|
||||||
<Pane styleClass="custom-container" maxHeight="1.7976931348623157E308" maxWidth="300.0" minWidth="300.0" prefHeight="200.0" prefWidth="200.0" HBox.hgrow="NEVER">
|
<Pane maxHeight="1.7976931348623157E308" maxWidth="300.0" minWidth="300.0" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: white; -fx-border-color: black;" HBox.hgrow="NEVER">
|
||||||
<children>
|
<children>
|
||||||
<ImageView fx:id="img_plant" fitWidth="300" pickOnBounds="true" preserveRatio="true" />
|
<ImageView fx:id="img_plant" fitWidth="300" pickOnBounds="true" preserveRatio="true" />
|
||||||
</children>
|
</children>
|
||||||
</Pane>
|
</Pane>
|
||||||
</children>
|
</children>
|
||||||
</HBox>
|
</HBox>
|
||||||
<VBox styleClass="vbox" maxHeight="1.7976931348623157E308" prefHeight="237.0" prefWidth="879.0" VBox.vgrow="ALWAYS">
|
<VBox maxHeight="1.7976931348623157E308" prefHeight="237.0" prefWidth="879.0" style="-fx-background-color: white; -fx-border-color: black;" VBox.vgrow="ALWAYS">
|
||||||
<children>
|
<children>
|
||||||
<Label maxHeight="1.7976931348623157E308" prefHeight="33.0" prefWidth="919.0" text="Plant Information:" VBox.vgrow="NEVER">
|
<Label maxHeight="1.7976931348623157E308" prefHeight="33.0" prefWidth="919.0" text="Plant Information:" VBox.vgrow="NEVER">
|
||||||
<font>
|
<font>
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
<Insets bottom="10.0" top="10.0" />
|
<Insets bottom="10.0" top="10.0" />
|
||||||
</padding>
|
</padding>
|
||||||
</Label>
|
</Label>
|
||||||
<Button styleClass="button-class" fx:id="selectSowDay_button" alignment="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#selectSowDate" prefHeight="38.0" prefWidth="917.0" text="Select Harvest/Sow Day" VBox.vgrow="NEVER" />
|
<Button fx:id="selectSowDay_button" alignment="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#selectSowDate" prefHeight="38.0" prefWidth="917.0" text="Select Harvest/Sow Day" VBox.vgrow="NEVER" />
|
||||||
</children>
|
</children>
|
||||||
<VBox.margin>
|
<VBox.margin>
|
||||||
<Insets />
|
<Insets />
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
<Insets />
|
<Insets />
|
||||||
</HBox.margin>
|
</HBox.margin>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
<AnchorPane styleClass="custom-container" maxWidth="300.0" minHeight="0.0" minWidth="300.0" prefHeight="160.0" prefWidth="100.0">
|
<AnchorPane maxWidth="300.0" minHeight="0.0" minWidth="300.0" prefHeight="160.0" prefWidth="100.0" style="-fx-border-color: black; -fx-background-color: white;">
|
||||||
<children>
|
<children>
|
||||||
<VBox layoutX="38.0" layoutY="100.0" prefHeight="850.6666666666666" prefWidth="316.6666666666667" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
<VBox layoutX="38.0" layoutY="100.0" prefHeight="850.6666666666666" prefWidth="316.6666666666667" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
<children>
|
<children>
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
</Label>
|
</Label>
|
||||||
<TitledPane animated="false" text="Seasons">
|
<TitledPane animated="false" text="Seasons">
|
||||||
<content>
|
<content>
|
||||||
<AnchorPane styleClass="custom-container" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
||||||
<children>
|
<children>
|
||||||
<VBox fx:id="seasons" layoutX="37.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
<VBox fx:id="seasons" layoutX="37.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||||
</children>
|
</children>
|
||||||
|
@ -87,7 +87,7 @@
|
||||||
</TitledPane>
|
</TitledPane>
|
||||||
<TitledPane animated="false" text="Climate Zones">
|
<TitledPane animated="false" text="Climate Zones">
|
||||||
<content>
|
<content>
|
||||||
<AnchorPane styleClass="custom-container" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
||||||
<children>
|
<children>
|
||||||
<VBox fx:id="climate_zones" layoutX="36.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
<VBox fx:id="climate_zones" layoutX="36.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||||
</children>
|
</children>
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
<Separator prefWidth="50.0" visible="false" HBox.hgrow="ALWAYS" />
|
<Separator prefWidth="50.0" visible="false" HBox.hgrow="ALWAYS" />
|
||||||
<ButtonBar prefHeight="40.0" prefWidth="200.0">
|
<ButtonBar prefHeight="40.0" prefWidth="200.0">
|
||||||
<buttons>
|
<buttons>
|
||||||
<Button styleClass="button-class" cancelButton="true" contentDisplay="CENTER" graphicTextGap="5.0" mnemonicParsing="false" text="Close" onAction="#closeTutorial"/>
|
<Button cancelButton="true" contentDisplay="CENTER" graphicTextGap="5.0" mnemonicParsing="false" text="Close" onAction="#closeTutorial"/>
|
||||||
<Button styleClass="button-class" fx:id="previousPageButton" mnemonicParsing="false" text="Previous" onAction="#viewPreviousPage"/>
|
<Button fx:id="previousPageButton" mnemonicParsing="false" text="Previous" onAction="#viewPreviousPage"/>
|
||||||
<Button styleClass="button-class" fx:id="nextPageButton" defaultButton="true" mnemonicParsing="false" text="Next" onAction="#viewNextPage" />
|
<Button fx:id="nextPageButton" defaultButton="true" mnemonicParsing="false" text="Next" onAction="#viewNextPage" />
|
||||||
</buttons>
|
</buttons>
|
||||||
</ButtonBar>
|
</ButtonBar>
|
||||||
</children>
|
</children>
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
.myDialog *.header-panel,
|
|
||||||
.myDialog *.header-panel .label {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-font-weight: bold;
|
|
||||||
}
|
|
||||||
.myDialog {
|
|
||||||
-fx-background-color: #EAFFE2;
|
|
||||||
-fx-border-color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .button {
|
|
||||||
-fx-border-color: darkgreen;
|
|
||||||
-fx-border-radius: 4;
|
|
||||||
-fx-border-width: 1.5;
|
|
||||||
-fx-background-color: #D1FFB7;
|
|
||||||
-fx-font-weight: bold;
|
|
||||||
-fx-font-size: 13
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .check-box .box {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-border-color:grey;
|
|
||||||
-fx-border-radius: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box .list-cell
|
|
||||||
{
|
|
||||||
-fx-background-color: #D1FFB7;
|
|
||||||
-fx-text-fill: -fx-text-base-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-popup .list-view
|
|
||||||
{
|
|
||||||
-fx-background-color: darkgreen, darkgreen;
|
|
||||||
-fx-background-insets: 0, 1;
|
|
||||||
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-popup .list-view .list-cell
|
|
||||||
{
|
|
||||||
-fx-padding: 4 0 4 5;
|
|
||||||
|
|
||||||
/* No alternate highlighting */
|
|
||||||
-fx-background-color: #EAFFE2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-popup .list-view .list-cell:filled:selected, .combo-box-popup .list-view .list-cell:filled:selected:hover
|
|
||||||
{
|
|
||||||
-fx-background: -fx-accent;
|
|
||||||
-fx-text-fill: black;
|
|
||||||
-fx-background-color: #D1FFB7;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-popup .list-view .list-cell:filled:hover
|
|
||||||
{
|
|
||||||
-fx-text-fill: black;
|
|
||||||
-fx-background-color: #54B91C;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-base {
|
|
||||||
-fx-border-color: grey;
|
|
||||||
-fx-background-color: #D1FFB7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .combo-box-base:hover
|
|
||||||
{
|
|
||||||
-fx-color: #54B91C;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .radio-button .radio {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-border-color:grey;
|
|
||||||
-fx-border-radius: 25;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myDialog .date-picker .button {
|
|
||||||
-fx-border-color: none;
|
|
||||||
-fx-background-color: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,10 @@
|
||||||
.button-class {
|
|
||||||
-fx-border-color: darkgreen;
|
|
||||||
-fx-border-radius: 4;
|
|
||||||
-fx-border-width: 1.5;
|
|
||||||
-fx-background-color: #D1FFB7;
|
|
||||||
-fx-font-weight: bold;
|
|
||||||
-fx-font-size: 13
|
|
||||||
}
|
|
||||||
|
|
||||||
#home_button, #myGarden_button,
|
#home_button, #myGarden_button,
|
||||||
#mySchedule_button, #settings_button,
|
#mySchedule_button, #settings_button,
|
||||||
#tutorial_button, #menu_pane {
|
#tutorial_button, #menu_pane {
|
||||||
-fx-text-fill: white;
|
-fx-text-fill: white;
|
||||||
-fx-background-color: rgb(0,128,0);
|
-fx-background-color: rgb(0,128,0);
|
||||||
-fx-border-color: rgb(0,128,0);
|
|
||||||
-fx-border-radius: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#menubar {
|
#menubar {
|
||||||
|
@ -22,64 +13,13 @@
|
||||||
|
|
||||||
#home_button:hover, #myGarden_button:hover,
|
#home_button:hover, #myGarden_button:hover,
|
||||||
#mySchedule_button:hover, #settings_button:hover,
|
#mySchedule_button:hover, #settings_button:hover,
|
||||||
#tutorial_button:hover {
|
#tutorial_button:hover,
|
||||||
|
#home_button:focused, #myGarden_button:focused,
|
||||||
|
#mySchedule_button:focused, #settings_button:focused,
|
||||||
|
#tutorial_button:focused{
|
||||||
-fx-background-color: darkgreen;
|
-fx-background-color: darkgreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
.root, .scroll-pane, #homeVBox, #cropDetailVBox {
|
.root, .scroll-pane, #homeVBox, #cropDetailVBox {
|
||||||
-fx-background-color: #F3FFEC;
|
-fx-background-color: #e6ffe6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-view {
|
|
||||||
-fx-border-color: black;
|
|
||||||
-fx-background-color: #EAFFE2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-cell:even:filled:selected:focused .label,
|
|
||||||
.list-cell:even:filled:selected .label,
|
|
||||||
.list-cell:even {
|
|
||||||
-fx-background-color: #EAFFE2;
|
|
||||||
-fx-text-fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-cell:odd:filled:selected:focused .label,
|
|
||||||
.list-cell:odd:filled:selected .label,
|
|
||||||
.list-cell:odd {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-text-fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
#list_plants .list-cell:even:filled:selected:focused,
|
|
||||||
#list_plants .list-cell:even:filled:selected,
|
|
||||||
#list_plants .list-cell:odd:filled:selected:focused,
|
|
||||||
#list_plants .list-cell:odd:filled:selected,
|
|
||||||
#scheduledPlants_listview .list-cell:even:filled:selected:focused,
|
|
||||||
#scheduledPlants_listview .list-cell:even:filled:selected,
|
|
||||||
#scheduledPlants_listview .list-cell:odd:filled:selected:focused,
|
|
||||||
#scheduledPlants_listview .list-cell:odd:filled:selected{
|
|
||||||
-fx-background-color: #7CD14B;
|
|
||||||
-fx-text-fill: white;
|
|
||||||
-fx-font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vbox, .custom-container {
|
|
||||||
-fx-background-color: #EAFFE2;
|
|
||||||
-fx-border-color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.titled-pane > .title {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-border-color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-title {
|
|
||||||
-fx-font-size: 20;
|
|
||||||
-fx-font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.radio-button .radio {
|
|
||||||
-fx-background-color: #D3FFB5;
|
|
||||||
-fx-border-color:grey;
|
|
||||||
-fx-border-radius: 25;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ public class WeatherGardenTaskPlannerTest {
|
||||||
exampleTask.setNextExecution(LocalDate.now().plusDays(1L));
|
exampleTask.setNextExecution(LocalDate.now().plusDays(1L));
|
||||||
exampleWeatherTask = new Task("Hail",
|
exampleWeatherTask = new Task("Hail",
|
||||||
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
||||||
LocalDate.now(),LocalDate.now().plusDays(1L),3L);
|
LocalDate.now().minusDays(1L),LocalDate.now().plusDays(1L),3L);
|
||||||
|
|
||||||
taskList = new JsonTaskList(testFile);
|
taskList = new JsonTaskList(testFile);
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ public class JsonTaskListTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testSubscription() throws IOException {
|
void testSubscription() {
|
||||||
TaskList.TaskListObserver mockObs = Mockito.mock(TaskList.TaskListObserver.class);
|
TaskList.TaskListObserver mockObs = Mockito.mock(TaskList.TaskListObserver.class);
|
||||||
testDatabase.subscribe(mockObs);
|
testDatabase.subscribe(mockObs);
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue