Message displaying
Implemented message status icons and revised message displaying (unfinished)
This commit is contained in:
		| @@ -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: <strong>envoy-client</strong> | ||||
| @@ -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 <T extends Enum<T>> EnumMap<T, BufferedImage> loadByEnum(Class<T> enumClass) throws IOException { | ||||
| 		var	icons	= new EnumMap<T, BufferedImage>(enumClass); | ||||
| 	public static <T extends Enum<T>> EnumMap<T, ImageIcon> loadByEnum(Class<T> enumClass, int size) throws IOException { | ||||
| 		var	icons	= new EnumMap<T, ImageIcon>(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; | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -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<Message> { | ||||
|  | ||||
| 	private static final EnumMap<MessageStatus, BufferedImage> statusIcons = new EnumMap<>(MessageStatus.class); | ||||
| 	private static EnumMap<MessageStatus, ImageIcon> 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; | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 DieGurke
					DieGurke