// 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.Component; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.lang.ref.WeakReference; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JMenuItem; 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.Layer.LayerAction; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.tools.MultikeyShortcutAction; import org.openstreetmap.josm.tools.Shortcut; /** * Action which will toggle the visibility of the currently selected layers. */ public final class ShowHideLayerAction extends AbstractAction implements IEnabledStateUpdating, LayerAction, MultikeyShortcutAction { private transient WeakReference<Layer> lastLayer; private final transient Shortcut multikeyShortcut; private final LayerListModel model; /** * Creates a {@link ShowHideLayerAction} which will toggle the visibility of the currently selected layers * @param model layer list model */ public ShowHideLayerAction(LayerListModel model) { this.model = model; putValue(NAME, tr("Show/hide")); putValue(SMALL_ICON, ImageProvider.get("dialogs", "showhide")); putValue(SHORT_DESCRIPTION, tr("Toggle visible state of the selected layer.")); putValue("help", HelpUtil.ht("/Dialog/LayerList#ShowHideLayer")); multikeyShortcut = Shortcut.registerShortcut("core_multikey:showHideLayer", tr("Multikey: {0}", tr("Show/hide layer")), KeyEvent.VK_S, Shortcut.SHIFT); multikeyShortcut.setAccelerator(this); updateEnabledState(); } @Override public Shortcut getMultikeyShortcut() { return multikeyShortcut; } @Override public void actionPerformed(ActionEvent e) { for (Layer l : model.getSelectedLayers()) { l.toggleVisible(); } } @Override public void executeMultikeyAction(int index, boolean repeat) { Layer l = LayerListDialog.getLayerForIndex(index); if (l != null) { l.toggleVisible(); lastLayer = new WeakReference<>(l); } else if (repeat && lastLayer != null) { l = lastLayer.get(); if (LayerListDialog.isLayerValid(l)) { l.toggleVisible(); } } } @Override public void updateEnabledState() { setEnabled(!model.getSelectedLayers().isEmpty()); } @Override public Component createMenuComponent() { return new JMenuItem(this); } @Override public boolean supportLayers(List<Layer> layers) { return true; } @Override public boolean equals(Object obj) { return obj instanceof ShowHideLayerAction; } @Override public int hashCode() { return getClass().hashCode(); } @Override public List<MultikeyInfo> getMultikeyCombinations() { return LayerListDialog.getLayerInfoByClass(Layer.class); } @Override public MultikeyInfo getLastMultikeyAction() { if (lastLayer != null) return LayerListDialog.getLayerInfo(lastLayer.get()); return null; } }