Ticket #18801: 18801.1.patch
| File 18801.1.patch, 13.7 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/data/ImageData.java
4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 6 import java.util.ArrayList; 7 import java.util.Collection; 7 8 import java.util.Collections; 8 9 import java.util.List; 9 10 import java.util.stream.Collectors; … … 16 17 * Class to hold {@link ImageEntry} and the current selection 17 18 * @since 14590 18 19 */ 19 public class ImageData {20 public class ImageData implements Data { 20 21 /** 21 22 * A listener that is informed when the current selection change 22 23 */ … … 343 344 public void removeImageDataUpdateListener(ImageDataUpdateListener listener) { 344 345 listeners.removeListener(listener); 345 346 } 347 348 @Override 349 public Collection<DataSource> getDataSources() { 350 return Collections.emptyList(); 351 } 346 352 } -
src/org/openstreetmap/josm/data/osm/NoteData.java
9 9 import java.util.List; 10 10 import java.util.Map; 11 11 12 import org.openstreetmap.josm.data.Data; 13 import org.openstreetmap.josm.data.DataSource; 12 14 import org.openstreetmap.josm.data.UserIdentityManager; 13 15 import org.openstreetmap.josm.data.coor.LatLon; 14 16 import org.openstreetmap.josm.data.notes.Note; … … 20 22 /** 21 23 * Class to hold and perform operations on a set of notes 22 24 */ 23 public class NoteData {25 public class NoteData implements Data { 24 26 25 27 /** 26 28 * A listener that can be informed on note data changes. … … 59 61 60 62 /** 61 63 * Construct a new note container with a given list of notes 64 * 62 65 * @param notes The list of notes to populate the container with 63 66 */ 64 67 public NoteData(Collection<Note> notes) { … … 140 143 } 141 144 142 145 /** 143 * Add notes to the data set. It only adds a note if the ID is not already present 146 * Add notes to the data set. It only adds a note if the ID is not already 147 * present 148 * 144 149 * @param newNotes A list of notes to add 145 150 */ 146 151 public synchronized void addNotes(Collection<Note> newNotes) { … … 309 314 public void removeNoteDataUpdateListener(NoteDataUpdateListener listener) { 310 315 listeners.removeListener(listener); 311 316 } 317 318 @Override 319 public Collection<DataSource> getDataSources() { 320 return Collections.emptyList(); // Notes don't currently store data sources 321 } 312 322 } -
src/org/openstreetmap/josm/gui/layer/AbstractModifiableLayer.java
1 1 // License: GPL. For details, see LICENSE file. 2 2 package org.openstreetmap.josm.gui.layer; 3 3 4 import java.io.File; 5 import java.io.IOException; 6 7 import org.openstreetmap.josm.data.Data; 4 8 import org.openstreetmap.josm.data.osm.Lockable; 5 9 import org.openstreetmap.josm.gui.io.AbstractIOTask; 6 10 import org.openstreetmap.josm.gui.io.AbstractUploadDialog; … … 102 106 // Override if needed 103 107 return false; 104 108 } 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 xxx 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 xxx 128 */ 129 public abstract Data getData(); 105 130 } -
src/org/openstreetmap/josm/gui/layer/AutosaveTask.java
31 31 import java.util.regex.Pattern; 32 32 33 33 import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask; 34 import org.openstreetmap.josm.data. osm.DataSet;34 import org.openstreetmap.josm.data.Data; 35 35 import org.openstreetmap.josm.data.osm.NoteData; 36 36 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener; 37 37 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; … … 41 41 import org.openstreetmap.josm.data.preferences.IntegerProperty; 42 42 import org.openstreetmap.josm.gui.MainApplication; 43 43 import org.openstreetmap.josm.gui.Notification; 44 import org.openstreetmap.josm.gui.io.importexport.NoteExporter;45 44 import org.openstreetmap.josm.gui.io.importexport.NoteImporter; 46 import org.openstreetmap.josm.gui.io.importexport.OsmExporter;47 45 import org.openstreetmap.josm.gui.io.importexport.OsmImporter; 48 46 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent; 49 47 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; … … 116 114 } 117 115 118 116 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<>(); 121 118 private final List<AutosaveLayerInfo<?>> layersInfo = new ArrayList<>(); 122 119 private final Object layersLock = new Object(); 123 120 private final Deque<File> deletedLayers = new LinkedList<>(); … … 236 233 info.layerName = info.layer.getName(); 237 234 } 238 235 try { 239 if (info.layer instanceof OsmDataLayer) { 240 OsmDataLayer dataLayer = (OsmDataLayer) info.layer; 241 if (changedDatasets.remove(dataLayer.data)) { 242 File file = getNewLayerFile(info, new Date(), 0); 243 if (file != null) { 244 info.backupFiles.add(file); 245 new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */); 246 } 236 if (changedData.remove(info.layer.getData())) { 237 File file = getNewLayerFile(info, new Date(), 0); 238 if (file != null) { 239 info.backupFiles.add(file); 240 info.layer.autosave(file); 247 241 } 248 } else if (info.layer instanceof NoteLayer) {249 NoteLayer noteLayer = (NoteLayer) info.layer;250 if (changedNoteData.remove(noteLayer.getNoteData())) {251 File file = getNewLayerFile(info, new Date(), 0);252 if (file != null) {253 info.backupFiles.add(file);254 new NoteExporter().exportData(file, info.layer);255 }256 }257 242 } 258 243 } catch (IOException e) { 259 244 Logging.error(e); … … 273 258 for (AutosaveLayerInfo<?> info: layersInfo) { 274 259 savelayer(info); 275 260 } 276 changedDatasets.clear(); 277 changedNoteData.clear(); 261 changedData.clear(); 278 262 if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) { 279 263 GuiHelper.runInEDT(this::displayNotification); 280 264 } … … 317 301 registerNewlayer((OsmDataLayer) e.getAddedLayer()); 318 302 } else if (e.getAddedLayer() instanceof NoteLayer) { 319 303 registerNewlayer((NoteLayer) e.getAddedLayer()); 304 } else if (e.getAddedLayer() instanceof AbstractModifiableLayer) { 305 synchronized (layersLock) { 306 layersInfo.add(new AutosaveLayerInfo<>((AbstractModifiableLayer) e.getAddedLayer())); 307 } 320 308 } 321 309 } 322 310 … … 361 349 362 350 @Override 363 351 public void processDatasetEvent(AbstractDatasetChangedEvent event) { 364 changedData sets.add(event.getDataset());352 changedData.add(event.getDataset()); 365 353 } 366 354 367 355 @Override 368 356 public void noteDataUpdated(NoteData data) { 369 changed NoteData.add(data);357 changedData.add(data); 370 358 } 371 359 360 /** 361 * Indicate that data has changed, and it might be a good idea to autosave. 362 * 363 * @param data The data that has changed 364 * @return See {@link Set#add} 365 * @since xxx 366 */ 367 public boolean dataUpdated(Data data) { 368 return changedData.add(data); 369 } 370 372 371 @Override 373 372 public void selectedNoteChanged(NoteData noteData) { 374 373 // Do nothing -
src/org/openstreetmap/josm/gui/layer/GpxLayer.java
27 27 import org.openstreetmap.josm.actions.RenameLayerAction; 28 28 import org.openstreetmap.josm.actions.SaveActionBase; 29 29 import org.openstreetmap.josm.data.Bounds; 30 import org.openstreetmap.josm.data.Data; 30 31 import org.openstreetmap.josm.data.SystemOfMeasurement; 31 32 import org.openstreetmap.josm.data.gpx.GpxConstants; 32 33 import org.openstreetmap.josm.data.gpx.GpxData; … … 546 547 // no i18n for international values 547 548 return isLocalFile ? "survey" : null; 548 549 } 550 551 @Override 552 public Data getData() { 553 return data; 554 } 549 555 } -
src/org/openstreetmap/josm/gui/layer/NoteLayer.java
13 13 import java.awt.event.MouseWheelEvent; 14 14 import java.awt.event.MouseWheelListener; 15 15 import java.io.File; 16 import java.io.IOException; 16 17 import java.text.DateFormat; 17 18 import java.util.ArrayList; 18 19 import java.util.Collection; … … 35 36 36 37 import org.openstreetmap.josm.actions.SaveActionBase; 37 38 import org.openstreetmap.josm.data.Bounds; 39 import org.openstreetmap.josm.data.Data; 38 40 import org.openstreetmap.josm.data.notes.Note; 39 41 import org.openstreetmap.josm.data.notes.Note.State; 40 42 import org.openstreetmap.josm.data.notes.NoteComment; … … 91 93 92 94 /** 93 95 * Create a new note layer with a set of notes 94 * @param notes A list of notes to show in this layer 95 * @param name The name of the layer. Typically "Notes" 96 * 97 * @param notes A list of notes to show in this layer 98 * @param name The name of the layer. Typically "Notes" 96 99 */ 97 100 public NoteLayer(Collection<Note> notes, String name) { 98 101 this(new NoteData(notes), name); … … 478 481 public String getChangesetSourceTag() { 479 482 return "Notes"; 480 483 } 484 485 @Override 486 public boolean autosave(File file) throws IOException { 487 new NoteExporter().exportData(file, this); 488 return true; 489 } 490 491 @Override 492 public Data getData() { 493 return getNoteData(); 494 } 481 495 } -
src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
51 51 import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction; 52 52 import org.openstreetmap.josm.data.APIDataSet; 53 53 import org.openstreetmap.josm.data.Bounds; 54 import org.openstreetmap.josm.data.Data; 54 55 import org.openstreetmap.josm.data.DataSource; 55 56 import org.openstreetmap.josm.data.ProjectionBounds; 56 57 import org.openstreetmap.josm.data.UndoRedoHandler; … … 109 110 import org.openstreetmap.josm.gui.io.UploadDialog; 110 111 import org.openstreetmap.josm.gui.io.UploadLayerTask; 111 112 import org.openstreetmap.josm.gui.io.importexport.NoteExporter; 113 import org.openstreetmap.josm.gui.io.importexport.OsmExporter; 112 114 import org.openstreetmap.josm.gui.io.importexport.OsmImporter; 113 115 import org.openstreetmap.josm.gui.io.importexport.ValidatorErrorExporter; 114 116 import org.openstreetmap.josm.gui.io.importexport.WMSLayerImporter; … … 1320 1322 public boolean isUploadInProgress() { 1321 1323 return isUploadInProgress.get(); 1322 1324 } 1325 1326 @Override 1327 public Data getData() { 1328 return getDataSet(); 1329 } 1330 1331 @Override 1332 public boolean autosave(File file) throws IOException { 1333 new OsmExporter().exportData(file, this, true /* no backup with appended ~ */); 1334 return true; 1335 } 1323 1336 } -
src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
36 36 import javax.swing.JOptionPane; 37 37 38 38 import org.openstreetmap.josm.actions.RenameLayerAction; 39 import org.openstreetmap.josm.actions.mapmode.SelectLassoAction;40 39 import org.openstreetmap.josm.actions.mapmode.MapMode; 41 40 import org.openstreetmap.josm.actions.mapmode.SelectAction; 41 import org.openstreetmap.josm.actions.mapmode.SelectLassoAction; 42 42 import org.openstreetmap.josm.data.Bounds; 43 import org.openstreetmap.josm.data.Data; 43 44 import org.openstreetmap.josm.data.ImageData; 44 45 import org.openstreetmap.josm.data.ImageData.ImageDataUpdateListener; 45 46 import org.openstreetmap.josm.data.gpx.GpxData; … … 1015 1016 public String getChangesetSourceTag() { 1016 1017 return "Geotagged Images"; 1017 1018 } 1019 1020 @Override 1021 public Data getData() { 1022 return data; 1023 } 1018 1024 }
