001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.layer;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007
008import javax.swing.AbstractAction;
009
010import org.openstreetmap.josm.data.osm.DataSet;
011import org.openstreetmap.josm.gui.MainApplication;
012import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
013import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
014import org.openstreetmap.josm.gui.help.HelpUtil;
015import org.openstreetmap.josm.gui.layer.Layer;
016import org.openstreetmap.josm.gui.layer.OsmDataLayer;
017import org.openstreetmap.josm.tools.CheckParameterUtil;
018import org.openstreetmap.josm.tools.ImageProvider;
019
020/**
021 * The action to duplicate the given selected layer into another layer.
022 */
023public final class DuplicateAction extends AbstractAction implements IEnabledStateUpdating {
024    private transient Layer layer;
025    private final LayerListModel model;
026
027    /**
028     * Constructs a new {@code DuplicateAction}.
029     * @param layer the layer
030     * @param model layer list model
031     * @throws IllegalArgumentException if {@code layer} is null
032     */
033    public DuplicateAction(Layer layer, LayerListModel model) {
034        this(model);
035        CheckParameterUtil.ensureParameterNotNull(layer, "layer");
036        this.layer = layer;
037        updateEnabledState();
038    }
039
040    /**
041     * Constructs a new {@code DuplicateAction}.
042     * @param model layer list model
043     */
044    public DuplicateAction(LayerListModel model) {
045        this.model = model;
046        putValue(NAME, tr("Duplicate"));
047        new ImageProvider("dialogs", "duplicatelayer").getResource().attachImageIcon(this, true);
048        putValue(SHORT_DESCRIPTION, tr("Duplicate this layer"));
049        putValue("help", HelpUtil.ht("/Dialog/LayerList#DuplicateLayer"));
050        updateEnabledState();
051    }
052
053    private static void duplicate(Layer layer) {
054        if (layer instanceof OsmDataLayer) {
055            String newName = LayerListTransferHandler.suggestNewLayerName(layer.getName(), MainApplication.getLayerManager().getLayers());
056            OsmDataLayer oldLayer = (OsmDataLayer) layer;
057            MainApplication.getLayerManager().addLayer(new OsmDataLayer(new DataSet(oldLayer.getDataSet()), newName, null));
058        }
059    }
060
061    @Override
062    public void actionPerformed(ActionEvent e) {
063        if (layer != null) {
064            duplicate(layer);
065        } else {
066            duplicate(model.getSelectedLayers().get(0));
067        }
068    }
069
070    @Override
071    public void updateEnabledState() {
072        if (layer == null) {
073            if (model != null && model.getSelectedLayers().size() == 1) {
074                setEnabled(model.getSelectedLayers().get(0) instanceof OsmDataLayer);
075            } else {
076                setEnabled(false);
077            }
078        } else {
079            setEnabled(layer instanceof OsmDataLayer);
080        }
081    }
082}