From 95bf169edcb93c5fa4f3e0fa265deb9ebb860b12 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Mon, 9 Oct 2023 19:52:31 +0100 Subject: [PATCH 01/12] Created Stock Model and StockStatus Enum. Added FXML attributes and action events to Controller --- ShareDatabaseApp.iml | 1 + .../java/share_database_app/models/Stock.java | 49 +++++++++++++++++++ .../models/StockStatus.java | 8 +++ .../share_database_app/mvc/Controller.java | 28 +++++++++++ .../share_database_app/mvc}/Main.java | 24 ++++++--- .../java/share_database_app/mvc/Model.java | 5 ++ .../res/ResourceManager.java | 10 +--- .../java/share_database_app/res/scene.fxml | 24 +++++++++ src/com/atden04/java_test/res/scene.fxml | 10 ---- src/com/atden04/java_test/res/style.css | 3 -- .../java_test/user_interface/Controller.java | 22 --------- src/module-info.java | 8 +-- 12 files changed, 136 insertions(+), 56 deletions(-) create mode 100644 src/com/atden04/java/share_database_app/models/Stock.java create mode 100644 src/com/atden04/java/share_database_app/models/StockStatus.java create mode 100644 src/com/atden04/java/share_database_app/mvc/Controller.java rename src/com/atden04/{java_test/user_interface => java/share_database_app/mvc}/Main.java (57%) create mode 100644 src/com/atden04/java/share_database_app/mvc/Model.java rename src/com/atden04/{java_test => java/share_database_app}/res/ResourceManager.java (51%) create mode 100644 src/com/atden04/java/share_database_app/res/scene.fxml delete mode 100644 src/com/atden04/java_test/res/scene.fxml delete mode 100644 src/com/atden04/java_test/res/style.css delete mode 100644 src/com/atden04/java_test/user_interface/Controller.java diff --git a/ShareDatabaseApp.iml b/ShareDatabaseApp.iml index c90834f..109adcc 100644 --- a/ShareDatabaseApp.iml +++ b/ShareDatabaseApp.iml @@ -7,5 +7,6 @@ + \ No newline at end of file diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java new file mode 100644 index 0000000..4b75b8f --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -0,0 +1,49 @@ +package com.atden04.java.share_database_app.models; + +import javafx.beans.property.SimpleStringProperty; + +public class Stock { + private final SimpleStringProperty name; + private final SimpleStringProperty dateOfPurchase; + private StockStatus status; + + public Stock(String name, String dateOfPurchase, String status) { + this.name = new SimpleStringProperty(name); + this.dateOfPurchase = new SimpleStringProperty(dateOfPurchase); + if (status.equalsIgnoreCase("bought")) + this.status = StockStatus.BOUGHT; + else if (status.equalsIgnoreCase("sold")) + this.status = StockStatus.SOLD; + else if (status.equalsIgnoreCase("liquidated")) + this.status = StockStatus.LIQUIDATED; + } + + public String toString() { + return "Stock Name : "+this.getName()+", Date of Purchase : "+this.getDateOfPurchase()+", Status : "+this.getStatus(); + } + + public String getName() { + return this.name.get(); + } + + public void setName(String newName) { + this.name.set(newName); + } + + public String getDateOfPurchase() { + return this.dateOfPurchase.get(); + } + + public void setDateOfPurchase(String newDate) { + this.dateOfPurchase.set(newDate); + } + + public StockStatus getStatus() { + return this.status; + } + + public void setStatus(StockStatus newStatus) { + this.status = newStatus; + } + +} diff --git a/src/com/atden04/java/share_database_app/models/StockStatus.java b/src/com/atden04/java/share_database_app/models/StockStatus.java new file mode 100644 index 0000000..a1310fb --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/StockStatus.java @@ -0,0 +1,8 @@ +package com.atden04.java.share_database_app.models; + +public enum StockStatus { + DEFUALT, + BOUGHT, + SOLD, + LIQUIDATED +} diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java new file mode 100644 index 0000000..f5d419c --- /dev/null +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -0,0 +1,28 @@ +package com.atden04.java.share_database_app.mvc; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.MenuItem; +import javafx.scene.control.TabPane; + +public class Controller { + + public MenuItem addRowMenu; + public MenuItem deleteRowMenu; + public TabPane tabPane; + + public Controller() { + System.out.println("Controller constructed"); + } + + public void initialise() { + + } + + public void handleAddRow(ActionEvent actionEvent) { + } + + public void handleDeleteRow(ActionEvent actionEvent) { + } +} diff --git a/src/com/atden04/java_test/user_interface/Main.java b/src/com/atden04/java/share_database_app/mvc/Main.java similarity index 57% rename from src/com/atden04/java_test/user_interface/Main.java rename to src/com/atden04/java/share_database_app/mvc/Main.java index c979e7f..b7c6fae 100644 --- a/src/com/atden04/java_test/user_interface/Main.java +++ b/src/com/atden04/java/share_database_app/mvc/Main.java @@ -1,37 +1,45 @@ -package com.atden04.java_test.user_interface; +package com.atden04.java.share_database_app.mvc; -import com.atden04.java_test.res.ResourceManager; +import com.atden04.java.share_database_app.res.ResourceManager; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; -import java.net.URL; - // Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, // then press Enter. You can now see whitespace characters in your code. public class Main extends Application { + Model model; Controller controller; @Override public void start(Stage stage) throws Exception { - //Parent root = FXMLLoader.load(getClass().getResource("scene.fxml")); + // Create the controller and model + this.controller = new Controller(); + this.model = new Model(); + + //Create FXML Loader and set the controller FXMLLoader loader = new FXMLLoader(ResourceManager.getFxml("scene.fxml")); this.controller = new Controller(); loader.setControllerFactory((Klass) -> this.controller); + //Load the root of the scene and create the scene itself Parent root = loader.load(); Scene scene = new Scene(root); - scene.getStylesheets().add(ResourceManager.getCss("style.css").toExternalForm()); - stage.setTitle("JavaFX"); - stage.setScene(scene); + stage.setTitle("Share Database App v0.1"); //set title of stage (window) + stage.setScene(scene); //set the scene of the stage stage.show(); } + @Override + public void stop() { + System.out.println("Closing the App..."); + } + public static void main(String[] args) { launch(args); } diff --git a/src/com/atden04/java/share_database_app/mvc/Model.java b/src/com/atden04/java/share_database_app/mvc/Model.java new file mode 100644 index 0000000..279c287 --- /dev/null +++ b/src/com/atden04/java/share_database_app/mvc/Model.java @@ -0,0 +1,5 @@ +package com.atden04.java.share_database_app.mvc; + +public class Model { + +} diff --git a/src/com/atden04/java_test/res/ResourceManager.java b/src/com/atden04/java/share_database_app/res/ResourceManager.java similarity index 51% rename from src/com/atden04/java_test/res/ResourceManager.java rename to src/com/atden04/java/share_database_app/res/ResourceManager.java index 7f6e8c9..aa3afc7 100644 --- a/src/com/atden04/java_test/res/ResourceManager.java +++ b/src/com/atden04/java/share_database_app/res/ResourceManager.java @@ -1,4 +1,4 @@ -package com.atden04.java_test.res; +package com.atden04.java.share_database_app.res; import java.net.URL; @@ -11,12 +11,4 @@ public static URL getFxml(String name) { } return url; } - - public static URL getCss(String name) { - var url = ResourceManager.class.getResource(name); - if(url == null) { - throw new RuntimeException("Resource not found: "+name); - } - return url; - } } diff --git a/src/com/atden04/java/share_database_app/res/scene.fxml b/src/com/atden04/java/share_database_app/res/scene.fxml new file mode 100644 index 0000000..b39b375 --- /dev/null +++ b/src/com/atden04/java/share_database_app/res/scene.fxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/atden04/java_test/res/scene.fxml b/src/com/atden04/java_test/res/scene.fxml deleted file mode 100644 index 5efadc3..0000000 --- a/src/com/atden04/java_test/res/scene.fxml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/com/atden04/java_test/res/style.css b/src/com/atden04/java_test/res/style.css deleted file mode 100644 index ec1d16e..0000000 --- a/src/com/atden04/java_test/res/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.label { - -fx-text-fill: blue; -} \ No newline at end of file diff --git a/src/com/atden04/java_test/user_interface/Controller.java b/src/com/atden04/java_test/user_interface/Controller.java deleted file mode 100644 index 2355843..0000000 --- a/src/com/atden04/java_test/user_interface/Controller.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.atden04.java_test.user_interface; - -import javafx.fxml.FXML; -import javafx.scene.control.Label; - -public class Controller { - - @FXML - private Label label; - - public Controller() { - System.out.println("Controller constructed"); - } - - @FXML - public void initialize() { - String javaVersion = System.getProperty("java.version"); - String javafxVersion = System.getProperty("javafx.version"); - System.out.println("Hello, JavaFX " + javafxVersion + "\nRunning on Java " + javaVersion+ "."); - this.label.setText("Hello, JavaFX " + javafxVersion + "\nRunning on Java " + javaVersion+ "."); - } -} diff --git a/src/module-info.java b/src/module-info.java index c06742c..1fb8119 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -3,8 +3,8 @@ requires javafx.controls; requires javafx.graphics; - opens com.atden04.java_test.user_interface to javafx.fxml; - exports com.atden04.java_test.user_interface; - exports com.atden04.java_test.res; - opens com.atden04.java_test.res to javafx.fxml; + opens com.atden04.java.share_database_app.mvc to javafx.fxml; + exports com.atden04.java.share_database_app.mvc; + exports com.atden04.java.share_database_app.res; + opens com.atden04.java.share_database_app.res to javafx.fxml; } \ No newline at end of file From e4fbc05b3027a2c4d7159e7b6c1e5647739caa58 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sun, 29 Oct 2023 15:22:09 +0000 Subject: [PATCH 02/12] Added Dividend and Purchase Models --- .../share_database_app/models/Dividend.java | 25 +++++++++++++++++ .../share_database_app/models/Purchase.java | 24 ++++++++++++++++ .../java/share_database_app/models/Stock.java | 28 ++++++++++--------- .../java/share_database_app/res/scene.fxml | 2 +- src/module-info.java | 2 +- 5 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 src/com/atden04/java/share_database_app/models/Dividend.java create mode 100644 src/com/atden04/java/share_database_app/models/Purchase.java diff --git a/src/com/atden04/java/share_database_app/models/Dividend.java b/src/com/atden04/java/share_database_app/models/Dividend.java new file mode 100644 index 0000000..83e4ed0 --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/Dividend.java @@ -0,0 +1,25 @@ +package com.atden04.java.share_database_app.models; + +import javafx.beans.property.SimpleFloatProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; + +public class Dividend { + private SimpleStringProperty date; + private SimpleIntegerProperty quantity; + + private SimpleFloatProperty paymentRate; + private SimpleFloatProperty value; + + public Dividend(String newDate, int newQuantity, float newCost){ + this.date = new SimpleStringProperty(newDate); + this.quantity = new SimpleIntegerProperty(newQuantity); + this.value = new SimpleFloatProperty(newCost); + this.paymentRate = new SimpleFloatProperty(this.value.get()/this.quantity.get()); + } + + @Override + public String toString(){ + return "Date : "+this.date+", Quantity : "+this.quantity+", Payment Rate : £"+this.paymentRate+", Value : £"+this.value; + } +} diff --git a/src/com/atden04/java/share_database_app/models/Purchase.java b/src/com/atden04/java/share_database_app/models/Purchase.java new file mode 100644 index 0000000..6b3c4c9 --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/Purchase.java @@ -0,0 +1,24 @@ +package com.atden04.java.share_database_app.models; + +import javafx.beans.property.SimpleFloatProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; + +public class Purchase { + private SimpleStringProperty date; + private SimpleIntegerProperty quantity; + private SimpleFloatProperty cost; + private SimpleFloatProperty costPerShare; + + public Purchase(String newDate, int newQuantity, float newCost){ + this.date = new SimpleStringProperty(newDate); + this.quantity = new SimpleIntegerProperty(newQuantity); + this.cost = new SimpleFloatProperty(newCost); + this.costPerShare = new SimpleFloatProperty(this.cost.get()/this.quantity.get()); + } + + @Override + public String toString(){ + return "Date : "+this.date+", Quantity : "+this.quantity+", Cost : £"+this.cost+", Cost per Share : £"+this.costPerShare; + } +} diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index 4b75b8f..2261fa2 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -1,25 +1,31 @@ package com.atden04.java.share_database_app.models; import javafx.beans.property.SimpleStringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import static javafx.collections.FXCollections.observableArrayList; public class Stock { - private final SimpleStringProperty name; - private final SimpleStringProperty dateOfPurchase; + private SimpleStringProperty name; private StockStatus status; + private ObservableList purchases; + private ObservableList dividends; - public Stock(String name, String dateOfPurchase, String status) { + public Stock(String name, String status) { this.name = new SimpleStringProperty(name); - this.dateOfPurchase = new SimpleStringProperty(dateOfPurchase); if (status.equalsIgnoreCase("bought")) this.status = StockStatus.BOUGHT; else if (status.equalsIgnoreCase("sold")) this.status = StockStatus.SOLD; else if (status.equalsIgnoreCase("liquidated")) this.status = StockStatus.LIQUIDATED; + this.purchases = observableArrayList(); + this.dividends = observableArrayList(); } public String toString() { - return "Stock Name : "+this.getName()+", Date of Purchase : "+this.getDateOfPurchase()+", Status : "+this.getStatus(); + return "Stock Name : "+this.getName()+", Status : "+this.getStatus(); } public String getName() { @@ -30,14 +36,6 @@ public void setName(String newName) { this.name.set(newName); } - public String getDateOfPurchase() { - return this.dateOfPurchase.get(); - } - - public void setDateOfPurchase(String newDate) { - this.dateOfPurchase.set(newDate); - } - public StockStatus getStatus() { return this.status; } @@ -46,4 +44,8 @@ public void setStatus(StockStatus newStatus) { this.status = newStatus; } + public ObservableList getPurchases(){return this.purchases;} + + public ObservableList getDividends(){return this.dividends;} + } diff --git a/src/com/atden04/java/share_database_app/res/scene.fxml b/src/com/atden04/java/share_database_app/res/scene.fxml index b39b375..92042fc 100644 --- a/src/com/atden04/java/share_database_app/res/scene.fxml +++ b/src/com/atden04/java/share_database_app/res/scene.fxml @@ -3,7 +3,7 @@ - + diff --git a/src/module-info.java b/src/module-info.java index 1fb8119..3b7b46b 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -1,4 +1,4 @@ -module Test.Java { +module ShareDatabaseApp { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; From 4cc1a1c5781f5987ee682546fbcba0e099c8baf5 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Tue, 31 Oct 2023 08:42:01 +0000 Subject: [PATCH 03/12] adding csv files --- src/com/atden04/java/share_database_app/res/purchase.csv | 1 + src/com/atden04/java/share_database_app/res/stock.csv | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 src/com/atden04/java/share_database_app/res/purchase.csv create mode 100644 src/com/atden04/java/share_database_app/res/stock.csv diff --git a/src/com/atden04/java/share_database_app/res/purchase.csv b/src/com/atden04/java/share_database_app/res/purchase.csv new file mode 100644 index 0000000..44f71d8 --- /dev/null +++ b/src/com/atden04/java/share_database_app/res/purchase.csv @@ -0,0 +1 @@ +stockA,28/10/2023,5,5.00 diff --git a/src/com/atden04/java/share_database_app/res/stock.csv b/src/com/atden04/java/share_database_app/res/stock.csv new file mode 100644 index 0000000..c558c25 --- /dev/null +++ b/src/com/atden04/java/share_database_app/res/stock.csv @@ -0,0 +1,3 @@ +stockA, Bought +stockB, Bought +stockC, Bought \ No newline at end of file From c9a1799f5ca092d1471686b0e763d98ff15a075f Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sun, 10 Dec 2023 14:47:13 +0000 Subject: [PATCH 04/12] Program is able to demonstrate adding new stock and user can select a stock they already have or a new one. --- .../share_database_app/models/Dividend.java | 12 ++- .../share_database_app/models/Purchase.java | 6 +- .../java/share_database_app/models/Sale.java | 24 ++++++ .../java/share_database_app/models/Stock.java | 39 +++++++-- .../share_database_app/mvc/Controller.java | 83 +++++++++++++++++-- .../java/share_database_app/mvc/Main.java | 5 +- .../java/share_database_app/mvc/Model.java | 51 ++++++++++++ .../res/ResourceManager.java | 8 ++ .../java/share_database_app/res/scene.fxml | 5 +- .../java/share_database_app/res/style.css | 3 + src/module-info.java | 3 +- 11 files changed, 218 insertions(+), 21 deletions(-) create mode 100644 src/com/atden04/java/share_database_app/models/Sale.java create mode 100644 src/com/atden04/java/share_database_app/res/style.css diff --git a/src/com/atden04/java/share_database_app/models/Dividend.java b/src/com/atden04/java/share_database_app/models/Dividend.java index 83e4ed0..e2061a9 100644 --- a/src/com/atden04/java/share_database_app/models/Dividend.java +++ b/src/com/atden04/java/share_database_app/models/Dividend.java @@ -6,14 +6,20 @@ public class Dividend { private SimpleStringProperty date; - private SimpleIntegerProperty quantity; + private SimpleFloatProperty quantity; private SimpleFloatProperty paymentRate; private SimpleFloatProperty value; - public Dividend(String newDate, int newQuantity, float newCost){ + /** + * blah blah + * @param newDate Date Dividend occurred + * @param newQuantity quantity + * @param newCost cost of share. + */ + public Dividend(String newDate, float newQuantity, float newCost){ this.date = new SimpleStringProperty(newDate); - this.quantity = new SimpleIntegerProperty(newQuantity); + this.quantity = new SimpleFloatProperty(newQuantity); this.value = new SimpleFloatProperty(newCost); this.paymentRate = new SimpleFloatProperty(this.value.get()/this.quantity.get()); } diff --git a/src/com/atden04/java/share_database_app/models/Purchase.java b/src/com/atden04/java/share_database_app/models/Purchase.java index 6b3c4c9..e5fd157 100644 --- a/src/com/atden04/java/share_database_app/models/Purchase.java +++ b/src/com/atden04/java/share_database_app/models/Purchase.java @@ -6,13 +6,13 @@ public class Purchase { private SimpleStringProperty date; - private SimpleIntegerProperty quantity; + private SimpleFloatProperty quantity; private SimpleFloatProperty cost; private SimpleFloatProperty costPerShare; - public Purchase(String newDate, int newQuantity, float newCost){ + public Purchase(String newDate, float newQuantity, float newCost){ this.date = new SimpleStringProperty(newDate); - this.quantity = new SimpleIntegerProperty(newQuantity); + this.quantity = new SimpleFloatProperty(newQuantity); this.cost = new SimpleFloatProperty(newCost); this.costPerShare = new SimpleFloatProperty(this.cost.get()/this.quantity.get()); } diff --git a/src/com/atden04/java/share_database_app/models/Sale.java b/src/com/atden04/java/share_database_app/models/Sale.java new file mode 100644 index 0000000..19da513 --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/Sale.java @@ -0,0 +1,24 @@ +package com.atden04.java.share_database_app.models; + +import javafx.beans.property.SimpleFloatProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; + +public class Sale { + private SimpleStringProperty date; + private SimpleFloatProperty quantity; + private SimpleFloatProperty value; + private SimpleFloatProperty profit; + + public Sale(String newDate, float newQuantity, float newValue, float cost){ + this.date = new SimpleStringProperty(newDate); + this.quantity = new SimpleFloatProperty(newQuantity); + this.value = new SimpleFloatProperty(newValue); + this.profit = new SimpleFloatProperty(this.value.get()-cost); + } + + @Override + public String toString(){ + return "Date : "+this.date+", Quantity : "+this.quantity+", Sale : £"+this.value+", Profit : £"+this.profit; + } +} diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index 2261fa2..f28a118 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -7,13 +7,22 @@ import static javafx.collections.FXCollections.observableArrayList; public class Stock { - private SimpleStringProperty name; + private String name; private StockStatus status; private ObservableList purchases; private ObservableList dividends; + private float totalCost; + private float totalQuantity; + + public Stock() { + this.name = ""; + this.status = StockStatus.BOUGHT; + this.purchases = observableArrayList(); + this.dividends = observableArrayList(); + } public Stock(String name, String status) { - this.name = new SimpleStringProperty(name); + this.name = name; if (status.equalsIgnoreCase("bought")) this.status = StockStatus.BOUGHT; else if (status.equalsIgnoreCase("sold")) @@ -24,16 +33,36 @@ else if (status.equalsIgnoreCase("liquidated")) this.dividends = observableArrayList(); } + public Stock(String name, String date, float quantity, float cost) { + this.name = name; + this.status = StockStatus.BOUGHT; + this.purchases = observableArrayList(); + this.dividends = observableArrayList(); + this.purchases.add(new Purchase(date, quantity, cost)); + this.totalCost+=cost; + this.totalQuantity+=quantity; + } + + public void addPurchase(String date, float quantity, float cost) { + this.purchases.add(new Purchase(date, quantity, cost)); + if (this.status != StockStatus.BOUGHT) + { + this.status = StockStatus.BOUGHT; + } + this.totalCost+=cost; + this.totalQuantity+=quantity; + } + public String toString() { - return "Stock Name : "+this.getName()+", Status : "+this.getStatus(); + return "\nStock Name : "+this.getName()+", Status : "+this.getStatus()+", Quantity : "+this.totalQuantity + ", Cost : "+this.totalCost; } public String getName() { - return this.name.get(); + return this.name; } public void setName(String newName) { - this.name.set(newName); + this.name = newName; } public StockStatus getStatus() { diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index f5d419c..095629a 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -1,28 +1,99 @@ package com.atden04.java.share_database_app.mvc; +import com.atden04.java.share_database_app.models.Stock; +import javafx.beans.property.SimpleStringProperty; import javafx.event.ActionEvent; +import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.scene.control.Label; -import javafx.scene.control.MenuItem; -import javafx.scene.control.TabPane; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.stage.Stage; + +import java.util.Objects; public class Controller { + @FXML public MenuItem addRowMenu; + @FXML public MenuItem deleteRowMenu; + @FXML public TabPane tabPane; + @FXML + public MenuItem outputData; + Model model; + Stage stage; public Controller() { System.out.println("Controller constructed"); } - public void initialise() { - + public void initialise(Model model, Stage stage) { + this.model = model; + this.stage = stage; } - public void handleAddRow(ActionEvent actionEvent) { + public void handleAddStock(ActionEvent actionEvent) { + Stage addRowStage = new Stage(); + addRowStage.initOwner(stage); + + ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); + TextField addName = new TextField(); + addName.setPromptText("Name"); + addName.setVisible(false); + TextField addDate = new TextField(); + addDate.setPromptText("Date Bought"); + TextField addQuantity = new TextField(); + addQuantity.setPromptText("Quantity"); + TextField addCost = new TextField(); + addCost.setPromptText("Cost"); + + final Button addButton = new Button("Add"); + + selectionBox.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + String choice = selectionBox.getValue(); + addName.setVisible(Objects.equals(choice, "Add Stock")); + } + }); + addButton.setOnAction(new EventHandler() { + @Override public void handle(ActionEvent e) { + String newName = addName.getText(); + String choice = selectionBox.getValue(); + String date = addDate.getText(); + String status = "bought"; + float quantity = Float.parseFloat(addQuantity.getText()); + float cost = Float.parseFloat(addCost.getText()); + + if (Objects.equals(choice, "Add Stock")) { + model.addStock(newName, date, quantity,cost); + } + else { + model.addPurchase(choice, date, quantity, cost); + } + addName.clear(); + addDate.clear(); + addQuantity.clear(); + addCost.clear(); + } + }); + + HBox hBox = new HBox(selectionBox, addName, addDate, addQuantity, addCost, addButton); + hBox.alignmentProperty().set(Pos.CENTER); + hBox.setSpacing(10); + + Scene addRowScene = new Scene(hBox, 900, 100); + addRowStage.setScene(addRowScene); + addRowStage.show(); } public void handleDeleteRow(ActionEvent actionEvent) { } + + public void handleOutputData(ActionEvent actionEvent) { + System.out.println(this.model.getAllStock()); + } } diff --git a/src/com/atden04/java/share_database_app/mvc/Main.java b/src/com/atden04/java/share_database_app/mvc/Main.java index b7c6fae..50c626c 100644 --- a/src/com/atden04/java/share_database_app/mvc/Main.java +++ b/src/com/atden04/java/share_database_app/mvc/Main.java @@ -23,12 +23,15 @@ public void start(Stage stage) throws Exception { //Create FXML Loader and set the controller FXMLLoader loader = new FXMLLoader(ResourceManager.getFxml("scene.fxml")); - this.controller = new Controller(); loader.setControllerFactory((Klass) -> this.controller); //Load the root of the scene and create the scene itself Parent root = loader.load(); Scene scene = new Scene(root); + scene.getStylesheets().add(ResourceManager.getCss("style.css").toExternalForm()); + + this.controller.initialise(this.model, stage); + this.model.initialise(this.controller); stage.setTitle("Share Database App v0.1"); //set title of stage (window) stage.setScene(scene); //set the scene of the stage diff --git a/src/com/atden04/java/share_database_app/mvc/Model.java b/src/com/atden04/java/share_database_app/mvc/Model.java index 279c287..71361d7 100644 --- a/src/com/atden04/java/share_database_app/mvc/Model.java +++ b/src/com/atden04/java/share_database_app/mvc/Model.java @@ -1,5 +1,56 @@ package com.atden04.java.share_database_app.mvc; +import com.atden04.java.share_database_app.models.Stock; +import javafx.beans.property.SimpleStringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import java.util.Objects; + public class Model { + Controller controller; + private ObservableList stock; + private ObservableList stockNames; + + public void initialise(Controller controller) { + this.controller = controller; + this.createStock(); + //this.controller.createTable(this.stock, this.selectedStock); + } + + private void createStock() { + this.stock = FXCollections.observableArrayList( + new Stock("StockA", "08/12/2023", 5, 10) + ); + this.stockNames = FXCollections.observableArrayList("Add Stock", "StockA"); + } + + private Stock getStock(String name) { + Stock returnValue = null; + for (Stock s: this.stock) { + if (Objects.equals(name, s.getName())) + returnValue = s; + } + return returnValue; + } + + public ObservableList getAllStock(){ + return this.stock; + } + + public ObservableList getStockNames() { + return this.stockNames; + } + + public void addStock(String newName, String date, float quantity, float cost) + { + this.stock.add(new Stock(newName, date, quantity, cost)); + this.stockNames.add(newName); + } + public void addPurchase(String name, String date, float quantity, float cost) + { + Stock stock = this.getStock(name); + stock.addPurchase(date, quantity, cost); + } } diff --git a/src/com/atden04/java/share_database_app/res/ResourceManager.java b/src/com/atden04/java/share_database_app/res/ResourceManager.java index aa3afc7..2a40993 100644 --- a/src/com/atden04/java/share_database_app/res/ResourceManager.java +++ b/src/com/atden04/java/share_database_app/res/ResourceManager.java @@ -11,4 +11,12 @@ public static URL getFxml(String name) { } return url; } + + public static URL getCss(String name) { + var url = ResourceManager.class.getResource(name); + if(url==null){ + throw new RuntimeException("Resource not found: " + name); + } + return url; + } } diff --git a/src/com/atden04/java/share_database_app/res/scene.fxml b/src/com/atden04/java/share_database_app/res/scene.fxml index 92042fc..c7cc33b 100644 --- a/src/com/atden04/java/share_database_app/res/scene.fxml +++ b/src/com/atden04/java/share_database_app/res/scene.fxml @@ -3,14 +3,15 @@ - + - + + diff --git a/src/com/atden04/java/share_database_app/res/style.css b/src/com/atden04/java/share_database_app/res/style.css new file mode 100644 index 0000000..4f840bc --- /dev/null +++ b/src/com/atden04/java/share_database_app/res/style.css @@ -0,0 +1,3 @@ +.label { + -fx-test-fill: black; +} \ No newline at end of file diff --git a/src/module-info.java b/src/module-info.java index 3b7b46b..4a0bd20 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -3,8 +3,9 @@ requires javafx.controls; requires javafx.graphics; - opens com.atden04.java.share_database_app.mvc to javafx.fxml; exports com.atden04.java.share_database_app.mvc; exports com.atden04.java.share_database_app.res; + exports com.atden04.java.share_database_app.models; + opens com.atden04.java.share_database_app.mvc to javafx.fxml; opens com.atden04.java.share_database_app.res to javafx.fxml; } \ No newline at end of file From 637aada649e986ec3272972fbd683a490260a902 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Mon, 11 Dec 2023 12:25:42 +0000 Subject: [PATCH 05/12] Implemented adding of Dividend --- .../java/share_database_app/models/Stock.java | 8 +++- .../share_database_app/mvc/Controller.java | 45 ++++++++++++++++++- .../java/share_database_app/mvc/Model.java | 6 ++- .../java/share_database_app/res/scene.fxml | 3 +- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index f28a118..75303fe 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -13,6 +13,7 @@ public class Stock { private ObservableList dividends; private float totalCost; private float totalQuantity; + private float totalReturn; public Stock() { this.name = ""; @@ -53,8 +54,13 @@ public void addPurchase(String date, float quantity, float cost) { this.totalQuantity+=quantity; } + public void addDividend(String date, float quantity, float value) { + this.dividends.add(new Dividend(date, quantity, value)); + this.totalReturn+=value; + } + public String toString() { - return "\nStock Name : "+this.getName()+", Status : "+this.getStatus()+", Quantity : "+this.totalQuantity + ", Cost : "+this.totalCost; + return "\nStock Name : "+this.getName()+", Status : "+this.getStatus()+", Quantity : "+this.totalQuantity + ", Cost : "+this.totalCost+", Return : "+this.totalReturn; } public String getName() { diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index 095629a..c31d390 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -2,6 +2,7 @@ import com.atden04.java.share_database_app.models.Stock; import javafx.beans.property.SimpleStringProperty; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; @@ -16,7 +17,7 @@ public class Controller { @FXML - public MenuItem addRowMenu; + public MenuItem addStockMenu; @FXML public MenuItem deleteRowMenu; @FXML @@ -39,7 +40,9 @@ public void handleAddStock(ActionEvent actionEvent) { Stage addRowStage = new Stage(); addRowStage.initOwner(stage); - ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); + ObservableList options = this.model.getStockNames(); + options.add(0, "Add Stock"); + ComboBox selectionBox = new ComboBox<>(options); TextField addName = new TextField(); addName.setPromptText("Name"); addName.setVisible(false); @@ -90,10 +93,48 @@ public void handle(ActionEvent actionEvent) { addRowStage.show(); } + public void handleAddDividend(ActionEvent actionEvent) { + Stage addRowStage = new Stage(); + addRowStage.initOwner(stage); + + ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); + TextField addDate = new TextField(); + addDate.setPromptText("Date Bought"); + TextField addQuantity = new TextField(); + addQuantity.setPromptText("Quantity"); + TextField addValue = new TextField(); + addValue.setPromptText("Value"); + + final Button addButton = new Button("Add"); + addButton.setOnAction(new EventHandler() { + @Override public void handle(ActionEvent e) { + String choice = selectionBox.getValue(); + String date = addDate.getText(); + float quantity = Float.parseFloat(addQuantity.getText()); + float value = Float.parseFloat(addValue.getText()); + model.addDividend(choice, date, quantity, value); + addDate.clear(); + addQuantity.clear(); + addValue.clear(); + } + }); + + HBox hBox = new HBox(selectionBox, addDate, addQuantity, addValue, addButton); + hBox.alignmentProperty().set(Pos.CENTER); + hBox.setSpacing(10); + + Scene addRowScene = new Scene(hBox, 900, 100); + addRowStage.setScene(addRowScene); + addRowStage.show(); + + } + public void handleDeleteRow(ActionEvent actionEvent) { } public void handleOutputData(ActionEvent actionEvent) { System.out.println(this.model.getAllStock()); } + + } diff --git a/src/com/atden04/java/share_database_app/mvc/Model.java b/src/com/atden04/java/share_database_app/mvc/Model.java index 71361d7..d969c8f 100644 --- a/src/com/atden04/java/share_database_app/mvc/Model.java +++ b/src/com/atden04/java/share_database_app/mvc/Model.java @@ -22,7 +22,7 @@ private void createStock() { this.stock = FXCollections.observableArrayList( new Stock("StockA", "08/12/2023", 5, 10) ); - this.stockNames = FXCollections.observableArrayList("Add Stock", "StockA"); + this.stockNames = FXCollections.observableArrayList("StockA"); } private Stock getStock(String name) { @@ -53,4 +53,8 @@ public void addPurchase(String name, String date, float quantity, float cost) Stock stock = this.getStock(name); stock.addPurchase(date, quantity, cost); } + + public void addDividend(String choice, String date, float quantity, float value) { + this.getStock(choice).addDividend(date, quantity, value); + } } diff --git a/src/com/atden04/java/share_database_app/res/scene.fxml b/src/com/atden04/java/share_database_app/res/scene.fxml index c7cc33b..554f6a5 100644 --- a/src/com/atden04/java/share_database_app/res/scene.fxml +++ b/src/com/atden04/java/share_database_app/res/scene.fxml @@ -9,7 +9,8 @@ - + + From c5809fc904dd82d58190b61c48aa7fa703db4769 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Mon, 11 Dec 2023 18:34:08 +0000 Subject: [PATCH 06/12] Implemented adding of Sale --- .../java/share_database_app/models/Sale.java | 8 ++--- .../java/share_database_app/models/Stock.java | 12 +++++++ .../share_database_app/mvc/Controller.java | 34 +++++++++++++++++++ .../java/share_database_app/mvc/Model.java | 4 +++ .../java/share_database_app/res/scene.fxml | 2 ++ 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/com/atden04/java/share_database_app/models/Sale.java b/src/com/atden04/java/share_database_app/models/Sale.java index 19da513..edb8279 100644 --- a/src/com/atden04/java/share_database_app/models/Sale.java +++ b/src/com/atden04/java/share_database_app/models/Sale.java @@ -10,10 +10,10 @@ public class Sale { private SimpleFloatProperty value; private SimpleFloatProperty profit; - public Sale(String newDate, float newQuantity, float newValue, float cost){ - this.date = new SimpleStringProperty(newDate); - this.quantity = new SimpleFloatProperty(newQuantity); - this.value = new SimpleFloatProperty(newValue); + public Sale(String date, float quantity, float value, float cost){ + this.date = new SimpleStringProperty(date); + this.quantity = new SimpleFloatProperty(quantity); + this.value = new SimpleFloatProperty(value); this.profit = new SimpleFloatProperty(this.value.get()-cost); } diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index 75303fe..e6f31f4 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -11,6 +11,7 @@ public class Stock { private StockStatus status; private ObservableList purchases; private ObservableList dividends; + private ObservableList sales; private float totalCost; private float totalQuantity; private float totalReturn; @@ -20,6 +21,7 @@ public Stock() { this.status = StockStatus.BOUGHT; this.purchases = observableArrayList(); this.dividends = observableArrayList(); + this.sales = observableArrayList(); } public Stock(String name, String status) { @@ -32,6 +34,7 @@ else if (status.equalsIgnoreCase("liquidated")) this.status = StockStatus.LIQUIDATED; this.purchases = observableArrayList(); this.dividends = observableArrayList(); + this.sales = observableArrayList(); } public Stock(String name, String date, float quantity, float cost) { @@ -40,6 +43,7 @@ public Stock(String name, String date, float quantity, float cost) { this.purchases = observableArrayList(); this.dividends = observableArrayList(); this.purchases.add(new Purchase(date, quantity, cost)); + this.sales = observableArrayList(); this.totalCost+=cost; this.totalQuantity+=quantity; } @@ -59,6 +63,14 @@ public void addDividend(String date, float quantity, float value) { this.totalReturn+=value; } + public void addSale(String date, float value) { + this.sales.add(new Sale(date, this.totalQuantity, value, this.totalCost)); + this.status = StockStatus.SOLD; + this.totalReturn = value-this.totalCost; + this.totalQuantity = 0; + this.totalCost = 0; + } + public String toString() { return "\nStock Name : "+this.getName()+", Status : "+this.getStatus()+", Quantity : "+this.totalQuantity + ", Cost : "+this.totalCost+", Return : "+this.totalReturn; } diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index c31d390..4eb007b 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -126,7 +126,40 @@ public void handleAddDividend(ActionEvent actionEvent) { Scene addRowScene = new Scene(hBox, 900, 100); addRowStage.setScene(addRowScene); addRowStage.show(); + } + + public void handleAddSale(ActionEvent actionEvent) { + Stage addRowStage = new Stage(); + addRowStage.initOwner(stage); + ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); + TextField addDate = new TextField(); + addDate.setPromptText("Date Sold"); + TextField addValue = new TextField(); + addValue.setPromptText("Value"); + + final Button addButton = new Button("Add"); + addButton.setOnAction(new EventHandler() { + @Override public void handle(ActionEvent e) { + String choice = selectionBox.getValue(); + String date = addDate.getText(); + float value = Float.parseFloat(addValue.getText()); + model.addSale(choice, date, value); + addDate.clear(); + addValue.clear(); + } + }); + + HBox hBox = new HBox(selectionBox, addDate, addValue, addButton); + hBox.alignmentProperty().set(Pos.CENTER); + hBox.setSpacing(10); + + Scene addRowScene = new Scene(hBox, 900, 100); + addRowStage.setScene(addRowScene); + addRowStage.show(); + } + + public void handleAddLiquidation(ActionEvent actionEvent) { } public void handleDeleteRow(ActionEvent actionEvent) { @@ -137,4 +170,5 @@ public void handleOutputData(ActionEvent actionEvent) { } + } diff --git a/src/com/atden04/java/share_database_app/mvc/Model.java b/src/com/atden04/java/share_database_app/mvc/Model.java index d969c8f..74e8649 100644 --- a/src/com/atden04/java/share_database_app/mvc/Model.java +++ b/src/com/atden04/java/share_database_app/mvc/Model.java @@ -57,4 +57,8 @@ public void addPurchase(String name, String date, float quantity, float cost) public void addDividend(String choice, String date, float quantity, float value) { this.getStock(choice).addDividend(date, quantity, value); } + + public void addSale(String choice, String date, float value) { + this.getStock(choice).addSale(date, value); + } } diff --git a/src/com/atden04/java/share_database_app/res/scene.fxml b/src/com/atden04/java/share_database_app/res/scene.fxml index 554f6a5..48297b6 100644 --- a/src/com/atden04/java/share_database_app/res/scene.fxml +++ b/src/com/atden04/java/share_database_app/res/scene.fxml @@ -11,6 +11,8 @@ + + From f22cdc7d03c47f0dace121cd521d41256032b48c Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Tue, 12 Dec 2023 11:40:19 +0000 Subject: [PATCH 07/12] Add Stock string (now renamed to New Stock) in the combobox was being saved to the stockNames list after use, it is now removed when stage is closed. --- .../java/share_database_app/models/Stock.java | 12 ++++++------ .../java/share_database_app/mvc/Controller.java | 12 +++++++++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index e6f31f4..cc8fd7f 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -7,7 +7,7 @@ import static javafx.collections.FXCollections.observableArrayList; public class Stock { - private String name; + private SimpleStringProperty name; private StockStatus status; private ObservableList purchases; private ObservableList dividends; @@ -17,7 +17,7 @@ public class Stock { private float totalReturn; public Stock() { - this.name = ""; + this.name = new SimpleStringProperty(); this.status = StockStatus.BOUGHT; this.purchases = observableArrayList(); this.dividends = observableArrayList(); @@ -25,7 +25,7 @@ public Stock() { } public Stock(String name, String status) { - this.name = name; + this.name = new SimpleStringProperty(name); if (status.equalsIgnoreCase("bought")) this.status = StockStatus.BOUGHT; else if (status.equalsIgnoreCase("sold")) @@ -38,7 +38,7 @@ else if (status.equalsIgnoreCase("liquidated")) } public Stock(String name, String date, float quantity, float cost) { - this.name = name; + this.name = new SimpleStringProperty(name); this.status = StockStatus.BOUGHT; this.purchases = observableArrayList(); this.dividends = observableArrayList(); @@ -76,11 +76,11 @@ public String toString() { } public String getName() { - return this.name; + return this.name.get(); } public void setName(String newName) { - this.name = newName; + this.name.set(newName); } public StockStatus getStatus() { diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index 4eb007b..f092142 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -11,6 +11,7 @@ import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.stage.Stage; +import javafx.stage.WindowEvent; import java.util.Objects; @@ -59,7 +60,7 @@ public void handleAddStock(ActionEvent actionEvent) { @Override public void handle(ActionEvent actionEvent) { String choice = selectionBox.getValue(); - addName.setVisible(Objects.equals(choice, "Add Stock")); + addName.setVisible(Objects.equals(choice, "New Stock")); } }); addButton.setOnAction(new EventHandler() { @@ -67,11 +68,10 @@ public void handle(ActionEvent actionEvent) { String newName = addName.getText(); String choice = selectionBox.getValue(); String date = addDate.getText(); - String status = "bought"; float quantity = Float.parseFloat(addQuantity.getText()); float cost = Float.parseFloat(addCost.getText()); - if (Objects.equals(choice, "Add Stock")) { + if (Objects.equals(choice, "New Stock")) { model.addStock(newName, date, quantity,cost); } else { @@ -91,6 +91,12 @@ public void handle(ActionEvent actionEvent) { Scene addRowScene = new Scene(hBox, 900, 100); addRowStage.setScene(addRowScene); addRowStage.show(); + addRowStage.setOnCloseRequest(new EventHandler() { + @Override + public void handle(WindowEvent windowEvent) { + options.remove(0); //options is only a reference, and we don't want this option elsewhere in the code + } + }); } public void handleAddDividend(ActionEvent actionEvent) { From 888b2d59076d1a04cd76b518da0cab78140fd80a Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sat, 29 Jun 2024 19:32:57 +0100 Subject: [PATCH 08/12] New stock name field wasn't showing. Now fixed --- src/com/atden04/java/share_database_app/mvc/Controller.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index f092142..554afd0 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -42,7 +42,7 @@ public void handleAddStock(ActionEvent actionEvent) { addRowStage.initOwner(stage); ObservableList options = this.model.getStockNames(); - options.add(0, "Add Stock"); + options.add(0, "New Stock"); ComboBox selectionBox = new ComboBox<>(options); TextField addName = new TextField(); addName.setPromptText("Name"); From 9f1450a602ef4b193fa49ea6d43e7c098079b3f4 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sat, 29 Jun 2024 20:06:30 +0100 Subject: [PATCH 09/12] Implemented Add Liquidation class and functionality. --- .../models/Liquidation.java | 21 ++++++++++++ .../java/share_database_app/models/Stock.java | 11 ++++++ .../share_database_app/mvc/Controller.java | 34 +++++++++++++++++-- .../java/share_database_app/mvc/Model.java | 7 ++-- 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/com/atden04/java/share_database_app/models/Liquidation.java diff --git a/src/com/atden04/java/share_database_app/models/Liquidation.java b/src/com/atden04/java/share_database_app/models/Liquidation.java new file mode 100644 index 0000000..18f659e --- /dev/null +++ b/src/com/atden04/java/share_database_app/models/Liquidation.java @@ -0,0 +1,21 @@ +package com.atden04.java.share_database_app.models; + +import javafx.beans.property.SimpleFloatProperty; +import javafx.beans.property.SimpleStringProperty; + +public class Liquidation { + private SimpleStringProperty date; + private SimpleFloatProperty quantity; + private SimpleFloatProperty value; + + public Liquidation(String date, float quantity, float value){ + this.date = new SimpleStringProperty(date); + this.quantity = new SimpleFloatProperty(quantity); + this.value = new SimpleFloatProperty(value); + } + + @Override + public String toString(){ + return "Date : "+this.date+", Quantity : "+this.quantity+", Sale : £"+this.value; + } +} diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index cc8fd7f..ebaf575 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -12,6 +12,7 @@ public class Stock { private ObservableList purchases; private ObservableList dividends; private ObservableList sales; + private ObservableList liquidations; private float totalCost; private float totalQuantity; private float totalReturn; @@ -22,6 +23,7 @@ public Stock() { this.purchases = observableArrayList(); this.dividends = observableArrayList(); this.sales = observableArrayList(); + this.liquidations = observableArrayList(); } public Stock(String name, String status) { @@ -35,6 +37,7 @@ else if (status.equalsIgnoreCase("liquidated")) this.purchases = observableArrayList(); this.dividends = observableArrayList(); this.sales = observableArrayList(); + this.liquidations = observableArrayList(); } public Stock(String name, String date, float quantity, float cost) { @@ -44,6 +47,7 @@ public Stock(String name, String date, float quantity, float cost) { this.dividends = observableArrayList(); this.purchases.add(new Purchase(date, quantity, cost)); this.sales = observableArrayList(); + this.liquidations = observableArrayList(); this.totalCost+=cost; this.totalQuantity+=quantity; } @@ -71,6 +75,13 @@ public void addSale(String date, float value) { this.totalCost = 0; } + public void addLiquidation(String date, float value) { + this.liquidations.add(new Liquidation(date, this.totalQuantity, value)); + this.status = StockStatus.LIQUIDATED; + this.totalReturn+=value; + this.totalQuantity = 0; + } + public String toString() { return "\nStock Name : "+this.getName()+", Status : "+this.getStatus()+", Quantity : "+this.totalQuantity + ", Cost : "+this.totalCost+", Return : "+this.totalReturn; } diff --git a/src/com/atden04/java/share_database_app/mvc/Controller.java b/src/com/atden04/java/share_database_app/mvc/Controller.java index 554afd0..f2426b7 100644 --- a/src/com/atden04/java/share_database_app/mvc/Controller.java +++ b/src/com/atden04/java/share_database_app/mvc/Controller.java @@ -105,11 +105,11 @@ public void handleAddDividend(ActionEvent actionEvent) { ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); TextField addDate = new TextField(); - addDate.setPromptText("Date Bought"); + addDate.setPromptText("Pay Date"); TextField addQuantity = new TextField(); - addQuantity.setPromptText("Quantity"); + addQuantity.setPromptText("Holding"); TextField addValue = new TextField(); - addValue.setPromptText("Value"); + addValue.setPromptText("Payment"); final Button addButton = new Button("Add"); addButton.setOnAction(new EventHandler() { @@ -166,6 +166,34 @@ public void handleAddSale(ActionEvent actionEvent) { } public void handleAddLiquidation(ActionEvent actionEvent) { + Stage addRowStage = new Stage(); + addRowStage.initOwner(stage); + + ComboBox selectionBox = new ComboBox<>(this.model.getStockNames()); + TextField addDate = new TextField(); + addDate.setPromptText("Date Liquidated"); + TextField addValue = new TextField(); + addValue.setPromptText("Value"); + + final Button addButton = new Button("Add"); + addButton.setOnAction(new EventHandler() { + @Override public void handle(ActionEvent e) { + String choice = selectionBox.getValue(); + String date = addDate.getText(); + float value = Float.parseFloat(addValue.getText()); + model.addLiquidation(choice, date, value); + addDate.clear(); + addValue.clear(); + } + }); + + HBox hBox = new HBox(selectionBox, addDate, addValue, addButton); + hBox.alignmentProperty().set(Pos.CENTER); + hBox.setSpacing(10); + + Scene addRowScene = new Scene(hBox, 900, 100); + addRowStage.setScene(addRowScene); + addRowStage.show(); } public void handleDeleteRow(ActionEvent actionEvent) { diff --git a/src/com/atden04/java/share_database_app/mvc/Model.java b/src/com/atden04/java/share_database_app/mvc/Model.java index 74e8649..2cdf514 100644 --- a/src/com/atden04/java/share_database_app/mvc/Model.java +++ b/src/com/atden04/java/share_database_app/mvc/Model.java @@ -50,8 +50,7 @@ public void addStock(String newName, String date, float quantity, float cost) public void addPurchase(String name, String date, float quantity, float cost) { - Stock stock = this.getStock(name); - stock.addPurchase(date, quantity, cost); + this.getStock(name).addPurchase(date, quantity, cost); } public void addDividend(String choice, String date, float quantity, float value) { @@ -61,4 +60,8 @@ public void addDividend(String choice, String date, float quantity, float value) public void addSale(String choice, String date, float value) { this.getStock(choice).addSale(date, value); } + + public void addLiquidation(String choice, String date, float value) { + this.getStock(choice).addLiquidation(date, value); + } } From 878630d8b9303a460286a68344536b049119e137 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sat, 29 Jun 2024 20:19:30 +0100 Subject: [PATCH 10/12] Reviewed StockStatus Enum and moved location --- .../java/share_database_app/enums/StockStatus.java | 11 +++++++++++ .../atden04/java/share_database_app/models/Stock.java | 2 +- .../java/share_database_app/models/StockStatus.java | 8 -------- src/module-info.java | 1 + 4 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 src/com/atden04/java/share_database_app/enums/StockStatus.java delete mode 100644 src/com/atden04/java/share_database_app/models/StockStatus.java diff --git a/src/com/atden04/java/share_database_app/enums/StockStatus.java b/src/com/atden04/java/share_database_app/enums/StockStatus.java new file mode 100644 index 0000000..1ab4d10 --- /dev/null +++ b/src/com/atden04/java/share_database_app/enums/StockStatus.java @@ -0,0 +1,11 @@ +package com.atden04.java.share_database_app.enums; + +/** + * Enumeration for the status of the Stock + */ +public enum StockStatus { + DEFAULT, + BOUGHT, + SOLD, + LIQUIDATED +} diff --git a/src/com/atden04/java/share_database_app/models/Stock.java b/src/com/atden04/java/share_database_app/models/Stock.java index ebaf575..01647d5 100644 --- a/src/com/atden04/java/share_database_app/models/Stock.java +++ b/src/com/atden04/java/share_database_app/models/Stock.java @@ -1,7 +1,7 @@ package com.atden04.java.share_database_app.models; +import com.atden04.java.share_database_app.enums.StockStatus; import javafx.beans.property.SimpleStringProperty; -import javafx.collections.FXCollections; import javafx.collections.ObservableList; import static javafx.collections.FXCollections.observableArrayList; diff --git a/src/com/atden04/java/share_database_app/models/StockStatus.java b/src/com/atden04/java/share_database_app/models/StockStatus.java deleted file mode 100644 index a1310fb..0000000 --- a/src/com/atden04/java/share_database_app/models/StockStatus.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.atden04.java.share_database_app.models; - -public enum StockStatus { - DEFUALT, - BOUGHT, - SOLD, - LIQUIDATED -} diff --git a/src/module-info.java b/src/module-info.java index 4a0bd20..8f3a17d 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -8,4 +8,5 @@ exports com.atden04.java.share_database_app.models; opens com.atden04.java.share_database_app.mvc to javafx.fxml; opens com.atden04.java.share_database_app.res to javafx.fxml; + exports com.atden04.java.share_database_app.enums; } \ No newline at end of file From 8806bb441aadd71fe375c3352647368d079f4a51 Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Sat, 29 Jun 2024 20:30:39 +0100 Subject: [PATCH 11/12] Reviewed Dividend class --- .../share_database_app/models/Dividend.java | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/com/atden04/java/share_database_app/models/Dividend.java b/src/com/atden04/java/share_database_app/models/Dividend.java index e2061a9..13cd4b3 100644 --- a/src/com/atden04/java/share_database_app/models/Dividend.java +++ b/src/com/atden04/java/share_database_app/models/Dividend.java @@ -1,18 +1,44 @@ package com.atden04.java.share_database_app.models; import javafx.beans.property.SimpleFloatProperty; -import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; +/** + * Class to store all data regarding the dividends of a stock. + */ public class Dividend { + /** + * Data of the dividend being paid + */ private SimpleStringProperty date; + + /** + * Quantity of shares held on the Ex-dividend date. + */ private SimpleFloatProperty quantity; + /** + * The amount paid to shareholders per share of the dividend + */ private SimpleFloatProperty paymentRate; + + /** + * The value of the dividend as a whole. + */ private SimpleFloatProperty value; /** - * blah blah + * Base constructor for the Dividend class + */ + public Dividend(){ + this.date = new SimpleStringProperty(); + this.quantity = new SimpleFloatProperty(); + this.value = new SimpleFloatProperty(); + this.paymentRate = new SimpleFloatProperty(); + } + + /** + * Overloaded constructor for the Dividend class * @param newDate Date Dividend occurred * @param newQuantity quantity * @param newCost cost of share. @@ -24,8 +50,12 @@ public Dividend(String newDate, float newQuantity, float newCost){ this.paymentRate = new SimpleFloatProperty(this.value.get()/this.quantity.get()); } + /** + * Overridden method to output the object as a string + * @return string output + */ @Override public String toString(){ - return "Date : "+this.date+", Quantity : "+this.quantity+", Payment Rate : £"+this.paymentRate+", Value : £"+this.value; + return "Date : " + this.date + ", Quantity : " + this.quantity + ", Payment Rate : £" + this.paymentRate + ", Value : £" + this.value; } } From d302206c7dab65f35d23c45072ff0cf8a9ccbdef Mon Sep 17 00:00:00 2001 From: Alexander Denton Date: Mon, 1 Jul 2024 21:30:13 +0100 Subject: [PATCH 12/12] Reviewed Liquidation, Purchase and Sale classes --- .../share_database_app/models/Dividend.java | 16 +++---- .../models/Liquidation.java | 35 +++++++++++++- .../share_database_app/models/Purchase.java | 47 +++++++++++++++++-- .../java/share_database_app/models/Sale.java | 40 +++++++++++++++- 4 files changed, 123 insertions(+), 15 deletions(-) diff --git a/src/com/atden04/java/share_database_app/models/Dividend.java b/src/com/atden04/java/share_database_app/models/Dividend.java index 13cd4b3..b5f41dd 100644 --- a/src/com/atden04/java/share_database_app/models/Dividend.java +++ b/src/com/atden04/java/share_database_app/models/Dividend.java @@ -8,7 +8,7 @@ */ public class Dividend { /** - * Data of the dividend being paid + * Date of the dividend being paid */ private SimpleStringProperty date; @@ -39,14 +39,14 @@ public Dividend(){ /** * Overloaded constructor for the Dividend class - * @param newDate Date Dividend occurred - * @param newQuantity quantity - * @param newCost cost of share. + * @param date Date Dividend occurred + * @param quantity Quantity of shares held + * @param value Value of Dividend payment */ - public Dividend(String newDate, float newQuantity, float newCost){ - this.date = new SimpleStringProperty(newDate); - this.quantity = new SimpleFloatProperty(newQuantity); - this.value = new SimpleFloatProperty(newCost); + public Dividend(String date, float quantity, float value){ + this.date = new SimpleStringProperty(date); + this.quantity = new SimpleFloatProperty(quantity); + this.value = new SimpleFloatProperty(value); this.paymentRate = new SimpleFloatProperty(this.value.get()/this.quantity.get()); } diff --git a/src/com/atden04/java/share_database_app/models/Liquidation.java b/src/com/atden04/java/share_database_app/models/Liquidation.java index 18f659e..dd6fc62 100644 --- a/src/com/atden04/java/share_database_app/models/Liquidation.java +++ b/src/com/atden04/java/share_database_app/models/Liquidation.java @@ -3,19 +3,52 @@ import javafx.beans.property.SimpleFloatProperty; import javafx.beans.property.SimpleStringProperty; +/** + * Class to store all data regarding the liquidations of a stock. + */ public class Liquidation { + /** + * Date of the liquidation payment being paid + */ private SimpleStringProperty date; + + /** + * Quantity of shares held at the point of liquidation + */ private SimpleFloatProperty quantity; + + /** + * The value of the liquidation payment + */ private SimpleFloatProperty value; + /** + * Base constructor for the Liquidation class + */ + public Liquidation() { + this.date = new SimpleStringProperty(); + this.quantity = new SimpleFloatProperty(); + this.value = new SimpleFloatProperty(); + } + + /** + * Overloaded constructor for the Liquidation class + * @param date Date Liquidation payment received + * @param quantity Quantity of shares held + * @param value Value of Liquidation payment + */ public Liquidation(String date, float quantity, float value){ this.date = new SimpleStringProperty(date); this.quantity = new SimpleFloatProperty(quantity); this.value = new SimpleFloatProperty(value); } + /** + * Overridden method to output the object as a string + * @return string output + */ @Override public String toString(){ - return "Date : "+this.date+", Quantity : "+this.quantity+", Sale : £"+this.value; + return "Date : "+this.date+", Quantity : "+this.quantity+", Payment : £"+this.value; } } diff --git a/src/com/atden04/java/share_database_app/models/Purchase.java b/src/com/atden04/java/share_database_app/models/Purchase.java index e5fd157..3a44eef 100644 --- a/src/com/atden04/java/share_database_app/models/Purchase.java +++ b/src/com/atden04/java/share_database_app/models/Purchase.java @@ -1,22 +1,59 @@ package com.atden04.java.share_database_app.models; import javafx.beans.property.SimpleFloatProperty; -import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; +/** + * Class to store all data regarding the purchases of a stock + */ public class Purchase { + /** + * Date of the purchase of stock + */ private SimpleStringProperty date; + + /** + * Quantity of stock bought + */ private SimpleFloatProperty quantity; + + /** + * Cost of the stock bought + */ private SimpleFloatProperty cost; + + /** + * Average (mean) cost of each share + */ private SimpleFloatProperty costPerShare; - public Purchase(String newDate, float newQuantity, float newCost){ - this.date = new SimpleStringProperty(newDate); - this.quantity = new SimpleFloatProperty(newQuantity); - this.cost = new SimpleFloatProperty(newCost); + /** + * Base constructor for the Purchase class + */ + public Purchase() { + this.date = new SimpleStringProperty(); + this.quantity = new SimpleFloatProperty(); + this.cost = new SimpleFloatProperty(); + this.costPerShare = new SimpleFloatProperty(); + } + + /** + * Overloaded constructor for the Purchase class + * @param date Date of Purchase + * @param quantity Quantity of shares purchased + * @param cost Cost of shares purchased + */ + public Purchase(String date, float quantity, float cost){ + this.date = new SimpleStringProperty(date); + this.quantity = new SimpleFloatProperty(quantity); + this.cost = new SimpleFloatProperty(cost); this.costPerShare = new SimpleFloatProperty(this.cost.get()/this.quantity.get()); } + /** + * Overridden method to output the object as a string + * @return string output + */ @Override public String toString(){ return "Date : "+this.date+", Quantity : "+this.quantity+", Cost : £"+this.cost+", Cost per Share : £"+this.costPerShare; diff --git a/src/com/atden04/java/share_database_app/models/Sale.java b/src/com/atden04/java/share_database_app/models/Sale.java index edb8279..4274651 100644 --- a/src/com/atden04/java/share_database_app/models/Sale.java +++ b/src/com/atden04/java/share_database_app/models/Sale.java @@ -1,15 +1,49 @@ package com.atden04.java.share_database_app.models; import javafx.beans.property.SimpleFloatProperty; -import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; +/** + * Class to store all data regarding the sale of a stock + */ public class Sale { + /** + * Date of the sale of stock + */ private SimpleStringProperty date; + + /** + * Quantity of stock sold + */ private SimpleFloatProperty quantity; + + /** + * Value of the sale + */ private SimpleFloatProperty value; + + /** + * Profit made from the sale + */ private SimpleFloatProperty profit; + /** + * Base constructor for the Sale class + */ + public Sale() { + this.date = new SimpleStringProperty(); + this.quantity = new SimpleFloatProperty(); + this.value = new SimpleFloatProperty(); + this.profit = new SimpleFloatProperty(); + } + + /** + * Overloaded constructor for the Sale class + * @param date Date of Sale + * @param quantity Quantity of stock sold + * @param value Value of the sale + * @param cost Cost to buy the stock sold + */ public Sale(String date, float quantity, float value, float cost){ this.date = new SimpleStringProperty(date); this.quantity = new SimpleFloatProperty(quantity); @@ -17,6 +51,10 @@ public Sale(String date, float quantity, float value, float cost){ this.profit = new SimpleFloatProperty(this.value.get()-cost); } + /** + * Overridden method to output the object as a string + * @return string output + */ @Override public String toString(){ return "Date : "+this.date+", Quantity : "+this.quantity+", Sale : £"+this.value+", Profit : £"+this.profit;