Ticket #6741: 6741.patch
File 6741.patch, 17.5 KB (added by , 13 years ago) |
---|
-
src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java index 32c331b..eb04edd 100644
a b import java.awt.Font; 9 9 import java.awt.GridBagLayout; 10 10 import java.util.ArrayList; 11 11 import java.util.Collection; 12 import java.util.Collections;13 12 import java.util.List; 14 13 import java.util.Map.Entry; 15 14 … … import javax.swing.event.ChangeListener; 24 23 import org.openstreetmap.josm.Main; 25 24 import org.openstreetmap.josm.data.conflict.Conflict; 26 25 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; 30 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;31 28 import org.openstreetmap.josm.data.osm.Relation; 32 29 import org.openstreetmap.josm.data.osm.RelationMember; 33 import org.openstreetmap.josm.data.osm.User;34 30 import org.openstreetmap.josm.data.osm.Way; 35 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;36 31 import org.openstreetmap.josm.gui.DefaultNameFormatter; 37 32 import org.openstreetmap.josm.gui.ExtendedDialog; 38 33 import org.openstreetmap.josm.gui.NavigatableComponent; … … import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource; 49 44 import org.openstreetmap.josm.gui.mappaint.xml.XmlStyleSource; 50 45 import org.openstreetmap.josm.tools.DateUtils; 51 46 import org.openstreetmap.josm.tools.GBC; 52 import org.openstreetmap.josm.tools.SubclassFilteredCollection;53 47 import org.openstreetmap.josm.tools.WindowGeometry; 54 48 55 49 /** … … import org.openstreetmap.josm.tools.WindowGeometry; 60 54 * to better understand the JOSM data representation. 61 55 */ 62 56 public class InspectPrimitiveDialog extends ExtendedDialog { 63 protected List<OsmPrimitive> primitives; 57 58 protected Collection<OsmPrimitive> primitives; 64 59 protected OsmDataLayer layer; 65 60 private JTextArea txtData; 66 61 private JTextArea txtMappaint; … … public class InspectPrimitiveDialog extends ExtendedDialog { 73 68 setRememberWindowGeometry(getClass().getName() + ".geometry", 74 69 WindowGeometry.centerInWindow(Main.parent, new Dimension(750, 550))); 75 70 76 setButtonIcons(new String[] 71 setButtonIcons(new String[]{"ok.png"}); 77 72 final JTabbedPane tabs = new JTabbedPane(); 78 73 JPanel pData = buildDataPanel(); 79 74 tabs.addTab(tr("data"), pData); … … public class InspectPrimitiveDialog extends ExtendedDialog { 107 102 } 108 103 109 104 protected String buildDataText() { 110 StringBuilder s = new StringBuilder(); 111 112 Collections.sort(primitives, new OsmPrimitiveComparator()); 113 114 String sep = ""; 105 DataText dt = new DataText(); 115 106 for (OsmPrimitive o : primitives) { 116 s.append(sep); 117 sep = "\n"; 118 addInfo(s, o); 107 dt.addPrimitive(o); 119 108 } 120 121 return s.toString(); 109 return dt.toString(); 122 110 } 123 111 124 protected void addInfo(StringBuilder s, OsmPrimitive o) { 125 o.visit(new AddPrimitiveInfoVisitor(s)); 126 addConflicts(s, o); 127 } 112 class DataText { 128 113 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)); 114 StringBuilder s = new StringBuilder(); 115 116 private DataText add(String title, String... values) { 117 s.append(" ").append(tr(title)); 118 for (String v : values) { 119 s.append(v); 120 } 121 s.append("\n"); 122 return this; 135 123 } 136 }137 124 138 protected class AddPrimitiveInfoVisitor extends AbstractVisitor { 139 StringBuilder s; 125 private DataText add(String title, int value) { 126 return add(title, Integer.toString(value)); 127 } 140 128 141 public AddPrimitiveInfoVisitor(StringBuilder s) { 142 this.s = s; 129 private String getNameAndId(String name, long id) { 130 if (name != null) { 131 return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id)); 132 } else { 133 return Long.toString(id); 134 } 143 135 } 144 136 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")); 137 void addPrimitive(OsmPrimitive o) { 138 139 addHeadline(o); 140 141 if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) { 142 s.append("\n ").append(tr("not in data set")); 149 143 return; 150 144 } 151 if (n.isIncomplete()) { 152 s.append(tr(" incomplete\n")); 153 addWayReferrer(s, n); 154 addRelationReferrer(s, n); 145 if (o.isIncomplete()) { 146 s.append("\n ").append(tr("incomplete")); 155 147 return; 156 148 } 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); 149 s.append("\n"); 150 151 addState(o); 152 addCommon(o); 153 addAttributes(o); 154 addSpecial(o); 155 addReferrers(s, o); 156 addConflicts(o); 157 s.append("\n"); 164 158 } 165 159 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; 160 void addHeadline(OsmPrimitive o) { 161 if (o instanceof Node) { 162 s.append(tr("Node: ")); 163 } else if (o instanceof Way) { 164 s.append(tr("Way: ")); 165 } else if (o instanceof Relation) { 166 s.append(tr("Relation: ")); 171 167 } 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 168 182 s.append(tr(" nodes:\n")); 183 for (Node n : w.getNodes()) { 184 s.append(String.format(" %d\n", n.getUniqueId())); 169 String name = o.get("name"); 170 if (name == null) { 171 s.append(o.getUniqueId()); 172 } else { 173 s.append(getNameAndId(name, o.getUniqueId())); 185 174 } 186 175 } 187 176 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;177 void addState(OsmPrimitive o) { 178 StringBuilder sb = new StringBuilder(" "); 179 /* selected state is left out: not interesting as it is always selected */ 180 if (o.isDeleted()) { 181 sb.append(tr("deleted")).append(" "); 193 182 } 194 if (r.isIncomplete()) { 195 s.append(tr(" incomplete\n")); 196 addRelationReferrer(s, r); 197 return; 183 if (!o.isVisible()) { 184 sb.append(tr("deleted-on-server")).append(" "); 185 } 186 if (o.isModified()) { 187 s.append(tr("modified")).append(" "); 198 188 } 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())); 189 if (o.isDisabledAndHidden()) { 190 sb.append(tr("filtered/hidden")).append(" "); 191 } 192 if (o.isDisabled()) { 193 sb.append(tr("filtered/disabled")).append(" "); 194 } 195 if (o.hasDirectionKeys()) { 196 if (o.reversedDirection()) { 197 sb.append(tr("has direction keys (reversed)")).append(" "); 198 } else { 199 sb.append(tr("has direction keys")).append(" "); 200 } 207 201 } 202 sb.append("\n"); 203 s.append(sb.toString().trim()); 208 204 } 209 }210 205 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")); 206 void addCommon(OsmPrimitive o) { 207 add("Data Set: ", Integer.toHexString(o.getDataSet().hashCode())); 208 add("Edited at: ", o.isTimestampEmpty() ? tr("<new object>") 209 : DateUtils.fromDate(o.getTimestamp())); 210 add("Edited by: ", o.getUser() == null ? tr("<new object>") 211 : getNameAndId(o.getUser().getName(), o.getUser().getId())); 212 add("Version: ", o.getVersion()); 213 add("In changeset: ", o.getChangesetId()); 234 214 } 235 if (o.hasDirectionKeys()) { 236 s.append(tr("; has direction keys")); 237 if (o.reversedDirection()) { 238 s.append(tr(" (reversed)")); 215 216 void addAttributes(OsmPrimitive o) { 217 if (o.hasKeys()) { 218 add("Tags: "); 219 for (String key : o.keySet()) { 220 s.append(String.format(" \"%s\"=\"%s\"\n", key, o.get(key))); 221 } 239 222 } 240 223 } 241 s.append("\n");242 }243 224 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))); 225 void addSpecial(OsmPrimitive o) { 226 if (o instanceof Node) { 227 addCorrdinates((Node) o); 228 } else if (o instanceof Way) { 229 addWayNodes((Way) o); 230 } else if (o instanceof Relation) { 231 addRelationMembers((Relation) o); 249 232 } 250 233 } 251 }252 234 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"); 235 void addRelationMembers(Relation r) { 236 s.append(trn(" {0} Member: ", " {0} Members: ", r.getMembersCount(), r.getMembersCount())).append("\n"); 237 for (RelationMember m : r.getMembers()) { 238 s.append(" "); 239 addHeadline(m.getMember()); 240 s.append(tr(" as {0}", m.getRole())); 241 s.append("\n"); 261 242 } 262 243 } 263 }264 244 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"); 245 void addWayNodes(Way w) { 246 add("Nodes: "); 247 for (Node n : w.getNodes()) { 248 s.append(" "); 249 addHeadline(n); 250 s.append("\n"); 272 251 } 273 252 } 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 253 287 protected String userString(User user) { 288 if (user == null) 289 return tr("<new object>"); 290 291 List<String> names = user.getNames(); 254 void addCorrdinates(Node n) { 255 add("Coordinates: ", 256 Double.toString(n.getCoor().lat()), ", ", 257 Double.toString(n.getCoor().lon())); 258 add("Coordinates (projected): ", 259 Double.toString(n.getEastNorth().east()), ", ", 260 Double.toString(n.getEastNorth().north())); 261 } 292 262 293 StringBuilder us = new StringBuilder(); 263 void addReferrers(StringBuilder s, OsmPrimitive o) { 264 List<OsmPrimitive> refs = o.getReferrers(); 265 if (!refs.isEmpty()) { 266 add("Part of: "); 267 for (OsmPrimitive p : refs) { 268 s.append(" "); 269 addHeadline(p); 270 s.append("\n"); 271 } 272 } 273 } 294 274 295 us.append(tr("id: {0}",user.getId())); 296 if (names.size() == 1) { 297 us.append(tr(" name: {0}",user.getName())); 275 void addConflicts(OsmPrimitive o) { 276 ConflictCollection conflicts = layer.getConflicts(); 277 Conflict<?> c = conflicts.getConflictForMy(o); 278 if (c != null) { 279 add(tr("In conflict with: ")); 280 addPrimitive(c.getTheir()); 281 } 298 282 } 299 else if (names.size() > 1) { 300 us.append(trn(" {0} name: {1}", " {0} names: {1}", names.size(), names.size(), user.getName())); 283 284 @Override 285 public String toString() { 286 return s.toString(); 301 287 } 302 return us.toString();303 288 } 304 289 305 290 protected void buildMapPaintPanel(JPanel p) { … … public class InspectPrimitiveDialog extends ExtendedDialog { 318 303 double scale = nc.getDist100Pixel(); 319 304 320 305 for (OsmPrimitive osm : sel) { 321 txtMappaint.append(tr("Styles Cache for \"{0}\":", osm.getDisplayName(DefaultNameFormatter.getInstance())));306 txtMappaint.append(tr("Styles Cache for \"{0}\":", osm.getDisplayName(DefaultNameFormatter.getInstance()))); 322 307 323 308 MultiCascade mc = new MultiCascade(); 324 309 325 310 for (StyleSource s : elemstyles.getStyleSources()) { 326 311 if (s.active) { 327 txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n", getSort(s), s.getDisplayString()));312 txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n", getSort(s), s.getDisplayString())); 328 313 s.apply(mc, osm, scale, null, false); 329 txtMappaint.append(tr("\nRange:{0}", mc.range));314 txtMappaint.append(tr("\nRange:{0}", mc.range)); 330 315 for (Entry<String, Cascade> e : mc.getLayers()) { 331 txtMappaint.append("\n " +e.getKey()+": \n"+e.getValue());316 txtMappaint.append("\n " + e.getKey() + ": \n" + e.getValue()); 332 317 } 333 318 } else { 334 txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)", s.getDisplayString()));319 txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)", s.getDisplayString())); 335 320 } 336 321 } 337 322 txtMappaint.append(tr("\n\nList of generated Styles:\n")); 338 323 StyleList sl = elemstyles.get(osm, scale, nc); 339 324 for (ElemStyle s : sl) { 340 txtMappaint.append(" * " +s+"\n");325 txtMappaint.append(" * " + s + "\n"); 341 326 } 342 327 txtMappaint.append("\n\n"); 343 328 } … … public class InspectPrimitiveDialog extends ExtendedDialog { 359 344 } 360 345 361 346 private String getSort(StyleSource s) { 362 if (s instanceof XmlStyleSource) 347 if (s instanceof XmlStyleSource) { 363 348 return tr("xml"); 364 if (s instanceof MapCSSStyleSource)349 } else if (s instanceof MapCSSStyleSource) { 365 350 return tr("mapcss"); 366 return tr("unknown"); 351 } else { 352 return tr("unknown"); 353 } 367 354 } 368 369 355 }