Ticket #6741: 6741.v2.patch

File 6741.v2.patch, 18.0 KB (added by simon04, 15 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..da5ede1 100644
    a b import javax.swing.event.ChangeListener;  
    2424import org.openstreetmap.josm.Main;
    2525import org.openstreetmap.josm.data.conflict.Conflict;
    2626import org.openstreetmap.josm.data.conflict.ConflictCollection;
    27 import org.openstreetmap.josm.data.osm.DataSet;
    2827import org.openstreetmap.josm.data.osm.Node;
    2928import org.openstreetmap.josm.data.osm.OsmPrimitive;
    3029import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
    3130import org.openstreetmap.josm.data.osm.Relation;
    3231import org.openstreetmap.josm.data.osm.RelationMember;
    33 import org.openstreetmap.josm.data.osm.User;
    3432import org.openstreetmap.josm.data.osm.Way;
    35 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
    3633import org.openstreetmap.josm.gui.DefaultNameFormatter;
    3734import org.openstreetmap.josm.gui.ExtendedDialog;
    3835import org.openstreetmap.josm.gui.NavigatableComponent;
    import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;  
    4946import org.openstreetmap.josm.gui.mappaint.xml.XmlStyleSource;
    5047import org.openstreetmap.josm.tools.DateUtils;
    5148import org.openstreetmap.josm.tools.GBC;
    52 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
    5349import org.openstreetmap.josm.tools.WindowGeometry;
    5450
    5551/**
    import org.openstreetmap.josm.tools.WindowGeometry;  
    6056 * to better understand the JOSM data representation.
    6157 */
    6258public class InspectPrimitiveDialog extends ExtendedDialog {
     59
    6360    protected List<OsmPrimitive> primitives;
    6461    protected OsmDataLayer layer;
    6562    private JTextArea txtData;
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    7370        setRememberWindowGeometry(getClass().getName() + ".geometry",
    7471                WindowGeometry.centerInWindow(Main.parent, new Dimension(750, 550)));
    7572
    76         setButtonIcons(new String[] {"ok.png"});
     73        setButtonIcons(new String[]{"ok.png"});
    7774        final JTabbedPane tabs = new JTabbedPane();
    7875        JPanel pData = buildDataPanel();
    7976        tabs.addTab(tr("data"), pData);
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    9087                }
    9188            }
    9289        });
    93         txtData.setText(buildDataText());
    9490        setContent(tabs, false);
    9591    }
    9692
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    9995        txtData = new JTextArea();
    10096        txtData.setFont(new Font("Monospaced", txtData.getFont().getStyle(), txtData.getFont().getSize()));
    10197        txtData.setEditable(false);
     98        txtData.setText(buildDataText());
     99        txtData.setSelectionStart(0);
     100        txtData.setSelectionEnd(0);
    102101
    103102        JScrollPane scroll = new JScrollPane(txtData);
    104103
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    107106    }
    108107
    109108    protected String buildDataText() {
    110         StringBuilder s = new StringBuilder();
    111 
     109        DataText dt = new DataText();
    112110        Collections.sort(primitives, new OsmPrimitiveComparator());
    113 
    114         String sep = "";
    115111        for (OsmPrimitive o : primitives) {
    116             s.append(sep);
    117             sep = "\n";
    118             addInfo(s, o);
     112            dt.addPrimitive(o);
    119113        }
    120 
    121         return s.toString();
     114        return dt.toString();
    122115    }
    123116
    124     protected void addInfo(StringBuilder s, OsmPrimitive o) {
    125         o.visit(new AddPrimitiveInfoVisitor(s));
    126         addConflicts(s, o);
    127     }
     117    class DataText {
    128118
    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));
     119        private StringBuilder s = new StringBuilder();
     120
     121        private DataText add(String title, String... values) {
     122            s.append("  ").append(title);
     123            for (String v : values) {
     124                s.append(v);
     125            }
     126            s.append("\n");
     127            return this;
    135128        }
    136     }
    137129
    138     protected class AddPrimitiveInfoVisitor extends AbstractVisitor {
    139         StringBuilder s;
     130        private DataText add(String title, int value) {
     131            return add(title, Integer.toString(value));
     132        }
    140133
    141         public AddPrimitiveInfoVisitor(StringBuilder s) {
    142             this.s = s;
     134        private String getNameAndId(String name, long id) {
     135            if (name != null) {
     136                return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id));
     137            } else {
     138                return Long.toString(id);
     139            }
    143140        }
    144141
    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"));
     142        void addPrimitive(OsmPrimitive o) {
     143
     144            addHeadline(o);
     145
     146            if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) {
     147                s.append("\n  ").append(tr("not in data set"));
    149148                return;
    150149            }
    151             if (n.isIncomplete()) {
    152                 s.append(tr(" incomplete\n"));
    153                 addWayReferrer(s, n);
    154                 addRelationReferrer(s, n);
     150            if (o.isIncomplete()) {
     151                s.append("\n  ").append(tr("incomplete"));
    155152                return;
    156153            }
    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);
     154            s.append("\n");
     155
     156            addState(o);
     157            addCommon(o);
     158            addAttributes(o);
     159            addSpecial(o);
     160            addReferrers(s, o);
     161            addConflicts(o);
     162            s.append("\n");
    164163        }
    165164
    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;
     165        void addHeadline(OsmPrimitive o) {
     166            if (o instanceof Node) {
     167                s.append(tr("Node: "));
     168            } else if (o instanceof Way) {
     169                s.append(tr("Way: "));
     170            } else if (o instanceof Relation) {
     171                s.append(tr("Relation: "));
    176172            }
    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);
    181173
    182             s.append(tr("  nodes:\n"));
    183             for (Node n : w.getNodes()) {
    184                 s.append(String.format("    %d\n", n.getUniqueId()));
     174            String name = o.get("name");
     175            if (name == null) {
     176                s.append(o.getUniqueId());
     177            } else {
     178                s.append(getNameAndId(name, o.getUniqueId()));
    185179            }
    186180        }
    187181
    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;
     182        void addState(OsmPrimitive o) {
     183            StringBuilder sb = new StringBuilder("  ");
     184            /* selected state is left out: not interesting as it is always selected */
     185            if (o.isDeleted()) {
     186                sb.append(tr("deleted")).append(" ");
    193187            }
    194             if (r.isIncomplete()) {
    195                 s.append(tr(" incomplete\n"));
    196                 addRelationReferrer(s, r);
    197                 return;
     188            if (!o.isVisible()) {
     189                sb.append(tr("deleted-on-server")).append(" ");
     190            }
     191            if (o.isModified()) {
     192                sb.append(tr("modified")).append(" ");
     193            }
     194            if (o.isDisabledAndHidden()) {
     195                sb.append(tr("filtered/hidden")).append(" ");
    198196            }
    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()));
     197            if (o.isDisabled()) {
     198                sb.append(tr("filtered/disabled")).append(" ");
     199            }
     200            if (o.hasDirectionKeys()) {
     201                if (o.reversedDirection()) {
     202                    sb.append(tr("has direction keys (reversed)")).append(" ");
     203                } else {
     204                    sb.append(tr("has direction keys")).append(" ");
     205                }
     206            }
     207            String state = sb.toString().trim();
     208            if (!state.isEmpty()) {
     209                add(tr("State: "), sb.toString().trim());
    207210            }
    208211        }
    209     }
    210212
    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"));
     213        void addCommon(OsmPrimitive o) {
     214            add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
     215            add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
     216                    : DateUtils.fromDate(o.getTimestamp()));
     217            add(tr("Edited by: "), o.getUser() == null ? tr("<new object>")
     218                    : getNameAndId(o.getUser().getName(), o.getUser().getId()));
     219            add(tr("Version: "), o.getVersion());
     220            add(tr("In changeset: "), o.getChangesetId());
    234221        }
    235         if (o.hasDirectionKeys()) {
    236             s.append(tr("; has direction keys"));
    237             if (o.reversedDirection()) {
    238                 s.append(tr(" (reversed)"));
     222
     223        void addAttributes(OsmPrimitive o) {
     224            if (o.hasKeys()) {
     225                add(tr("Tags: "));
     226                for (String key : o.keySet()) {
     227                    s.append(String.format("    \"%s\"=\"%s\"\n", key, o.get(key)));
     228                }
    239229            }
    240230        }
    241         s.append("\n");
    242     }
    243231
    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)));
     232        void addSpecial(OsmPrimitive o) {
     233            if (o instanceof Node) {
     234                addCorrdinates((Node) o);
     235            } else if (o instanceof Way) {
     236                addWayNodes((Way) o);
     237            } else if (o instanceof Relation) {
     238                addRelationMembers((Relation) o);
    249239            }
    250240        }
    251     }
    252241
    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");
     242        void addRelationMembers(Relation r) {
     243            s.append(trn("  {0} Member: ", "  {0} Members: ", r.getMembersCount(), r.getMembersCount())).append("\n");
     244            for (RelationMember m : r.getMembers()) {
     245                s.append("    ");
     246                addHeadline(m.getMember());
     247                s.append(tr(" as {0}", m.getRole()));
     248                s.append("\n");
    261249            }
    262250        }
    263     }
    264251
    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");
     252        void addWayNodes(Way w) {
     253            add(tr("Nodes: "));
     254            for (Node n : w.getNodes()) {
     255                s.append("    ");
     256                addHeadline(n);
     257                s.append("\n");
    272258            }
    273259        }
    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     }
    286260
    287     protected String userString(User user) {
    288         if (user == null)
    289             return tr("<new object>");
    290 
    291         List<String> names = user.getNames();
     261        void addCorrdinates(Node n) {
     262            add(tr("Coordinates: "),
     263                    Double.toString(n.getCoor().lat()), ", ",
     264                    Double.toString(n.getCoor().lon()));
     265            add(tr("Coordinates (projected): "),
     266                    Double.toString(n.getEastNorth().east()), ", ",
     267                    Double.toString(n.getEastNorth().north()));
     268        }
    292269
    293         StringBuilder us = new StringBuilder();
     270        void addReferrers(StringBuilder s, OsmPrimitive o) {
     271            List<OsmPrimitive> refs = o.getReferrers();
     272            if (!refs.isEmpty()) {
     273                add(tr("Part of: "));
     274                for (OsmPrimitive p : refs) {
     275                    s.append("    ");
     276                    addHeadline(p);
     277                    s.append("\n");
     278                }
     279            }
     280        }
    294281
    295         us.append(tr("id: {0}",user.getId()));
    296         if (names.size() == 1) {
    297             us.append(tr(" name: {0}",user.getName()));
     282        void addConflicts(OsmPrimitive o) {
     283            ConflictCollection conflicts = layer.getConflicts();
     284            Conflict<?> c = conflicts.getConflictForMy(o);
     285            if (c != null) {
     286                add(tr("In conflict with: "));
     287                addPrimitive(c.getTheir());
     288            }
    298289        }
    299         else if (names.size() > 1) {
    300             us.append(trn(" {0} name: {1}", " {0} names: {1}", names.size(), names.size(), user.getName()));
     290
     291        @Override
     292        public String toString() {
     293            return s.toString();
    301294        }
    302         return us.toString();
    303295    }
    304296
    305297    protected void buildMapPaintPanel(JPanel p) {
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    318310        double scale = nc.getDist100Pixel();
    319311
    320312        for (OsmPrimitive osm : sel) {
    321             txtMappaint.append(tr("Styles Cache for \"{0}\":",osm.getDisplayName(DefaultNameFormatter.getInstance())));
     313            txtMappaint.append(tr("Styles Cache for \"{0}\":", osm.getDisplayName(DefaultNameFormatter.getInstance())));
    322314
    323315            MultiCascade mc = new MultiCascade();
    324316
    325317            for (StyleSource s : elemstyles.getStyleSources()) {
    326318                if (s.active) {
    327                     txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n",getSort(s), s.getDisplayString()));
     319                    txtMappaint.append(tr("\n\n> applying {0} style \"{1}\"\n", getSort(s), s.getDisplayString()));
    328320                    s.apply(mc, osm, scale, null, false);
    329                     txtMappaint.append(tr("\nRange:{0}",mc.range));
     321                    txtMappaint.append(tr("\nRange:{0}", mc.range));
    330322                    for (Entry<String, Cascade> e : mc.getLayers()) {
    331                         txtMappaint.append("\n "+e.getKey()+": \n"+e.getValue());
     323                        txtMappaint.append("\n " + e.getKey() + ": \n" + e.getValue());
    332324                    }
    333325                } else {
    334                     txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)",s.getDisplayString()));
     326                    txtMappaint.append(tr("\n\n> skipping \"{0}\" (not active)", s.getDisplayString()));
    335327                }
    336328            }
    337329            txtMappaint.append(tr("\n\nList of generated Styles:\n"));
    338330            StyleList sl = elemstyles.get(osm, scale, nc);
    339331            for (ElemStyle s : sl) {
    340                 txtMappaint.append(" * "+s+"\n");
     332                txtMappaint.append(" * " + s + "\n");
    341333            }
    342334            txtMappaint.append("\n\n");
    343335        }
    public class InspectPrimitiveDialog extends ExtendedDialog {  
    359351    }
    360352
    361353    private String getSort(StyleSource s) {
    362         if (s instanceof XmlStyleSource)
     354        if (s instanceof XmlStyleSource) {
    363355            return tr("xml");
    364         if (s instanceof MapCSSStyleSource)
     356        } else if (s instanceof MapCSSStyleSource) {
    365357            return tr("mapcss");
    366         return tr("unknown");
     358        } else {
     359            return tr("unknown");
     360        }
    367361    }
    368 
    369362}