package envoy.client.ui; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import envoy.client.data.Chat; import envoy.client.data.LocalDB; import envoy.client.net.Client; import envoy.client.net.WriteProxy; import envoy.data.Message; import envoy.data.MessageBuilder; import envoy.data.User; import envoy.util.EnvoyLog; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; /** * Project: envoy-client
* File: ChatSceneController.java
* Created: 26.03.2020
* * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ public final class ChatSceneController { @FXML private Label contactLabel; @FXML private ListView messageList; @FXML private ListView userList; @FXML private Button postButton; @FXML private Button settingsButton; @FXML private TextArea messageTextArea; private LocalDB localDB; private Client client; private WriteProxy writeProxy; private Chat currentChat; private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class); @FXML private void initialize() { messageList.setCellFactory(listView -> new MessageListCell()); userList.setCellFactory(listView -> new UserListCell()); } void initializeData(LocalDB localDB, Client client, WriteProxy writeProxy) { this.localDB = localDB; this.client = client; this.writeProxy = writeProxy; // TODO: handle offline mode userList.getItems().addAll(client.getContacts().getContacts()); // userList.getItems().addAll(localDB.getChats().stream().map(Chat::getRecipient).collect(Collectors.toList())); } @FXML private void userListClicked() { final User user = userList.getSelectionModel().getSelectedItem(); if (user != null && (currentChat == null || user != currentChat.getRecipient())) { contactLabel.setText(user.getName()); // Swap observable list if (currentChat != null) { currentChat.getMessages().clear(); currentChat.getMessages().addAll(messageList.getItems()); } // LEON: JFC <===> JAVA FRIED CHICKEN <=/=> Java Foundation Classes // Load the chat or create a new one and add it to the LocalDB currentChat = localDB.getChats() .stream() .filter(c -> c.getRecipient() == user) .findAny() .orElseGet(() -> { var chat = new Chat(user); localDB.getChats().add(chat); return chat; }); messageList.setItems(FXCollections.observableArrayList(currentChat.getMessages())); } } @FXML private void postButtonClicked() { postMessage(); } @FXML private void settingsButtonClicked() { logger.info("Settings Button clicked."); } @FXML private void messageTextUpdated(KeyEvent e) { if (e.getCode() == KeyCode.ENTER) postMessage(); else postButton.setDisable(messageTextArea.getText().isBlank()); } /** * Sends a new message to the server based on the text entered in the * messageTextArea. * * @since Envoy Client v0.1-beta */ private void postMessage() { // Create and send message sendMessage(new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB.getIDGenerator()) .setText(messageTextArea.getText().strip()) .build()); // Clear text field and disable post button messageTextArea.setText(""); postButton.setDisable(true); } /** * Sends a message to the server. * * @param message the message to send * @since Envoy Client v0.1-beta */ private void sendMessage(Message message) { try { // Send message writeProxy.writeMessage(message); // Add message to LocalDB and update UI messageList.getItems().add(message); // Request a new ID generator if all IDs were used if (!localDB.getIDGenerator().hasNext()) client.requestIdGenerator(); } catch (IOException e) { logger.log(Level.SEVERE, "Error sending message", e); } } }