// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.dialogs.layer;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
import org.openstreetmap.josm.gui.help.HelpUtil;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.CheckParameterUtil;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* The action to duplicate the given selected layer into another layer.
*/
public final class DuplicateAction extends AbstractAction implements IEnabledStateUpdating {
private transient Layer layer;
private final LayerListModel model;
/**
* Constructs a new {@code DuplicateAction}.
* @param layer the layer
* @param model layer list model
* @throws IllegalArgumentException if {@code layer} is null
*/
public DuplicateAction(Layer layer, LayerListModel model) {
this(model);
CheckParameterUtil.ensureParameterNotNull(layer, "layer");
this.layer = layer;
updateEnabledState();
}
/**
* Constructs a new {@code DuplicateAction}.
* @param model layer list model
*/
public DuplicateAction(LayerListModel model) {
this.model = model;
putValue(NAME, tr("Duplicate"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "duplicatelayer"));
putValue(SHORT_DESCRIPTION, tr("Duplicate this layer"));
putValue("help", HelpUtil.ht("/Dialog/LayerList#DuplicateLayer"));
updateEnabledState();
}
private static void duplicate(Layer layer) {
if (layer instanceof OsmDataLayer) {
String newName = LayerListTransferHandler.suggestNewLayerName(layer.getName(), Main.getLayerManager().getLayers());
OsmDataLayer oldLayer = (OsmDataLayer) layer;
Main.getLayerManager().addLayer(new OsmDataLayer(new DataSet(oldLayer.data), newName, null));
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (layer != null) {
duplicate(layer);
} else {
duplicate(model.getSelectedLayers().get(0));
}
}
@Override
public void updateEnabledState() {
if (layer == null) {
if (model != null && model.getSelectedLayers().size() == 1) {
setEnabled(model.getSelectedLayers().get(0) instanceof OsmDataLayer);
} else {
setEnabled(false);
}
} else {
setEnabled(layer instanceof OsmDataLayer);
}
}
}