001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.changeset;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Component;
007
008import javax.swing.JLabel;
009import javax.swing.JList;
010import javax.swing.ListCellRenderer;
011import javax.swing.UIManager;
012
013import org.openstreetmap.josm.data.osm.Changeset;
014import org.openstreetmap.josm.tools.ImageProvider;
015
016/**
017 * This class renders the cells in a {@link ChangesetListModel}.
018 */
019public class ChangesetListCellRenderer extends JLabel implements ListCellRenderer<Changeset> {
020
021    /**
022     * Constructs a new {@code ChangesetListCellRenderer}.
023     */
024    public ChangesetListCellRenderer() {
025        setOpaque(true);
026        setIcon(ImageProvider.get("data", "changeset"));
027    }
028
029    protected void renderColors(boolean selected) {
030        if (selected) {
031            setForeground(UIManager.getColor("List.selectionForeground"));
032            setBackground(UIManager.getColor("List.selectionBackground"));
033        } else {
034            setForeground(UIManager.getColor("List.foreground"));
035            setBackground(UIManager.getColor("List.background"));
036        }
037    }
038
039    protected void renderLabel(Changeset cs) {
040        StringBuilder sb = new StringBuilder();
041        if (cs.isIncomplete()) {
042            sb.append(tr("{0} [incomplete]", cs.getId()));
043        } else {
044            String comment = cs.getComment();
045            sb.append(cs.getId())
046              .append(" - ")
047              .append(cs.isOpen() ? tr("open") : tr("closed"));
048            if (!comment.isEmpty()) {
049                sb.append(" - '").append(comment).append('\'');
050            }
051        }
052        setText(sb.toString());
053    }
054
055    @Override
056    public Component getListCellRendererComponent(JList<? extends Changeset> list, Changeset cs, int index, boolean isSelected,
057            boolean cellHasFocus) {
058        renderColors(isSelected);
059        renderLabel(cs);
060        return this;
061    }
062}