Compare commits
3 Commits
5ef3f6c587
...
05e7bcc2e8
Author | SHA1 | Date |
---|---|---|
David Guler | 05e7bcc2e8 | |
David Guler | 09e582b8a2 | |
David Guler | 2b7cec7e6a |
|
@ -1,8 +1,7 @@
|
|||
package ch.zhaw.gartenverwaltung;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||
import javafx.application.Application;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -10,10 +9,11 @@ import java.io.IOException;
|
|||
public class HelloApplication extends Application {
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("MainFXML.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load());
|
||||
AppLoader appLoader = new AppLoader();
|
||||
|
||||
appLoader.loadSceneToStage("MainFXML.fxml", stage);
|
||||
|
||||
stage.setTitle("Gartenverwaltung");
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,21 +1,25 @@
|
|||
package ch.zhaw.gartenverwaltung;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AfterInject;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.ChangeViewEvent;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class MainFXMLController implements Initializable {
|
||||
public class MainFXMLController {
|
||||
private static final Logger LOG = Logger.getLogger(MainFXMLController.class.getName());
|
||||
private final AppLoader appLoader = new AppLoader(this);
|
||||
|
||||
@Inject
|
||||
AppLoader appLoader;
|
||||
|
||||
@FXML
|
||||
private Button home_button;
|
||||
|
||||
|
@ -31,29 +35,26 @@ public class MainFXMLController implements Initializable {
|
|||
@FXML
|
||||
private Button plants_button;
|
||||
|
||||
public MainFXMLController() throws IOException {
|
||||
}
|
||||
|
||||
@FXML
|
||||
void goToHome() throws IOException {
|
||||
void goToHome() {
|
||||
showPaneAsMainView("Home.fxml");
|
||||
styleChangeButton(home_button);
|
||||
}
|
||||
|
||||
@FXML
|
||||
void goToMyPlants() throws IOException {
|
||||
void goToMyPlants() {
|
||||
showPaneAsMainView("MyGarden.fxml");
|
||||
styleChangeButton(myGarden_button);
|
||||
}
|
||||
|
||||
@FXML
|
||||
void goToMySchedule() throws IOException {
|
||||
void goToMySchedule() {
|
||||
showPaneAsMainView("MySchedule.fxml");
|
||||
styleChangeButton(mySchedule_button);
|
||||
}
|
||||
|
||||
@FXML
|
||||
void goToPlants() throws IOException {
|
||||
void goToPlants() {
|
||||
showPaneAsMainView("Plants.fxml");
|
||||
styleChangeButton(plants_button);
|
||||
}
|
||||
|
@ -63,15 +64,22 @@ public class MainFXMLController implements Initializable {
|
|||
* set HGrow and VGrow to parent AnchorPane.
|
||||
* Sends MainController to other Controllers.
|
||||
* @param fxmlFile string of fxml file
|
||||
* @throws IOException exception when file does not exist
|
||||
*/
|
||||
public void showPaneAsMainView(String fxmlFile) throws IOException {
|
||||
public void showPaneAsMainView(String fxmlFile) {
|
||||
try {
|
||||
Pane anchorPane = appLoader.loadPane(fxmlFile);
|
||||
mainPane.getChildren().setAll(anchorPane);
|
||||
anchorPane.prefWidthProperty().bind(mainPane.widthProperty());
|
||||
anchorPane.prefHeightProperty().bind(mainPane.heightProperty());
|
||||
|
||||
anchorPane.removeEventHandler(ChangeViewEvent.CHANGE_MAIN_VIEW, changeMainViewHandler);
|
||||
anchorPane.addEventHandler(ChangeViewEvent.CHANGE_MAIN_VIEW, changeMainViewHandler);
|
||||
} catch (IOException e) {
|
||||
LOG.log(Level.SEVERE, "Could not load pane.", e);
|
||||
}
|
||||
}
|
||||
|
||||
private final EventHandler<ChangeViewEvent> changeMainViewHandler = (ChangeViewEvent event) -> showPaneAsMainView(event.view());
|
||||
|
||||
private void preloadPanes() throws IOException {
|
||||
appLoader.loadAndCacheFxml("MyGarden.fxml");
|
||||
|
@ -87,8 +95,9 @@ public class MainFXMLController implements Initializable {
|
|||
* loads the default FXML File
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||
@AfterInject
|
||||
@SuppressWarnings("unused")
|
||||
public void init() {
|
||||
try {
|
||||
preloadPanes();
|
||||
showPaneAsMainView("Home.fxml");
|
||||
|
|
|
@ -2,6 +2,7 @@ package ch.zhaw.gartenverwaltung;
|
|||
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AfterInject;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.ChangeViewEvent;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||
|
@ -17,6 +18,7 @@ import javafx.scene.control.Button;
|
|||
import javafx.scene.control.ButtonType;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.Priority;
|
||||
import javafx.scene.layout.VBox;
|
||||
|
@ -30,16 +32,15 @@ import java.util.logging.Logger;
|
|||
|
||||
public class MyGardenController {
|
||||
private static final Logger LOG = Logger.getLogger(MyGardenController.class.getName());
|
||||
|
||||
@Inject
|
||||
AppLoader appLoader;
|
||||
@Inject
|
||||
MainFXMLController mainController;
|
||||
@Inject
|
||||
private Garden garden;
|
||||
@Inject
|
||||
private PlantList plantList;
|
||||
|
||||
@FXML
|
||||
public AnchorPane myGardenRoot;
|
||||
@FXML
|
||||
private VBox myPlants_vbox;
|
||||
|
||||
|
@ -61,8 +62,8 @@ public class MyGardenController {
|
|||
}
|
||||
|
||||
@FXML
|
||||
void addPlant(ActionEvent event) throws IOException {
|
||||
mainController.showPaneAsMainView("Plants.fxml");
|
||||
void addPlant() {
|
||||
myGardenRoot.fireEvent(new ChangeViewEvent(ChangeViewEvent.CHANGE_MAIN_VIEW, "Plants.fxml"));
|
||||
}
|
||||
|
||||
private void createPlantView(List<Crop> crops) throws HardinessZoneNotSetException, IOException {
|
||||
|
@ -128,7 +129,7 @@ public class MyGardenController {
|
|||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||
alert.setTitle("Delete Crop");
|
||||
alert.setHeaderText("Are you sure want to delete this Crop?");
|
||||
alert.setContentText("placeholder");
|
||||
alert.setContentText("Deleting this crop will remove all associated tasks from your schedule.");
|
||||
|
||||
alert.showAndWait()
|
||||
.ifPresent(buttonType -> {
|
||||
|
|
|
@ -2,9 +2,12 @@ package ch.zhaw.gartenverwaltung;
|
|||
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AfterInject;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.ChangeViewEvent;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||
import ch.zhaw.gartenverwaltung.models.PlantListModel;
|
||||
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
||||
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Seasons;
|
||||
|
@ -16,11 +19,12 @@ import javafx.geometry.Insets;
|
|||
import javafx.scene.control.*;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.stage.Modality;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
@ -32,6 +36,8 @@ public class PlantsController {
|
|||
private PlantListModel plantListModel;
|
||||
@Inject
|
||||
private AppLoader appLoader;
|
||||
@Inject
|
||||
private Garden garden;
|
||||
|
||||
private Plant selectedPlant = null;
|
||||
private final HardinessZone DEFAULT_HARDINESS_ZONE = HardinessZone.ZONE_8A;
|
||||
|
@ -39,6 +45,9 @@ public class PlantsController {
|
|||
// TODO: move to model
|
||||
private final ListProperty<Plant> plantListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
|
||||
|
||||
@FXML
|
||||
public AnchorPane plantsRoot;
|
||||
|
||||
@FXML
|
||||
private VBox seasons;
|
||||
|
||||
|
@ -66,13 +75,32 @@ public class PlantsController {
|
|||
@FXML
|
||||
void selectSowDate() throws IOException {
|
||||
Stage stage = new Stage();
|
||||
if (appLoader.loadSceneToStage("SelectSowDay.fxml", stage) instanceof SelectSowDayController controller) {
|
||||
controller.setSelectedPlant(selectedPlant);
|
||||
}
|
||||
Dialog<LocalDate> dateSelection = new Dialog<>();
|
||||
dateSelection.setTitle("Select Date");
|
||||
dateSelection.setHeaderText(String.format("Select Harvest/Sow Date for %s:", selectedPlant.name()));
|
||||
dateSelection.setResizable(false);
|
||||
|
||||
stage.initModality(Modality.APPLICATION_MODAL);
|
||||
stage.setResizable(false);
|
||||
stage.showAndWait();
|
||||
DialogPane dialogPane = dateSelection.getDialogPane();
|
||||
|
||||
ButtonType sowButton = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
|
||||
dialogPane.getButtonTypes().addAll(sowButton, ButtonType.CANCEL);
|
||||
|
||||
if (appLoader.loadSceneToStage("SelectSowDay.fxml", stage) instanceof SelectSowDayController controller) {
|
||||
controller.initSaveButton((Button) dialogPane.lookupButton(sowButton));
|
||||
controller.setSelectedPlant(selectedPlant);
|
||||
dateSelection.setResultConverter(button -> button.equals(sowButton) ? controller.retrieveResult() : null);
|
||||
}
|
||||
dialogPane.setContent(stage.getScene().getRoot());
|
||||
|
||||
dateSelection.showAndWait()
|
||||
.ifPresent(date -> {
|
||||
try {
|
||||
garden.plantAsCrop(selectedPlant, date);
|
||||
} catch (IOException | HardinessZoneNotSetException | PlantNotFoundException e) {
|
||||
LOG.log(Level.SEVERE, "Couldn't save Crop", e);
|
||||
}
|
||||
plantsRoot.fireEvent(new ChangeViewEvent(ChangeViewEvent.CHANGE_MAIN_VIEW, "MyGarden.fxml"));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -126,6 +154,7 @@ public class PlantsController {
|
|||
/**
|
||||
* get plant list according to param season and hardiness zone
|
||||
* fill list view with plant list
|
||||
*
|
||||
* @param season enum of seasons
|
||||
* @throws HardinessZoneNotSetException throws exception
|
||||
* @throws IOException throws exception
|
||||
|
@ -138,6 +167,7 @@ public class PlantsController {
|
|||
/**
|
||||
* get plant list filtered by search plant entry and hardiness zone
|
||||
* fill list view with plant list
|
||||
*
|
||||
* @throws HardinessZoneNotSetException throws exception when no hardiness zone is defined
|
||||
* @throws IOException throws exception
|
||||
*/
|
||||
|
|
|
@ -1,88 +1,55 @@
|
|||
package ch.zhaw.gartenverwaltung;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
||||
import ch.zhaw.gartenverwaltung.types.GrowthPhaseType;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.util.Callback;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class SelectSowDayController implements Initializable {
|
||||
private Plant selectedPlant = null;
|
||||
|
||||
@Inject
|
||||
private Garden garden;
|
||||
public class SelectSowDayController {
|
||||
private Plant selectedPlant;
|
||||
|
||||
@FXML
|
||||
private DatePicker datepicker;
|
||||
|
||||
@FXML
|
||||
private Label popup_label;
|
||||
|
||||
@FXML
|
||||
private Button save_button;
|
||||
|
||||
@FXML
|
||||
private RadioButton harvest_radio;
|
||||
|
||||
/**
|
||||
* close the date selector window
|
||||
*/
|
||||
@FXML
|
||||
void cancel() {
|
||||
closeWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* get sow date from datePicker or calculate sow date from harvest date
|
||||
* save selected plant and sow date
|
||||
*/
|
||||
@FXML
|
||||
void save() throws HardinessZoneNotSetException, IOException, PlantNotFoundException {
|
||||
public LocalDate retrieveResult() {
|
||||
LocalDate sowDate = datepicker.getValue();
|
||||
if (harvest_radio.isSelected()) {
|
||||
//ToDo method to get current lifecycle group in plant
|
||||
sowDate = selectedPlant.sowDateFromHarvestDate(datepicker.getValue(), 0);
|
||||
}
|
||||
garden.plantAsCrop(selectedPlant, sowDate);
|
||||
closeWindow();
|
||||
return sowDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* save the plant which will be planted and update label
|
||||
* Set the {@link Plant} for which a date should be selected.
|
||||
*
|
||||
* @param plant Plant
|
||||
*/
|
||||
public void setSelectedPlant(Plant plant) {
|
||||
selectedPlant = plant;
|
||||
popup_label.setText(String.format("Select Harvest/Sow Date for %s:", selectedPlant.name()));
|
||||
}
|
||||
|
||||
/**
|
||||
* add listener and set default values
|
||||
* {@inheritDoc}
|
||||
* @param location location
|
||||
* @param resources resources
|
||||
*/
|
||||
@Override
|
||||
public void initialize(URL location, ResourceBundle resources) {
|
||||
@FXML
|
||||
public void initialize() {
|
||||
clearDatePickerEntries();
|
||||
|
||||
Callback<DatePicker, DateCell> dayCellFactory = getDayCellFactory();
|
||||
datepicker.setDayCellFactory(dayCellFactory);
|
||||
datepicker.setEditable(false);
|
||||
}
|
||||
|
||||
save_button.disableProperty().bind(datepicker.valueProperty().isNull());
|
||||
public void initSaveButton(Button saveButton) {
|
||||
saveButton.disableProperty().bind(datepicker.valueProperty().isNull());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -126,12 +93,4 @@ public class SelectSowDayController implements Initializable {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* close date picker window
|
||||
*/
|
||||
private void closeWindow() {
|
||||
Stage stage = (Stage) save_button.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,10 @@ import java.lang.annotation.Retention;
|
|||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Annotates a method to be executed after all dependencies annotates with {@link Inject}
|
||||
* have been injected.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface AfterInject { }
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package ch.zhaw.gartenverwaltung.bootstrap;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.HelloApplication;
|
||||
import ch.zhaw.gartenverwaltung.MainFXMLController;
|
||||
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonCropList;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonPlantList;
|
||||
|
@ -13,7 +12,6 @@ import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
|||
import ch.zhaw.gartenverwaltung.models.PlantListModel;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
|
@ -39,14 +37,19 @@ public class AppLoader {
|
|||
|
||||
private final GardenSchedule gardenSchedule = new GardenSchedule(taskList, plantList);
|
||||
private final Garden garden = new Garden(gardenSchedule, cropList);
|
||||
private final MainFXMLController mainController;
|
||||
|
||||
|
||||
public AppLoader(MainFXMLController mainController) throws IOException {
|
||||
this.mainController = mainController;
|
||||
public AppLoader() throws IOException {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads and returns a {@link Pane} (cached).
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @return The loaded Pane
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public Pane loadPane(String fxmlFile) throws IOException {
|
||||
Pane pane = panes.get(fxmlFile);
|
||||
if (pane == null) {
|
||||
|
@ -56,6 +59,16 @@ public class AppLoader {
|
|||
return pane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given fxml-file from resources (no caching) and creates a new {@link Scene},
|
||||
* which is then appended to the given {@link Stage}.
|
||||
* Performs dependency-injection.
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @param appendee The {@link Stage} to which the new {@link Scene} is appended.
|
||||
* @return The controller of the loaded scene.
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
||||
Pane root = loader.load();
|
||||
|
@ -65,13 +78,27 @@ public class AppLoader {
|
|||
return controller;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given fxml-file from resources and caches the pane.
|
||||
* Performs dependency-injection.
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public void loadAndCacheFxml(String fxmlFile) throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
||||
AnchorPane anchorPane = loader.load();
|
||||
panes.put(fxmlFile, anchorPane);
|
||||
Pane pane = loader.load();
|
||||
panes.put(fxmlFile, pane);
|
||||
annotationInject(loader.getController());
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects the applications dependencies into the given object's fields annotated with {@link Inject}.
|
||||
* Afterwards, all methods on the objects annotated with {@link AfterInject} are executed.
|
||||
* (Success of the injections is not guaranteed!)
|
||||
*
|
||||
* @param controller The class containing the injectable fields
|
||||
*/
|
||||
public void annotationInject(Object controller) {
|
||||
Arrays.stream(controller.getClass().getDeclaredFields())
|
||||
.filter(field -> field.isAnnotationPresent(Inject.class))
|
||||
|
@ -104,7 +131,6 @@ public class AppLoader {
|
|||
case "PlantList" -> plantList;
|
||||
case "PlantListModel" -> new PlantListModel(plantList);
|
||||
case "GardenSchedule" -> gardenSchedule;
|
||||
case "MainFXMLController" -> mainController;
|
||||
case "AppLoader" -> this;
|
||||
default -> null;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
package ch.zhaw.gartenverwaltung.bootstrap;
|
||||
|
||||
import javafx.event.Event;
|
||||
import javafx.event.EventType;
|
||||
|
||||
public class ChangeViewEvent extends Event {
|
||||
private final String view;
|
||||
|
||||
public static final EventType<ChangeViewEvent> CHANGE_MAIN_VIEW = new EventType<>("CHANGE_MAIN_VIEW");
|
||||
|
||||
public ChangeViewEvent(EventType<? extends Event> eventType, String view) {
|
||||
super(eventType);
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
public String view() {
|
||||
return view;
|
||||
}
|
||||
}
|
|
@ -5,6 +5,9 @@ import java.lang.annotation.Retention;
|
|||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Annotates a Field to be injected from the application-dependencies
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface Inject { }
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="655.0" prefWidth="1175.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.MyGardenController">
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="655.0" prefWidth="1175.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.MyGardenController" fx:id="myGardenRoot">
|
||||
<children>
|
||||
<VBox layoutY="49.0" prefHeight="655.0" prefWidth="1175.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="1000.0" prefHeight="853.0"
|
||||
prefWidth="1219.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
|
||||
fx:controller="ch.zhaw.gartenverwaltung.PlantsController">
|
||||
fx:controller="ch.zhaw.gartenverwaltung.PlantsController"
|
||||
fx:id="plantsRoot">
|
||||
<children>
|
||||
<SplitPane dividerPositions="0.7377363661277062" layoutX="539.0" layoutY="266.0" prefHeight="853.0" prefWidth="1219.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<items>
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.DatePicker?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.RadioButton?>
|
||||
<?import javafx.scene.control.ToggleGroup?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
|
@ -16,12 +14,11 @@
|
|||
<children>
|
||||
<VBox maxWidth="1.7976931348623157E308" prefHeight="408.0" prefWidth="640.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<Label fx:id="popup_label" text="Label" />
|
||||
<HBox alignment="CENTER" prefHeight="293.0" prefWidth="631.0">
|
||||
<children>
|
||||
<VBox alignment="CENTER_LEFT" prefHeight="88.0" prefWidth="155.0">
|
||||
<children>
|
||||
<RadioButton fx:id="sow_radio" mnemonicParsing="false" selected="true" text="Sow">
|
||||
<RadioButton fx:id="sow_radio" mnemonicParsing="false" selected="true" text="Sow" toggleGroup="$group">
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
|
@ -38,16 +35,6 @@
|
|||
<DatePicker fx:id="datepicker" />
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox fillHeight="false" prefHeight="54.0" prefWidth="631.0" VBox.vgrow="NEVER">
|
||||
<children>
|
||||
<Button fx:id="save_button" mnemonicParsing="false" onAction="#save" prefHeight="25.0" prefWidth="53.0" text="Save">
|
||||
<HBox.margin>
|
||||
<Insets right="10.0" />
|
||||
</HBox.margin>
|
||||
</Button>
|
||||
<Button fx:id="cancel_button" mnemonicParsing="false" onAction="#cancel" text="Cancel" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
|
|
|
@ -6,17 +6,25 @@ import org.junit.jupiter.api.BeforeEach;
|
|||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.time.LocalDate;
|
||||
import java.time.MonthDay;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
public class GardenPlanModelTest {
|
||||
private final URL dbDataSource = JsonCropList.class.getResource("user-crops.json");
|
||||
private final URL testFile = JsonCropList.class.getResource("test-user-crops.json");
|
||||
|
||||
CropList cropList;
|
||||
List<Crop> exampleCrops;
|
||||
Crop exampleCropOnion;
|
||||
|
@ -29,7 +37,7 @@ public class GardenPlanModelTest {
|
|||
Garden model;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() throws IOException {
|
||||
void setUp() throws IOException, URISyntaxException {
|
||||
|
||||
|
||||
examplePlantOnion = new Plant(
|
||||
|
@ -76,18 +84,24 @@ public class GardenPlanModelTest {
|
|||
exampleCrops.add(exampleCrop1);
|
||||
exampleCrops.add(exampleCrop2);
|
||||
exampleCrops.add(exampleCrop3);
|
||||
cropList = mockGardenPlan(exampleCrops);
|
||||
cropList = mockCropList(exampleCrops);
|
||||
|
||||
GardenSchedule gardenSchedule = new GardenSchedule(new JsonTaskList(), new JsonPlantList());
|
||||
model = new Garden(gardenSchedule, cropList);
|
||||
// Reset Crop "database" before test
|
||||
assertNotNull(testFile);
|
||||
assertNotNull(dbDataSource);
|
||||
Files.copy(Path.of(testFile.toURI()), Path.of(dbDataSource.toURI()), StandardCopyOption.REPLACE_EXISTING);
|
||||
CropList testDatabase = new JsonCropList(dbDataSource);
|
||||
|
||||
GardenSchedule gardenSchedule = mock(GardenSchedule.class);
|
||||
model = new Garden(gardenSchedule, testDatabase);
|
||||
}
|
||||
|
||||
CropList mockGardenPlan(List<Crop> cropList) throws IOException {
|
||||
CropList gardenPlan = mock(CropList.class);
|
||||
when(gardenPlan.getCrops()).thenReturn(cropList);
|
||||
when(gardenPlan.getCropById(5)).thenReturn(java.util.Optional.ofNullable(exampleCropCarrot));
|
||||
when(gardenPlan.getCropById(3)).thenReturn(java.util.Optional.ofNullable(exampleCropOnion));
|
||||
return gardenPlan;
|
||||
CropList mockCropList(List<Crop> cropList) throws IOException {
|
||||
CropList croplist = mock(CropList.class);
|
||||
when(croplist.getCrops()).thenReturn(cropList);
|
||||
when(croplist.getCropById(5)).thenReturn(java.util.Optional.ofNullable(exampleCropCarrot));
|
||||
when(croplist.getCropById(3)).thenReturn(java.util.Optional.ofNullable(exampleCropOnion));
|
||||
return croplist;
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in New Issue