Compare commits

..
Author SHA1 Message Date
giavaphi 45035e565c update tasks with subscription from JsonTaskList 2022-12-09 01:27:37 +01:00
David Guler c7b23335b5 doc: javadoc for types 2022-12-05 15:26:10 +01:00
gulerdavandGitHub Enterprise 7c015d78f4 Merge pull request #76 from schrom01/feature_guiOverhaul_M3
changesFXMLFile_and_JavaDocControllerFiles
2022-12-05 13:15:36 +01:00
28 changed files with 211 additions and 273 deletions
@@ -3,6 +3,7 @@ package ch.zhaw.gartenverwaltung;
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
import ch.zhaw.gartenverwaltung.io.PlantList;
import ch.zhaw.gartenverwaltung.io.TaskList;
import ch.zhaw.gartenverwaltung.models.Garden;
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
@@ -28,7 +29,6 @@ import javafx.stage.Stage;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -129,7 +129,14 @@ public class CropDetailController {
}
area_label.setText(String.valueOf(crop.getArea()));
setTaskListProperty(crop);
initializeTaskListProperty(crop);
TaskList.TaskListObserver taskListObserver = newTaskList -> {
taskListProperty.clear();
taskListProperty.addAll(gardenSchedule.getTaskListForCrop(crop.getCropId().get()));
};
gardenSchedule.setTaskListObserver(taskListObserver);
taskList_listView.itemsProperty().bind(taskListProperty);
pestListProperty.addAll(plant.pests());
@@ -186,10 +193,10 @@ public class CropDetailController {
}
/**
* update task list
* initialize task list
* @param crop {@link Crop} that is selected
*/
private void setTaskListProperty(Crop crop) {
private void initializeTaskListProperty(Crop crop) {
crop.getCropId().ifPresent(id -> {
List<Task> taskList;
try {
@@ -223,8 +230,6 @@ public class CropDetailController {
Button edit = new Button();
Button delete = new Button();
edit.getStyleClass().add("button-class");
delete.getStyleClass().add("button-class");
HBox.setHgrow(edit, Priority.NEVER);
HBox.setHgrow(delete, Priority.NEVER);
setIconToButton(edit, "editIcon.png");
@@ -308,10 +313,6 @@ public class CropDetailController {
DialogPane dialogPane = dialog.getDialogPane();
dialogPane.getStylesheets().add(
Objects.requireNonNull(getClass().getResource("bootstrap/dialogStyle.css")).toExternalForm());
dialogPane.getStyleClass().add("myDialog");
ButtonType saveTask;
if(newTask) {
saveTask = new ButtonType("Add", ButtonBar.ButtonData.OK_DONE);
@@ -333,13 +334,15 @@ public class CropDetailController {
if (newTask) {
try {
gardenSchedule.addTask(task);
setTaskListProperty(this.crop);
} catch (IOException e) {
e.printStackTrace();
}
} else {
//ToDo method to edit task
setTaskListProperty(this.crop);
try {
gardenSchedule.addTask(givenTask.updateTask(task));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
@@ -358,10 +361,6 @@ public class CropDetailController {
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);
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
@@ -393,18 +392,12 @@ public class CropDetailController {
alert.setTitle("Delete " + task.getName());
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()
.ifPresent(buttonType -> {
if (buttonType == ButtonType.OK) {
try {
gardenSchedule.removeTask(task);
setTaskListProperty(this.crop);
//setTaskListProperty(this.crop);
} catch (IOException e) {
// TODO: Show error alert
LOG.log(Level.SEVERE, "Could not remove crop.", e);
@@ -16,7 +16,6 @@ import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.io.IOException;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -90,10 +89,6 @@ public class MainFXMLController {
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);
dialogPane.getButtonTypes().addAll(saveSettings, ButtonType.CANCEL);
@@ -161,12 +156,7 @@ public class MainFXMLController {
}
private void styleChangeButton(Button button) {
/*home_button.setStyle("-fx-background-color: rgb(0,128,0)");
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");*/
//ToDo changeStyle of the menu buttons
}
/**
@@ -117,9 +117,6 @@ public class MyGardenController {
Button details = new Button();
Button delete = new Button();
details.getStyleClass().add("button-class");
delete.getStyleClass().add("button-class");
setIconToButton(details, "detailsIcon.png");
setIconToButton(delete, "deleteIcon.png");
details.setOnAction(getGoToCropDetailEvent(crop));
@@ -189,12 +186,6 @@ public class MyGardenController {
Plant plant = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get();
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
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.setContentText("Deleting this crop will remove all associated tasks from your schedule.");
@@ -32,7 +32,6 @@ import java.util.logging.Logger;
*/
public class MyScheduleController {
private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName());
private final ListProperty<List<Task>> taskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
private Crop selectedCrop = null;
@@ -58,14 +57,10 @@ public class MyScheduleController {
setCellFactoryCropListView();
setCellFactoryTaskListView();
scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops());
ListProperty<List<Task>> taskListProperty = gardenSchedule.getWeeklyTaskListProperty();
week_listView.itemsProperty().bind(taskListProperty);
lookForSelectedListEntries();
information_label.setText("");
try {
loadTaskList();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
@@ -117,8 +112,8 @@ public class MyScheduleController {
super.updateItem(taskList, empty);
if (empty || taskList == null) {
setGraphic(null);
setText(null);
setGraphic(null);
} else {
setText("");
setGraphic(weekTaskVBox(taskList, this.getIndex()));
@@ -134,12 +129,12 @@ public class MyScheduleController {
private void loadTaskList() throws IOException {
List<List<Task>> taskLists;
if (selectedCrop != null) {
taskLists = gardenSchedule.getTasksUpcomingWeekForCrop(selectedCrop.getCropId().get());
gardenSchedule.getTasksUpcomingWeekForCrop(selectedCrop.getCropId().get());
} else {
taskLists = gardenSchedule.getTasksUpcomingWeek();
gardenSchedule.getTasksUpcomingWeek();
}
taskListProperty.clear();
taskListProperty.addAll(taskLists);
//taskListProperty.clear();
//taskListProperty.addAll(taskLists);
}
/**
@@ -169,8 +164,6 @@ public class MyScheduleController {
Pane puffer = new Pane();
HBox.setHgrow(puffer, Priority.ALWAYS);
Button button = new Button("Task completed!");
button.getStyleClass().add("button-class");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
@@ -25,7 +25,6 @@ import javafx.scene.layout.VBox;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -83,10 +82,6 @@ public class PlantsController {
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);
dialogPane.getButtonTypes().addAll(sowButton, ButtonType.CANCEL);
@@ -12,7 +12,6 @@ import javafx.scene.image.ImageView;
import java.io.IOException;
import java.net.URL;
import java.util.Objects;
import java.util.ResourceBundle;
/**
@@ -92,10 +91,6 @@ public class SettingsController implements Initializable {
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);
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
@@ -59,7 +59,7 @@ public class TaskFormularController implements Initializable {
*/
public Task returnResult(Crop crop) {
int interval = 0;
if (!(interval_field.getText().isEmpty() || interval_field.getText().equals(""))) {
if (interval_field.getText() != null && !(interval_field.getText().isEmpty() || interval_field.getText().equals(""))) {
interval = Integer.parseInt(interval_field.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) {
interval_field.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.matches("\\d*")) {
if (newValue != null && !newValue.matches("\\d*")) {
interval_field.setText(newValue.replaceAll("[^\\d]", ""));
}
});
@@ -43,7 +43,8 @@ public class WeatherGradenTaskPlanner {
private void getSevereWeatherEvents() throws IOException {
SevereWeather actualWeather = weatherService.causeSevereWeather(1);
if (SevereWeather.HAIL.equals(actualWeather)) {
createPreHailTask();
//ToDo creates hail task all 3 seconds, pls fix
//createPreHailTask();
} else if (SevereWeather.FROST.equals(actualWeather)) {
createPreFrostTask();
} else if (SevereWeather.SNOW.equals(actualWeather)) {
@@ -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();
}
/**
@@ -154,7 +154,7 @@ public class JsonTaskList implements TaskList {
/**
* Calls the change handler method on all registered observers.
*/
private void notifySubscribers() {
private void notifySubscribers() throws IOException {
for (TaskListObserver subscriber : subscribers) {
subscriber.onChange(taskMap.values().stream().toList());
}
@@ -67,6 +67,6 @@ public interface TaskList {
* Method which will be called when changes occur.
* @param newTaskList The new values
*/
void onChange(List<Task> newTaskList);
void onChange(List<Task> newTaskList) throws IOException;
}
}
@@ -3,6 +3,9 @@ package ch.zhaw.gartenverwaltung.models;
import ch.zhaw.gartenverwaltung.Settings;
import ch.zhaw.gartenverwaltung.io.*;
import ch.zhaw.gartenverwaltung.types.*;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import java.io.IOException;
import java.time.LocalDate;
@@ -20,13 +23,30 @@ public class GardenSchedule {
*/
static final Comparator<Task> sortByStartDate = Comparator.comparing(Task::getStartDate);
static final Comparator<Task> sortByNextExecution = Comparator.comparing(Task::getNextExecution);
private final ListProperty<List<Task>> weeklyTaskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
/**
* Constructor to create Database Objects.
*/
public GardenSchedule(TaskList taskList, PlantList plantList) {
public GardenSchedule(TaskList taskList, PlantList plantList) throws IOException {
this.taskList = taskList;
this.plantList = plantList;
TaskList.TaskListObserver taskListObserver = newTaskList -> {
getTasksUpcomingWeek();
};
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);
}
/**
@@ -163,18 +183,20 @@ public class GardenSchedule {
}
});
}
weeklyTaskListProperty.clear();
weeklyTaskListProperty.addAll(dayTaskList);
return dayTaskList;
}
/**
* 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
*/
public List<List<Task>> getTasksUpcomingWeekForCrop(Long cropId) throws IOException {
public void getTasksUpcomingWeekForCrop(Long cropId) throws IOException {
List<List<Task>> dayTaskList = getTasksUpcomingWeek();
dayTaskList.forEach(taskList -> taskList.removeIf(task -> task.getCropId() != cropId));
return dayTaskList;
weeklyTaskListProperty.clear();
weeklyTaskListProperty.addAll(dayTaskList);
}
/**
@@ -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;
@@ -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,
@@ -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
}
@@ -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) {
}
@@ -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<GrowthPhase> 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) &&
@@ -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"),
@@ -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) {
this.name = name;
this.description = description;
@@ -51,6 +62,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;
@@ -75,10 +96,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);
@@ -117,6 +148,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();
@@ -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;
@@ -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,
@@ -19,19 +19,19 @@
<content>
<VBox fx:id="cropDetailVBox" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="781.0" prefWidth="897.0" spacing="5.0">
<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>
<Insets bottom="10.0" />
</VBox.margin>
</Button>
<Label styleClass="page-title" fx:id="cropName_label" text="Label">
<Label fx:id="cropName_label" text="Label">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
</Label>
<HBox maxHeight="1.7976931348623157E308" prefHeight="268.0" prefWidth="855.0" spacing="10.0" VBox.vgrow="NEVER">
<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 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" />
@@ -72,9 +72,6 @@
</GridPane.margin>
</Label>
</children>
<padding>
<Insets bottom="5.0" left="10.0" right="5.0" top="5.0" />
</padding>
</GridPane>
<ImageView fx:id="imageView" fitHeight="250.0" fitWidth="250.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER" />
</children>
@@ -89,7 +86,7 @@
<Insets bottom="10.0" />
</VBox.margin>
</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>
<Insets />
</VBox.margin>
@@ -112,7 +109,7 @@
<Insets right="10.0" />
</HBox.margin>
</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>
<VBox.margin>
<Insets />
@@ -18,7 +18,7 @@
<content>
<VBox fx:id="homeVBox" prefHeight="1047.0" prefWidth="1019.0" spacing="10.0">
<children>
<Label styleClass="page-title" text="Garden Management">
<Label text="Garden Management">
<font>
<Font size="34.0" />
</font>
@@ -34,7 +34,7 @@
<Insets />
</VBox.margin>
</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>
<Label text="Base Functionalities:">
<font>
@@ -79,7 +79,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</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>
<Label text="Advanced Functionalities:">
<font>
@@ -114,7 +114,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</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>
<Label text="Weather Forcast:">
<font>
@@ -139,7 +139,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</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>
<Label text="Created by:">
<font>
@@ -12,7 +12,7 @@
<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">
<children>
<Label styleClass="page-title" text="My Garden">
<Label text="My Garden">
<font>
<Font name="System Bold" size="28.0" />
</font>
@@ -21,7 +21,7 @@
</VBox.margin>
</Label>
<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>
<Insets />
</VBox.margin>
@@ -12,7 +12,7 @@
<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">
<children>
<Label styleClass="page-title" text="MySchedule" VBox.vgrow="NEVER">
<Label text="MySchedule" VBox.vgrow="NEVER">
<font>
<Font size="24.0" />
</font>
@@ -31,7 +31,7 @@
<Insets />
</VBox.margin>
</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>
<Label alignment="TOP_LEFT" maxWidth="1.7976931348623157E308" prefHeight="17.0" prefWidth="558.0" text="Importants Information:" wrapText="true" VBox.vgrow="NEVER">
<font>
@@ -17,7 +17,7 @@
<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">
<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 name="System Bold" size="30.0" />
</font>
@@ -32,14 +32,14 @@
<HBox alignment="CENTER_LEFT" minHeight="300.0" prefHeight="480.0" prefWidth="881.0" spacing="10.0" VBox.vgrow="ALWAYS">
<children>
<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>
<ImageView fx:id="img_plant" fitWidth="300" pickOnBounds="true" preserveRatio="true" />
</children>
</Pane>
</children>
</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>
<Label maxHeight="1.7976931348623157E308" prefHeight="33.0" prefWidth="919.0" text="Plant Information:" VBox.vgrow="NEVER">
<font>
@@ -51,7 +51,7 @@
<Insets bottom="10.0" top="10.0" />
</padding>
</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>
<VBox.margin>
<Insets />
@@ -67,7 +67,7 @@
<Insets />
</HBox.margin>
</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>
<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>
@@ -78,7 +78,7 @@
</Label>
<TitledPane animated="false" text="Seasons">
<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>
<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>
@@ -87,7 +87,7 @@
</TitledPane>
<TitledPane animated="false" text="Climate Zones">
<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>
<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>
@@ -22,9 +22,9 @@
<Separator prefWidth="50.0" visible="false" HBox.hgrow="ALWAYS" />
<ButtonBar prefHeight="40.0" prefWidth="200.0">
<buttons>
<Button styleClass="button-class" 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 styleClass="button-class" fx:id="nextPageButton" defaultButton="true" mnemonicParsing="false" text="Next" onAction="#viewNextPage" />
<Button cancelButton="true" contentDisplay="CENTER" graphicTextGap="5.0" mnemonicParsing="false" text="Close" onAction="#closeTutorial"/>
<Button fx:id="previousPageButton" mnemonicParsing="false" text="Previous" onAction="#viewPreviousPage"/>
<Button fx:id="nextPageButton" defaultButton="true" mnemonicParsing="false" text="Next" onAction="#viewNextPage" />
</buttons>
</ButtonBar>
</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,
#mySchedule_button, #settings_button,
#tutorial_button, #menu_pane {
-fx-text-fill: white;
-fx-background-color: rgb(0,128,0);
-fx-border-color: rgb(0,128,0);
-fx-border-radius: 0;
}
#menubar {
@@ -22,64 +13,13 @@
#home_button:hover, #myGarden_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;
}
.root, .scroll-pane, #homeVBox, #cropDetailVBox {
-fx-background-color: #F3FFEC;
}
.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;
}
-fx-background-color: #e6ffe6;
}