001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer.geoimage;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import org.openstreetmap.josm.data.gpx.GpxData;
007import org.openstreetmap.josm.data.gpx.GpxDataContainer;
008import org.openstreetmap.josm.data.osm.DownloadPolicy;
009import org.openstreetmap.josm.data.osm.UploadPolicy;
010import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
011import org.openstreetmap.josm.gui.layer.Layer;
012import org.openstreetmap.josm.gui.layer.OsmDataLayer;
013import org.openstreetmap.josm.gui.layer.gpx.ConvertFromGpxLayerAction;
014
015/**
016 * A support layer meant to be modified by the user to provide real-time images correlation.
017 * @since 18078
018 */
019public final class CorrelationSupportLayer extends OsmDataLayer implements GpxDataContainer {
020
021    private static final String CORRELATION_PREFIX = "correlation:";
022
023    private final GpxData gpxData = new GpxData();
024
025    /**
026     * Constructs a new {@code CorrelationSupportLayer} with a default name
027     * @param fauxGpxData Faux GPX data to be modified using OSM editing tools
028     */
029    public CorrelationSupportLayer(GpxData fauxGpxData) {
030        this(fauxGpxData, tr("Correlation support layer"));
031    }
032
033    /**
034     * Constructs a new {@code CorrelationSupportLayer} with a given name
035     * @param fauxGpxData Faux GPX data to be modified using OSM editing tools
036     * @param name layer name
037     */
038    public CorrelationSupportLayer(GpxData fauxGpxData, String name) {
039        super(ConvertFromGpxLayerAction.convert(fauxGpxData, "list", CORRELATION_PREFIX), name, null);
040        data.setDownloadPolicy(DownloadPolicy.BLOCKED);
041        data.setUploadPolicy(UploadPolicy.BLOCKED);
042        rebuildGpxData();
043    }
044
045    @Override
046    public GpxData toGpxData() {
047        GpxData gpxData = new GpxData();
048        fillGpxData(gpxData, data, getAssociatedFile(), CORRELATION_PREFIX);
049        return gpxData;
050    }
051
052    @Override
053    public CorrelationSupportLayer duplicate(String newName) {
054        return new CorrelationSupportLayer(gpxData, newName);
055    }
056
057    private void rebuildGpxData() {
058        gpxData.beginUpdate();
059        try {
060            gpxData.clear();
061            fillGpxData(gpxData, data, null, CORRELATION_PREFIX);
062        } finally {
063            gpxData.endUpdate();
064        }
065    }
066
067    @Override
068    public GpxData getGpxData() {
069        return gpxData;
070    }
071
072    @Override
073    public void processDatasetEvent(AbstractDatasetChangedEvent event) {
074        invalidate();
075        rebuildGpxData();
076    }
077
078    @Override
079    protected void setRequiresSaveToFile(boolean newValue) {
080        // Do nothing
081    }
082
083    @Override
084    protected void setRequiresUploadToServer(boolean newValue) {
085        // Do nothing
086    }
087
088    @Override
089    public boolean isMergable(Layer other) {
090        return false;
091    }
092
093    @Override
094    public boolean isDownloadable() {
095        return false;
096    }
097
098    @Override
099    public boolean isUploadable() {
100        return false;
101    }
102
103    @Override
104    public boolean requiresUploadToServer() {
105        return false;
106    }
107
108    @Override
109    public boolean requiresSaveToFile() {
110        return false;
111    }
112
113    @Override
114    public boolean isSavable() {
115        return false;
116    }
117}