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}