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.Component;
007import java.awt.event.ActionEvent;
008import java.util.List;
009
010import javax.swing.AbstractAction;
011import javax.swing.JMenuItem;
012
013import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
014import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
015import org.openstreetmap.josm.gui.help.HelpUtil;
016import org.openstreetmap.josm.gui.io.SaveLayersDialog;
017import org.openstreetmap.josm.gui.layer.Layer;
018import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
019import org.openstreetmap.josm.tools.ImageProvider;
020
021/**
022 * The action to delete the currently selected layer
023 */
024public final class DeleteLayerAction extends AbstractAction implements IEnabledStateUpdating, LayerAction {
025
026    private final LayerListModel model;
027
028    /**
029     * Creates a {@link DeleteLayerAction} which will delete the currently selected layers in the layer dialog.
030     * @param model layer list model
031     */
032    public DeleteLayerAction(LayerListModel model) {
033        this.model = model;
034        new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
035        putValue(SHORT_DESCRIPTION, tr("Delete the selected layers."));
036        putValue(NAME, tr("Delete"));
037        putValue("help", HelpUtil.ht("/Dialog/LayerList#DeleteLayer"));
038        updateEnabledState();
039    }
040
041    @Override
042    public void actionPerformed(ActionEvent e) {
043        List<Layer> selectedLayers = model.getSelectedLayers();
044        if (selectedLayers.isEmpty())
045            return;
046        if (!SaveLayersDialog.saveUnsavedModifications(selectedLayers, SaveLayersDialog.Reason.DELETE))
047            return;
048        for (Layer l: selectedLayers) {
049            if (model.getLayerManager().containsLayer(l)) {
050                // it may happen that this call removes other layers.
051                // this is why we need to check if every layer is still in the list of selected layers.
052                model.getLayerManager().removeLayer(l);
053            }
054        }
055    }
056
057    @Override
058    public void updateEnabledState() {
059        setEnabled(!model.getSelectedLayers().isEmpty());
060    }
061
062    @Override
063    public Component createMenuComponent() {
064        return new JMenuItem(this);
065    }
066
067    @Override
068    public boolean supportLayers(List<Layer> layers) {
069        return true;
070    }
071
072    @Override
073    public boolean equals(Object obj) {
074        return obj instanceof DeleteLayerAction;
075    }
076
077    @Override
078    public int hashCode() {
079        return getClass().hashCode();
080    }
081}