001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions;
003
004import java.beans.PropertyChangeListener;
005
006import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
007import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
008import org.openstreetmap.josm.gui.layer.OsmDataLayer;
009import org.openstreetmap.josm.tools.Shortcut;
010
011/**
012 * Abstract super-class of all upload actions.
013 * Listens to layer change events to update its enabled state.
014 * @since 15513
015 */
016public abstract class AbstractUploadAction extends JosmAction {
017
018    /**
019     * Constructs a new {@code AbstractUploadAction}.
020     *
021     * @param name the action's text as displayed on the menu (if it is added to a menu)
022     * @param iconName the filename of the icon to use
023     * @param tooltip  a longer description of the action that will be displayed in the tooltip. Please note
024     *           that html is not supported for menu actions on some platforms.
025     * @param shortcut a ready-created shortcut object or null if you don't want a shortcut. But you always
026     *            do want a shortcut, remember you can always register it with group=none, so you
027     *            won't be assigned a shortcut unless the user configures one. If you pass null here,
028     *            the user CANNOT configure a shortcut for your action.
029     * @param registerInToolbar register this action for the toolbar preferences?
030     */
031    public AbstractUploadAction(String name, String iconName, String tooltip, Shortcut shortcut,
032            boolean registerInToolbar) {
033        super(name, iconName, tooltip, shortcut, registerInToolbar);
034    }
035
036    private final PropertyChangeListener updateOnRequireUploadChange = evt -> {
037        if (OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP.equals(evt.getPropertyName())) {
038            updateEnabledState();
039        }
040    };
041
042    @Override
043    protected LayerChangeAdapter buildLayerChangeAdapter() {
044        return new LayerChangeAdapter() {
045            @Override
046            public void layerAdded(LayerAddEvent e) {
047                if (e.getAddedLayer() instanceof OsmDataLayer) {
048                    e.getAddedLayer().addPropertyChangeListener(updateOnRequireUploadChange);
049                }
050                super.layerAdded(e);
051            }
052
053            @Override
054            public void layerRemoving(LayerRemoveEvent e) {
055                if (e.getRemovedLayer() instanceof OsmDataLayer) {
056                    e.getRemovedLayer().removePropertyChangeListener(updateOnRequireUploadChange);
057                }
058                super.layerRemoving(e);
059            }
060        };
061    }
062}