From 421068bb914e9ad080a956ba805dbdeead6d21f5 Mon Sep 17 00:00:00 2001 From: Robin Cheney Date: Thu, 20 Nov 2025 18:38:00 +0100 Subject: [PATCH] unstable but at least it starts --- pom.xml | 98 +++++++++- .../tankstelle/FuelStation.java | 2 +- ...lStationUI.java => FuelStationUI.java.old} | 0 .../diejungsvondertanke/tankstelle/Main.java | 10 +- .../controllers/ControllerRegistry.java.old | 13 ++ .../controllers/FuelStationUIController.java | 179 ++++++++++++++++++ .../controllers/NewStationTabController.java | 48 +++++ .../controllers/OverviewTabController.java | 75 ++++++++ .../controllers/PriceTabController.java | 47 +++++ .../controllers/ResultTabController.java | 88 +++++++++ .../controllers/SearchTabController.java | 33 ++++ .../controllers/StockTabController.java | 73 +++++++ .../tankstelle/ui/JFX.java | 42 ++++ src/main/java/module-info.java | 10 + src/main/resources/ui/FuelStationUI.fxml | 56 ++++++ src/main/resources/ui/NewStationTab.fxml | 38 ++++ src/main/resources/ui/OverviewTab.fxml | 32 ++++ src/main/resources/ui/PriceTab.fxml | 19 ++ src/main/resources/ui/ResultTab.fxml | 26 +++ src/main/resources/ui/SearchTab.fxml | 15 ++ src/main/resources/ui/StockTab.fxml | 23 +++ 21 files changed, 918 insertions(+), 9 deletions(-) rename src/main/java/de/diejungsvondertanke/tankstelle/{FuelStationUI.java => FuelStationUI.java.old} (100%) create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/ControllerRegistry.java.old create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/FuelStationUIController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/NewStationTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/OverviewTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/PriceTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/ResultTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/SearchTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/controllers/StockTabController.java create mode 100644 src/main/java/de/diejungsvondertanke/tankstelle/ui/JFX.java create mode 100644 src/main/java/module-info.java create mode 100644 src/main/resources/ui/FuelStationUI.fxml create mode 100644 src/main/resources/ui/NewStationTab.fxml create mode 100644 src/main/resources/ui/OverviewTab.fxml create mode 100644 src/main/resources/ui/PriceTab.fxml create mode 100644 src/main/resources/ui/ResultTab.fxml create mode 100644 src/main/resources/ui/SearchTab.fxml create mode 100644 src/main/resources/ui/StockTab.fxml diff --git a/pom.xml b/pom.xml index c35dd0a..f1179cb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,18 +6,82 @@ de.diejungsvondertanke.tankstelle tankstelle 1.0-SNAPSHOT + jar + - org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.1.0 - de.diejungsvondertanke.tankstelle.Main + ${mainClass} + + ${project.build.directory}/modules + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${java.version} + + + + org.ow2.asm + asm + 6.2.1 + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/modules + runtime + + + + + + + + maven-compiler-plugin + 3.11.0 + + ${java.version} + ${java.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + ${main.Class} + + --module-path + ${java.home}/lib + --add-modules=javafx.controls,javafx.fxml + @@ -27,6 +91,34 @@ UTF-8 25 25 + 20 + 23.0.2 + de.diejungsvondertanke.tankstelle.ui.JFX + + + + org.openjfx + javafx-controls + ${javafx.version} + + + org.openjfx + javafx-fxml + ${javafx.version} + + + org.openjfx + javafx-graphics + ${javafx.version} + + + + + org.openjfx + javafx-base + ${javafx.version} + + \ No newline at end of file diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/FuelStation.java b/src/main/java/de/diejungsvondertanke/tankstelle/FuelStation.java index c2c5fe3..a3c6042 100644 --- a/src/main/java/de/diejungsvondertanke/tankstelle/FuelStation.java +++ b/src/main/java/de/diejungsvondertanke/tankstelle/FuelStation.java @@ -15,7 +15,7 @@ import de.diejungsvondertanke.tankstelle.error.NoSuchFuelTypeError; * @author Robin Cheney * @author Nils Göbbert */ -abstract class FuelStation { +public abstract class FuelStation { /** * Number of employees of this fuel station */ diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/FuelStationUI.java b/src/main/java/de/diejungsvondertanke/tankstelle/FuelStationUI.java.old similarity index 100% rename from src/main/java/de/diejungsvondertanke/tankstelle/FuelStationUI.java rename to src/main/java/de/diejungsvondertanke/tankstelle/FuelStationUI.java.old diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/Main.java b/src/main/java/de/diejungsvondertanke/tankstelle/Main.java index 0e0d38c..0ab25e4 100644 --- a/src/main/java/de/diejungsvondertanke/tankstelle/Main.java +++ b/src/main/java/de/diejungsvondertanke/tankstelle/Main.java @@ -29,7 +29,7 @@ public class Main { * create an array list to store the fuel stations while the program is running * add the initial array of fuel stations to the List */ - static ArrayList fuelStations = new ArrayList(Arrays.asList(initialFuelStations)); + public static ArrayList fuelStations = new ArrayList(Arrays.asList(initialFuelStations)); /** * Main method @@ -37,10 +37,10 @@ public class Main { * @param args Program arguments (not in use) */ public static void main(String[] args) { - javax.swing.SwingUtilities.invokeLater(() -> { - FuelStationUI ui = new FuelStationUI(); - ui.setVisible(true); - }); + // javax.swing.SwingUtilities.invokeLater(() -> { + // FuelStationUI ui = new FuelStationUI(); + // ui.setVisible(true); + // }); } /** diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ControllerRegistry.java.old b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ControllerRegistry.java.old new file mode 100644 index 0000000..010b211 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ControllerRegistry.java.old @@ -0,0 +1,13 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +public class ControllerRegistry { + private static FuelStationUIController main; + + public static void registerMain(FuelStationUIController controller) { + main = controller; + } + + public static FuelStationUIController getMain() { + return main; + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/FuelStationUIController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/FuelStationUIController.java new file mode 100644 index 0000000..78f17b0 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/FuelStationUIController.java @@ -0,0 +1,179 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import java.io.IOException; +import java.util.function.Consumer; + +import de.diejungsvondertanke.tankstelle.*; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.control.*; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; + +public class FuelStationUIController { + + // @FXML + // public ComboBox comboFuelStations; + + // @FXML + // public ComboBox comboFuelTypes; + + // @FXML + // private TabPane tabPane; + + // // child controllers + // @FXML + // private HBox resultTab; + + // @FXML + // private HBox priceTab; + + // @FXML + // private HBox stockTab; + + // @FXML + // private HBox searchTab; + + // @FXML + // private HBox newStationTab; + + // @FXML + // private HBox overviewTab; + + // @FXML + // private TextArea outputArea; + + @FXML + public ComboBox comboFuelStations; + @FXML + public ComboBox comboFuelTypes; + @FXML + private TabPane tabPane; + @FXML + private TextArea outputArea; + + // Placeholder containers for the included tabs + @FXML + private HBox resultTabContainer; + @FXML + private GridPane priceTabContainer; + @FXML + private GridPane stockTabContainer; + @FXML + private HBox searchTabContainer; + @FXML + private GridPane newStationTabContainer; + @FXML + private BorderPane overviewTabContainer; + + // Controllers of included tabs + private ResultTabController resultTabController; + private PriceTabController priceTabController; + private StockTabController stockTabController; + private SearchTabController searchTabController; + private NewStationTabController newStationTabController; + private OverviewTabController overviewTabController; + + @FXML + public void initialize() { + // Load all tabs manually and keep controllers + comboFuelTypes.getItems().setAll(FuelType.values()); + // loadTab("/ui/ResultTab.fxml", resultTabContainer, + // (ResultTabController controller) -> resultTabController = controller); + // loadTab("/ui/PriceTab.fxml", priceTabContainer, + // (PriceTabController controller) -> priceTabController = controller); + // loadTab("/ui/StockTab.fxml", stockTabContainer, + // (StockTabController controller) -> stockTabController = controller); + // loadTab("/ui/SearchTab.fxml", searchTabContainer, + // (SearchTabController controller) -> searchTabController = controller); + // loadTab("/ui/NewStationTab.fxml", newStationTabContainer, + // (NewStationTabController controller) -> newStationTabController = + // controller); + // loadTab("/ui/OverviewTab.fxml", overviewTabContainer, + // (OverviewTabController controller) -> overviewTabController = controller); + + try { + loadTab("/ui/ResultTab.fxml", resultTabContainer, (ResultTabController c) -> resultTabController = c); + loadTab("/ui/PriceTab.fxml", priceTabContainer, (PriceTabController c) -> priceTabController = c); + loadTab("/ui/StockTab.fxml", stockTabContainer, (StockTabController c) -> stockTabController = c); + loadTab("/ui/SearchTab.fxml", searchTabContainer, (SearchTabController c) -> searchTabController = c); + loadTab("/ui/NewStationTab.fxml", newStationTabContainer, + (NewStationTabController c) -> newStationTabController = c); + loadTab("/ui/OverviewTab.fxml", overviewTabContainer, + (OverviewTabController c) -> overviewTabController = c); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + // Generic loader helper + // private void loadTab(String fxmlPath, Parent placeholder, + // java.util.function.Consumer controllerSetter) { + // try { + // FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlPath)); + // Parent content = loader.load(); + // T controller = loader.getController(); + // controllerSetter.accept(controller); + // placeholder.getChildren().setAll(content); + // } catch (IOException e) { + // e.printStackTrace(); + // } + // } + + private void loadTab(String fxmlPath, Parent container, Consumer controllerConsumer) throws IOException { + FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlPath)); + Parent loaded = loader.load(); + T controller = loader.getController(); + + // Add loaded node to the container + if (container instanceof Pane pane) { + pane.getChildren().setAll(loaded); + } else if (container instanceof ScrollPane scroll) { + scroll.setContent(loaded); + } else if (container instanceof BorderPane border) { + border.setCenter(loaded); + } else { + throw new IllegalArgumentException("Unsupported container type: " + container.getClass()); + } + + controllerConsumer.accept(controller); + } + + public FuelStation getSelectedStation() { + int idx = comboFuelStations.getSelectionModel().getSelectedIndex(); + if (idx < 0 || idx >= Main.fuelStations.size()) + return null; + return Main.fuelStations.get(idx); + } + + public void refreshStationNames() { + comboFuelStations.getItems().setAll( + Main.fuelStations.stream() + .map(this::getDisplayName) + .toList()); + } + + public String getDisplayName(FuelStation fs) { + int index = Main.fuelStations.indexOf(fs); + if (index >= 0) { + return "Station " + (index + 1) + " (" + fs.getClass().getSimpleName() + ")"; + } + return fs.getClass().getSimpleName(); + } + + public void appendOutput(String text) { + outputArea.appendText(text + "\n\n"); + } + + public void showError(String msg) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setHeaderText("Error"); + alert.setContentText(msg); + alert.showAndWait(); + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/NewStationTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/NewStationTabController.java new file mode 100644 index 0000000..603bec9 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/NewStationTabController.java @@ -0,0 +1,48 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.Main; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import javafx.fxml.FXML; +import javafx.scene.control.*; + +public class NewStationTabController { + + @FXML + private RadioButton rbSmall, rbMedium, rbLarge; + @FXML + private TextField txtAttr; + + private FuelStationUIController parentController; + + // Called by parent after full initialization + public void setParentController(FuelStationUIController parent) { + this.parentController = parent; + } + + @FXML + private void add() { + try { + if (rbSmall.isSelected()) { + short vending = Short.parseShort(txtAttr.getText().trim()); + Main.addNewFuelStation(vending); + parentController.appendOutput("Added small station (" + vending + " vending machines)."); + + } else if (rbMedium.isSelected()) { + float size = Float.parseFloat(txtAttr.getText().replace(",", ".")); + Main.addNewFuelStation(size); + parentController.appendOutput("Added medium station (" + size + " m²)."); + + } else if (rbLarge.isSelected()) { + String company = txtAttr.getText().trim(); + Main.addNewFuelStation(company); + parentController.appendOutput("Added large station (" + company + ")."); + } + + parentController.refreshStationNames(); + txtAttr.clear(); + + } catch (Exception e) { + parentController.showError(e.getMessage()); + } + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/OverviewTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/OverviewTabController.java new file mode 100644 index 0000000..2ce3c46 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/OverviewTabController.java @@ -0,0 +1,75 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.*; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import javafx.beans.property.SimpleFloatProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.fxml.FXML; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; + +public class OverviewTabController { + + @FXML + private TableView table; + + @FXML + private TableColumn colStation; + @FXML + private TableColumn colType; + @FXML + private TableColumn colFuel; + @FXML + private TableColumn colAmount; + @FXML + private TableColumn colCapacity; + @FXML + private TableColumn colPrice; + + private FuelStationUIController parentController; + + // Called by parent after full initialization + public void setParentController(FuelStationUIController parent) { + this.parentController = parent; + } + + @FXML + public void initialize() { + colStation.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().station())); + colType.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().type())); + colFuel.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().fuel())); + colAmount.setCellValueFactory(data -> new SimpleFloatProperty(data.getValue().amount()).asObject()); + colCapacity.setCellValueFactory(data -> new SimpleIntegerProperty(data.getValue().capacity()).asObject()); + colPrice.setCellValueFactory(data -> new SimpleFloatProperty(data.getValue().price()).asObject()); + + refresh(); + } + + @FXML + public void refresh() { + table.getItems().clear(); + + for (FuelStation station : Main.fuelStations) { + for (Fuel f : station.fuels) { + table.getItems().add( + new FuelRow( + parentController.getDisplayName(station), + station.getClass().getSimpleName(), + f.FUEL_TYPE.toString(), + f.getStored_amount(), + f.CAPACITY, + f.getPrice())); + } + } + } + + public record FuelRow( + String station, + String type, + String fuel, + float amount, + int capacity, + float price) { + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/PriceTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/PriceTabController.java new file mode 100644 index 0000000..2a2c616 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/PriceTabController.java @@ -0,0 +1,47 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.FuelStation; +import de.diejungsvondertanke.tankstelle.FuelType; +import de.diejungsvondertanke.tankstelle.error.NoSuchFuelTypeError; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import javafx.fxml.FXML; +import javafx.scene.control.TextField; + +public class PriceTabController { + + @FXML + private TextField txtPrice; + + private FuelStationUIController parentController; + + // Called by parent after full initialization + public void setParentController(FuelStationUIController parent) { + this.parentController = parent; + } + + @FXML + private void save() { + FuelStation station = parentController.getSelectedStation(); + FuelType type = parentController.comboFuelTypes.getValue(); + + if (station == null) { + parentController.showError("Select a station."); + return; + } + + try { + float price = Float.parseFloat(txtPrice.getText().replace(",", ".")); + station.set_price(type, price); + + parentController.appendOutput("Price of %s at %s changed to %.3f €/L" + .formatted(type, parentController.getDisplayName(station), price)); + + txtPrice.clear(); + + } catch (NumberFormatException ex) { + parentController.showError("Invalid number."); + } catch (NoSuchFuelTypeError ex) { + parentController.showError("Fuel type unavailable."); + } + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ResultTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ResultTabController.java new file mode 100644 index 0000000..c6619c3 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/ResultTabController.java @@ -0,0 +1,88 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.*; +import de.diejungsvondertanke.tankstelle.error.NoSuchFuelTypeError; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import javafx.fxml.FXML; +import javafx.scene.control.ListView; + +public class ResultTabController { + + @FXML + private ListView listFuelStations; + private FuelStationUIController parentController; + + public void setParentController(FuelStationUIController parentController) { + this.parentController = parentController; + } + + public void refreshList() { + if (parentController != null && parentController.comboFuelStations != null) { + listFuelStations.getItems().setAll(parentController.comboFuelStations.getItems()); + } + } + + // Example action using parent + @FXML + private void handleTotalPrice() { + if (parentController != null) { + parentController.appendOutput("Total price calculation here..."); + } + } + + @FXML + private void handleHighestPrice() { + FuelType type = parentController.comboFuelTypes.getValue(); + try { + FuelStation fs = Main.getHighestPrice(type); + parentController.appendOutput("Highest price for %s: %s" + .formatted(type, parentController.getDisplayName(fs))); + } catch (NoSuchFuelTypeError ex) { + parentController.showError("Fuel type unavailable."); + } + } + + @FXML + private void handleHighestTotalValue() { + try { + FuelStation fs = Main.getHighestAccumulatedValue(); + parentController.appendOutput("Highest total value: " + parentController.getDisplayName(fs)); + } catch (NoSuchFuelTypeError ex) { + parentController.showError("Calculation error."); + } + } + + @FXML + private void handleStock() { + FuelType type = parentController.comboFuelTypes.getValue(); + try { + FuelStation max = Main.getHighestStoredAmount(type); + FuelStation min = Main.getLowestStoredAmount(type); + parentController.appendOutput(""" + Stock for %s: + - Highest: %s + - Lowest: %s + """.formatted(type, parentController.getDisplayName(max), parentController.getDisplayName(min))); + } catch (NoSuchFuelTypeError e) { + parentController.showError("Fuel type unavailable."); + } + } + + @FXML + private void handleTotalStock() { + FuelType type = parentController.comboFuelTypes.getValue(); + var items = listFuelStations.getSelectionModel().getSelectedIndices(); + + if (items.isEmpty()) { + parentController.showError("Select at least one station."); + return; + } + + FuelStation[] stations = items.stream() + .map(i -> Main.fuelStations.get(i)) + .toArray(FuelStation[]::new); + + float total = Main.getTotalStockLevelOfFuel(type, stations); + parentController.appendOutput("Total for %s: %.2f L".formatted(type, total)); + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/SearchTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/SearchTabController.java new file mode 100644 index 0000000..8e86747 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/SearchTabController.java @@ -0,0 +1,33 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.*; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import de.diejungsvondertanke.tankstelle.error.NoSuchFuelTypeError; +import javafx.fxml.FXML; + +public class SearchTabController { + + private FuelStationUIController parentController; + + // Called by parent after full initialization + public void setParentController(FuelStationUIController parent) { + this.parentController = parent; + } + + @FXML + private void search() { + FuelType type = parentController.comboFuelTypes.getValue(); + + StringBuilder sb = new StringBuilder("Stations with " + type + ":\n"); + + for (FuelStation station : Main.fuelStations) { + try { + station.getStored_amount(type); + sb.append(" - ").append(parentController.getDisplayName(station)).append("\n"); + } catch (NoSuchFuelTypeError ignore) { + } + } + + parentController.appendOutput(sb.toString()); + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/controllers/StockTabController.java b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/StockTabController.java new file mode 100644 index 0000000..2224267 --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/controllers/StockTabController.java @@ -0,0 +1,73 @@ +package de.diejungsvondertanke.tankstelle.controllers; + +import de.diejungsvondertanke.tankstelle.*; +import de.diejungsvondertanke.tankstelle.ui.JFX; +import de.diejungsvondertanke.tankstelle.error.NoSuchFuelTypeError; +import javafx.fxml.FXML; +import javafx.scene.control.*; + +public class StockTabController { + + @FXML + private TextField txtAmount; + @FXML + private RadioButton rbAbsolute; + @FXML + private RadioButton rbDelta; + + private FuelStationUIController parentController; + + // Called by parent after full initialization + public void setParentController(FuelStationUIController parent) { + this.parentController = parent; + } + + private int getCapacity(FuelStation station, FuelType type) throws NoSuchFuelTypeError { + for (Fuel f : station.fuels) { + if (f.FUEL_TYPE == type) + return f.CAPACITY; + } + throw new NoSuchFuelTypeError("Fuel type not available"); + } + + @FXML + private void save() { + FuelStation station = parentController.getSelectedStation(); + FuelType type = parentController.comboFuelTypes.getValue(); + + if (station == null) { + parentController.showError("Select a station."); + return; + } + + try { + float value = Float.parseFloat(txtAmount.getText().replace(",", ".")); + int capacity = getCapacity(station, type); + float current = station.getStored_amount(type); + + if (rbAbsolute.isSelected()) { + if (value < 0 || value > capacity) { + parentController.showError("Invalid amount."); + return; + } + station.set_stored_amount(value, type); + parentController.appendOutput("Stock of %s at %s set to %.2f L" + .formatted(type, parentController.getDisplayName(station), value)); + } else { + float updated = current + value; + if (updated < 0 || updated > capacity) { + parentController.showError("Out of capacity bounds."); + return; + } + station.add_stored_amount(value, type); + parentController.appendOutput("Stock of %s at %s changed by %.2f L" + .formatted(type, parentController.getDisplayName(station), value)); + } + + txtAmount.clear(); + + } catch (Exception ex) { + parentController.showError(ex.getMessage()); + } + } +} diff --git a/src/main/java/de/diejungsvondertanke/tankstelle/ui/JFX.java b/src/main/java/de/diejungsvondertanke/tankstelle/ui/JFX.java new file mode 100644 index 0000000..5e2d1cf --- /dev/null +++ b/src/main/java/de/diejungsvondertanke/tankstelle/ui/JFX.java @@ -0,0 +1,42 @@ +package de.diejungsvondertanke.tankstelle.ui; + +import java.io.IOException; + +// import de.diejungsvondertanke.tankstelle.controllers.ControllerRegistry; +import de.diejungsvondertanke.tankstelle.controllers.FuelStationUIController; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +public class JFX extends Application { + + static Stage stage; + + public static FuelStationUIController controller; + + static Parent parent; + + @Override + public void start(Stage s) throws Exception { + stage = s; + Parent parent = loadFXML("FuelStationUI"); + Scene scene = new Scene(parent); + + stage.setScene(scene); + stage.setTitle("Fuel Station Management System"); + stage.show(); + } + + public static void main(String[] args) { + launch(args); + } + + private static Parent loadFXML(String fxml) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader(JFX.class.getResource("/ui/" + fxml + ".fxml")); + parent = fxmlLoader.load(); + controller = fxmlLoader.getController(); + return parent; + } +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..e850031 --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,10 @@ +module tankstelle { + requires javafx.controls; + requires javafx.fxml; + requires javafx.graphics; + requires javafx.base; + + opens de.diejungsvondertanke.tankstelle.ui to javafx.fxml, javafx.graphics; + opens de.diejungsvondertanke.tankstelle.controllers to javafx.fxml, javafx.graphics; + // exports de.diejungsvondertanke.tankstelle; +} diff --git a/src/main/resources/ui/FuelStationUI.fxml b/src/main/resources/ui/FuelStationUI.fxml new file mode 100644 index 0000000..1856b65 --- /dev/null +++ b/src/main/resources/ui/FuelStationUI.fxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +