001 // License: GPL. See LICENSE file for details.
002 package org.openstreetmap.josm.data.validation.util;
003
004 import static org.openstreetmap.josm.tools.I18n.trn;
005
006 import java.util.Collection;
007
008 import javax.swing.Icon;
009 import javax.swing.JLabel;
010
011 import org.openstreetmap.josm.data.osm.OsmPrimitive;
012 import 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 */
019 public 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 String multipleName = "";
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.isEmpty()) {
047 multipleName += ", ";
048 }
049 multipleName += name;
050 }
051
052 osm.visit(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.isEmpty()) {
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 }