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