001// License: GPL. See LICENSE file for details.
002package org.openstreetmap.josm.data.validation.util;
003
004import static org.openstreetmap.josm.tools.I18n.trn;
005
006import java.util.Collection;
007
008import javax.swing.Icon;
009import javax.swing.JLabel;
010
011import org.openstreetmap.josm.data.osm.OsmPrimitive;
012import org.openstreetmap.josm.tools.ImageProvider;
013
014/**
015 * Able to create a name and an icon for a collection of elements.
016 *
017 * @author frsantos
018 */
019public class MultipleNameVisitor extends NameVisitor
020{
021    public static final int MULTIPLE_NAME_MAX_LENGTH = 80;
022
023    /** The class name of the combined primitives */
024    private String multipleClassname;
025    /** Name to be displayed */
026    private String displayName;
027    /** Size of the collection */
028    private int size;
029
030    /**
031     * Visits a collection of primitives
032     * @param data The collection of primitives
033     */
034    public void visit(Collection<? extends OsmPrimitive> data) {
035        StringBuilder multipleName = new StringBuilder();
036        String multiplePluralClassname = null;
037        size = data.size();
038
039        multipleClassname = null;
040        for (OsmPrimitive osm : data) {
041            String name = osm.get("name");
042            if (name == null) {
043                name = osm.get("ref");
044            }
045            if (name != null && !name.isEmpty() && multipleName.length() <= MULTIPLE_NAME_MAX_LENGTH) {
046                if (multipleName.length() > 0) {
047                    multipleName.append(", ");
048                }
049                multipleName.append(name);
050            }
051
052            osm.accept(this);
053            if (multipleClassname == null) {
054                multipleClassname = className;
055                multiplePluralClassname = classNamePlural;
056            } else if (!multipleClassname.equals(className)) {
057                multipleClassname = "object";
058                multiplePluralClassname = trn("object", "objects", 2);
059            }
060        }
061
062        if (size <= 1) {
063            displayName = name;
064        } else {
065            displayName = size + " " + trn(multipleClassname, multiplePluralClassname, size);
066            if (multipleName.length() > 0) {
067                if (multipleName.length() <= MULTIPLE_NAME_MAX_LENGTH) {
068                    displayName += ": " + multipleName;
069                } else {
070                    displayName += ": " + multipleName.substring(0, MULTIPLE_NAME_MAX_LENGTH) + "...";
071                }
072            }
073        }
074    }
075
076    @Override
077    public JLabel toLabel() {
078        return new JLabel(getText(), getIcon(), JLabel.HORIZONTAL);
079    }
080
081    /**
082     * Gets the name of the items
083     * @return the name of the items
084     */
085    public String getText() {
086        return displayName;
087    }
088
089    /**
090     * Gets the icon of the items
091     * @return the icon of the items
092     */
093    public Icon getIcon() {
094        if (size <= 1)
095            return icon;
096        else
097            return ImageProvider.get("data", multipleClassname);
098    }
099
100    @Override
101    public String toString() {
102        return getText();
103    }
104}