From ad2accfced471bdd08bff1ada0edfbb6de2ebcfd Mon Sep 17 00:00:00 2001 From: Mathis Ginkel Date: Sun, 26 Apr 2026 20:25:31 +0200 Subject: [PATCH] Fix: Reopen whisper chat when previously closed --- .../client/ui/chatui/ChatBoxController.java | 45 +++++++++++++++---- .../client/ui/chatui/ChatViewController.java | 28 +++++++++--- 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java index 26aa545..66b087b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.casono.client.ui.chatui; import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatController; +import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatController.ChatKey; import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatModel; import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatType; import ch.unibas.dmi.dbis.cs108.casono.client.chat.Message; @@ -167,9 +168,19 @@ public class ChatBoxController { ChatType whisper = ChatType.WHISPER; chatController .getChatModelMap() - .put(new ChatController.ChatKey(whisper, target), chatModel); - addChatTab(target, chatModel, whisper); + .put(new ChatKey(whisper, target), chatModel); + ChatViewController chatViewController = addChatTab(target, chatModel, whisper); + Tab chatTab = chatViewController.getChatTab(); + chatTab.setOnCloseRequest(_ -> { + chatViewController.tabIsOpen = false; + chatTabPane.getTabs().remove(chatTab); + }); } else { + ChatViewController chatViewController = chatController.activeChatControllers.get(new ChatKey(ChatType.WHISPER, target)); + if (!chatViewController.tabIsOpen) { + reopenChatTab(chatViewController.getChatTab()); + chatViewController.tabIsOpen = true; + } chatTabPane.getSelectionModel().select(usernameTabMap.get(target)); } } @@ -183,18 +194,25 @@ public class ChatBoxController { * @param chatModel The {@link ChatModel} containing the data and logic for this specific chat. * @throws RuntimeException If the FXML resource for the chat tab cannot be loaded. */ - public void addChatTab(String title, ChatModel chatModel, ChatType chatType) { + public ChatViewController addChatTab(String title, ChatModel chatModel, ChatType chatType) { String ressource = "/ui-structure/components/chatui/chattab.fxml"; URL resource = getClass().getResource(ressource); FXMLLoader fxmlLoader = new FXMLLoader(resource); - runOnPlatformSynchronized( + return runOnPlatformSynchronized( () -> { try { ChatViewController chatViewController = new ChatViewController( - this.chatController, chatModel, this.username); + this.chatController, chatModel, this.username, this); + + ChatKey chatKey; + if (chatType.equals(ChatType.WHISPER)) { + chatKey = new ChatKey(chatType, title); + } else { + chatKey = new ChatKey(chatType); + } chatController.activeChatControllers.put( - new ChatController.ChatKey(chatType), chatViewController); + chatKey, chatViewController); fxmlLoader.setController(chatViewController); Node load = fxmlLoader.load(); VBox.setVgrow(load, Priority.ALWAYS); @@ -204,9 +222,13 @@ public class ChatBoxController { chatModel.addListener((msg) -> chatViewController.showMessage(msg)); Tab newChat = new Tab(title, vbox); usernameTabMap.put(title, newChat); - this.chatTabPane.getTabs().add(newChat); + chatTabPane.getTabs().add(newChat); this.chatTabPane.getSelectionModel().select(newChat); - return newChat; + chatViewController.setChatTab(newChat); + if (!chatType.equals(ChatType.WHISPER)) { + newChat.setClosable(false); + } + return chatViewController; } catch (IOException e) { throw new RuntimeException(e); } @@ -267,4 +289,11 @@ public class ChatBoxController { } } } + + public void reopenChatTab(Tab chatTab) { + Platform.runLater(() -> { + chatTabPane.getTabs().add(chatTab); + chatTabPane.getSelectionModel().select(chatTab); + }); + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatViewController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatViewController.java index 2bad460..2a1ec5f 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatViewController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatViewController.java @@ -2,22 +2,22 @@ package ch.unibas.dmi.dbis.cs108.casono.client.ui.chatui; import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatController; import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatModel; +import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatType; import ch.unibas.dmi.dbis.cs108.casono.client.chat.Message; import java.net.URL; +import java.util.Map; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.Initializable; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; /** Responsible for the presentation of the ChatModel to the Client */ public class ChatViewController implements Initializable { + private final ChatBoxController chatBoxController; @FXML private Button sendButton; @FXML private TextField inputField; @@ -30,6 +30,18 @@ public class ChatViewController implements Initializable { @FXML private VBox chat; + public Tab getChatTab() { + return chatTab; + } + + public void setChatTab(Tab chatTab) { + this.chatTab = chatTab; + } + + @FXML private Tab chatTab; + + public Boolean tabIsOpen; + private final ChatModel chatModel; private final String username; @@ -38,10 +50,12 @@ public class ChatViewController implements Initializable { private static final int CHAT_PADDING = 20; - public ChatViewController(ChatController chatController, ChatModel chatModel, String username) { + public ChatViewController(ChatController chatController, ChatModel chatModel, String username, ChatBoxController chatBoxController) { this.controller = chatController; this.username = username; this.chatModel = chatModel; + this.chatBoxController = chatBoxController; + tabIsOpen = true; } /** @@ -88,6 +102,10 @@ public class ChatViewController implements Initializable { * @param msg The {@link Message} object containing the content and metadata to display. */ public void showMessage(Message msg) { + if (!tabIsOpen) { + tabIsOpen = true; + chatBoxController.reopenChatTab(chatTab); + } Platform.runLater( () -> { String msgText =