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}