diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/Main.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/Main.java index f7d2273..cbf1cc2 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/Main.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/Main.java @@ -2,24 +2,14 @@ package ch.unibas.dmi.dbis.cs108.casono; import ch.unibas.dmi.dbis.cs108.casono.client.ClientApp; import ch.unibas.dmi.dbis.cs108.casono.server.ServerApp; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -/** - * Main entry point for Casono application. - * Handles client and server startup. - *
- * Standardkonstruktor für die Anwendung.
- */
+/** Main entry point for Casono application. Handles client and server startup. */
public final class Main {
-
- /**
- * Standardkonstruktor.
- */
- public Main() {
- // Standardkonstruktor
- }
-
/**
* Main entry point for Casono.
+ *
* @param args Command line arguments
*/
public static void main(String[] args) {
@@ -50,10 +40,12 @@ public final class Main {
}
private static void printUsage() {
- System.err.println("""
- Usage:
- java -jar xyz.jar server
- * Standardkonstruktor für die Anwendung.
+ * Entry point for the Casono client application. Handles client startup and connection parameters.
+ *
+ * Standardkonstruktor für die Anwendung.
*/
public class ClientApp {
- /**
- * Standardkonstruktor.
- */
+ private static final Logger LOGGER = LogManager.getLogger(ClientApp.class);
+
+ /** Standardkonstruktor. */
public ClientApp() {
// Standardkonstruktor
}
+
/**
* Starts the client application with the given address.
+ *
* @param arg Address in the format "ip:port".
* @throws IllegalArgumentException if the address format is invalid.
*/
@@ -32,7 +35,7 @@ public class ClientApp {
String host = parts[0];
int port = Integer.parseInt(parts[1]);
- System.out.println("You've selected the client. It will connect port " + port + " at host " + host);
- Launcher.main(new String[]{});
+ LOGGER.info("You've selected the client. It will connect port {} at host {}", port, host);
+ Launcher.main(new String[] {});
}
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
index c687abf..f4d4069 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/Launcher.java
@@ -1,26 +1,26 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui;
+import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import javafx.application.Application;
/**
* Launcher for the Casono main UI.
- *
- * Standardkonstruktor für die Anwendung.
+ *
+ * Standardkonstruktor für die Anwendung.
*/
public class Launcher {
- /**
- * Standardkonstruktor.
- */
+ /** Standardkonstruktor. */
public Launcher() {
// Standardkonstruktor
}
+
/**
* Main entry point for launching the UI.
+ *
* @param args Command line arguments
*/
public static void main(String[] args) {
- Application.launch(ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui.class, args);
+ Application.launch(Casinomainui.class, args);
}
}
-
\ No newline at end of file
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
index 437c689..b6b273f 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java
@@ -12,46 +12,38 @@ import javafx.scene.layout.VBox;
/**
* Controller-Klasse für das Chat-System innerhalb der Spieloberfläche.
*
- * Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten
- * sowie den Senden-Button. Unterstützt drei Arten von Nachrichten:
- * - Player-to-Player (Privat)
- * - Lobby-Chat (Raum)
- * - Globaler Chat (Serverweit)
+ * Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten sowie den
+ * Senden-Button. Unterstützt drei Arten von Nachrichten: - Player-to-Player (Privat) - Lobby-Chat
+ * (Raum) - Globaler Chat (Serverweit)
*
- * Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt.
- * Eigene Nachrichten werden über {@link #onSendToNetwork(String)} an das
- * Netzwerkprotokoll weitergeleitet, während eingehende Nachrichten über
- * {@link #receiveMessage(String, String)} verarbeitet und angezeigt werden.
+ * Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt. Eigene
+ * Nachrichten werden über {@link #onSendToNetwork(String)} an das Netzwerkprotokoll weitergeleitet,
+ * während eingehende Nachrichten über {@link #receiveMessage(String, String)} verarbeitet und
+ * angezeigt werden.
*
- * Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei
+ * Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei
*/
public class ChatController {
- @FXML
- private VBox chatVBox;
+ @FXML private VBox chatVBox;
- @FXML
- private TextField inputField;
+ @FXML private TextField inputField;
- @FXML
- private Button sendButton;
+ @FXML private Button sendButton;
- @FXML
- private ScrollPane chatScrollPane;
+ @FXML private ScrollPane chatScrollPane;
private static final int CHAT_PADDING = 20;
- /**
- * Initialisiert den ChatController nach dem Laden der FXML.
- */
+ /** Initialisiert den ChatController nach dem Laden der FXML. */
public void initialize() {
inputField.setOnAction(event -> sendMessage());
chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty());
}
/**
- * Diese Methode wird vom Senden-Button oder Enter ausgelöst.
- * Sie gibt die eigene Nachricht an das Netzwerkprotokoll weiter.
+ * Diese Methode wird vom Senden-Button oder Enter ausgelöst. Sie gibt die eigene Nachricht an
+ * das Netzwerkprotokoll weiter.
*/
@FXML
private void sendMessage() {
@@ -65,8 +57,9 @@ public class ChatController {
}
/**
- * Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden,
- * wenn eine neue Nachricht von einem anderen Spieler kommt.
+ * Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden, wenn eine neue Nachricht von
+ * einem anderen Spieler kommt.
+ *
* @param player Name des Spielers
* @param message Nachricht des Spielers
*/
@@ -80,12 +73,13 @@ public class ChatController {
}
/**
- * Schnittstelle zum Netzwerkprotokoll.
- * Diese Funktion wird automatisch aufgerufen, wenn der Benutzer eine eigene Nachricht sendet.
+ * Schnittstelle zum Netzwerkprotokoll. Diese Funktion wird automatisch aufgerufen, wenn der
+ * Benutzer eine eigene Nachricht sendet.
+ *
* @param message Nachricht, die der Benutzer abgeschickt hat
*/
public void onSendToNetwork(String message) {
// TODO: Netzwerkcode einfügen
receiveMessage("Du", message);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
index 91e3075..c96c9bd 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java
@@ -7,15 +7,11 @@ import javafx.scene.layout.VBox;
/**
* Controller für die Casino-Spielfläche.
*
- * Verantwortlich für:
- * - die Darstellung des Pokertisches und der Spieleroberfläche,
- * - die Verarbeitung von Benutzereingaben,
- * - die Schnittstelle zur GameEngine und zum Netzwerkprotokoll.
+ * Verantwortlich für: - die Darstellung des Pokertisches und der Spieleroberfläche, - die
+ * Verarbeitung von Benutzereingaben, - die Schnittstelle zur GameEngine und zum Netzwerkprotokoll.
*
- * Hinweise:
- * - Die Methode `onTableClick()` dient aktuell nur als Test-Logik.
- * Sie ist ggf. nicht mehr funktionsfähig und wird zukünftig
- * durch die finale Spielinteraktion ersetzt.
+ * Hinweise: - Die Methode `onTableClick()` dient aktuell nur als Test-Logik. Sie ist ggf. nicht
+ * mehr funktionsfähig und wird zukünftig durch die finale Spielinteraktion ersetzt.
*/
public class CasinoGameController {
@@ -28,4 +24,4 @@ public class CasinoGameController {
public void onTableClick() {
welcomeText.setText("Einsatz akzeptiert!");
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
index c280e3f..f9b5419 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java
@@ -9,13 +9,11 @@ import javafx.stage.Stage;
/**
* Hauptklasse für das Casino-Spiel-UI.
*
- * Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei
- * und initialisiert die Haupt-Stage für das Spiel.
+ * Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei und
+ * initialisiert die Haupt-Stage für das Spiel.
*
- * Aufgaben:
- * - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml".
- * - Lädt das Anwendungs-Icon aus "/images/logoinverted.png".
- * - Startet die Anwendung im Vollbildmodus.
+ * Aufgaben: - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml". - Lädt das
+ * Anwendungs-Icon aus "/images/logoinverted.png". - Startet die Anwendung im Vollbildmodus.
*/
public class CasinoGameUI extends Application {
@@ -44,9 +42,10 @@ public class CasinoGameUI extends Application {
/**
* Startpunkt der Anwendung.
+ *
* @param args Befehlszeilenargumente.
*/
public static void main(String[] args) {
launch();
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
index 282582a..e351b7a 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java
@@ -31,32 +31,22 @@ import javafx.stage.Stage;
/**
* Experimenteller integrierter Browser für Casono.
*
- * Diese Klasse implementiert einen einfachen eingebetteten Webbrowser
- * auf Basis von {@link javafx.scene.web.WebView}. Der Browser dient
- * primär als Hilfswerkzeug innerhalb des Spiels, um externe Inhalte
- * wie Webseiten oder Videos anzuzeigen.
+ * Diese Klasse implementiert einen einfachen eingebetteten Webbrowser auf Basis von {@link
+ * javafx.scene.web.WebView}. Der Browser dient primär als Hilfswerkzeug innerhalb des Spiels, um
+ * externe Inhalte wie Webseiten oder Videos anzuzeigen.
*
- * Status
- * Der Browser befindet sich derzeit in einer experimentellen Phase.
- * Einige Sicherheitsmechanismen basieren auf experimentellen
- * KI-gestützten Empfehlungen und können sich in zukünftigen
- * Versionen noch ändern.
+ * Status Der Browser befindet sich derzeit in einer experimentellen Phase. Einige
+ * Sicherheitsmechanismen basieren auf experimentellen KI-gestützten Empfehlungen und können sich in
+ * zukünftigen Versionen noch ändern.
*
- * Zweck
- * Der Browser wird aktuell experimentell genutzt, um:
- * Pokerregeln direkt im Spiel zu erklären
- * Hilfeseiten oder Dokumentationen anzuzeigen
- * Videos (z.B. Tutorials oder Erklärungen) über Plattformen wie YouTube abzuspielen
+ * Zweck Der Browser wird aktuell experimentell genutzt, um: Pokerregeln direkt im Spiel zu
+ * erklären Hilfeseiten oder Dokumentationen anzuzeigen Videos (z.B. Tutorials oder Erklärungen)
+ * über Plattformen wie YouTube abzuspielen
*
- * Sicherheitsmechanismen
- * Da externe Webseiten geladen werden können, wurden einige
- * grundlegende Schutzmaßnahmen integriert:
- * - HTTPS-Zwang für Webseiten
- * - Whitelist für bekannte Domains
- * - Warnung bei unbekannten Webseiten
- * - JavaScript standardmäßig deaktiviert (man kann es jedoch für Google etc. einschalten)
- * - Popup-Blocker
- * - Automatische Cookie-Löschung beim Schließen
+ * Sicherheitsmechanismen Da externe Webseiten geladen werden können, wurden einige grundlegende
+ * Schutzmaßnahmen integriert: - HTTPS-Zwang für Webseiten - Whitelist für bekannte Domains -
+ * Warnung bei unbekannten Webseiten - JavaScript standardmäßig deaktiviert (man kann es jedoch für
+ * Google etc. einschalten) - Popup-Blocker - Automatische Cookie-Löschung beim Schließen
*/
public class CasinoBrowserController {
@@ -105,76 +95,84 @@ public class CasinoBrowserController {
private static boolean javascriptEnabled = false;
- /**
- * Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung.
- */
+ /** Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung. */
private static void clearCookies() {
try {
COOKIE_MANAGER.getCookieStore().removeAll();
- } catch (Exception ignored) {}
+ } catch (Exception ignored) {
+ }
}
/**
* Öffnet ein neues Browserfenster und lädt eine angegebene Webseite.
*
- * Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört,
- * wird der Benutzer gefragt, ob die Seite dennoch geladen werden soll.
+ * Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört, wird der Benutzer
+ * gefragt, ob die Seite dennoch geladen werden soll.
*
* @param url die Startadresse der Webseite, die geladen werden soll
*/
public static void open(String url) {
- Platform.runLater(() -> {
- Stage stage = new Stage();
+ Platform.runLater(
+ () -> {
+ Stage stage = new Stage();
- WebView webView = new WebView();
- WebEngine engine = webView.getEngine();
+ WebView webView = new WebView();
+ WebEngine engine = webView.getEngine();
- engine.setJavaScriptEnabled(false);
+ engine.setJavaScriptEnabled(false);
- configurePopupBlocker(engine);
+ configurePopupBlocker(engine);
- webView.getStyleClass().add("web-view");
+ webView.getStyleClass().add("web-view");
- StackPane webContainer = createWebContainer(webView);
+ StackPane webContainer = createWebContainer(webView);
- Rectangle clip = new Rectangle();
- clip.setArcWidth(CORNER_RADIUS);
- clip.setArcHeight(CORNER_RADIUS);
- webView.setClip(clip);
+ Rectangle clip = new Rectangle();
+ clip.setArcWidth(CORNER_RADIUS);
+ clip.setArcHeight(CORNER_RADIUS);
+ webView.setClip(clip);
- webView.widthProperty().addListener((o, a, b) ->
- clip.setWidth(b.doubleValue()));
- webView.heightProperty().addListener((o, a, b) ->
- clip.setHeight(b.doubleValue()));
+ webView.widthProperty()
+ .addListener((o, a, b) -> clip.setWidth(b.doubleValue()));
+ webView.heightProperty()
+ .addListener((o, a, b) -> clip.setHeight(b.doubleValue()));
- ImageView browserLogo = loadLogos(stage);
+ ImageView browserLogo = loadLogos(stage);
- TextField urlField = createUrlField(url);
- Label securityLabel = createSecurityLabel();
+ TextField urlField = createUrlField(url);
+ Label securityLabel = createSecurityLabel();
- Button jsToggle = createJsToggle(engine);
- Button backBtn = createBackButton(engine);
- Button fwdBtn = createForwardButton(engine);
- Button reloadBtn = createReloadButton(engine);
- Button closeBtn = createCloseButton(stage, webView);
- configureUrlEvents(engine, urlField, securityLabel);
+ Button jsToggle = createJsToggle(engine);
+ Button backBtn = createBackButton(engine);
+ Button fwdBtn = createForwardButton(engine);
+ Button reloadBtn = createReloadButton(engine);
+ Button closeBtn = createCloseButton(stage, webView);
+ configureUrlEvents(engine, urlField, securityLabel);
- HBox taskbar = new HBox(HBOX_SPACIN, browserLogo, backBtn, fwdBtn,
- reloadBtn, urlField, jsToggle, securityLabel, closeBtn
- );
+ HBox taskbar =
+ new HBox(
+ HBOX_SPACIN,
+ browserLogo,
+ backBtn,
+ fwdBtn,
+ reloadBtn,
+ urlField,
+ jsToggle,
+ securityLabel,
+ closeBtn);
- taskbar.getStyleClass().add("taskbar-browser");
- taskbar.setAlignment(Pos.CENTER_LEFT);
+ taskbar.getStyleClass().add("taskbar-browser");
+ taskbar.setAlignment(Pos.CENTER_LEFT);
- Scene scene = createScene(taskbar, webContainer);
+ Scene scene = createScene(taskbar, webContainer);
- configureKeyEvents(scene, engine);
+ configureKeyEvents(scene, engine);
- stage.setScene(scene);
- stage.setTitle("Casono Browser");
- loadUrlSafely(engine, url, securityLabel);
- stage.show();
- });
+ stage.setScene(scene);
+ stage.setTitle("Casono Browser");
+ loadUrlSafely(engine, url, securityLabel);
+ stage.show();
+ });
}
/**
@@ -197,41 +195,43 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
*/
public static void configurePopupBlocker(WebEngine engine) {
- engine.setCreatePopupHandler(config -> {
- Alert alert = new Alert(Alert.AlertType.WARNING);
- alert.setTitle("Popup blockiert");
- alert.setHeaderText(null);
- alert.setContentText("Popup wurde aus Sicherheitsgründen blockiert.");
+ engine.setCreatePopupHandler(
+ config -> {
+ Alert alert = new Alert(Alert.AlertType.WARNING);
+ alert.setTitle("Popup blockiert");
+ alert.setHeaderText(null);
+ alert.setContentText("Popup wurde aus Sicherheitsgründen blockiert.");
- try {
- var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
- Image logo = new Image(stream);
+ try {
+ var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
+ Image logo = new Image(stream);
- // Variable 'streamM' abgekürzt, um das 100-Zeichen-Limit (LineLength)
- // einzuhalten
- var streamM = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN);
- Image logomain = new Image(streamM);
+ // Variable 'streamM' abgekürzt, um das 100-Zeichen-Limit (LineLength)
+ // einzuhalten
+ var streamM =
+ CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN);
+ Image logomain = new Image(streamM);
- if (logo != null) {
- Stage alertStage = (Stage) alert.getDialogPane().getScene().getWindow();
- if (alertStage != null) {
- alertStage.getIcons().add(logo);
+ if (logo != null) {
+ Stage alertStage = (Stage) alert.getDialogPane().getScene().getWindow();
+ if (alertStage != null) {
+ alertStage.getIcons().add(logo);
+ }
+ }
+
+ if (logomain != null) {
+ ImageView logoView = new ImageView(logomain);
+ logoView.setFitHeight(LOGO_HEIGHT);
+ logoView.setPreserveRatio(true);
+ alert.setGraphic(logoView);
+ }
+ } catch (Exception e) {
+ LOGGER.error("Logo konnte nicht geladen werden");
}
- }
- if (logomain != null) {
- ImageView logoView = new ImageView(logomain);
- logoView.setFitHeight(LOGO_HEIGHT);
- logoView.setPreserveRatio(true);
- alert.setGraphic(logoView);
- }
- } catch (Exception e) {
- LOGGER.error("Logo konnte nicht geladen werden");
- }
-
- alert.showAndWait();
- return null;
- });
+ alert.showAndWait();
+ return null;
+ });
}
/**
@@ -300,25 +300,26 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
* @return Button Umschalten
*/
- public static Button createJsToggle(WebEngine engine){
+ public static Button createJsToggle(WebEngine engine) {
Button jsToggle = new Button("JS EINSCHALTEN");
jsToggle.getStyleClass().add("red-button");
- jsToggle.setOnAction(e -> {
- javascriptEnabled = !javascriptEnabled;
- engine.setJavaScriptEnabled(javascriptEnabled);
+ jsToggle.setOnAction(
+ e -> {
+ javascriptEnabled = !javascriptEnabled;
+ engine.setJavaScriptEnabled(javascriptEnabled);
- if (javascriptEnabled) {
- jsToggle.setText("JS AUSSCHALTEN");
- jsToggle.getStyleClass().removeAll("red-button");
- jsToggle.getStyleClass().add("yellow-button");
+ if (javascriptEnabled) {
+ jsToggle.setText("JS AUSSCHALTEN");
+ jsToggle.getStyleClass().removeAll("red-button");
+ jsToggle.getStyleClass().add("yellow-button");
- } else {
- jsToggle.setText("JS EINSCHALTEN");
- jsToggle.getStyleClass().removeAll("yellow-button");
- jsToggle.getStyleClass().add("red-button");
- }
- });
+ } else {
+ jsToggle.setText("JS EINSCHALTEN");
+ jsToggle.getStyleClass().removeAll("yellow-button");
+ jsToggle.getStyleClass().add("red-button");
+ }
+ });
return jsToggle;
}
@@ -332,11 +333,12 @@ public class CasinoBrowserController {
public static Button createBackButton(WebEngine engine) {
Button backBtn = new Button("<");
backBtn.getStyleClass().add("gray-button");
- backBtn.setOnAction(e -> {
- if (engine.getHistory().getCurrentIndex() > 0) {
- engine.getHistory().go(-1);
- }
- });
+ backBtn.setOnAction(
+ e -> {
+ if (engine.getHistory().getCurrentIndex() > 0) {
+ engine.getHistory().go(-1);
+ }
+ });
return backBtn;
}
@@ -350,12 +352,13 @@ public class CasinoBrowserController {
public static Button createForwardButton(WebEngine engine) {
Button fwdBtn = new Button(">");
fwdBtn.getStyleClass().add("gray-button");
- fwdBtn.setOnAction(e -> {
- if (engine.getHistory().getCurrentIndex() <
- engine.getHistory().getEntries().size() - 1) {
- engine.getHistory().go(1);
- }
- });
+ fwdBtn.setOnAction(
+ e -> {
+ if (engine.getHistory().getCurrentIndex()
+ < engine.getHistory().getEntries().size() - 1) {
+ engine.getHistory().go(1);
+ }
+ });
return fwdBtn;
}
@@ -383,12 +386,12 @@ public class CasinoBrowserController {
public static Button createCloseButton(Stage stage, WebView webView) {
Button closeBtn = new Button("X");
closeBtn.getStyleClass().add("red-button");
- closeBtn.setOnAction(e -> {
- webView.getEngine().load("about:blank");
- clearCookies();
- stage.close();
-
- });
+ closeBtn.setOnAction(
+ e -> {
+ webView.getEngine().load("about:blank");
+ clearCookies();
+ stage.close();
+ });
return closeBtn;
}
@@ -400,13 +403,10 @@ public class CasinoBrowserController {
* @param urlField URL Textfeld
* @param securityLabel Sicherheits Label
*/
- public static void configureUrlEvents(WebEngine engine,
- TextField urlField,
- Label securityLabel) {
- urlField.setOnAction(e ->
- loadUrlSafely(engine, urlField.getText(), securityLabel));
- engine.locationProperty().addListener((obs, o, n) ->
- urlField.setText(n));
+ public static void configureUrlEvents(
+ WebEngine engine, TextField urlField, Label securityLabel) {
+ urlField.setOnAction(e -> loadUrlSafely(engine, urlField.getText(), securityLabel));
+ engine.locationProperty().addListener((obs, o, n) -> urlField.setText(n));
}
/**
@@ -423,8 +423,7 @@ public class CasinoBrowserController {
Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT);
- var css = CasinoBrowserController.class
- .getResource("/ui-structure/casinogameui.css");
+ var css = CasinoBrowserController.class.getResource("/ui-structure/casinogameui.css");
if (css != null) {
scene.getStylesheets().add(css.toExternalForm());
@@ -440,25 +439,23 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
*/
public static void configureKeyEvents(Scene scene, WebEngine engine) {
- scene.setOnKeyPressed(event -> {
- if (event.getCode() == KeyCode.F5) {
- engine.reload();
- }
- });
+ scene.setOnKeyPressed(
+ event -> {
+ if (event.getCode() == KeyCode.F5) {
+ engine.reload();
+ }
+ });
}
/**
- * Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen
- * durchgeführt wurden.
+ * Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen durchgeführt wurden.
*
- * Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt:
- * - Überprüfung des Protokolls (nur HTTPS erlaubt)
- * - Überprüfung der Domain gegen eine Whitelist
- * - Schutz vor Domain-Spoofing (Domain-Vortäuschung)
+ * Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt: - Überprüfung des
+ * Protokolls (nur HTTPS erlaubt) - Überprüfung der Domain gegen eine Whitelist - Schutz vor
+ * Domain-Spoofing (Domain-Vortäuschung)
*
- * Falls eine Domain nicht als vertrauenswürdig eingestuft wird,
- * muss der Benutzer bestätigen, dass die Seite dennoch geöffnet
- * werden darf.
+ * Falls eine Domain nicht als vertrauenswürdig eingestuft wird, muss der Benutzer
+ * bestätigen, dass die Seite dennoch geöffnet werden darf.
*
* @param engine der WebEngine-Renderer des Browsers
* @param url die zu ladende Webadresse
@@ -485,8 +482,9 @@ public class CasinoBrowserController {
}
// Sicherer Domain Check
- boolean trusted = TRUSTED_DOMAINS.stream().anyMatch(domain ->
- host.equals(domain) || host.endsWith("." + domain));
+ boolean trusted =
+ TRUSTED_DOMAINS.stream()
+ .anyMatch(domain -> host.equals(domain) || host.endsWith("." + domain));
if (!trusted) {
if (!showUnknownWebsiteAlert(host)) {
@@ -515,9 +513,9 @@ public class CasinoBrowserController {
alert.setTitle("Unbekannte Website");
alert.setHeaderText("Diese Website ist nicht bekannt");
alert.setContentText(
- host + "\n\nDiese Seite ist nicht vom " +
- "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?"
- );
+ host
+ + "\n\nDiese Seite ist nicht vom "
+ + "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?");
var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
Image logo = new Image(stream);
@@ -541,4 +539,4 @@ public class CasinoBrowserController {
return true;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
index 79f1615..33e1e32 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java
@@ -11,10 +11,8 @@ import javafx.scene.layout.HBox;
/**
* Controller für die interaktive Taskleiste innerhalb der Poker-UI.
*
- * Verantwortlich für:
- * - Drag-and-Drop-Verschieben der Taskleiste,
- * - Eingabe und Verwaltung von Spieleinsätzen,
- * - Steuerung allgemeiner Menüfunktionen wie Exit.
+ * Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und Verwaltung von
+ * Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit.
*/
public class TaskbarController {
@@ -32,8 +30,8 @@ public class TaskbarController {
private static final int CREDIT_STEP = 5;
/**
- * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird.
- * Speichert die relative Position, um später korrekt zu verschieben.
+ * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert die relative
+ * Position, um später korrekt zu verschieben.
*
* @param event Das Mausereignis
*/
@@ -44,11 +42,11 @@ public class TaskbarController {
}
/**
- * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird.
- * Aktualisiert die Position und skaliert die Taskleiste leicht zur visuellen Rückmeldung.
+ * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. Aktualisiert die Position
+ * und skaliert die Taskleiste leicht zur visuellen Rückmeldung.
*
- * TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem
- * Fenster verschwinden kann.
+ * TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster verschwinden
+ * kann.
*
* @param event Das Mausereignis
*/
@@ -62,8 +60,8 @@ public class TaskbarController {
}
/**
- * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird.
- * Setzt die Skalierung der Taskleiste wieder auf Normalgröße.
+ * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt die Skalierung der
+ * Taskleiste wieder auf Normalgröße.
*
* @param event Das Mausereignis
*/
@@ -86,8 +84,8 @@ public class TaskbarController {
}
/**
- * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird.
- * Löst die Verarbeitung des Einsatzes aus.
+ * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst die
+ * Verarbeitung des Einsatzes aus.
*/
@FXML
private void onInputSubmittedAction() {
@@ -97,8 +95,8 @@ public class TaskbarController {
/**
* Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird.
*
- * TODO: Logik implementieren, um zur Lobby zurückzukehren,
- * ohne die gesamte Anwendung zu schließen (kein System.exit/Platform.exit).
+ * TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu
+ * schließen (kein System.exit/Platform.exit).
*/
@FXML
private void onExitButtonClick() {
@@ -106,10 +104,9 @@ public class TaskbarController {
}
/**
- * Verarbeitet den im Textfeld eingegebenen Einsatz.
- * Es werden ausschließlich ganzzahlige Werte im Bereich von 5 bis 100.000
- * Credits akzeptiert, die einem Vielfachen von 5 entsprechen (5er-Schritte).
- * Der Einsatz wird aktuell nur auf der Konsole ausgegeben.
+ * Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich ganzzahlige Werte
+ * im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5 entsprechen
+ * (5er-Schritte). Der Einsatz wird aktuell nur auf der Konsole ausgegeben.
*/
private void processBet() {
String input = taskbarInput.getText();
@@ -131,11 +128,11 @@ public class TaskbarController {
/**
* Öffnet den integrierten Casono Webbrowser.
*
- * TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks Seite),
- * sobald die Inhalte für Strategien und Support bereitstehen.
+ * TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks
+ * Seite), sobald die Inhalte für Strategien und Support bereitstehen.
*/
@FXML
private void onBrowserButtonClick() {
CasinoBrowserController.open("wikipedia.org");
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
index 169da1d..959c8d3 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/Casinomainui.java
@@ -1,41 +1,43 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
-/**
- * Main UI application for Casono.
- * Loads the main FXML layout and sets up the stage.
- */
+/** Main UI application for Casono. Loads the main FXML layout and sets up the stage. */
+import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
-import java.io.IOException;
-
/**
* JavaFX Application class for the Casono main UI.
- *
- * Standardkonstruktor für die Anwendung.
+ *
+ * Standardkonstruktor für die Anwendung.
*/
public class Casinomainui extends Application {
- /**
- * Standardkonstruktor.
- */
+ /** Standardkonstruktor. */
public Casinomainui() {
// Standardkonstruktor
}
+
+ private static final int SCENE_WIDTH = 1200;
+ private static final int SCENE_HEIGHT = 800;
+
@Override
/**
* Starts the JavaFX application and loads the main UI.
+ *
* @param stage The primary stage for this application.
* @throws IOException If loading the FXML fails.
*/
public void start(Stage stage) throws IOException {
- FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/ui-structure/Casinomainui.fxml"));
- Scene scene = new Scene(fxmlLoader.load(), 1200, 800);
+ FXMLLoader fxmlLoader =
+ new FXMLLoader(getClass().getResource("/ui-structure/Casinomainui.fxml"));
+ Scene scene = new Scene(fxmlLoader.load(), SCENE_WIDTH, SCENE_HEIGHT);
stage.setTitle("Casono");
-
- stage.getIcons().add(new javafx.scene.image.Image(getClass().getResource("/images/logoinverted.png").toExternalForm()));
+ javafx.scene.image.Image icon =
+ new javafx.scene.image.Image(
+ getClass().getResource("/images/logoinverted.png").toExternalForm());
+ stage.getIcons().add(icon);
stage.setScene(scene);
stage.setFullScreen(true);
stage.show();
@@ -43,6 +45,7 @@ public class Casinomainui extends Application {
/**
* Main entry point for launching the application.
+ *
* @param args Command line arguments
*/
public static void main(String[] args) {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
index 5c235cf..56fe07e 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java
@@ -2,34 +2,27 @@ package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import javafx.application.Platform;
import javafx.fxml.FXML;
-import javafx.scene.control.Label;
import javafx.scene.control.Button;
+import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
-/**
- * Controller for the Casono main UI lobby.
- * Handles UI initialization and user actions.
- */
+/** Controller for the Casono main UI lobby. Handles UI initialization and user actions. */
public class CasinomainuiController {
+ private static final Logger LOGGER = LogManager.getLogger(CasinomainuiController.class);
- @FXML
- private AnchorPane rootPane;
- @FXML
- private Label titleLabel;
- @FXML
- private Label subtitleLabel;
- @FXML
- private ImageView logoView;
- @FXML
- private Rectangle greenBox;
- @FXML
- private Button exitbutton;
- @FXML
- private VBox casinoTable;
+ @FXML private AnchorPane rootPane;
+ @FXML private Label titleLabel;
+ @FXML private Label subtitleLabel;
+ @FXML private ImageView logoView;
+ @FXML private Rectangle greenBox;
+ @FXML private Button exitbutton;
+ @FXML private VBox casinoTable;
private LobbyButtonTranslationManager translationManager;
private LobbyButtonGridManager gridManager;
@@ -39,9 +32,7 @@ public class CasinomainuiController {
// Default constructor
}
- /**
- * Initializes the UI components and sets default values.
- */
+ /** Initializes the UI components and sets default values. */
@FXML
public void initialize() {
titleLabel.setText("Casono");
@@ -49,37 +40,34 @@ public class CasinomainuiController {
logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm()));
translationManager = new LobbyButtonTranslationManager();
- gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
+ gridManager =
+ new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
casinoTable.getChildren().clear();
casinoTable.getChildren().add(gridManager.getGridPane());
gridManager.renderLobbyButtons();
}
- /**
- * Handles the exit button action to close the application.
- */
+ /** Handles the exit button action to close the application. */
@FXML
public void handleexitbutton() {
Platform.exit();
}
- /**
- * Handles creation of a new lobby button.
- */
+ /** Handles creation of a new lobby button. */
@FXML
public void handleCreateLobbyButton() {
if (translationManager.isFull()) {
- System.out.println("Grid voll! Keine weiteren Lobbys moeglich.");
+ LOGGER.warn("Grid voll! Keine weiteren Lobbys moeglich.");
return;
}
int buttonId = nextButtonId++;
int lobbyId = gridManager.createLobby();
try {
translationManager.addLobbyButton(buttonId, lobbyId);
- System.out.println("ButtonID: " + buttonId + ", LobbyID: " + lobbyId);
+ LOGGER.info("ButtonID: {}, LobbyID: {}", buttonId, lobbyId);
gridManager.renderLobbyButtons();
} catch (Exception e) {
- System.out.println("Fehler beim Hinzufügen: " + e.getMessage());
+ LOGGER.error("Fehler beim Hinzufügen: {}", e.getMessage());
}
}
}
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
index 6add82d..03259a7 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java
@@ -1,47 +1,57 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
/**
- * Manages the grid for lobby buttons and rendering.
- * Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
+ * Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping
+ * ButtonID to LobbyID.
*/
-
+import java.util.Map;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
-import java.util.Map;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
- * Manages the grid for lobby buttons and rendering.
- * Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
+ * Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping
+ * ButtonID to LobbyID.
*/
public class LobbyButtonGridManager {
+ private static final Logger LOGGER = LogManager.getLogger(LobbyButtonGridManager.class);
/** GridPane for the button grid. */
private final GridPane gridPane;
+
/** Manager for mapping ButtonID to LobbyID. */
private final LobbyButtonTranslationManager translationManager;
+
/** Number of rows in the grid. */
- private final int rows = 2;
+ private static final int ROWS = 2;
+
/** Number of columns in the grid. */
- private final int cols = 4;
+ private static final int COLS = 4;
+
/** Path to the button image. */
- private final String buttonImagePath = "/images/logo.png";
+ private static final String BUTTON_IMAGE_PATH = "/images/logo.png";
+
+ /** Max random lobby id. */
+ private static final int MAX_RANDOM_LOBBY_ID = 10000;
/**
* Constructor for the GridManager.
- *
- * @param gridPane the GridPane for rendering
+ *
+ * @param gridPane the GridPane for rendering
* @param translationManager the manager for mapping ButtonID to LobbyID
*/
- public LobbyButtonGridManager(GridPane gridPane, LobbyButtonTranslationManager translationManager) {
+ public LobbyButtonGridManager(
+ GridPane gridPane, LobbyButtonTranslationManager translationManager) {
this.gridPane = gridPane;
this.translationManager = translationManager;
}
/**
- * Renders all lobby buttons in the grid.
- * Creates a button for each mapping with image and event handler.
+ * Renders all lobby buttons in the grid. Creates a button for each mapping with image and event
+ * handler.
*/
public void renderLobbyButtons() {
gridPane.getChildren().clear();
@@ -55,14 +65,17 @@ public class LobbyButtonGridManager {
int buttonId = entry.getKey();
Button btn = new Button();
btn.setId("lobbyBtn-" + buttonId);
- btn.setGraphic(new ImageView(new Image(getClass().getResourceAsStream(buttonImagePath))));
- btn.setOnAction(e -> {
- Integer lobbyId = translationManager.getLobbyIdForButton(buttonId);
- if (lobbyId != null)
- joinLobby(lobbyId);
- });
- int row = index / cols;
- int col = index % cols;
+ btn.setGraphic(
+ new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH))));
+ btn.setOnAction(
+ e -> {
+ Integer lobbyId = translationManager.getLobbyIdForButton(buttonId);
+ if (lobbyId != null) {
+ joinLobby(lobbyId);
+ }
+ });
+ int row = index / COLS;
+ int col = index % COLS;
gridPane.add(btn, col, row);
index++;
}
@@ -70,29 +83,29 @@ public class LobbyButtonGridManager {
/**
* Placeholder for lobby creation logic. Returns a generated lobbyId.
- *
+ *
* @return The generated lobbyId
*/
public int createLobby() {
// TODO: Replace with actual lobby creation logic
- int lobbyId = (int) (Math.random() * 10000 + 1);
- System.out.println("Lobby created: " + lobbyId);
+ int lobbyId = (int) (Math.random() * MAX_RANDOM_LOBBY_ID + 1);
+ LOGGER.info("Lobby created: {}", lobbyId);
return lobbyId;
}
/**
* Placeholder for joining a lobby.
- *
+ *
* @param lobbyId The lobbyId to join
*/
public void joinLobby(int lobbyId) {
// TODO: Replace with actual join logic
- System.out.println("Joining lobby: " + lobbyId);
+ LOGGER.info("Joining lobby: {}", lobbyId);
}
/**
* Getter for the GridPane.
- *
+ *
* @return The GridPane for the button grid
*/
public javafx.scene.layout.GridPane getGridPane() {
diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
index e3dd72e..19af19e 100644
--- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
+++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java
@@ -4,24 +4,24 @@ import java.util.HashMap;
import java.util.Map;
/**
- * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher.
- * Keine Dateioperationen, nur Laufzeitdatenstruktur.
+ * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. Keine Dateioperationen,
+ * nur Laufzeitdatenstruktur.
*/
public class LobbyButtonTranslationManager {
/** Maximale Anzahl an Buttons/Lobbys */
private static final int MAX_BUTTONS = 8;
+
/** Zuordnung ButtonID → LobbyID */
private final Map