diff --git a/src/main/java/envoy/client/ui/IconUtil.java b/src/main/java/envoy/client/ui/IconUtil.java
index 457a977..47588ab 100644
--- a/src/main/java/envoy/client/ui/IconUtil.java
+++ b/src/main/java/envoy/client/ui/IconUtil.java
@@ -1,11 +1,12 @@
package envoy.client.ui;
-import java.awt.image.BufferedImage;
+import java.awt.Image;
import java.io.IOException;
import java.util.EnumMap;
import java.util.EnumSet;
import javax.imageio.ImageIO;
+import javax.swing.ImageIcon;
/**
* Project: envoy-client
@@ -19,13 +20,15 @@ public class IconUtil {
private IconUtil() {}
- public BufferedImage load(String path) throws IOException { return ImageIO.read(IconUtil.class.getResourceAsStream(path)); }
+ public static ImageIcon load(String path, int size) throws IOException {
+ return new ImageIcon(ImageIO.read(IconUtil.class.getResourceAsStream(path)).getScaledInstance(size, size, Image.SCALE_SMOOTH));
+ }
- public > EnumMap loadByEnum(Class enumClass) throws IOException {
- var icons = new EnumMap(enumClass);
+ public static > EnumMap loadByEnum(Class enumClass, int size) throws IOException {
+ var icons = new EnumMap(enumClass);
var path = "/icons/" + enumClass.getSimpleName().toLowerCase() + "/";
for (var e : EnumSet.allOf(enumClass))
- icons.put(e, load(path + e.toString().toLowerCase() + ".png"));
+ icons.put(e, load(path + e.toString().toLowerCase() + ".png", size));
return icons;
}
}
diff --git a/src/main/java/envoy/client/ui/renderer/MessageListRenderer.java b/src/main/java/envoy/client/ui/renderer/MessageListRenderer.java
index 047f12c..b537c56 100644
--- a/src/main/java/envoy/client/ui/renderer/MessageListRenderer.java
+++ b/src/main/java/envoy/client/ui/renderer/MessageListRenderer.java
@@ -1,16 +1,15 @@
package envoy.client.ui.renderer;
-import java.awt.Font;
-import java.awt.image.BufferedImage;
+import java.awt.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.EnumMap;
-import javax.imageio.ImageIO;
import javax.swing.*;
import envoy.client.data.Settings;
import envoy.client.ui.Color;
+import envoy.client.ui.IconUtil;
import envoy.client.ui.Theme;
import envoy.client.ui.list.ComponentList;
import envoy.client.ui.list.ComponentListCellRenderer;
@@ -31,90 +30,109 @@ import envoy.data.Message.MessageStatus;
*/
public class MessageListRenderer implements ComponentListCellRenderer {
- private static final EnumMap statusIcons = new EnumMap<>(MessageStatus.class);
+ private static EnumMap statusIcons;
static {
- for (MessageStatus ms : MessageStatus.values())
- try {
- statusIcons.put(ms, ImageIO.read(MessageListRenderer.class.getResourceAsStream(ms.toString().toLowerCase() + "_icon.png")));
- } catch (IOException e) {
- e.printStackTrace();
- }
+ try {
+ statusIcons = IconUtil.loadByEnum(MessageStatus.class, 16);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
- private JTextArea messageTextArea;
@Override
- public JPanel getListCellComponent(ComponentList extends Message> list, Message value, boolean isSelected) {
- final JPanel panel = new JPanel();
- panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+ public JPanel getListCellComponent(ComponentList extends Message> list, Message message, boolean isSelected) {
final Theme theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme());
- // Panel background
+ // panel
+ final JPanel panel = new JPanel();
+
+ GridBagLayout gbl_panel = new GridBagLayout();
+ gbl_panel.columnWidths = new int[] { 1, 1 };
+ gbl_panel.rowHeights = new int[] { 1, 1 };
+ gbl_panel.columnWeights = new double[] { 1, 1 };
+ gbl_panel.rowWeights = new double[] { 1, 1 };
+
+ panel.setLayout(gbl_panel);
panel.setBackground(isSelected ? theme.getSelectionColor() : theme.getCellColor());
// TODO: Handle message attachments
- final String state = value.getStatus().toString();
- final String date = new SimpleDateFormat("dd.MM.yyyy HH:mm").format(value.getCreationDate());
- final String text = value.getText();
+ // content variables
+ final String status = message.getStatus().toString();
+ final String date = new SimpleDateFormat("dd.MM.yyyy HH:mm").format(message.getCreationDate());
+ final String text = message.getText();
- // The Label that displays the creation date of a message
- JLabel dateLabel = new JLabel(date);
- // Set the date color to be the value of DateColorChat
+ // date Label - The Label that displays the creation date of a message
+ JLabel dateLabel = new JLabel();
+ dateLabel.setText(date);
dateLabel.setForeground(theme.getDateColor());
+ dateLabel.setAlignmentX(1f);
+ dateLabel.setFont(new Font("Arial", Font.PLAIN, 12));
+ dateLabel.setPreferredSize(dateLabel.getPreferredSize());
- panel.add(dateLabel);
+ GridBagConstraints gbc_dateLabel = new GridBagConstraints();
+ gbc_dateLabel.fill = GridBagConstraints.BOTH;
+ gbc_dateLabel.gridx = 0;
+ gbc_dateLabel.gridy = 0;
+ panel.add(dateLabel, gbc_dateLabel);
- if (value.isForwarded()) try {
+
+ // Message area - The JTextArea that displays the text content of a message.
+ var messageTextArea = new JTextArea(text);
+ messageTextArea.setLineWrap(true);
+ messageTextArea.setWrapStyleWord(true);
+ messageTextArea.setForeground(theme.getMessageTextColor());
+ messageTextArea.setAlignmentX(0.5f);
+ messageTextArea.setBackground(Color.red);
+ messageTextArea.setEditable(false);
+ messageTextArea.setFont(new Font("Arial", Font.PLAIN, 14));
+ // messageTextArea.setPreferredSize(messageTextArea.getPreferredSize());
+
+ GridBagConstraints gbc_messageTextArea = new GridBagConstraints();
+ gbc_messageTextArea.fill = GridBagConstraints.HORIZONTAL;
+ gbc_messageTextArea.gridx = 0;
+ gbc_messageTextArea.gridy = 1;
+ panel.add(messageTextArea, gbc_messageTextArea);
+
+
+ // status Label - displays the status of the message
+ JLabel statusLabel = new JLabel(statusIcons.get(message.getStatus()));
+
+ GridBagConstraints gbc_statusLabel = new GridBagConstraints();
+ gbc_statusLabel.fill = GridBagConstraints.BOTH;
+ gbc_statusLabel.gridx = 1;
+ gbc_statusLabel.gridy = 1;
+ panel.add(statusLabel, gbc_statusLabel);
+
+ // Forwarding
+ if (message.isForwarded()) try {
var forwardLabel = new JLabel("Forwarded", new ImageIcon(ClassLoader.getSystemResourceAsStream(null).readAllBytes()),
SwingConstants.CENTER);
forwardLabel.setBackground(panel.getBackground());
forwardLabel.setForeground(Color.lightGray);
- panel.add(forwardLabel);
+
+ GridBagConstraints gbc_forwardLabel = new GridBagConstraints();
+ gbc_forwardLabel.fill = GridBagConstraints.BOTH;
+ gbc_forwardLabel.gridx = 1;
+ gbc_forwardLabel.gridy = 0;
+ panel.add(forwardLabel, gbc_forwardLabel);
} catch (IOException e) {
e.printStackTrace();
}
- // The JTextArea that displays the text content of a message and its status
- messageTextArea = new JTextArea(text + System.getProperty("line.separator"));
- messageTextArea.setLineWrap(true);
- messageTextArea.setWrapStyleWord(true);
- messageTextArea.setAlignmentX(0.5f);
- messageTextArea.setForeground(theme.getMessageTextColor());
- messageTextArea.setBackground(panel.getBackground());
- messageTextArea.setEditable(false);
-
- panel.add(messageTextArea);
-
- JLabel statusLabel = new JLabel(state);
- statusLabel.setFont(new Font("Arial", Font.BOLD, 14));
- Color statusColor;
- switch (value.getStatus()) {
- case WAITING:
- statusColor = Color.gray;
- break;
- case SENT:
- statusColor = Color.blue;
- break;
- case RECEIVED:
- statusColor = Color.yellow;
- break;
- case READ:
- statusColor = Color.green;
- break;
- default:
- statusColor = theme.getMessageTextColor();
- break;
- }
- statusLabel.setForeground(statusColor);
- statusLabel.setBackground(panel.getBackground());
-
- panel.add(statusLabel);
-
+ int padding = (int) (list.getWidth() * 0.35);
// Define some space to the messages below
- panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(), BorderFactory.createEtchedBorder()));
+ panel.setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createEmptyBorder(0, 0, 0, padding),
+ BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(), BorderFactory.createEtchedBorder())));
+ var size = new Dimension(list.getWidth(), (int) panel.getPreferredSize().getHeight());
+
+ // panel.setPreferredSize(panel.getPreferredSize());
+ panel.setMaximumSize(size);
+ // System.out.println(panel.getMaximumSize());
return panel;
}
}
diff --git a/src/main/resources/icons/messagestatus/read.png b/src/main/resources/icons/messagestatus/read.png
new file mode 100644
index 0000000..d81f23c
Binary files /dev/null and b/src/main/resources/icons/messagestatus/read.png differ
diff --git a/src/main/resources/icons/messagestatus/received.png b/src/main/resources/icons/messagestatus/received.png
new file mode 100644
index 0000000..3da9282
Binary files /dev/null and b/src/main/resources/icons/messagestatus/received.png differ
diff --git a/src/main/resources/icons/messagestatus/sent.png b/src/main/resources/icons/messagestatus/sent.png
new file mode 100644
index 0000000..2ff4cca
Binary files /dev/null and b/src/main/resources/icons/messagestatus/sent.png differ
diff --git a/src/main/resources/icons/messagestatus/waiting.png b/src/main/resources/icons/messagestatus/waiting.png
new file mode 100644
index 0000000..e767b28
Binary files /dev/null and b/src/main/resources/icons/messagestatus/waiting.png differ