diff --git a/src/main/java/envoy/client/ui/controller/ChatScene.java b/src/main/java/envoy/client/ui/controller/ChatScene.java index 2cf116b..09cbdfd 100644 --- a/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -2,7 +2,9 @@ package envoy.client.ui.controller; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; +import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -16,6 +18,7 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.paint.Color; +import javafx.stage.FileChooser; import envoy.client.data.*; import envoy.client.data.audio.AudioRecorder; @@ -60,6 +63,9 @@ public final class ChatScene implements Restorable { @FXML private Button voiceButton; + @FXML + private Button attachmentButton; + @FXML private Button settingsButton; @@ -234,6 +240,7 @@ public final class ChatScene implements Restorable { } messageTextArea.setDisable(currentChat == null || postingPermanentlyDisabled); voiceButton.setDisable(!recorder.isSupported()); + attachmentButton.setDisable(false); } /** @@ -287,6 +294,48 @@ public final class ChatScene implements Restorable { }).start(); } + @FXML + private void attachmentButtonClicked() { + + // Display file chooser + final var fileChooser = new FileChooser(); + fileChooser.setTitle("Add Attachment"); + fileChooser.setInitialDirectory(new File(System.getProperty("user.home"))); + fileChooser.getExtensionFilters() + .addAll(new FileChooser.ExtensionFilter("Pictures", "*.png", "*.jpg"), + new FileChooser.ExtensionFilter("Videos", "*.mp4"), + new FileChooser.ExtensionFilter("All Files", "*.*")); + final var file = fileChooser.showOpenDialog(sceneContext.getStage()); + + if(file != null) { + + // Check max file size + if (file.length() > 16E6) { + new Alert(AlertType.WARNING, "The selected file exceeds the size limit of 16MB!").showAndWait(); + return; + } + + // Get attachment type (default is document) + AttachmentType type = AttachmentType.DOCUMENT; + switch (fileChooser.getSelectedExtensionFilter().getDescription()) { + case "Pictures": + type = AttachmentType.PICTURE; + break; + case "Videos": + type = AttachmentType.VIDEO; + break; + } + + // Create the pending attachment + try { + pendingAttachment = new Attachment(Files.readAllBytes(file.toPath()), type); + attachmentView.setVisible(true); + } catch (IOException e) { + new Alert(AlertType.ERROR, "The selected file could not be loaded!").showAndWait(); + } + } + } + /** * Checks the text length of the {@code messageTextArea}, adjusts the * {@code remainingChars} label and checks whether to send the message @@ -373,16 +422,18 @@ public final class ChatScene implements Restorable { final var text = messageTextArea.getText().strip(); try { // Creating the message and its metadata - final var builder = new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB.getIDGenerator()) + final var builder = new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB + .getIDGenerator()) .setText(text); - // Setting an attachment, if present - if (pendingAttachment != null) { + // Setting an attachment, if present + if (pendingAttachment != null) { builder.setAttachment(pendingAttachment); pendingAttachment = null; attachmentView.setVisible(false); } - // Building the final message - final var message = currentChat.getRecipient() instanceof Group ? builder.buildGroupMessage((Group) currentChat.getRecipient()) + // Building the final message + final var message = currentChat.getRecipient() instanceof Group ? builder.buildGroupMessage((Group) currentChat + .getRecipient()) : builder.build(); // Send message @@ -429,7 +480,7 @@ public final class ChatScene implements Restorable { } // Context menu actions - + @FXML private void deleteContact() { try {} catch (final NullPointerException e) {} } diff --git a/src/main/java/envoy/client/ui/listcell/MessageControl.java b/src/main/java/envoy/client/ui/listcell/MessageControl.java index 55be558..03cb937 100644 --- a/src/main/java/envoy/client/ui/listcell/MessageControl.java +++ b/src/main/java/envoy/client/ui/listcell/MessageControl.java @@ -2,6 +2,7 @@ package envoy.client.ui.listcell; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; +import java.io.ByteArrayInputStream; import java.time.format.DateTimeFormatter; import java.util.Map; import java.util.logging.Level; @@ -67,6 +68,7 @@ public class MessageControl extends Label { if (message.hasAttachment()) { switch (message.getAttachment().getType()) { case PICTURE: + vbox.getChildren().add(new ImageView(new Image(new ByteArrayInputStream(message.getAttachment().getData())))); break; case VIDEO: break; diff --git a/src/main/resources/fxml/ChatScene.fxml b/src/main/resources/fxml/ChatScene.fxml index 4a6ac3a..21ded83 100644 --- a/src/main/resources/fxml/ChatScene.fxml +++ b/src/main/resources/fxml/ChatScene.fxml @@ -100,6 +100,9 @@ +