diff --git a/src/main/java/Model/Exchange.java b/src/main/java/Model/Exchange/Exchange.java similarity index 98% rename from src/main/java/Model/Exchange.java rename to src/main/java/Model/Exchange/Exchange.java index 7feb4f2..b135ef6 100644 --- a/src/main/java/Model/Exchange.java +++ b/src/main/java/Model/Exchange/Exchange.java @@ -1,5 +1,11 @@ -package Model; - +package Model.Exchange; + +import Model.Player.Player; +import Model.Purchase.Purchase; +import Model.Share; +import Model.Stock; +import Model.Transaction.Transaction; +import Model.Transaction.TransactionFactory; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; @@ -7,6 +13,8 @@ import java.util.Map; import java.util.Random; + + /** * Represents a stock exchange where players can buy and sell stocks. * The Exchange maintains a collection of stocks, advances through weeks, diff --git a/src/main/java/Model/ExchangeObserver.java b/src/main/java/Model/Exchange/ExchangeObserver.java similarity index 94% rename from src/main/java/Model/ExchangeObserver.java rename to src/main/java/Model/Exchange/ExchangeObserver.java index 7cef281..cd27665 100644 --- a/src/main/java/Model/ExchangeObserver.java +++ b/src/main/java/Model/Exchange/ExchangeObserver.java @@ -1,4 +1,4 @@ -package Model; +package Model.Exchange; /** * Observer interface for receiving notifications from the Exchange. diff --git a/src/main/java/Model/Player.java b/src/main/java/Model/Player/Player.java similarity index 98% rename from src/main/java/Model/Player.java rename to src/main/java/Model/Player/Player.java index bf6dd05..007e8b4 100644 --- a/src/main/java/Model/Player.java +++ b/src/main/java/Model/Player/Player.java @@ -1,7 +1,10 @@ -package Model; +package Model.Player; +import Model.Portfolio; +import Model.Transaction.TransactionArchive; import java.math.BigDecimal; + /** * Represents a player in the stock trading game. * A Player manages their personal portfolio of shares, cash balance, and transaction diff --git a/src/main/java/Model/PlayerStatus.java b/src/main/java/Model/Player/PlayerStatus.java similarity index 97% rename from src/main/java/Model/PlayerStatus.java rename to src/main/java/Model/Player/PlayerStatus.java index 312e38f..36013fc 100644 --- a/src/main/java/Model/PlayerStatus.java +++ b/src/main/java/Model/Player/PlayerStatus.java @@ -1,4 +1,4 @@ -package Model; +package Model.Player; /** * Enum representing the player's trading status level. diff --git a/src/main/java/Model/Portfolio.java b/src/main/java/Model/Portfolio.java index 7c9e38d..e934827 100644 --- a/src/main/java/Model/Portfolio.java +++ b/src/main/java/Model/Portfolio.java @@ -1,9 +1,11 @@ package Model; - + +import Model.Sale.SaleCalculator; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; + /** * Represents a portfolio of shares held by a player. * A Portfolio manages a collection of Share objects and provides methods to add, diff --git a/src/main/java/Model/Purchase.java b/src/main/java/Model/Purchase/Purchase.java similarity index 93% rename from src/main/java/Model/Purchase.java rename to src/main/java/Model/Purchase/Purchase.java index b81f655..5deaa55 100644 --- a/src/main/java/Model/Purchase.java +++ b/src/main/java/Model/Purchase/Purchase.java @@ -1,7 +1,11 @@ -package Model; +package Model.Purchase; +import Model.Player.Player; +import Model.Share; +import Model.Transaction.Transaction; import java.math.BigDecimal; + /** * Represents a stock purchase transaction. * A Purchase transaction represents a player buying shares. When committed, diff --git a/src/main/java/Model/PurchaseCalculator.java b/src/main/java/Model/Purchase/PurchaseCalculator.java similarity index 94% rename from src/main/java/Model/PurchaseCalculator.java rename to src/main/java/Model/Purchase/PurchaseCalculator.java index e2a7482..72bd703 100644 --- a/src/main/java/Model/PurchaseCalculator.java +++ b/src/main/java/Model/Purchase/PurchaseCalculator.java @@ -1,5 +1,7 @@ -package Model; +package Model.Purchase; +import Model.Share; +import Model.Transaction.TransactionCalculator; import java.math.BigDecimal; /** diff --git a/src/main/java/Model/Sale.java b/src/main/java/Model/Sale/Sale.java similarity index 94% rename from src/main/java/Model/Sale.java rename to src/main/java/Model/Sale/Sale.java index 8b2e05e..e4caad3 100644 --- a/src/main/java/Model/Sale.java +++ b/src/main/java/Model/Sale/Sale.java @@ -1,5 +1,8 @@ -package Model; +package Model.Sale; +import Model.Player.Player; +import Model.Share; +import Model.Transaction.Transaction; import java.math.BigDecimal; /** diff --git a/src/main/java/Model/SaleCalculator.java b/src/main/java/Model/Sale/SaleCalculator.java similarity index 95% rename from src/main/java/Model/SaleCalculator.java rename to src/main/java/Model/Sale/SaleCalculator.java index 271225a..3838729 100644 --- a/src/main/java/Model/SaleCalculator.java +++ b/src/main/java/Model/Sale/SaleCalculator.java @@ -1,5 +1,7 @@ -package Model; +package Model.Sale; +import Model.Share; +import Model.Transaction.TransactionCalculator; import java.math.BigDecimal; /** diff --git a/src/main/java/Model/Transaction.java b/src/main/java/Model/Transaction/Transaction.java similarity index 96% rename from src/main/java/Model/Transaction.java rename to src/main/java/Model/Transaction/Transaction.java index a8eb4f1..e758427 100644 --- a/src/main/java/Model/Transaction.java +++ b/src/main/java/Model/Transaction/Transaction.java @@ -1,4 +1,8 @@ -package Model; +package Model.Transaction; + +import Model.Player.Player; +import Model.Share; + /** * Abstract base class for all transactions (purchases and sales). diff --git a/src/main/java/Model/TransactionArchive.java b/src/main/java/Model/Transaction/TransactionArchive.java similarity index 97% rename from src/main/java/Model/TransactionArchive.java rename to src/main/java/Model/Transaction/TransactionArchive.java index 4af5bff..fffbd8b 100644 --- a/src/main/java/Model/TransactionArchive.java +++ b/src/main/java/Model/Transaction/TransactionArchive.java @@ -1,9 +1,13 @@ -package Model; +package Model.Transaction; +import Model.Purchase.Purchase; +import Model.Sale.Sale; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; + + /** * Maintains a chronological archive of all transactions executed by a player. * The TransactionArchive allows retrieval of transactions by week and type diff --git a/src/main/java/Model/TransactionCalculator.java b/src/main/java/Model/Transaction/TransactionCalculator.java similarity index 96% rename from src/main/java/Model/TransactionCalculator.java rename to src/main/java/Model/Transaction/TransactionCalculator.java index 2691e02..b1c28a6 100644 --- a/src/main/java/Model/TransactionCalculator.java +++ b/src/main/java/Model/Transaction/TransactionCalculator.java @@ -1,4 +1,4 @@ -package Model; +package Model.Transaction; import java.math.BigDecimal; diff --git a/src/main/java/Model/TransactionFactory.java b/src/main/java/Model/Transaction/TransactionFactory.java similarity index 89% rename from src/main/java/Model/TransactionFactory.java rename to src/main/java/Model/Transaction/TransactionFactory.java index 1f799d1..d026721 100644 --- a/src/main/java/Model/TransactionFactory.java +++ b/src/main/java/Model/Transaction/TransactionFactory.java @@ -1,4 +1,9 @@ -package Model; +package Model.Transaction; + +import Model.Purchase.Purchase; +import Model.Sale.Sale; +import Model.Share; + /** * Factory for creating transaction objects. diff --git a/src/main/java/View/GameSetupScene.java b/src/main/java/View/GameSetupScene.java index 44052ca..02577c6 100644 --- a/src/main/java/View/GameSetupScene.java +++ b/src/main/java/View/GameSetupScene.java @@ -1,8 +1,9 @@ package View; import Controller.StockFileHandler; -import Model.Exchange; import Model.Stock; +import Model.Exchange.Exchange; + import java.io.File; import java.math.BigDecimal; import java.util.List; diff --git a/src/main/java/View/MainGameScene.java b/src/main/java/View/MainGameScene.java index 6f4cd27..113b866 100644 --- a/src/main/java/View/MainGameScene.java +++ b/src/main/java/View/MainGameScene.java @@ -1,14 +1,40 @@ package View; -import Model.*; import java.math.BigDecimal; import java.util.List; + +import Model.Share; +import Model.Stock; +import Model.Exchange.Exchange; +import Model.Exchange.ExchangeObserver; +import Model.Player.Player; +import Model.Player.PlayerStatus; +import Model.Purchase.Purchase; +import Model.Sale.Sale; +import Model.Sale.SaleCalculator; +import Model.Transaction.Transaction; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Pos; import javafx.scene.Scene; -import javafx.scene.control.*; -import javafx.scene.layout.*; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Dialog; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.Separator; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; /** @@ -169,8 +195,22 @@ private VBox createStocksPanel() { searchBox.getChildren().addAll(search, searchBtn, filter); loadStocks.run(); + // Double-click a row to view price statistics + table.setOnMouseClicked(event -> { + if (event.getClickCount() == 2) { + StockRow selected = table.getSelectionModel().getSelectedItem(); + if (selected != null) { + showStockStats(selected.s); + } + } + }); + VBox.setVgrow(table, Priority.ALWAYS); - panel.getChildren().addAll(searchBox, table); + + Label hint = new Label("Double-click a row to view price history"); + hint.getStyleClass().add("file-label"); + panel.getChildren().addAll(searchBox, table, hint); + return panel; } @@ -557,6 +597,63 @@ private BigDecimal getNetWorth() { return player.getMoney().add(player.getPortfolio().getNetWorth()); } + private void showStockStats(Stock stock) { + Dialog dialog = new Dialog<>(); + dialog.setTitle(stock.getSymbol() + " — " + stock.getCompany()); + dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); + + VBox content = new VBox(12); + content.setPrefWidth(340); + + // --- Number Sumary --- + BigDecimal change = stock.getLatestPriceChange(); + String changeSign = change.compareTo(BigDecimal.ZERO) >= 0 ? "+" : ""; + + GridPane summary = new GridPane(); + summary.setHgap(16); + summary.setVgap(6); + addStatRow(summary, 0, "Current price:", "$" + formatMoney(stock.getSalesPrice())); + addStatRow(summary, 1, "Week change:", changeSign + formatMoney(change)); + addStatRow(summary, 2, "All-time high:", "$" + formatMoney(stock.getHighestPrice())); + addStatRow(summary, 3, "All-time low:", "$" + formatMoney(stock.getLowestPrice())); + addStatRow(summary, 4, "Weeks tracked:", String.valueOf(stock.getHistoricalPrices().size())); + + // --- Price history list --- + Label histHeading = new Label("Price history:"); + histHeading.setStyle("-fx-font-weight: bold;"); + + ListView histList = new ListView<>(); + histList.setPrefHeight(180); + List prices = stock.getHistoricalPrices(); + ObservableList rows = FXCollections.observableArrayList(); + for (int i = 0; i < prices.size(); i++) { + String change_i = ""; + if (i > 0) { + BigDecimal diff = prices.get(i).subtract(prices.get(i - 1)); + change_i = " (" + (diff.compareTo(BigDecimal.ZERO) >= 0 ? "+" : "") + + formatMoney(diff) + ")"; + } + rows.add("Week " + (i + 1) + ": $" + formatMoney(prices.get(i)) + change_i); + } + histList.setItems(rows); + + // Scroll to the most recent week + if (!rows.isEmpty()) histList.scrollTo(rows.size() - 1); + + content.getChildren().addAll(summary, new Separator(), histHeading, histList); + dialog.getDialogPane().setContent(content); + dialog.showAndWait(); + } + + /** Adds a label and value to the given row. */ + private void addStatRow(GridPane grid, int row, String labelText, String valueText) { + Label lbl = new Label(labelText); + lbl.setStyle("-fx-font-weight: bold;"); + Label val = new Label(valueText); + grid.add(lbl, 0, row); + grid.add(val, 1, row); + } + private void showConfirmation(String title, Transaction t) { StringBuilder msg = new StringBuilder(); if (t instanceof Purchase) { diff --git a/src/main/java/View/StockTradingGameApp.java b/src/main/java/View/StockTradingGameApp.java index b1ab987..cfb4d16 100644 --- a/src/main/java/View/StockTradingGameApp.java +++ b/src/main/java/View/StockTradingGameApp.java @@ -2,6 +2,8 @@ import Controller.StockFileHandler; import Model.*; +import Model.Exchange.Exchange; +import Model.Player.Player; import javafx.application.Application; import javafx.stage.Stage; diff --git a/src/test/java/ExchangeTest.java b/src/test/java/ExchangeTest.java index cc55f5d..10c567f 100644 --- a/src/test/java/ExchangeTest.java +++ b/src/test/java/ExchangeTest.java @@ -1,12 +1,12 @@ import static org.junit.jupiter.api.Assertions.*; -import Model.Exchange; -import Model.Player; -import Model.Purchase; -import Model.Sale; +import Model.Exchange.Exchange; +import Model.Player.Player; +import Model.Purchase.Purchase; +import Model.Sale.Sale; import Model.Share; import Model.Stock; -import Model.Transaction; +import Model.Transaction.Transaction; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index cedf182..05021d7 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,6 +1,6 @@ -import static org.junit.jupiter.api.Assertions.*; +import Model.Player.Player; -import Model.Player; +import static org.junit.jupiter.api.Assertions.*; import java.math.BigDecimal; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/PurchaseTest.java b/src/test/java/PurchaseTest.java index de1c2ca..a5cbe7b 100644 --- a/src/test/java/PurchaseTest.java +++ b/src/test/java/PurchaseTest.java @@ -1,7 +1,7 @@ import static org.junit.jupiter.api.Assertions.*; -import Model.Player; -import Model.Purchase; +import Model.Player.Player; +import Model.Purchase.Purchase; import Model.Share; import Model.Stock; import java.math.BigDecimal; diff --git a/src/test/java/SaleTest.java b/src/test/java/SaleTest.java index 31efe4d..fa15fca 100644 --- a/src/test/java/SaleTest.java +++ b/src/test/java/SaleTest.java @@ -1,7 +1,7 @@ import static org.junit.jupiter.api.Assertions.*; -import Model.Player; -import Model.Sale; +import Model.Player.Player; +import Model.Sale.Sale; import Model.Share; import Model.Stock; import java.math.BigDecimal; diff --git a/src/test/java/StockTest.java b/src/test/java/StockTest.java index c07c75b..a9f3703 100644 --- a/src/test/java/StockTest.java +++ b/src/test/java/StockTest.java @@ -1,11 +1,10 @@ -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import Model.Stock; - -import static org.junit.jupiter.api.Assertions.*; import java.math.BigDecimal; import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * Unit tests for the Stock class. diff --git a/src/test/java/TransactionArchiveTest.java b/src/test/java/TransactionArchiveTest.java index df7ed0c..5408d16 100644 --- a/src/test/java/TransactionArchiveTest.java +++ b/src/test/java/TransactionArchiveTest.java @@ -1,11 +1,11 @@ import static org.junit.jupiter.api.Assertions.*; -import Model.Player; -import Model.Purchase; -import Model.Sale; +import Model.Player.Player; +import Model.Purchase.Purchase; +import Model.Sale.Sale; import Model.Share; import Model.Stock; -import Model.TransactionArchive; +import Model.Transaction.TransactionArchive; import java.math.BigDecimal; import java.util.List; import org.junit.jupiter.api.BeforeEach; diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 88de729..e5a9236 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,19 +1,19 @@ C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Controller\StockFileHandler.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Exchange.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\ExchangeObserver.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Player.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\PlayerStatus.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Exchange\Exchange.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Exchange\ExchangeObserver.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Player\Player.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Player\PlayerStatus.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Portfolio.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Purchase.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\PurchaseCalculator.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Sale.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\SaleCalculator.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Purchase\Purchase.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Purchase\PurchaseCalculator.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Sale\Sale.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Sale\SaleCalculator.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Share.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Stock.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Transaction.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\TransactionArchive.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\TransactionCalculator.java -C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\TransactionFactory.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Transaction\Transaction.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Transaction\TransactionArchive.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Transaction\TransactionCalculator.java +C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\Model\Transaction\TransactionFactory.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\View\GameSetupScene.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\View\Launcher.java C:\Users\elisa\Downloads\progdel1\Programmering2_mappe_v26\src\main\java\View\MainGameScene.java diff --git a/target/test-classes/ExchangeTest.class b/target/test-classes/ExchangeTest.class index c301cc2..4f48c37 100644 Binary files a/target/test-classes/ExchangeTest.class and b/target/test-classes/ExchangeTest.class differ diff --git a/target/test-classes/StockTest.class b/target/test-classes/StockTest.class index c71a54d..92d9c85 100644 Binary files a/target/test-classes/StockTest.class and b/target/test-classes/StockTest.class differ