Changeset 4410 in josm for trunk/src/org
- Timestamp:
- 2011-09-08T17:00:04+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
r4357 r4410 24 24 import org.openstreetmap.josm.Main; 25 25 import org.openstreetmap.josm.data.conflict.Conflict; 26 import org.openstreetmap.josm.data.conflict.ConflictCollection;27 import org.openstreetmap.josm.data.osm.DataSet;28 26 import org.openstreetmap.josm.data.osm.Node; 29 27 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 31 29 import org.openstreetmap.josm.data.osm.Relation; 32 30 import org.openstreetmap.josm.data.osm.RelationMember; 33 import org.openstreetmap.josm.data.osm.User;34 31 import org.openstreetmap.josm.data.osm.Way; 35 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;36 32 import org.openstreetmap.josm.gui.DefaultNameFormatter; 37 33 import org.openstreetmap.josm.gui.ExtendedDialog; … … 50 46 import org.openstreetmap.josm.tools.DateUtils; 51 47 import org.openstreetmap.josm.tools.GBC; 52 import org.openstreetmap.josm.tools.SubclassFilteredCollection;53 48 import org.openstreetmap.josm.tools.WindowGeometry; 54 49 … … 61 56 */ 62 57 public class InspectPrimitiveDialog extends ExtendedDialog { 58 63 59 protected List<OsmPrimitive> primitives; 64 60 protected OsmDataLayer layer; … … 74 70 WindowGeometry.centerInWindow(Main.parent, new Dimension(750, 550))); 75 71 76 setButtonIcons(new String[] 72 setButtonIcons(new String[]{"ok.png"}); 77 73 final JTabbedPane tabs = new JTabbedPane(); 78 74 JPanel pData = buildDataPanel(); … … 91 87 } 92 88 }); 93 txtData.setText(buildDataText());94 89 setContent(tabs, false); 95 90 } … … 100 95 txtData.setFont(new Font("Monospaced", txtData.getFont().getStyle(), txtData.getFont().getSize())); 101 96 txtData.setEditable(false); 97 txtData.setText(buildDataText()); 98 txtData.setSelectionStart(0); 99 txtData.setSelectionEnd(0); 102 100 103 101 JScrollPane scroll = new JScrollPane(txtData); … … 108 106 109 107 protected String buildDataText() { 110 StringBuilder s = new StringBuilder(); 111 108 DataText dt = new DataText(); 112 109 Collections.sort(primitives, new OsmPrimitiveComparator()); 113 114 String sep = "";115 110 for (OsmPrimitive o : primitives) { 116 s.append(sep); 117 sep = "\n"; 118 addInfo(s, o); 119 } 120 121 return s.toString(); 122 } 123 124 protected void addInfo(StringBuilder s, OsmPrimitive o) { 125 o.visit(new AddPrimitiveInfoVisitor(s)); 126 addConflicts(s, o); 127 } 128 129 protected void addConflicts(StringBuilder s, OsmPrimitive o) { 130 ConflictCollection conflicts = layer.getConflicts(); 131 Conflict<?> c = conflicts.getConflictForMy(o); 132 if (c != null) { 133 s.append(tr("In conflict with:\n")); 134 c.getTheir().visit(new AddPrimitiveInfoVisitor(s)); 135 } 136 } 137 138 protected class AddPrimitiveInfoVisitor extends AbstractVisitor { 139 StringBuilder s; 140 141 public AddPrimitiveInfoVisitor(StringBuilder s) { 142 this.s = s; 143 } 144 145 public void visit(Node n) { 146 s.append(tr("Node id={0}", n.getUniqueId())); 147 if (!checkDataSet(n)) { 148 s.append(tr(" not in data set")); 111 dt.addPrimitive(o); 112 } 113 return dt.toString(); 114 } 115 116 class DataText { 117 static final String INDENT = " "; 118 static final String NL = "\n"; 119 120 private StringBuilder s = new StringBuilder(); 121 122 private DataText add(String title, String... values) { 123 s.append(INDENT).append(title); 124 for (String v : values) { 125 s.append(v); 126 } 127 s.append(NL); 128 return this; 129 } 130 131 private String getNameAndId(String name, long id) { 132 if (name != null) { 133 return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id)); 134 } else { 135 return Long.toString(id); 136 } 137 } 138 139 public void addPrimitive(OsmPrimitive o) { 140 141 addHeadline(o); 142 143 if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) { 144 s.append(NL).append(INDENT).append(tr("not in data set")); 149 145 return; 150 146 } 151 if (n.isIncomplete()) { 152 s.append(tr(" incomplete\n")); 153 addWayReferrer(s, n); 154 addRelationReferrer(s, n); 147 if (o.isIncomplete()) { 148 s.append(NL).append(INDENT).append(tr("incomplete")); 155 149 return; 156 150 } 157 s.append(tr(" lat={0} lon={1} (projected: x={2}, y={3}); ", 158 Double.toString(n.getCoor().lat()), Double.toString(n.getCoor().lon()), 159 Double.toString(n.getEastNorth().east()), Double.toString(n.getEastNorth().north()))); 160 addCommon(s, n); 161 addAttributes(s, n); 162 addWayReferrer(s, n); 163 addRelationReferrer(s, n); 164 } 165 166 public void visit(Way w) { 167 s.append(tr("Way id={0}", w.getUniqueId())); 168 if (!checkDataSet(w)) { 169 s.append(tr(" not in data set")); 170 return; 171 } 172 if (w.isIncomplete()) { 173 s.append(tr(" incomplete\n")); 174 addRelationReferrer(s, w); 175 return; 176 } 177 s.append(trn(" {0} node; ", " {0} nodes; ", w.getNodes().size(), w.getNodes().size())); 178 addCommon(s, w); 179 addAttributes(s, w); 180 addRelationReferrer(s, w); 181 182 s.append(tr(" nodes:\n")); 151 s.append(NL); 152 153 addState(o); 154 addCommon(o); 155 addAttributes(o); 156 addSpecial(o); 157 addReferrers(s, o); 158 addConflicts(o); 159 s.append(NL); 160 } 161 162 void addHeadline(OsmPrimitive o) { 163 addType(o); 164 addNameAndId(o); 165 } 166 167 void addType(OsmPrimitive o) { 168 if (o instanceof Node) { 169 s.append(tr("Node: ")); 170 } else if (o instanceof Way) { 171 s.append(tr("Way: ")); 172 } else if (o instanceof Relation) { 173 s.append(tr("Relation: ")); 174 } 175 } 176 177 void addNameAndId(OsmPrimitive o) { 178 String name = o.get("name"); 179 if (name == null) { 180 s.append(o.getUniqueId()); 181 } else { 182 s.append(getNameAndId(name, o.getUniqueId())); 183 } 184 } 185 186 void addState(OsmPrimitive o) { 187 StringBuilder sb = new StringBuilder(INDENT); 188 /* selected state is left out: not interesting as it is always selected */ 189 if (o.isDeleted()) { 190 sb.append(tr("deleted")).append(INDENT); 191 } 192 if (!o.isVisible()) { 193 sb.append(tr("deleted-on-server")).append(INDENT); 194 } 195 if (o.isModified()) { 196 sb.append(tr("modified")).append(INDENT); 197 } 198 if (o.isDisabledAndHidden()) { 199 sb.append(tr("filtered/hidden")).append(INDENT); 200 } 201 if (o.isDisabled()) { 202 sb.append(tr("filtered/disabled")).append(INDENT); 203 } 204 if (o.hasDirectionKeys()) { 205 if (o.reversedDirection()) { 206 sb.append(tr("has direction keys (reversed)")).append(INDENT); 207 } else { 208 sb.append(tr("has direction keys")).append(INDENT); 209 } 210 } 211 String state = sb.toString().trim(); 212 if (!state.isEmpty()) { 213 add(tr("State: "), sb.toString().trim()); 214 } 215 } 216 217 void addCommon(OsmPrimitive o) { 218 add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode())); 219 add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>") 220 : DateUtils.fromDate(o.getTimestamp())); 221 add(tr("Edited by: "), o.getUser() == null ? tr("<new object>") 222 : getNameAndId(o.getUser().getName(), o.getUser().getId())); 223 add(tr("Version: "), Integer.toString(o.getVersion())); 224 add(tr("In changeset: "), Integer.toString(o.getChangesetId())); 225 } 226 227 void addAttributes(OsmPrimitive o) { 228 if (o.hasKeys()) { 229 add(tr("Tags: ")); 230 for (String key : o.keySet()) { 231 s.append(INDENT).append(INDENT); 232 s.append(String.format("\"%s\"=\"%s\"\n", key, o.get(key))); 233 } 234 } 235 } 236 237 void addSpecial(OsmPrimitive o) { 238 if (o instanceof Node) { 239 addCorrdinates((Node) o); 240 } else if (o instanceof Way) { 241 addWayNodes((Way) o); 242 } else if (o instanceof Relation) { 243 addRelationMembers((Relation) o); 244 } 245 } 246 247 void addRelationMembers(Relation r) { 248 add(trn("{0} Member: ", "{0} Members: ", r.getMembersCount(), r.getMembersCount())); 249 for (RelationMember m : r.getMembers()) { 250 s.append(INDENT).append(INDENT); 251 addHeadline(m.getMember()); 252 s.append(tr(" as \"{0}\"", m.getRole())); 253 s.append(NL); 254 } 255 } 256 257 void addWayNodes(Way w) { 258 add(tr("{0} Nodes: ", w.getNodesCount())); 183 259 for (Node n : w.getNodes()) { 184 s.append(String.format(" %d\n", n.getUniqueId())); 185 } 186 } 187 188 public void visit(Relation r) { 189 s.append(tr("Relation id={0}",r.getUniqueId())); 190 if (!checkDataSet(r)) { 191 s.append(tr(" not in data set")); 192 return; 193 } 194 if (r.isIncomplete()) { 195 s.append(tr(" incomplete\n")); 196 addRelationReferrer(s, r); 197 return; 198 } 199 s.append(trn(" {0} member; ", " {0} members; ", r.getMembersCount(), r.getMembersCount())); 200 addCommon(s, r); 201 addAttributes(s, r); 202 addRelationReferrer(s, r); 203 204 s.append(tr(" members:\n")); 205 for (RelationMember m : r.getMembers() ) { 206 s.append(String.format(" %s%d '%s'\n", m.getMember().getType().getAPIName().substring(0,1), m.getMember().getUniqueId(), m.getRole())); 207 } 208 } 209 } 210 211 protected void addCommon(StringBuilder s, OsmPrimitive o) { 212 s.append(tr("Data set: {0}; User: [{1}]; ChangeSet id: {2}; Timestamp: {3}; Version: {4}", 213 Integer.toHexString(o.getDataSet().hashCode()), 214 userString(o.getUser()), 215 o.getChangesetId(), 216 o.isTimestampEmpty() ? tr("<new object>") : DateUtils.fromDate(o.getTimestamp()), 217 o.getVersion())); 218 219 /* selected state is left out: not interesting as it is always selected */ 220 if (o.isDeleted()) { 221 s.append(tr("; deleted")); 222 } 223 if (!o.isVisible()) { 224 s.append(tr("; deleted-on-server")); 225 } 226 if (o.isModified()) { 227 s.append(tr("; modified")); 228 } 229 if (o.isDisabledAndHidden()) { 230 s.append(tr("; filtered/hidden")); 231 } 232 if (o.isDisabled()) { 233 s.append(tr("; filtered/disabled")); 234 } 235 if (o.hasDirectionKeys()) { 236 s.append(tr("; has direction keys")); 237 if (o.reversedDirection()) { 238 s.append(tr(" (reversed)")); 239 } 240 } 241 s.append("\n"); 242 } 243 244 protected void addAttributes(StringBuilder s, OsmPrimitive o) { 245 if (o.hasKeys()) { 246 s.append(tr(" tags:\n")); 247 for (String key: o.keySet()) { 248 s.append(String.format(" \"%s\"=\"%s\"\n", key, o.get(key))); 249 } 250 } 251 } 252 253 protected void addWayReferrer(StringBuilder s, Node n) { 254 // add way referrer 255 List<OsmPrimitive> refs = n.getReferrers(); 256 Collection<Way> wayRefs = new SubclassFilteredCollection<OsmPrimitive, Way>(refs, OsmPrimitive.wayPredicate); 257 if (wayRefs.size() > 0) { 258 s.append(tr(" way referrer:\n")); 259 for (Way w : wayRefs) { 260 s.append(" "+w.getUniqueId()+"\n"); 261 } 262 } 263 } 264 265 protected void addRelationReferrer(StringBuilder s, OsmPrimitive o) { 266 List<OsmPrimitive> refs = o.getReferrers(); 267 Collection<Relation> relRefs = new SubclassFilteredCollection<OsmPrimitive, Relation>(refs, OsmPrimitive.relationPredicate); 268 if (relRefs.size() > 0) { 269 s.append(tr(" relation referrer:\n")); 270 for (Relation r : relRefs) { 271 s.append(" "+r.getUniqueId()+"\n"); 272 } 273 } 274 } 275 276 /** 277 * See if primitive is in a data set properly. 278 * This does not hold for primitives that are new and deleted. 279 */ 280 protected boolean checkDataSet(OsmPrimitive o) { 281 DataSet ds = o.getDataSet(); 282 if (ds == null) 283 return false; 284 return ds.getPrimitiveById(o) != null; 285 } 286 287 protected String userString(User user) { 288 if (user == null) 289 return tr("<new object>"); 290 291 List<String> names = user.getNames(); 292 293 StringBuilder us = new StringBuilder(); 294 295 us.append(tr("id: {0}",user.getId())); 296 if (names.size() == 1) { 297 us.append(tr(" name: {0}",user.getName())); 298 } 299 else if (names.size() > 1) { 300 us.append(trn(" {0} name: {1}", " {0} names: {1}", names.size(), names.size(), user.getName())); 301 } 302 return us.toString(); 260 s.append(INDENT).append(INDENT); 261 addNameAndId(n); 262 s.append(NL); 263 } 264 } 265 266 void addCorrdinates(Node n) { 267 add(tr("Coordinates: "), 268 Double.toString(n.getCoor().lat()), ", ", 269 Double.toString(n.getCoor().lon())); 270 add(tr("Coordinates (projected): "), 271 Double.toString(n.getEastNorth().east()), ", ", 272 Double.toString(n.getEastNorth().north())); 273 } 274 275 void addReferrers(StringBuilder s, OsmPrimitive o) { 276 List<OsmPrimitive> refs = o.getReferrers(); 277 if (!refs.isEmpty()) { 278 add(tr("Part of: ")); 279 for (OsmPrimitive p : refs) { 280 s.append(INDENT).append(INDENT); 281 addHeadline(p); 282 s.append(NL); 283 } 284 } 285 } 286 287 void addConflicts(OsmPrimitive o) { 288 Conflict<?> c = layer.getConflicts().getConflictForMy(o); 289 if (c != null) { 290 add(tr("In conflict with: ")); 291 addNameAndId(c.getTheir()); 292 } 293 } 294 295 @Override 296 public String toString() { 297 return s.toString(); 298 } 303 299 } 304 300 … … 319 315 320 316 for (OsmPrimitive osm : sel) { 321 txtMappaint.append(tr("Styles Cache for \"{0}\":",osm.getDisplayName(DefaultNameFormatter.getInstance()))); 317 txtMappaint.append(tr("Styles Cache for \"{0}\":", osm.getDisplayName(DefaultNameFormatter.getInstance()))); 322 318 323 319 MultiCascade mc = new MultiCascade(); … … 325 321 for (StyleSource s : elemstyles.getStyleSources()) { 326 322 if (s.active) { 327 txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n",getSort(s), s.getDisplayString())); 323 txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n", getSort(s), s.getDisplayString())); 328 324 s.apply(mc, osm, scale, null, false); 329 txtMappaint.append(tr("\nRange:{0}",mc.range)); 325 txtMappaint.append(tr("\nRange:{0}", mc.range)); 330 326 for (Entry<String, Cascade> e : mc.getLayers()) { 331 txtMappaint.append("\n " +e.getKey()+": \n"+e.getValue());327 txtMappaint.append("\n " + e.getKey() + ": \n" + e.getValue()); 332 328 } 333 329 } else { 334 txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)",s.getDisplayString())); 330 txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)", s.getDisplayString())); 335 331 } 336 332 } … … 338 334 StyleList sl = elemstyles.get(osm, scale, nc); 339 335 for (ElemStyle s : sl) { 340 txtMappaint.append(" * " +s+"\n");336 txtMappaint.append(" * " + s + "\n"); 341 337 } 342 338 txtMappaint.append("\n\n"); … … 360 356 361 357 private String getSort(StyleSource s) { 362 if (s instanceof XmlStyleSource) 358 if (s instanceof XmlStyleSource) { 363 359 return tr("xml"); 364 if (s instanceof MapCSSStyleSource) 360 } else if (s instanceof MapCSSStyleSource) { 365 361 return tr("mapcss"); 366 return tr("unknown"); 367 } 368 362 } else { 363 return tr("unknown"); 364 } 365 } 369 366 }
Note:
See TracChangeset
for help on using the changeset viewer.