From d9870f9b22b40cfab253e339efe459aa80f96f13 Mon Sep 17 00:00:00 2001 From: delvh Date: Tue, 5 Nov 2019 13:30:23 +0100 Subject: [PATCH] Added KeyListeners for sending the message and an automatic line break --- src/main/java/envoy/client/ui/ChatWindow.java | 140 ++++++++---------- .../java/envoy/client/ui/SettingsScreen.java | 8 +- 2 files changed, 62 insertions(+), 86 deletions(-) diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java index f6625b5..90bb87d 100644 --- a/src/main/java/envoy/client/ui/ChatWindow.java +++ b/src/main/java/envoy/client/ui/ChatWindow.java @@ -6,8 +6,7 @@ import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; -import java.awt.event.InputMethodEvent; -import java.awt.event.InputMethodListener; +import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -56,7 +55,7 @@ public class ChatWindow extends JFrame { private JList userList = new JList<>(); private Chat currentChat; - private String messageText; + private JTextArea messageEnterTextArea; public ChatWindow(Client client, LocalDB localDB) { this.client = client; @@ -118,38 +117,29 @@ public class ChatWindow extends JFrame { contentPane.add(scrollPane, gbc_scrollPane); // Message enter field - JTextArea messageEnterTextfield = new JTextArea(); - // checks for changed Message - messageEnterTextfield.addInputMethodListener(new InputMethodListener() { + messageEnterTextArea = new JTextArea(); + messageEnterTextArea.addKeyListener(new KeyAdapter() { - public void caretPositionChanged(InputMethodEvent arg0) {} + @Override + public void keyReleased(KeyEvent e) { + + if (e.getKeyCode() == KeyEvent.VK_ENTER && ((SettingsScreen.enterToSend && e.getModifiersEx() == 0) + || (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK))) { + postMessage(client, messageList); - public void inputMethodTextChanged(InputMethodEvent arg0) { - String message = messageEnterTextfield.getText(); - int messageSize = message.length(); - int lineSize = 45; - String[] tempString = message.split(System.getProperty("line.separator")); - int currentLineAmount = tempString.length; - int wantedLineAmount = Math.floorDiv(messageSize, lineSize); - if (currentLineAmount != wantedLineAmount) { - if (Math.abs(messageText.length() - messageSize) == 1 - && currentLineAmount == wantedLineAmount - 1) {// Check for "normal" Keystroke/Backspace - messageEnterTextfield.setText(transformLastSpace(message, wantedLineAmount, lineSize)); - } - } else {// That's the case if a group of chars was a)inserted or b)deleted - // TODO } - messageText = message; - } + } }); - messageEnterTextfield.setCaretColor(new Color(255, 255, 255)); - messageEnterTextfield.setForeground(new Color(255, 255, 255)); - messageEnterTextfield.setBackground(new Color(51, 51, 51)); - messageEnterTextfield.setLineWrap(true); - messageEnterTextfield.setBorder(null); - messageEnterTextfield.setFont(new Font("Arial", Font.PLAIN, 17)); - messageEnterTextfield.setBorder(new EmptyBorder(5, 5, 5, 5)); + // checks for changed Message + messageEnterTextArea.setWrapStyleWord(true); + messageEnterTextArea.setCaretColor(new Color(255, 255, 255)); + messageEnterTextArea.setForeground(new Color(255, 255, 255)); + messageEnterTextArea.setBackground(new Color(51, 51, 51)); + messageEnterTextArea.setLineWrap(true); + messageEnterTextArea.setBorder(null); + messageEnterTextArea.setFont(new Font("Arial", Font.PLAIN, 17)); + messageEnterTextArea.setBorder(new EmptyBorder(5, 5, 5, 5)); GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints(); gbc_messageEnterTextfield.fill = GridBagConstraints.BOTH; @@ -158,13 +148,10 @@ public class ChatWindow extends JFrame { gbc_messageEnterTextfield.insets = new Insets(10, 10, 10, 10); - contentPane.add(messageEnterTextfield, gbc_messageEnterTextfield); + contentPane.add(messageEnterTextArea, gbc_messageEnterTextfield); // Post Button JButton postButton = new JButton("Post"); - if (SettingsScreen.isEnterToSend() == true) { postButton.setMnemonic(KeyEvent.VK_ENTER); } - // TODO: Other option to send only on "ctrl"+"enter" needs to be implemented. - // TODO: Difficult. Also above statement doesn't work! postButton.setForeground(new Color(255, 255, 255)); postButton.setBackground(new Color(102, 51, 153)); postButton.setBorderPainted(false); @@ -177,36 +164,7 @@ public class ChatWindow extends JFrame { gbc_moveSelectionPostButton.insets = new Insets(10, 10, 10, 10); - postButton.addActionListener((evt) -> { - if (!client.hasRecipient()) { - JOptionPane.showMessageDialog(this, - "Please select a recipient!", - "Cannot send message", - JOptionPane.INFORMATION_MESSAGE); - return; - } - - if (!messageEnterTextfield.getText().isEmpty()) try { - - // Create and send message object - final Message message = client.createMessage(messageEnterTextfield.getText()); - client.sendMessage(message); - - // Append message object to chat - currentChat.appendMessage(message); - messageList.setModel(currentChat.getModel()); - - // Clear text field - messageEnterTextfield.setText(""); - contentPane.revalidate(); - } catch (Exception e) { - JOptionPane.showMessageDialog(this, - "An exception occured while sending a message. See the log for more details.", - "Exception occured", - JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); - } - }); + postButton.addActionListener((evt) -> { postMessage(client, messageList); }); contentPane.add(postButton, gbc_moveSelectionPostButton); @@ -229,7 +187,7 @@ public class ChatWindow extends JFrame { SettingsScreen.open(localDB.getUser().getName()); } catch (Exception e) { SettingsScreen.open(); - System.err.println("An Error occured while opening the Settings screen"); + System.err.println("An Error occured while opening the Settings screen: " + e); e.printStackTrace(); } }); @@ -243,10 +201,9 @@ public class ChatWindow extends JFrame { textPane.setFont(new Font("Arial", Font.PLAIN, 20)); GridBagConstraints gbc_partnerName = new GridBagConstraints(); - gbc_partnerName.fill = GridBagConstraints.HORIZONTAL; - gbc_partnerName.gridwidth = 2; - gbc_partnerName.gridx = 1; - gbc_partnerName.gridy = 0; + gbc_partnerName.fill = GridBagConstraints.HORIZONTAL; + gbc_partnerName.gridx = 1; + gbc_partnerName.gridy = 0; gbc_partnerName.insets = new Insets(0, 10, 0, 10); contentPane.add(textPane, gbc_partnerName); @@ -298,22 +255,41 @@ public class ChatWindow extends JFrame { } /** - * takes care of too long or not needed lines in the message. + * Posts a {@link Message}. Is used only twice: Once for clicking on the {@code postButton}
+ * and once for pressing the KeyStroke(s) to send a message ( (ctrl+)enter) * - * @param message the message that is currently written in the textfield - * @param wantedLine the line at which we currently are positioned - * @param lineSize the amount of chars per line - * @return the transformed message + * @param client the client who wants to send a {@link Message} + * @param messageList the chat in which this {@link Message} belongs * @since Envoy v0.1-alpha */ - private String transformLastSpace(String message, int wantedLine, int lineSize) { - int index = wantedLine * lineSize; - int lastSpace = message.lastIndexOf(" ", index); - if (index - lastSpace > lineSize) {// Fall Wort länger als Zeile - return message.substring(0, index) + System.getProperty("line.separator") + message.substring(index); - } else { - return message.substring(0, lastSpace - 1) + System.getProperty("line.separator") - + message.substring(lastSpace + 1); + private void postMessage(Client client, JList messageList) { + if (!client.hasRecipient()) { + JOptionPane.showMessageDialog(this, + "Please select a recipient!", + "Cannot send message", + JOptionPane.INFORMATION_MESSAGE); + return; + } + + if (!messageEnterTextArea.getText().isEmpty()) try { + + // Create and send message object + final Message message = client.createMessage(messageEnterTextArea.getText()); + client.sendMessage(message); + + // Append message object to chat + currentChat.appendMessage(message); + messageList.setModel(currentChat.getModel()); + + // Clear text field + messageEnterTextArea.setText(""); + contentPane.revalidate(); + } catch (Exception e) { + JOptionPane.showMessageDialog(this, + "An exception occured while sending a message. See the log for more details.", + "Exception occured", + JOptionPane.ERROR_MESSAGE); + e.printStackTrace(); } } diff --git a/src/main/java/envoy/client/ui/SettingsScreen.java b/src/main/java/envoy/client/ui/SettingsScreen.java index 7a4edab..8761160 100644 --- a/src/main/java/envoy/client/ui/SettingsScreen.java +++ b/src/main/java/envoy/client/ui/SettingsScreen.java @@ -20,7 +20,7 @@ public class SettingsScreen extends JDialog { private static final long serialVersionUID = -4476913491263077107L; private final JPanel contentPanel = new JPanel(); - public static boolean EnterToSend = true; + public static boolean enterToSend = true; // TODO: Add a JPanel with all the Information necessary: // change (Picture,Username, Email, Password) and toggle(light/dark mode, @@ -139,10 +139,10 @@ public class SettingsScreen extends JDialog { } /** - * @return true if Enter should be used to send a message + * @return true if Enter should be used to send a message instead of ctrl+enter * @since Envoy v0.1-alpha */ - public static boolean isEnterToSend() { return EnterToSend; } + public static boolean isEnterToSend() { return enterToSend; } /** * @param enterToSend
@@ -151,6 +151,6 @@ public class SettingsScreen extends JDialog { * buttonpress "enter" or "ctrl"+"enter" * @since Envoy v0.1-alpha */ - public static void setEnterToSend(boolean enterToSend) { EnterToSend = enterToSend; } + public static void setEnterToSend(boolean enterForSend) { enterToSend = enterForSend; } // TODO: Should be changed to private, but later to avoid warnings }