source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java@ 12745

Last change on this file since 12745 was 12745, checked in by bastiK, 7 years ago

see #15229 - deprecate LatLon#toStringCSV

removes last references of LatLon to CoordinateFormat classes

  • Property svn:eol-style set to native
File size: 8.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trn;
6
7import java.util.Arrays;
8import java.util.List;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.data.conflict.Conflict;
12import org.openstreetmap.josm.data.coor.EastNorth;
13import org.openstreetmap.josm.data.coor.ILatLon;
14import org.openstreetmap.josm.data.coor.conversion.DecimalDegreesCoordinateFormat;
15import org.openstreetmap.josm.data.osm.BBox;
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.data.osm.Relation;
20import org.openstreetmap.josm.data.osm.RelationMember;
21import org.openstreetmap.josm.data.osm.Way;
22import org.openstreetmap.josm.tools.Geometry;
23import org.openstreetmap.josm.tools.Utils;
24import org.openstreetmap.josm.tools.date.DateUtils;
25
26/**
27 * Textual representation of primitive contents, used in {@code InspectPrimitiveDialog}.
28 * @since 10198
29 */
30public class InspectPrimitiveDataText {
31 private static final String INDENT = " ";
32 private static final char NL = '\n';
33
34 private final StringBuilder s = new StringBuilder();
35 private final DataSet ds;
36
37 InspectPrimitiveDataText(DataSet ds) {
38 this.ds = ds;
39 }
40
41 private InspectPrimitiveDataText add(String title, String... values) {
42 s.append(INDENT).append(title);
43 for (String v : values) {
44 s.append(v);
45 }
46 s.append(NL);
47 return this;
48 }
49
50 private static String getNameAndId(String name, long id) {
51 if (name != null) {
52 return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id));
53 } else {
54 return Long.toString(id);
55 }
56 }
57
58 /**
59 * Adds a new OSM primitive.
60 * @param o primitive to add
61 */
62 public void addPrimitive(OsmPrimitive o) {
63
64 addHeadline(o);
65
66 if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) {
67 s.append(NL).append(INDENT).append(tr("not in data set")).append(NL);
68 return;
69 }
70 if (o.isIncomplete()) {
71 s.append(NL).append(INDENT).append(tr("incomplete")).append(NL);
72 return;
73 }
74 s.append(NL);
75
76 addState(o);
77 addCommon(o);
78 addAttributes(o);
79 addSpecial(o);
80 addReferrers(s, o);
81 addConflicts(o);
82 s.append(NL);
83 }
84
85 void addHeadline(OsmPrimitive o) {
86 addType(o);
87 addNameAndId(o);
88 }
89
90 void addType(OsmPrimitive o) {
91 if (o instanceof Node) {
92 s.append(tr("Node: "));
93 } else if (o instanceof Way) {
94 s.append(tr("Way: "));
95 } else if (o instanceof Relation) {
96 s.append(tr("Relation: "));
97 }
98 }
99
100 void addNameAndId(OsmPrimitive o) {
101 String name = o.get("name");
102 if (name == null) {
103 s.append(o.getUniqueId());
104 } else {
105 s.append(getNameAndId(name, o.getUniqueId()));
106 }
107 }
108
109 void addState(OsmPrimitive o) {
110 StringBuilder sb = new StringBuilder(INDENT);
111 /* selected state is left out: not interesting as it is always selected */
112 if (o.isDeleted()) {
113 sb.append(tr("deleted")).append(INDENT);
114 }
115 if (!o.isVisible()) {
116 sb.append(tr("deleted-on-server")).append(INDENT);
117 }
118 if (o.isModified()) {
119 sb.append(tr("modified")).append(INDENT);
120 }
121 if (o.isDisabledAndHidden()) {
122 sb.append(tr("filtered/hidden")).append(INDENT);
123 }
124 if (o.isDisabled()) {
125 sb.append(tr("filtered/disabled")).append(INDENT);
126 }
127 if (o.hasDirectionKeys()) {
128 if (o.reversedDirection()) {
129 sb.append(tr("has direction keys (reversed)")).append(INDENT);
130 } else {
131 sb.append(tr("has direction keys")).append(INDENT);
132 }
133 }
134 String state = sb.toString().trim();
135 if (!state.isEmpty()) {
136 add(tr("State: "), sb.toString().trim());
137 }
138 }
139
140 void addCommon(OsmPrimitive o) {
141 add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
142 add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
143 : DateUtils.fromTimestamp(o.getRawTimestamp()));
144 add(tr("Edited by: "), o.getUser() == null ? tr("<new object>")
145 : getNameAndId(o.getUser().getName(), o.getUser().getId()));
146 add(tr("Version: "), Integer.toString(o.getVersion()));
147 add(tr("In changeset: "), Integer.toString(o.getChangesetId()));
148 }
149
150 void addAttributes(OsmPrimitive o) {
151 if (o.hasKeys()) {
152 add(tr("Tags: "));
153 for (String key : o.keySet()) {
154 s.append(INDENT).append(INDENT);
155 s.append(String.format("\"%s\"=\"%s\"%n", key, o.get(key)));
156 }
157 }
158 }
159
160 void addSpecial(OsmPrimitive o) {
161 if (o instanceof Node) {
162 addCoordinates((Node) o);
163 } else if (o instanceof Way) {
164 addBbox(o);
165 add(tr("Centroid: "),
166 toStringCSV(", ", Main.getProjection().eastNorth2latlon(
167 Geometry.getCentroid(((Way) o).getNodes()))));
168 addWayNodes((Way) o);
169 } else if (o instanceof Relation) {
170 addBbox(o);
171 addRelationMembers((Relation) o);
172 }
173 }
174
175 void addRelationMembers(Relation r) {
176 add(trn("{0} Member: ", "{0} Members: ", r.getMembersCount(), r.getMembersCount()));
177 for (RelationMember m : r.getMembers()) {
178 s.append(INDENT).append(INDENT);
179 addHeadline(m.getMember());
180 s.append(tr(" as \"{0}\"", m.getRole()));
181 s.append(NL);
182 }
183 }
184
185 void addWayNodes(Way w) {
186 add(tr("{0} Nodes: ", w.getNodesCount()));
187 for (Node n : w.getNodes()) {
188 s.append(INDENT).append(INDENT);
189 addNameAndId(n);
190 s.append(NL);
191 }
192 }
193
194 void addBbox(OsmPrimitive o) {
195 BBox bbox = o.getBBox();
196 if (bbox != null) {
197 add(tr("Bounding box: "), bbox.toStringCSV(", "));
198 EastNorth bottomRigth = bbox.getBottomRight().getEastNorth(Main.getProjection());
199 EastNorth topLeft = bbox.getTopLeft().getEastNorth(Main.getProjection());
200 add(tr("Bounding box (projected): "),
201 Double.toString(topLeft.east()), ", ",
202 Double.toString(bottomRigth.north()), ", ",
203 Double.toString(bottomRigth.east()), ", ",
204 Double.toString(topLeft.north()));
205 add(tr("Center of bounding box: "), toStringCSV(", ", bbox.getCenter()));
206 }
207 }
208
209 void addCoordinates(Node n) {
210 if (n.isLatLonKnown()) {
211 add(tr("Coordinates: "),
212 Double.toString(n.lat()), ", ",
213 Double.toString(n.lon()));
214 add(tr("Coordinates (projected): "),
215 Double.toString(n.getEastNorth().east()), ", ",
216 Double.toString(n.getEastNorth().north()));
217 }
218 }
219
220 void addReferrers(StringBuilder s, OsmPrimitive o) {
221 List<OsmPrimitive> refs = o.getReferrers();
222 if (!refs.isEmpty()) {
223 add(tr("Part of: "));
224 for (OsmPrimitive p : refs) {
225 s.append(INDENT).append(INDENT);
226 addHeadline(p);
227 s.append(NL);
228 }
229 }
230 }
231
232 void addConflicts(OsmPrimitive o) {
233 Conflict<?> c = ds.getConflicts().getConflictForMy(o);
234 if (c != null) {
235 add(tr("In conflict with: "));
236 addNameAndId(c.getTheir());
237 }
238 }
239
240 /**
241 * Returns lat/lon coordinate in human-readable format separated by {@code separator}.
242 * @param separator values separator
243 * @param ll the lat/lon
244 * @return String in the format {@code "1.23456[separator]2.34567"}
245 */
246 private static String toStringCSV(String separator, ILatLon ll) {
247 return Utils.join(separator, Arrays.asList(
248 DecimalDegreesCoordinateFormat.INSTANCE.latToString(ll),
249 DecimalDegreesCoordinateFormat.INSTANCE.lonToString(ll)
250 ));
251 }
252
253 @Override
254 public String toString() {
255 return s.toString();
256 }
257}
Note: See TracBrowser for help on using the repository browser.