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.Main; 011import org.openstreetmap.josm.data.osm.DataSet; 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 putValue(SMALL_ICON, ImageProvider.get("dialogs", "duplicatelayer")); 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(), Main.getLayerManager().getLayers()); 056 OsmDataLayer oldLayer = (OsmDataLayer) layer; 057 Main.getLayerManager().addLayer(new OsmDataLayer(new DataSet(oldLayer.data), 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.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}