001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Component;
007import java.text.DateFormat;
008import java.util.Date;
009
010import javax.swing.ImageIcon;
011import javax.swing.JLabel;
012import javax.swing.JList;
013import javax.swing.ListCellRenderer;
014import javax.swing.UIManager;
015
016import org.openstreetmap.josm.data.osm.Changeset;
017import org.openstreetmap.josm.tools.ImageProvider;
018import org.openstreetmap.josm.tools.Utils;
019import org.openstreetmap.josm.tools.date.DateUtils;
020
021/**
022 * A {@link ListCellRenderer} for the list of changesets in the upload dialog.
023 *
024 * @since 2115
025 */
026public class ChangesetCellRenderer extends JLabel implements ListCellRenderer<Changeset> {
027    private final ImageIcon icon;
028
029    /**
030     * Constructs a new {@code ChangesetCellRenderer}.
031     */
032    public ChangesetCellRenderer() {
033        icon = ImageProvider.get("data", "changeset");
034        setOpaque(true);
035    }
036
037    protected String buildToolTipText(Changeset cs) {
038        StringBuilder sb = new StringBuilder(64);
039        sb.append("<html><strong>").append(tr("Changeset id:")).append("</strong>").append(cs.getId()).append("<br>");
040        Date createdDate = cs.getCreatedAt();
041        if (createdDate != null) {
042            sb.append("<strong>").append(tr("Created at:")).append("</strong>").append(
043                    DateUtils.formatDateTime(createdDate, DateFormat.SHORT, DateFormat.SHORT)).append("<br>");
044        }
045        String comment = cs.getComment();
046        if (!comment.isEmpty()) {
047            sb.append("<strong>").append(tr("Changeset comment:")).append("</strong>")
048              .append(Utils.escapeReservedCharactersHTML(comment)).append("<br>");
049        }
050        return sb.toString();
051    }
052
053    @Override
054    public Component getListCellRendererComponent(JList<? extends Changeset> list, Changeset cs, int index, boolean isSelected,
055            boolean cellHasFocus) {
056        if (isSelected) {
057            setForeground(UIManager.getColor("List.selectionForeground"));
058            setBackground(UIManager.getColor("List.selectionBackground"));
059        } else {
060            setForeground(UIManager.getColor("List.foreground"));
061            setBackground(UIManager.getColor("List.background"));
062        }
063        if (cs != null) {
064            setIcon(icon);
065            StringBuilder sb = new StringBuilder();
066            String comment = cs.getComment();
067            if (!comment.isEmpty()) {
068                sb.append(cs.getId()).append(" - ").append(comment);
069            } else if (cs.get("name") != null) {
070                sb.append(cs.getId()).append(" - ").append(cs.get("name"));
071            } else {
072                sb.append(tr("Changeset {0}", cs.getId()));
073            }
074            setText(sb.toString());
075            setToolTipText(buildToolTipText(cs));
076        } else {
077            setText(tr("No open changesets"));
078        }
079        return this;
080    }
081}