Ticket #18012: create-trackseg-names-from-gpxLayerName-if-there-is-no-name-attribute-attached.patch

File create-trackseg-names-from-gpxLayerName-if-there-is-no-name-attribute-attached.patch, 4.7 KB (added by cmuelle8, 5 years ago)

create trackseg names from gpxLayer name if there is no 'name' attribute present in track or trackseg data of the actual gpx; the gpxLayer name, by default, is named according to the filename on opening

  • src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java

     
    165165                                .filter(relsFound::contains)
    166166                                .findFirst()
    167167                                .ifPresent(r -> {
    168                                     trkAttr.put("name", r.getName() != null ? r.getName() : r.getId());
     168                                    trkAttr.put("name", r.getName() != null ? r.getName() : Long.toString(r.getId()));
    169169                                    trkAttr.put("desc", tr("based on osm route relation data, timestamps are synthetic"));
    170170                                });
    171                         GpxData.ensureUniqueName(trkAttr, names);
     171                        GpxData.ensureUniqueName(trkAttr, names, (String) trkAttr.get("name"));
    172172                    }
    173173                    List<Node> ln = flat.get(i).getWay().getNodes();
    174174                    if (wayConnectionType.direction == WayConnectionType.Direction.BACKWARD)
  • src/org/openstreetmap/josm/data/gpx/GpxData.java

     
    441441     *
    442442     * @since 13210
    443443     */
    444     public static String ensureUniqueName(Map<String, Object> attrs, Map<String, Integer> counts) {
    445         String name = attrs.getOrDefault("name", "GPX split result").toString();
     444    public static String ensureUniqueName(Map<String, Object> attrs, Map<String, Integer> counts, String srcLayerName) {
     445        String name = attrs.getOrDefault("name", srcLayerName).toString().replaceFirst(" #\\d+$", "");
    446446        Integer count = counts.getOrDefault(name, 0) + 1;
    447447        counts.put(name, count);
    448448
    449         attrs.put("name", MessageFormat.format("{0}{1}", name, (count > 1) ? " #"+count : ""));
     449        attrs.put("name", MessageFormat.format("{0}{1}", name, " #" + count));
    450450        return attrs.get("name").toString();
    451451    }
    452452
     
    456456     *
    457457     * @since 13210
    458458     */
    459     public synchronized void splitTrackSegmentsToTracks() {
     459    public synchronized void splitTrackSegmentsToTracks(String srcLayerName) {
    460460        final HashMap<String, Integer> counts = new HashMap<>();
    461461
    462462        List<GpxTrack> trks = getTracks().stream()
    463463            .flatMap(trk -> trk.getSegments().stream().map(seg -> {
    464464                    HashMap<String, Object> attrs = new HashMap<>(trk.getAttributes());
    465                     ensureUniqueName(attrs, counts);
     465                    ensureUniqueName(attrs, counts, srcLayerName);
    466466                    return new ImmutableGpxTrack(Arrays.asList(seg), attrs);
    467467                }))
    468468            .collect(Collectors.toCollection(ArrayList<GpxTrack>::new));
     
    480480     *
    481481     * @since 13210
    482482     */
    483     public synchronized void splitTracksToLayers() {
     483    public synchronized void splitTracksToLayers(String srcLayerName) {
    484484        final HashMap<String, Integer> counts = new HashMap<>();
    485485
    486486        getTracks().stream()
     
    489489                HashMap<String, Object> attrs = new HashMap<>(trk.getAttributes());
    490490                GpxData d = new GpxData();
    491491                d.addTrack(trk);
    492                 return new GpxLayer(d, ensureUniqueName(attrs, counts));
     492                return new GpxLayer(d, ensureUniqueName(attrs, counts, srcLayerName));
    493493            })
    494494            .forEachOrdered(layer -> MainApplication.getLayerManager().addLayer(layer));
    495495    }
     
    706706    * Warning: there are lot of track with broken timestamps,
    707707    * so we just ingore points from future and from year before 1970 in this method
    708708    * works correctly @since 5815
    709      * @return minimum and maximum dates in array of 2 elements
     709    * @return minimum and maximum dates in array of 2 elements
    710710    */
    711711    public synchronized Date[] getMinMaxTimeForAllTracks() {
    712712        long now = System.currentTimeMillis();
  • src/org/openstreetmap/josm/gui/layer/GpxLayer.java

     
    426426
    427427        @Override
    428428        public void actionPerformed(ActionEvent e) {
    429             layer.data.splitTrackSegmentsToTracks();
     429            layer.data.splitTrackSegmentsToTracks(layer.getName().length()>0 ? layer.getName() : "GPX split result");
    430430            layer.invalidate();
    431431        }
    432432
     
    459459
    460460        @Override
    461461        public void actionPerformed(ActionEvent e) {
    462             layer.data.splitTracksToLayers();
     462            layer.data.splitTracksToLayers(layer.getName().length()>0 ? layer.getName() : "GPX split result");
    463463            // layer is not modified by this action
    464464        }
    465465