Ignore:
Timestamp:
2021-10-19T01:26:15+02:00 (3 years ago)
Author:
Don-vip
Message:

fix #20913 - fix handling of GPX files in sessions (patch by Bjoeni)

  • revert r17659 (except for unit tests) - see #20233
    • don't save GPX track and marker colors in session file anymore, but in the GPX files as extensions (like before)
    • don't ask to save unmodified GPX file
    • don't override global color settings when individual track doesn't have a color
  • ask user to save changes to GPX file when any drawing settings or marker colors have changed (currently only happens for track colors)
  • save marker color values to session even when corresponding GPX layer has already been deleted
  • save alpha values for GPX marker colors
  • added explanation to the "overwrite GPX file" dialog
  • inform user if not all files referenced by the session file are saved yet
  • allow user to save all files that are not included in the *.jos/*.joz but are only referenced in the session file
  • display * next to GPX layers that need to be saved (move isDirty() logic from OsmDataLayer to AbstractModifiableLayer)
Location:
trunk/src/org/openstreetmap/josm/io
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/GpxWriter.java

    r18219 r18287  
    149149        validprefixes = namespaces.stream().map(n -> n.getPrefix()).collect(Collectors.toList());
    150150
     151        data.creator = JOSM_CREATOR_NAME;
    151152        out.println("<?xml version='1.0' encoding='UTF-8'?>");
    152         out.println("<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"");
     153
     154        out.print("<gpx version=\"1.1\" creator=\"");
     155        out.print(JOSM_CREATOR_NAME);
     156        out.println("\" xmlns=\"http://www.topografix.com/GPX/1/1\"");
    153157
    154158        StringBuilder schemaLocations = new StringBuilder("http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd");
  • trunk/src/org/openstreetmap/josm/io/session/GpxTracksSessionExporter.java

    r18133 r18287  
    77import java.io.Writer;
    88import java.nio.charset.StandardCharsets;
     9import java.time.Instant;
    910
    1011import org.openstreetmap.josm.gui.layer.GpxLayer;
     
    1617 */
    1718public class GpxTracksSessionExporter extends GenericSessionExporter<GpxLayer> {
     19
     20    private Instant metaTime;
    1821
    1922    /**
     
    3740        Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
    3841        GpxWriter w = new GpxWriter(new PrintWriter(writer));
     42        if (metaTime != null) {
     43            w.setMetaTime(metaTime);
     44        }
    3945        w.write(layer.data);
    4046        w.flush();
    4147    }
     48
     49    protected void setMetaTime(Instant metaTime) {
     50        this.metaTime = metaTime;
     51    }
    4252}
  • trunk/src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java

    r18208 r18287  
    5555                    importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
    5656                }
     57                if (importData.getGpxLayer() != null && importData.getGpxLayer().data != null) {
     58                    importData.getGpxLayer().data.fromSession = true;
     59                }
    5760
    5861                support.addPostLayersTask(importData.getPostLayerTask());
  • trunk/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java

    r17733 r18287  
    1010import java.io.Writer;
    1111import java.nio.charset.StandardCharsets;
     12import java.time.Instant;
    1213import java.util.Collection;
    1314import java.util.Collections;
     
    3233 */
    3334public class MarkerSessionExporter extends AbstractSessionExporter<MarkerLayer> {
     35
     36    private Instant metaTime;
    3437
    3538    /**
     
    8790        Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
    8891        MarkerWriter w = new MarkerWriter(new PrintWriter(writer));
     92        if (metaTime != null) {
     93            w.setMetaTime(metaTime);
     94        }
    8995        w.write(layer);
    9096        w.flush();
     97    }
     98
     99    protected void setMetaTime(Instant metaTime) {
     100        this.metaTime = metaTime;
    91101    }
    92102
     
    110120        public void write(MarkerLayer layer) {
    111121            GpxData data = new GpxData();
     122            layer.data.getLayerPrefs().forEach((k, v) -> {
     123                if (k != null && k.indexOf("markers.") == 0) {
     124                    data.getLayerPrefs().put(k, v);
     125                }
     126            });
    112127            data.put(GpxData.META_DESC, "exported JOSM marker layer");
    113128            for (Marker m : layer.data) {
  • trunk/src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java

    r18208 r18287  
    66import java.io.IOException;
    77import java.io.InputStream;
    8 import java.util.List;
    98
    109import javax.xml.xpath.XPath;
     
    1514
    1615import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
    17 import org.openstreetmap.josm.gui.layer.GpxLayer;
    1816import org.openstreetmap.josm.gui.layer.Layer;
    1917import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
     
    5149                support.addPostLayersTask(importData.getPostLayerTask());
    5250
    53                 GpxLayer gpxLayer = null;
    54                 List<SessionReader.LayerDependency> deps = support.getLayerDependencies();
    55                 if (!deps.isEmpty()) {
    56                     Layer layer = deps.get(0).getLayer();
    57                     if (layer instanceof GpxLayer) {
    58                         gpxLayer = (GpxLayer) layer;
    59                     }
    60                 }
    61 
    62                 MarkerLayer markerLayer = importData.getMarkerLayer();
    63                 if (markerLayer != null) {
    64                     markerLayer.fromLayer = gpxLayer;
    65                 }
    66 
    67                 return markerLayer;
     51                return importData.getMarkerLayer();
    6852            }
    6953        } catch (XPathExpressionException e) {
  • trunk/src/org/openstreetmap/josm/io/session/SessionReader.java

    r17659 r18287  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.awt.Color;
    76import java.awt.GraphicsEnvironment;
    87import java.io.BufferedInputStream;
     
    4746import org.openstreetmap.josm.io.IllegalDataException;
    4847import org.openstreetmap.josm.tools.CheckParameterUtil;
    49 import org.openstreetmap.josm.tools.ColorHelper;
    5048import org.openstreetmap.josm.tools.JosmRuntimeException;
    5149import org.openstreetmap.josm.tools.Logging;
     
    620618                }
    621619            }
    622             String colorString = el.getAttribute("color");
    623             if (colorString != null) {
    624                 try {
    625                     Color color = ColorHelper.html2color(colorString);
    626                     layer.setColor(color);
    627                 } catch (RuntimeException ex) {
    628                     Logging.warn("Cannot parse color " + colorString);
    629                 }
    630             }
    631620            layer.setName(names.get(entry.getKey()));
    632621            layers.add(layer);
  • trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java

    r18133 r18287  
    4444import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
    4545import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    46 import org.openstreetmap.josm.tools.ColorHelper;
    4746import org.openstreetmap.josm.tools.JosmRuntimeException;
    4847import org.openstreetmap.josm.tools.Logging;
     
    241240            if (!Utils.equalsEpsilon(layer.getOpacity(), 1.0)) {
    242241                el.setAttribute("opacity", Double.toString(layer.getOpacity()));
    243             }
    244             if (layer.getColor() != null) {
    245                 el.setAttribute("color", ColorHelper.color2html(layer.getColor()));
    246242            }
    247243            Set<Layer> deps = dependencies.get(layer);
Note: See TracChangeset for help on using the changeset viewer.