diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java index 99a1852..7c21101 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java @@ -19,7 +19,7 @@ public class MainFXMLController implements Initializable { /** * Caching the panes */ - private final Map panes = new HashMap<>(); + private final Map panes = new HashMap<>(); @FXML private Button home_button; @@ -68,20 +68,22 @@ public class MainFXMLController implements Initializable { * @throws IOException exception when file does not exist */ public void loadPane(String fxmlFile) throws IOException { - //ToDo HGrow and VGrow of new node - Node node = panes.get(fxmlFile); - System.out.println(node); - if (node == null) { + + AnchorPane anchorPane = panes.get(fxmlFile); + if (anchorPane == null) { FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile))); - node = loader.load(); - panes.put(fxmlFile, node); + anchorPane = loader.load(); + panes.put(fxmlFile, anchorPane); if(fxmlFile.equals("MyPlants.fxml")) { MyPlantsController myPlantsController = loader.getController(); myPlantsController.getMainController(this); } } - mainPane.getChildren().setAll(node); + mainPane.getChildren().setAll(anchorPane); + anchorPane.prefWidthProperty().bind(mainPane.widthProperty()); + anchorPane.prefHeightProperty().bind(mainPane.heightProperty()); + } private void styleChangeButton(Button button) { diff --git a/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java b/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java index a3646fa..5554d3d 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/PlantsController.java @@ -4,6 +4,7 @@ import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException; import ch.zhaw.gartenverwaltung.plantList.PlantListModel; import ch.zhaw.gartenverwaltung.types.HardinessZone; import ch.zhaw.gartenverwaltung.types.Plant; +import ch.zhaw.gartenverwaltung.types.Seasons; import javafx.application.Platform; import javafx.beans.property.ListProperty; import javafx.beans.property.SimpleListProperty; @@ -13,8 +14,10 @@ import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.geometry.Insets; import javafx.geometry.Bounds; import javafx.scene.control.*; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; import javafx.scene.layout.VBox; @@ -30,10 +33,11 @@ public class PlantsController implements Initializable { private final HardinessZone DEFAULT_HARDINESS_ZONE = HardinessZone.ZONE_8A; // TODO: move to model + private final ListProperty plantListProperty = new SimpleListProperty<>(FXCollections.observableArrayList()); @FXML - private CheckBox autum_filter; + private VBox seasons; @FXML private VBox climate_zones; @@ -53,81 +57,44 @@ public class PlantsController implements Initializable { @FXML private TextField search_plants; - @FXML - private CheckBox sommer_filter; - - @FXML - private CheckBox spring_filter; - - @FXML - private CheckBox winter_filter; - - @FXML - void filterAutum(ActionEvent event) { - //ToDo - - } - - @FXML - void filterSommer(ActionEvent event) { - //ToDo - - } - - @FXML - void filterSpring(ActionEvent event) { - //ToDo - - } - - @FXML - void filterWinter(ActionEvent event) { - //ToDo - - } - + /** + * saves the current selected plant in new JSON database + * @param event event + */ @FXML void saveToMyPlant(ActionEvent event) { //ToDo model save selectedPlant to mySelectedPlant(IO) } - @FXML - void searchForPlant(KeyEvent event) { - viewFilteredListBySearch(search_plants.getText()); - } - /** + * fill list view with current hardiness zone + * set default values + * create filter of season and hardiness zone + * create event listener for selected list entry and search by query * {@inheritDoc} */ @Override public void initialize(URL url, ResourceBundle resourceBundle) { setListCellFactory(); - try { - plantListProperty.addAll(plantListModel.getPlantList(DEFAULT_HARDINESS_ZONE)); - } catch (HardinessZoneNotSetException | IOException e) { - e.printStackTrace(); - } - + fillPlantListWithHardinessZone(); list_plants.itemsProperty().bind(plantListProperty); - list_plants.getSelectionModel().selectedItemProperty() - .addListener((observable, oldPlant, newPlant) -> { - if (newPlant != null) { - img_plant.setImage(newPlant.image()); - } - }); description_plant.setText(""); saveToMyPlant_button.setDisable(true); + createFilterSeasons(); createFilterHardinessZone(); lookForSelectedListEntry(); + try { + viewFilteredListBySearch(); + } catch (HardinessZoneNotSetException | IOException e) { + e.printStackTrace(); + } } - private void centerImage() { - - //img_plant.setX(0.3); - //img_plant.setX(-100); - } + /** + * set text of list view to plant name + */ private void setListCellFactory() { list_plants.setCellFactory(param -> new ListCell() { @Override @@ -144,62 +111,138 @@ public class PlantsController implements Initializable { } /** - * update the ListView according to the plant list provided - * Entry in ListView is plant name - * @param list plantList which fill the ListView + * 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 */ - private void fillListViewWithData(List list) { + private void viewFilteredListBySeason(Seasons season) throws HardinessZoneNotSetException, IOException { clearListView(); - for (Plant plant : list) { - list_plants.getItems().add(plant); - } - + plantListProperty.addAll(plantListModel.getFilteredPlantListBySaisonWithoutGrowthPhase(plantListModel.getCurrentZone(), season.getStartDate(), season.getEndDate())); } - private void viewFilteredListByFilters() { - boolean springValue = spring_filter.isSelected(); - boolean sommerValue = sommer_filter.isSelected(); - boolean autumValue = autum_filter.isSelected(); - boolean winterValue = winter_filter.isSelected(); - //ToDo getFilteredPlantList with (plantListModel.getFilteredPlantList(DEFAULT_HARDINESS_ZONE, )) - //List plantList = new LinkedList<>(); - //fillListViewWithData(plantList); + /** + * 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 + */ + private void viewFilteredListBySearch() throws HardinessZoneNotSetException, IOException { + search_plants.textProperty().addListener((observable, oldValue, newValue) -> { + if (newValue.isEmpty()) { + fillPlantListWithHardinessZone(); + }else { + try { + List filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, newValue); + clearListView(); + plantListProperty.addAll(filteredPlants); + } catch (HardinessZoneNotSetException | IOException e) { + e.printStackTrace(); + } + } + }); } - private void viewFilteredListBySearch(String query) { - //ToDo getFilteredPlantList with (plantListModel.getFilteredPlantList(DEFAULT_HARDINESS_ZONE, )) + /** + * get plant list of current hardiness zone + * fill list view with plant list + */ + private void fillPlantListWithHardinessZone() { try { - List filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, query); clearListView(); - plantListProperty.addAll(filteredPlants); - + plantListProperty.addAll(plantListModel.getPlantList(plantListModel.getCurrentZone())); } catch (HardinessZoneNotSetException | IOException e) { e.printStackTrace(); } } + /** + * creates radio buttons for the hardiness zones defined in enum HardinessZone + * defines default value as selected + * when selected filter viewList according to hardiness zone + */ private void createFilterHardinessZone() { - //ToDo create radioList of hardinessZone in VBox climate_zones + ToggleGroup hardinessGroup = new ToggleGroup(); + for (HardinessZone zone : HardinessZone.values()) { + RadioButton radioButton = new RadioButton(zone.name()); + radioButton.setToggleGroup(hardinessGroup); + radioButton.setPadding(new Insets(0,0,10,0)); + if (zone.equals(DEFAULT_HARDINESS_ZONE)) { + radioButton.setSelected(true); + } + radioButton.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + plantListModel.setCurrentZone(zone); + fillPlantListWithHardinessZone(); + } + }); + climate_zones.getChildren().add(radioButton); + } } /** - * observes changes in the selectedProperty of ListView and updates the description label + * creates radio buttons for the seasons defined in enum Seasons + * defines default value as selected + * when selected filter viewList according to seasons + */ + private void createFilterSeasons() { + ToggleGroup seasonGroup = new ToggleGroup(); + for (Seasons season : Seasons.values()) { + RadioButton radioButton = new RadioButton(season.name()); + radioButton.setToggleGroup(seasonGroup); + radioButton.setPadding(new Insets(0,0,10,0)); + if (season.equals(Seasons.AllSEASONS)) { + radioButton.setSelected(true); + } + radioButton.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (season.equals(Seasons.AllSEASONS)) { + fillPlantListWithHardinessZone(); + } else { + try { + viewFilteredListBySeason(season); + } catch (HardinessZoneNotSetException | IOException e) { + e.printStackTrace(); + } + } + + } + }); + seasons.getChildren().add(radioButton); + } + } + + /** + * observes changes in the selectedProperty of ListView and updates: + * the description label + * image of the plant */ private void lookForSelectedListEntry() { list_plants.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Plant oldValue, Plant newValue) { - //ToDo if(newValue != null) { selectedPlant = newValue; description_plant.setText(selectedPlant.description()); saveToMyPlant_button.setDisable(false); - //update img plant + Image img; + if(selectedPlant.image() != null) { + img = selectedPlant.image(); + } else { + img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png"))); + } + img_plant.setImage(img); + + } else { selectedPlant = null; description_plant.setText(""); saveToMyPlant_button.setDisable(true); - //update img when null placeholder PNG + Image img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png"))); + img_plant.setImage(img); } } }); diff --git a/src/main/java/ch/zhaw/gartenverwaltung/plantList/PlantListModel.java b/src/main/java/ch/zhaw/gartenverwaltung/plantList/PlantListModel.java index ad02864..4bfc9b1 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/plantList/PlantListModel.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/plantList/PlantListModel.java @@ -167,4 +167,17 @@ public class PlantListModel { public List getFilteredPlantListByHarvestSaison(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException { return getFilteredPlantListBySaison(GrowthPhaseType.HARVEST, zone, from, to); } + + /** + * + * @param zone selected hardiness zone + * @param from the earliest date to for the filter + * @param to the lastest date for the filter + * @return List of Plants with selected saison + * @throws HardinessZoneNotSetException If no {@link HardinessZone} was specified + * @throws IOException If the database cannot be accessed + */ + public List getFilteredPlantListBySaisonWithoutGrowthPhase(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException { + return getFilteredPlantList(zone, plant -> plant.lifecycle().stream().anyMatch(growthPhase -> growthPhase.startDate().compareTo(from) >= 0 && (growthPhase.startDate().compareTo(to) <= 0))); + } } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java b/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java new file mode 100644 index 0000000..5e907a4 --- /dev/null +++ b/src/main/java/ch/zhaw/gartenverwaltung/types/Seasons.java @@ -0,0 +1,26 @@ +package ch.zhaw.gartenverwaltung.types; + +import java.time.MonthDay; + +public enum Seasons { + AllSEASONS("--01-01", "--12-31"), + SPRING("--03-01", "--05-30"), + SOMMER("--06-01", "--08-30"), + AUTUM("--09-01", "--11-30"), + WINTER("--12-01", "--02-28"); + + public final String startDate; + public final String endDate; + + Seasons(String startDate, String endDate) { + this.startDate = startDate; + this.endDate = endDate; + } + + public MonthDay getStartDate() { + return MonthDay.parse(this.startDate); + } + public MonthDay getEndDate() { + return MonthDay.parse(this.endDate); + } +} diff --git a/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml b/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml index 9abee94..4fbb89b 100644 --- a/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml +++ b/src/main/resources/ch/zhaw/gartenverwaltung/Plants.fxml @@ -3,7 +3,6 @@ - @@ -16,8 +15,9 @@ - + @@ -30,7 +30,7 @@ - + @@ -75,30 +75,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - +