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.time.Instant; 008import java.time.format.FormatStyle; 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 Instant createdDate = cs.getCreatedAt(); 041 if (createdDate != null) { 042 sb.append("<strong>").append(tr("Created at:")).append("</strong>").append( 043 DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(createdDate)).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 if (cs.getId() == 0) { 066 setText("New changeset"); 067 } else { 068 StringBuilder sb = new StringBuilder(); 069 String comment = cs.getComment(); 070 if (!comment.isEmpty()) { 071 sb.append(cs.getId()).append(" - ").append(comment); 072 } else if (cs.get("name") != null) { 073 sb.append(cs.getId()).append(" - ").append(cs.get("name")); 074 } else { 075 sb.append(tr("Changeset {0}", cs.getId())); 076 } 077 setText(sb.toString()); 078 } 079 setToolTipText(buildToolTipText(cs)); 080 } else { 081 setIcon(null); 082 setText(""); 083 } 084 return this; 085 } 086}