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 list, Message value, boolean isSelected) { - final JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + public JPanel getListCellComponent(ComponentList 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