// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.util; import static org.openstreetmap.josm.tools.I18n.trn; import java.util.Collection; import java.util.Optional; import javax.swing.Icon; import javax.swing.JLabel; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.tools.ImageProvider; /** * Able to create a name and an icon for a collection of elements. * * @author frsantos */ public class MultipleNameVisitor extends NameVisitor { /** * Maximum displayed length, in characters. */ public static final int MULTIPLE_NAME_MAX_LENGTH = 80; /** The class name of the combined primitives */ private String multipleClassname; /** Name to be displayed */ private String displayName; /** Size of the collection */ private int size; /** * Visits a collection of primitives * @param data The collection of primitives */ public void visit(Collection<? extends OsmPrimitive> data) { StringBuilder multipleName = new StringBuilder(); String multiplePluralClassname = null; size = data.size(); multipleClassname = null; for (OsmPrimitive osm : data) { String name = Optional.ofNullable(osm.get("name")).orElseGet(() -> osm.get("ref")); if (name != null && !name.isEmpty() && multipleName.length() <= MULTIPLE_NAME_MAX_LENGTH) { if (multipleName.length() > 0) { multipleName.append(", "); } multipleName.append(name); } osm.accept(this); if (multipleClassname == null) { multipleClassname = className; multiplePluralClassname = classNamePlural; } else if (!multipleClassname.equals(className)) { multipleClassname = "object"; multiplePluralClassname = trn("object", "objects", 2); } } if (size <= 1) { displayName = name; } else { StringBuilder sb = new StringBuilder().append(size).append(' ').append(trn(multipleClassname, multiplePluralClassname, size)); if (multipleName.length() > 0) { sb.append(": "); if (multipleName.length() <= MULTIPLE_NAME_MAX_LENGTH) { sb.append(multipleName); } else { sb.append(multipleName.substring(0, MULTIPLE_NAME_MAX_LENGTH)).append("..."); } } displayName = sb.toString(); } } @Override public JLabel toLabel() { return new JLabel(getText(), getIcon(), JLabel.HORIZONTAL); } /** * Gets the name of the items * @return the name of the items */ public String getText() { return displayName; } /** * Gets the icon of the items * @return the icon of the items */ public Icon getIcon() { if (size <= 1) return icon; else return ImageProvider.get("data", multipleClassname); } @Override public String toString() { return getText(); } }