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;
007import java.awt.event.KeyEvent;
008import java.util.ArrayList;
009import java.util.Collections;
010import java.util.List;
011import java.util.stream.Collectors;
012
013import org.openstreetmap.josm.actions.JosmAction;
014import org.openstreetmap.josm.gui.MainApplication;
015import org.openstreetmap.josm.gui.layer.ImageryLayer;
016import org.openstreetmap.josm.gui.layer.Layer;
017import org.openstreetmap.josm.gui.layer.MainLayerManager;
018import org.openstreetmap.josm.tools.ImageProvider;
019import org.openstreetmap.josm.tools.Shortcut;
020
021/**
022 * Allow users to cycle between adjacent layers easily
023 *
024 * @author Taylor Smock
025 * @since 15923
026 */
027public class CycleLayerDownAction extends JosmAction {
028    private static final long serialVersionUID = 1L;
029    private static final Shortcut cycleDown =
030            Shortcut.registerShortcut("core:cyclelayerdown", tr("Cycle layer down"), KeyEvent.VK_CLOSE_BRACKET, Shortcut.SHIFT);
031
032    /**
033     * Create a CycleLayerDownAction that cycles through layers that are in the model
034     */
035    public CycleLayerDownAction() {
036        super(tr("Cycle layer down"), "dialogs/previous", tr("Cycle through data layers in a downward direction"),
037                cycleDown, true, "cycle-layer-down", false);
038        new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this, true);
039        putValue(SHORT_DESCRIPTION, tr("Cycle through visible layers."));
040        putValue(NAME, tr("Cycle layers"));
041    }
042
043    @Override
044    public void actionPerformed(ActionEvent e) {
045        MainLayerManager manager = MainApplication.getLayerManager();
046        List<Layer> managerLayers = manager.getLayers().stream().filter(layer -> !(layer instanceof ImageryLayer))
047                .collect(Collectors.toList());
048        if (managerLayers.isEmpty()) {
049            return;
050        }
051
052        List<Layer> layers = new ArrayList<>(managerLayers);
053        Collections.reverse(layers);
054        int index = layers.indexOf(manager.getActiveLayer());
055        int sublist = index < managerLayers.size() - 1 ? index + 1 : 0;
056        layers = layers.subList(sublist, layers.size());
057
058        manager.setActiveLayer(layers.stream().filter(Layer::isVisible).filter(tlayer -> !(tlayer instanceof ImageryLayer))
059                .findFirst().orElse(manager.getActiveLayer()));
060    }
061}