001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer;
003
004import java.io.File;
005import java.io.IOException;
006
007import org.openstreetmap.josm.data.Data;
008import org.openstreetmap.josm.data.osm.Lockable;
009import org.openstreetmap.josm.gui.io.AbstractIOTask;
010import org.openstreetmap.josm.gui.io.AbstractUploadDialog;
011import org.openstreetmap.josm.gui.progress.ProgressMonitor;
012
013/**
014 * A modifiable layer.
015 * @since 7358
016 */
017public abstract class AbstractModifiableLayer extends Layer implements DownloadFromServer, UploadToServer, SaveToFile, Lockable {
018
019    /**
020     * Property used to know if this layer has to be saved on disk.
021     * @since 18287 
022     */
023    public static final String REQUIRES_SAVE_TO_DISK_PROP = AbstractModifiableLayer.class.getName() + ".requiresSaveToDisk";
024    static final String IS_DIRTY_SYMBOL = "*";
025
026    /**
027     * Constructs a new {@code ModifiableLayer}.
028     * @param name Layer name
029     */
030    protected AbstractModifiableLayer(String name) {
031        super(name);
032    }
033
034    @Override
035    public boolean isDownloadable() {
036        // Override if needed
037        return false;
038    }
039
040    @Override
041    public boolean isUploadable() {
042        // Override if needed
043        return false;
044    }
045
046    @Override
047    public boolean requiresUploadToServer() {
048        // Override if needed
049        return false;
050    }
051
052    @Override
053    public boolean requiresSaveToFile() {
054        // Override if needed
055        return false;
056    }
057
058    @Override
059    public boolean isUploadDiscouraged() {
060        // Override if needed
061        return false;
062    }
063
064    /**
065     * Determines if this layer is "dirty", i.e. requires save or upload
066     * @return if this layer is "dirty"
067     * @since 18287
068     */
069    public boolean isDirty() {
070        // Override if needed
071        return requiresSaveToFile() || (requiresUploadToServer() && !isUploadDiscouraged());
072    }
073
074    /**
075     * Determines if data managed by this layer has been modified.
076     * @return true if data has been modified; false, otherwise
077     */
078    public abstract boolean isModified();
079
080    @Override
081    public void onPostSaveToFile() {
082        // Override if needed
083    }
084
085    /**
086     * Initializes the layer after a successful upload to the server.
087     */
088    @Override
089    public void onPostUploadToServer() {
090        // Override if needed
091    }
092
093    @Override
094    public AbstractIOTask createUploadTask(ProgressMonitor monitor) {
095        // Override if needed
096        return null;
097    }
098
099    @Override
100    public AbstractUploadDialog getUploadDialog() {
101        // Override if needed
102        return null;
103    }
104
105    @Override
106    public boolean isUploadInProgress() {
107        // Override if needed
108        return false;
109    }
110
111    @Override
112    public void lock() {
113        // Override if needed
114    }
115
116    @Override
117    public void unlock() {
118        // Override if needed
119    }
120
121    @Override
122    public boolean isLocked() {
123        // Override if needed
124        return false;
125    }
126
127    /**
128     * Perform the autosave action for the layer
129     *
130     * @param file The file to save to
131     * @return {@code true} if the layer was successfully saved
132     * @throws IOException If there was an IO exception from saving
133     * @since 16548
134     */
135    public boolean autosave(File file) throws IOException {
136        // Override if needed;
137        return false;
138    }
139
140    /**
141     * Get the data for the modifiable layer
142     *
143     * @return The data object
144     * @since 16548
145     */
146    public Data getData() {
147        // Override if needed;
148        return null;
149    }
150}