Ticket #18801: 18801.patch
| File 18801.patch, 14.5 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<>(); … … 125 122 private final File autosaveDir = new File(Config.getDirs().getUserDataDirectory(true), AUTOSAVE_DIR); 126 123 private final File deletedLayersDir = new File(Config.getDirs().getUserDataDirectory(true), DELETED_LAYERS_DIR); 127 124 125 private static AutosaveTask task; 126 128 127 /** 128 * Initialize the AutosaveTask and set the global instance, if the global 129 * instance is not yet set. 130 */ 131 public AutosaveTask() { 132 if (task == null) 133 task = this; 134 } 135 136 /** 137 * @return The global instance for the AutosaveTask 138 * @since xxx 139 */ 140 public static AutosaveTask getInstance() { 141 if (task == null) 142 new AutosaveTask(); 143 return task; 144 } 145 146 /** 129 147 * Replies the autosave directory. 130 148 * @return the autosave directory 131 149 * @since 10299 … … 236 254 info.layerName = info.layer.getName(); 237 255 } 238 256 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 } 257 if (changedData.remove(info.layer.getData())) { 258 File file = getNewLayerFile(info, new Date(), 0); 259 if (file != null) { 260 info.backupFiles.add(file); 261 info.layer.autosave(file); 247 262 } 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 263 } 258 264 } catch (IOException e) { 259 265 Logging.error(e); … … 273 279 for (AutosaveLayerInfo<?> info: layersInfo) { 274 280 savelayer(info); 275 281 } 276 changedDatasets.clear(); 277 changedNoteData.clear(); 282 changedData.clear(); 278 283 if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) { 279 284 GuiHelper.runInEDT(this::displayNotification); 280 285 } … … 317 322 registerNewlayer((OsmDataLayer) e.getAddedLayer()); 318 323 } else if (e.getAddedLayer() instanceof NoteLayer) { 319 324 registerNewlayer((NoteLayer) e.getAddedLayer()); 325 } else if (e.getAddedLayer() instanceof AbstractModifiableLayer) { 326 synchronized (layersLock) { 327 layersInfo.add(new AutosaveLayerInfo<>((AbstractModifiableLayer) e.getAddedLayer())); 328 } 320 329 } 321 330 } 322 331 … … 361 370 362 371 @Override 363 372 public void processDatasetEvent(AbstractDatasetChangedEvent event) { 364 changedData sets.add(event.getDataset());373 changedData.add(event.getDataset()); 365 374 } 366 375 367 376 @Override 368 377 public void noteDataUpdated(NoteData data) { 369 changed NoteData.add(data);378 changedData.add(data); 370 379 } 371 380 381 /** 382 * Indicate that data has changed, and it might be a good idea to autosave. 383 * 384 * @param data The data that has changed 385 * @return See {@link Set#add} 386 * @since xxx 387 */ 388 public boolean dataUpdated(Data data) { 389 return changedData.add(data); 390 } 391 372 392 @Override 373 393 public void selectedNoteChanged(NoteData noteData) { 374 394 // 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
52 52 import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction; 53 53 import org.openstreetmap.josm.data.APIDataSet; 54 54 import org.openstreetmap.josm.data.Bounds; 55 import org.openstreetmap.josm.data.Data; 55 56 import org.openstreetmap.josm.data.DataSource; 56 57 import org.openstreetmap.josm.data.ProjectionBounds; 57 58 import org.openstreetmap.josm.data.UndoRedoHandler; … … 110 111 import org.openstreetmap.josm.gui.io.UploadDialog; 111 112 import org.openstreetmap.josm.gui.io.UploadLayerTask; 112 113 import org.openstreetmap.josm.gui.io.importexport.NoteExporter; 114 import org.openstreetmap.josm.gui.io.importexport.OsmExporter; 113 115 import org.openstreetmap.josm.gui.io.importexport.OsmImporter; 114 116 import org.openstreetmap.josm.gui.io.importexport.ValidatorErrorExporter; 115 117 import org.openstreetmap.josm.gui.io.importexport.WMSLayerImporter; … … 1335 1337 public boolean isUploadInProgress() { 1336 1338 return isUploadInProgress.get(); 1337 1339 } 1340 1341 @Override 1342 public Data getData() { 1343 return getDataSet(); 1344 } 1345 1346 @Override 1347 public boolean autosave(File file) throws IOException { 1348 new OsmExporter().exportData(file, this, true /* no backup with appended ~ */); 1349 return true; 1350 } 1338 1351 } -
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 }
