// 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 java.awt.event.KeyEvent; import java.util.List; import javax.swing.AbstractAction; import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; 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.MainLayerManager.ActiveLayerChangeEvent; import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.tools.CheckParameterUtil; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.tools.MultikeyShortcutAction; import org.openstreetmap.josm.tools.Shortcut; /** * The action to activate the currently selected layer */ public final class ActivateLayerAction extends AbstractAction implements IEnabledStateUpdating, ActiveLayerChangeListener, MultikeyShortcutAction { private transient Layer layer; private transient Shortcut multikeyShortcut; private final LayerListModel model; /** * Constructs a new {@code ActivateLayerAction}. * @param layer the layer * @param model layer list model */ public ActivateLayerAction(Layer layer, LayerListModel model) { this(model); CheckParameterUtil.ensureParameterNotNull(layer, "layer"); this.layer = layer; putValue(NAME, tr("Activate")); updateEnabledState(); } /** * Constructs a new {@code ActivateLayerAction}. * @param model layer list model */ public ActivateLayerAction(LayerListModel model) { this.model = model; putValue(NAME, tr("Activate")); new ImageProvider("dialogs", "activate").getResource().attachImageIcon(this, true); putValue(SHORT_DESCRIPTION, tr("Activate the selected layer")); multikeyShortcut = Shortcut.registerShortcut("core_multikey:activateLayer", tr("Multikey: {0}", tr("Activate layer")), KeyEvent.VK_A, Shortcut.SHIFT); multikeyShortcut.setAccelerator(this); putValue("help", HelpUtil.ht("/Dialog/LayerList#ActivateLayer")); } @Override public Shortcut getMultikeyShortcut() { return multikeyShortcut; } @Override public void actionPerformed(ActionEvent e) { Layer toActivate; if (layer != null) { toActivate = layer; } else { toActivate = model.getSelectedLayers().get(0); } execute(toActivate); } private void execute(Layer layer) { // model is going to be updated via LayerChangeListener and PropertyChangeEvents model.getLayerManager().setActiveLayer(layer); layer.setVisible(true); } boolean isActiveLayer(Layer layer) { return model.getLayerManager().getActiveLayer() == layer; } @Override public void updateEnabledState() { GuiHelper.runInEDTAndWait(() -> { if (layer == null) { if (model.getSelectedLayers().size() != 1) { setEnabled(false); return; } setEnabled(!isActiveLayer(model.getSelectedLayers().get(0))); } else { setEnabled(!isActiveLayer(layer)); } }); } @Override public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) { updateEnabledState(); } @Override public void executeMultikeyAction(int index, boolean repeat) { Layer l = LayerListDialog.getLayerForIndex(index); if (l != null) { execute(l); } } @Override public List<MultikeyInfo> getMultikeyCombinations() { return LayerListDialog.getLayerInfoByClass(Layer.class); } @Override public MultikeyInfo getLastMultikeyAction() { return null; // Repeating action doesn't make much sense for activating } }