package com.gpl.rpg.atcontentstudio.ui; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.Notification; import com.gpl.rpg.atcontentstudio.NotificationListener; import javax.swing.*; import javax.swing.event.ListDataListener; import java.awt.*; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; @SuppressWarnings("rawtypes") public class NotificationsPane extends JList { private static final long serialVersionUID = -1100364214372392608L; public static final Map icons = new LinkedHashMap(Notification.Type.values().length); static { icons.put(Notification.Type.SUCCESS, new ImageIcon(DefaultIcons.getStatusGreenIcon())); icons.put(Notification.Type.INFO, new ImageIcon(DefaultIcons.getStatusBlueIcon())); icons.put(Notification.Type.WARN, new ImageIcon(DefaultIcons.getStatusOrangeIcon())); icons.put(Notification.Type.ERROR, new ImageIcon(DefaultIcons.getStatusRedIcon())); } @SuppressWarnings("unchecked") public NotificationsPane() { super(); MyListModel model = new MyListModel(); setModel(model); setCellRenderer(new ListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = new JLabel(); Font f = label.getFont(); label.setIcon(NotificationsPane.icons.get(((Notification) value).type)); label.setText(((Notification) value).text); if (isSelected) { // label.setBackground(Color.RED); label.setBorder(BorderFactory.createLineBorder(Color.BLUE)); // label.setForeground(Color.WHITE); } f = f.deriveFont(10f * ATContentStudio.SCALING); label.setFont(f); return label; } }); Notification.addNotificationListener(model); } private class MyListModel implements ListenerListModel, NotificationListener { @Override public Notification getElementAt(int index) { return Notification.notifs.get(index); } @Override public List getListeners() { return listeners; } @Override public int getSize() { return Notification.notifs.size(); } @Override public void onNewNotification(Notification n) { notifyListeners(NotificationsPane.this, ChangeType.ADDED, Notification.notifs.size() - 1, Notification.notifs.size() - 1); NotificationsPane.this.ensureIndexIsVisible(Notification.notifs.indexOf(n)); } @Override public void onListCleared(int i) { notifyListeners(NotificationsPane.this, ChangeType.REMOVED, 0, i); } private List listeners = new CopyOnWriteArrayList(); } }