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}