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}