diff --git a/pom.xml b/pom.xml
index 9457940..893f8e6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,13 +17,20 @@
4.13.2
test
-
-
- org.junit.jupiter
- junit-jupiter-api
- 5.10.2
- test
-
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.10.2
+ test
+
+
+
+ com.vdurmont
+ emoji-java
+ 5.1.1
+
+
+
diff --git a/src/main/java/ChatClient.java b/src/main/java/ChatClient.java
index 7621057..b5eaa97 100644
--- a/src/main/java/ChatClient.java
+++ b/src/main/java/ChatClient.java
@@ -77,6 +77,10 @@ public class ChatClient extends JFrame implements KeyListener {
private Timer timer;
private JLabel timeLabel;
+ // Emoji
+ private JButton emojiButton;
+ private EmojiPicker emojiPicker;
+
public ChatClient() {
super("Chat");
address = JOptionPane.showInputDialog("bitte IP-Adresse");
@@ -106,9 +110,39 @@ public class ChatClient extends JFrame implements KeyListener {
prepareOutputTextArea();
createInputTextField();
showCurrentTime();
+ outputTextArea = new JTextArea();
+ outputTextArea.setEditable(false);
+ outputTextArea.setBorder(BorderFactory.createTitledBorder("Chat"));
+ outputTextArea.setBackground(Color.lightGray);
+
+ outputScrollPane = new JScrollPane(outputTextArea);
+
+ timeLabel = new JLabel();
+ updateTime();
+ add(timeLabel, BorderLayout.NORTH);
+ inputTextField = new JTextField();
+ inputTextField.setBorder(BorderFactory.createTitledBorder("Nachricht eingeben"));
+ inputTextField.addKeyListener(this);
+
+ // Create a panel to hold input text field and emoji picker
+ JPanel inputPanel = new JPanel(new BorderLayout());
+ inputPanel.add(inputTextField, BorderLayout.CENTER); // Add input text field to the center of the panel
+
+ // Initialize EmojiPicker and add it to the input text field
+ emojiPicker = new EmojiPicker(inputTextField);
+
+ // Create a panel to hold emoji button
+ JPanel emojiPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ emojiButton = new JButton("😀"); // Create emoji button with a smiley face
+ emojiButton.setPreferredSize(new Dimension(50, 50));// Set preferred size for the emoji button
+ emojiButton.addActionListener(e -> showEmojiPicker());// Add action listener to show emoji picker when button is clicked
+ emojiPanel.add(emojiButton); // Add emoji button to panel
+ inputPanel.add(emojiPanel, BorderLayout.LINE_END);// Add emoji panel to the right side of the input panel
+
+
add(outputScrollPane, BorderLayout.CENTER);
- add(inputTextField, BorderLayout.SOUTH);
+ add(inputTextField, BorderLayout.PAGE_END);
add(timeLabel, BorderLayout.NORTH);
setVisible(true);
@@ -137,6 +171,17 @@ public class ChatClient extends JFrame implements KeyListener {
updateTime();
}
+
+ private void showEmojiPicker() {
+ // Create a dialog to display the emoji picker
+ JDialog emojiDialog = new JDialog(this, "Emoji Picker", true); // Create a modal dialog with a title "Emoji Picker"
+ emojiDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Set close operation to dispose the dialog when closed
+ emojiDialog.getContentPane().add(emojiPicker); // Add the emoji picker component to the content pane of the dialog
+ emojiDialog.pack(); // Pack the dialog to fit the preferred size of its components
+ emojiDialog.setLocationRelativeTo(this);// Set the location of the dialog relative to the parent frame
+ emojiDialog.setVisible(true); // Make the dialog visible
+ }
+
private void receiveMessages() {
try {
connectionToServer = new Socket(address, Constants.PORT);
diff --git a/src/main/java/EmojiPicker.java b/src/main/java/EmojiPicker.java
new file mode 100644
index 0000000..dc991e1
--- /dev/null
+++ b/src/main/java/EmojiPicker.java
@@ -0,0 +1,67 @@
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * A panel containing a selection of emoji buttons to be used in conjunction with a JTextField.
+ */
+
+public class EmojiPicker extends JPanel {
+
+ private JTextField textField; // Text field to append selected emoji
+
+ // Array containing a selection of emojis
+ private static final String[] emojis = {"😀", "😃", "😄", "😁", "😆", "😅",
+ "😂", "🤣", "😊", "😇", "🙂", "🙃"};
+
+ /**
+ * Constructs an EmojiPicker with a specified JTextField.
+ * @param textField The JTextField to append selected emojis.
+ */
+ public EmojiPicker(JTextField textField) {
+ setLayout(new GridLayout(4, 3, 5, 5)); // Set grid layout for the emoji buttons
+
+ // Create and add buttons for each emoji
+ for (String emoji : emojis) {
+ JButton emojiButton = new JButton(emoji);
+ emojiButton.setFont(new Font("Segoe UI Emoji", Font.PLAIN, 20)); // Set font for emoji buttons
+ emojiButton.addActionListener(new EmojiActionListener(emoji)); // Add action listener to each button
+ add(emojiButton); // Add emoji button to the panel
+ }
+
+ setPreferredSize(new Dimension(300, 200)); // Set preferred size for the EmojiPicker panel
+ }
+
+ /**
+ * ActionListener for handling emoji button clicks.
+ */
+ class EmojiActionListener implements ActionListener {
+
+ private String emoji; // Selected emoji
+
+ /**
+ * Constructs an EmojiActionListener with the specified emoji.
+ * @param emoji The emoji associated with this listener.
+ */
+
+ public EmojiActionListener(String emoji) {
+ this.emoji = emoji;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ System.out.println("Selected emoji: " + emoji); // Print selected emoji to console
+ System.out.println("textField: " + textField); // Print the value of textField
+ textField.setText(textField.getText() + emoji); // Append selected emoji to text field
+ }
+ }
+}
+
+
+
+
+
+
+
+
diff --git a/src/test/java/TestClientHandlerConstructor.java b/src/test/java/TestClientHandlerConstructor.java
new file mode 100644
index 0000000..773b39f
--- /dev/null
+++ b/src/test/java/TestClientHandlerConstructor.java
@@ -0,0 +1,30 @@
+import static org.junit.Assert.*;
+import org.junit.Test;
+import java.io.*;
+import java.net.*;
+
+public class TestClientHandlerConstructor {
+
+ @Test
+ public void testConstructor() {
+ // Create a mock Socket
+ Socket mockSocket = new Socket();
+
+ // Create a ChatServer instance
+ int port = 12345; // Use any available port for testing
+ ChatServer mockChatServer = new ChatServer(port);
+
+ // Create a ClientHandler instance using the constructor
+ ClientHandler clientHandler = new ClientHandler(mockChatServer, mockSocket);
+
+ // Wait for a short time to allow the ClientHandler to be added to the ChatServer's list of clients
+ try {
+ Thread.sleep(1000); // Adjust the sleep duration as needed
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ // Assert that the clientHandler was added to the list of clients in the ChatServer
+ assertTrue(mockChatServer.getClients().contains(clientHandler));
+ }
+}
diff --git a/src/test/java/TestEmojiPicker.java b/src/test/java/TestEmojiPicker.java
new file mode 100644
index 0000000..1279081
--- /dev/null
+++ b/src/test/java/TestEmojiPicker.java
@@ -0,0 +1,93 @@
+import org.junit.jupiter.api.Test;
+import javax.swing.*;
+import java.awt.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestEmojiPicker {
+
+ //Test to ensure the EmojiPicker constructor initializes without errors
+ @Test
+ public void testEmojiPickerConstructor() {
+ // Arrange
+ JTextField textField = new JTextField();
+
+ // Act
+ EmojiPicker emojiPicker = new EmojiPicker(textField);
+
+ // Assert
+ assertNotNull(emojiPicker);
+
+ }
+ //Test to verify the correct number of emoji buttons in the EmojiPicker
+ @Test
+ public void testEmojiPickerButtonCount() {
+ // Arrange
+ JTextField textField = new JTextField();
+ EmojiPicker emojiPicker = new EmojiPicker(textField);
+
+ // Act
+ Component[] components = emojiPicker.getComponents();
+
+ // Assert
+ assertEquals(12, components.length); // 12 buttons for 12 emojis
+ }
+
+ //Test to check if each emoji button contains valid emoji text
+ @Test
+ public void testEmojiPickerButtonText() {
+ // Arrange
+ JTextField textField = new JTextField();
+ EmojiPicker emojiPicker = new EmojiPicker(textField);
+
+ // Act
+ Component[] components = emojiPicker.getComponents();
+
+ // Assert
+ for (Component component : components) {
+ assertTrue(component instanceof JButton);
+ JButton button = (JButton) component;
+ assertTrue(button.getText().matches("[\uD83C-\uDBFF\uDC00-\uDFFF]+")); // Check if button text is an emoji
+ }
+ }
+
+ // Test to ensure each emoji button has an EmojiActionListener attached
+ @Test
+ public void testEmojiPickerActionListener() {
+ // Arrange
+ JTextField textField = new JTextField();
+ EmojiPicker emojiPicker = new EmojiPicker(textField);
+
+ // Act
+ Component[] components = emojiPicker.getComponents();
+
+ // Assert
+ for (Component component : components) {
+ assertTrue(component instanceof JButton);
+ JButton button = (JButton) component;
+ assertNotNull(button.getActionListeners());
+ assertEquals(1, button.getActionListeners().length);
+ assertTrue(button.getActionListeners()[0] instanceof EmojiPicker.EmojiActionListener);
+ }
+ }
+
+//Test to verify the functionality of EmojiActionListener for each emoji button
+ @Test
+ public void testEmojiPickerActionListenerFunctionality() {
+ // Arrange
+ JTextField textField = new JTextField(); // Initialize JTextField
+ EmojiPicker emojiPicker = new EmojiPicker(textField); // Pass the initialized JTextField to the EmojiPicker constructor
+ Component[] components = emojiPicker.getComponents();
+
+ // Act & Assert
+ for (Component component : components) {
+ assertTrue(component instanceof JButton);
+ JButton button = (JButton) component;
+ EmojiPicker.EmojiActionListener actionListener = (EmojiPicker.EmojiActionListener) button.getActionListeners()[0];
+ assertNotNull(actionListener);
+ actionListener.actionPerformed(null);
+ String expectedText = textField.getText() + button.getText(); // Expected text after appending emoji
+ assertEquals(expectedText, textField.getText(), "Failed for emoji: " + button.getText()); // Check if emoji is appended to the text field
+ }
+ }
+}