Chore/conform ui to checkstyle #184
@@ -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.
|
||||
* <p>
|
||||
* 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 <listenPort>
|
||||
java -jar xyz.jar client <serverIp>:<serverPort>
|
||||
""");
|
||||
Logger logger = LogManager.getLogger(Main.class);
|
||||
logger.fatal(
|
||||
"""
|
||||
Usage:
|
||||
java -jar xyz.jar server <listenPort>
|
||||
java -jar xyz.jar client <serverIp>:<serverPort>
|
||||
""");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,11 +8,9 @@ import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Entry point for the Casono client application. Handles client startup and
|
||||
* connection parameters.
|
||||
* Entry point for the Casono client application. Handles client startup and connection parameters.
|
||||
*
|
||||
* <p>
|
||||
* Standardkonstruktor für die Anwendung.
|
||||
* <p>Standardkonstruktor für die Anwendung.
|
||||
*/
|
||||
public class ClientApp {
|
||||
|
||||
|
||||
+21
-27
@@ -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)
|
||||
* <p>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.
|
||||
* <p>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
|
||||
* <p>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,8 +73,9 @@ 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) {
|
||||
|
||||
+4
-8
@@ -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.
|
||||
* <p>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.
|
||||
* <p>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 {
|
||||
|
||||
|
||||
@@ -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.
|
||||
* <p>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.
|
||||
* <p>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,6 +42,7 @@ public class CasinoGameUI extends Application {
|
||||
|
||||
/**
|
||||
* Startpunkt der Anwendung.
|
||||
*
|
||||
* @param args Befehlszeilenargumente.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
+153
-155
@@ -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.
|
||||
* <p>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.
|
||||
* <p>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
|
||||
* <p>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
|
||||
* <p>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.
|
||||
* <p>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)
|
||||
* <p>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.
|
||||
* <p>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);
|
||||
|
||||
+19
-22
@@ -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.
|
||||
* <p>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.
|
||||
* <p>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).
|
||||
* <p>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,8 +128,8 @@ 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.
|
||||
* <p>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() {
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
|
||||
|
||||
import javafx.scene.layout.GridPane;
|
||||
import org.junit.jupiter.api.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class LobbyButtonGridManagerTest {
|
||||
LobbyButtonGridManager gridManager;
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
|
||||
|
||||
import java.util.Map;
|
||||
import org.junit.jupiter.api.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class LobbyButtonTranslationManagerTest {
|
||||
LobbyButtonTranslationManager manager;
|
||||
|
||||
Reference in New Issue
Block a user