Changeset 16548 in josm


Ignore:
Timestamp:
2020-06-07T12:21:07+02:00 (10 months ago)
Author:
simon04
Message:

fix #18801 - Allow layers to determine autosave functionality (patch by taylor.smock, modified)

Location:
trunk/src/org/openstreetmap/josm
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/ImageData.java

    r16436 r16548  
    55
    66import java.util.ArrayList;
     7import java.util.Collection;
    78import java.util.Collections;
    89import java.util.List;
     
    1819 * @since 14590
    1920 */
    20 public class ImageData {
     21public class ImageData implements Data {
    2122    /**
    2223     * A listener that is informed when the current selection change
     
    340341        listeners.removeListener(listener);
    341342    }
     343
     344    @Override
     345    public Collection<DataSource> getDataSources() {
     346        return Collections.emptyList();
     347    }
    342348}
  • trunk/src/org/openstreetmap/josm/data/osm/NoteData.java

    r14102 r16548  
    1010import java.util.Map;
    1111
     12import org.openstreetmap.josm.data.Data;
     13import org.openstreetmap.josm.data.DataSource;
    1214import org.openstreetmap.josm.data.UserIdentityManager;
    1315import org.openstreetmap.josm.data.coor.LatLon;
     
    2123 * Class to hold and perform operations on a set of notes
    2224 */
    23 public class NoteData {
     25public class NoteData implements Data {
    2426
    2527    /**
     
    310312        listeners.removeListener(listener);
    311313    }
     314
     315    @Override
     316    public Collection<DataSource> getDataSources() {
     317        return Collections.emptyList(); // Notes don't currently store data sources
     318    }
    312319}
  • trunk/src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java

    r13453 r16548  
    22package org.openstreetmap.josm.gui.layer;
    33
     4import java.io.File;
     5import java.io.IOException;
     6
     7import org.openstreetmap.josm.data.Data;
    48import org.openstreetmap.josm.data.osm.Lockable;
    59import org.openstreetmap.josm.gui.io.AbstractIOTask;
     
    103107        return false;
    104108    }
     109
     110    /**
     111     * Perform the autosave action for the layer
     112     *
     113     * @param file The file to save to
     114     * @return {@code true} if the layer was successfully saved
     115     * @throws IOException If there was an IO exception from saving
     116     * @since 16548
     117     */
     118    public boolean autosave(File file) throws IOException {
     119        // Override if needed;
     120        return false;
     121    }
     122
     123    /**
     124     * Get the data for the modifiable layer
     125     *
     126     * @return The data object
     127     * @since 16548
     128     */
     129    public Data getData() {
     130        // Override if needed;
     131        return null;
     132    }
    105133}
  • trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java

    r16436 r16548  
    3232
    3333import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
    34 import org.openstreetmap.josm.data.osm.DataSet;
     34import org.openstreetmap.josm.data.Data;
    3535import org.openstreetmap.josm.data.osm.NoteData;
    3636import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
     
    4242import org.openstreetmap.josm.gui.MainApplication;
    4343import org.openstreetmap.josm.gui.Notification;
    44 import org.openstreetmap.josm.gui.io.importexport.NoteExporter;
    4544import org.openstreetmap.josm.gui.io.importexport.NoteImporter;
    46 import org.openstreetmap.josm.gui.io.importexport.OsmExporter;
    4745import org.openstreetmap.josm.gui.io.importexport.OsmImporter;
    4846import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
     
    117115
    118116    private final DataSetListenerAdapter datasetAdapter = new DataSetListenerAdapter(this);
    119     private final Set<DataSet> changedDatasets = new HashSet<>();
    120     private final Set<NoteData> changedNoteData = new HashSet<>();
     117    private final Set<Data> changedData = new HashSet<>();
    121118    private final List<AutosaveLayerInfo<?>> layersInfo = new ArrayList<>();
    122119    private final Object layersLock = new Object();
     
    230227        }
    231228        try {
    232             if (info.layer instanceof OsmDataLayer) {
    233                 OsmDataLayer dataLayer = (OsmDataLayer) info.layer;
    234                 if (changedDatasets.remove(dataLayer.data)) {
    235                     File file = getNewLayerFile(info, new Date(), 0);
    236                     if (file != null) {
    237                         info.backupFiles.add(file);
    238                         new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */);
    239                     }
    240                 }
    241             } else if (info.layer instanceof NoteLayer) {
    242                 NoteLayer noteLayer = (NoteLayer) info.layer;
    243                 if (changedNoteData.remove(noteLayer.getNoteData())) {
    244                     File file = getNewLayerFile(info, new Date(), 0);
    245                     if (file != null) {
    246                         info.backupFiles.add(file);
    247                         new NoteExporter().exportData(file, info.layer);
    248                     }
     229            Data data = info.layer.getData();
     230            if (data != null && changedData.remove(data)) {
     231                File file = getNewLayerFile(info, new Date(), 0);
     232                if (file != null) {
     233                    info.backupFiles.add(file);
     234                    info.layer.autosave(file);
    249235                }
    250236            }
     
    267253                    savelayer(info);
    268254                }
    269                 changedDatasets.clear();
    270                 changedNoteData.clear();
     255                changedData.clear();
    271256                if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) {
    272257                    GuiHelper.runInEDT(this::displayNotification);
     
    311296        } else if (e.getAddedLayer() instanceof NoteLayer) {
    312297            registerNewlayer((NoteLayer) e.getAddedLayer());
     298        } else if (e.getAddedLayer() instanceof AbstractModifiableLayer) {
     299            synchronized (layersLock) {
     300                layersInfo.add(new AutosaveLayerInfo<>((AbstractModifiableLayer) e.getAddedLayer()));
     301            }
    313302        }
    314303    }
     
    355344    @Override
    356345    public void processDatasetEvent(AbstractDatasetChangedEvent event) {
    357         changedDatasets.add(event.getDataset());
     346        dataUpdated(event.getDataset());
    358347    }
    359348
    360349    @Override
    361350    public void noteDataUpdated(NoteData data) {
    362         changedNoteData.add(data);
     351        dataUpdated(data);
     352    }
     353
     354    /**
     355     * Indicate that data has changed, and it might be a good idea to autosave.
     356     *
     357     * @param data The data that has changed
     358     * @return See {@link Set#add}
     359     * @since 16548
     360     */
     361    public boolean dataUpdated(Data data) {
     362        return changedData.add(data);
    363363    }
    364364
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r15924 r16548  
    2828import org.openstreetmap.josm.actions.SaveActionBase;
    2929import org.openstreetmap.josm.data.Bounds;
     30import org.openstreetmap.josm.data.Data;
    3031import org.openstreetmap.josm.data.SystemOfMeasurement;
    3132import org.openstreetmap.josm.data.gpx.GpxConstants;
     
    547548        return isLocalFile ? "survey" : null;
    548549    }
     550
     551    @Override
     552    public Data getData() {
     553        return data;
     554    }
    549555}
  • trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java

    r15654 r16548  
    1414import java.awt.event.MouseWheelListener;
    1515import java.io.File;
     16import java.io.IOException;
    1617import java.text.DateFormat;
    1718import java.util.ArrayList;
     
    3637import org.openstreetmap.josm.actions.SaveActionBase;
    3738import org.openstreetmap.josm.data.Bounds;
     39import org.openstreetmap.josm.data.Data;
    3840import org.openstreetmap.josm.data.notes.Note;
    3941import org.openstreetmap.josm.data.notes.Note.State;
     
    479481        return "Notes";
    480482    }
     483
     484    @Override
     485    public boolean autosave(File file) throws IOException {
     486        new NoteExporter().exportData(file, this);
     487        return true;
     488    }
     489
     490    @Override
     491    public Data getData() {
     492        return getNoteData();
     493    }
    481494}
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r16438 r16548  
    5555import org.openstreetmap.josm.data.APIDataSet;
    5656import org.openstreetmap.josm.data.Bounds;
     57import org.openstreetmap.josm.data.Data;
    5758import org.openstreetmap.josm.data.ProjectionBounds;
    5859import org.openstreetmap.josm.data.UndoRedoHandler;
     
    112113import org.openstreetmap.josm.gui.io.UploadLayerTask;
    113114import org.openstreetmap.josm.gui.io.importexport.NoteExporter;
     115import org.openstreetmap.josm.gui.io.importexport.OsmExporter;
    114116import org.openstreetmap.josm.gui.io.importexport.OsmImporter;
    115117import org.openstreetmap.josm.gui.io.importexport.ValidatorErrorExporter;
     
    13021304        return isUploadInProgress.get();
    13031305    }
     1306
     1307    @Override
     1308    public Data getData() {
     1309        return getDataSet();
     1310    }
     1311
     1312    @Override
     1313    public boolean autosave(File file) throws IOException {
     1314        new OsmExporter().exportData(file, this, true /* no backup with appended ~ */);
     1315        return true;
     1316    }
    13041317}
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

    r16438 r16548  
    4141import org.openstreetmap.josm.actions.mapmode.SelectAction;
    4242import org.openstreetmap.josm.data.Bounds;
     43import org.openstreetmap.josm.data.Data;
    4344import org.openstreetmap.josm.data.ImageData;
    4445import org.openstreetmap.josm.data.ImageData.ImageDataUpdateListener;
     
    10091010        return "Geotagged Images";
    10101011    }
     1012
     1013    @Override
     1014    public Data getData() {
     1015        return data;
     1016    }
    10111017}
Note: See TracChangeset for help on using the changeset viewer.