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