001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.layer; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.event.ActionEvent; 007 import java.awt.event.KeyEvent; 008 import java.lang.ref.WeakReference; 009 import java.util.List; 010 011 import javax.swing.AbstractAction; 012 013 import org.openstreetmap.josm.gui.dialogs.LayerListDialog; 014 import org.openstreetmap.josm.tools.MultikeyActionsHandler; 015 import org.openstreetmap.josm.tools.MultikeyShortcutAction; 016 import org.openstreetmap.josm.tools.Shortcut; 017 018 public class JumpToMarkerActions { 019 020 public interface JumpToMarkerLayer { 021 void jumpToNextMarker(); 022 void jumpToPreviousMarker(); 023 } 024 025 private static JumpToNextMarker jumpToNextMarkerAction; 026 private static JumpToPreviousMarker jumpToPreviousMarkerAction; 027 028 public static void initialize() { 029 jumpToNextMarkerAction = new JumpToNextMarker(null); 030 jumpToPreviousMarkerAction = new JumpToPreviousMarker(null); 031 MultikeyActionsHandler.getInstance().addAction(jumpToNextMarkerAction); 032 MultikeyActionsHandler.getInstance().addAction(jumpToPreviousMarkerAction); 033 } 034 035 public static void unregisterActions() { 036 MultikeyActionsHandler.getInstance().removeAction(jumpToNextMarkerAction); 037 MultikeyActionsHandler.getInstance().removeAction(jumpToPreviousMarkerAction); 038 } 039 040 public static final class JumpToNextMarker extends AbstractAction implements MultikeyShortcutAction { 041 042 private final Layer layer; 043 private WeakReference<Layer> lastLayer; 044 private Shortcut multikeyShortcut; 045 046 public JumpToNextMarker(JumpToMarkerLayer layer) { 047 multikeyShortcut = Shortcut.registerShortcut("core_multikey:nextMarker", tr("Multikey: {0}", tr("Next marker")), 048 KeyEvent.VK_J, Shortcut.ALT_CTRL); 049 multikeyShortcut.setAccelerator(this); 050 putValue(SHORT_DESCRIPTION, tr("Jump to next marker")); 051 putValue(NAME, tr("Jump to next marker")); 052 053 this.layer = (Layer)layer; 054 } 055 056 @Override 057 public Shortcut getMultikeyShortcut() { 058 return multikeyShortcut; 059 } 060 061 @Override 062 public void actionPerformed(ActionEvent e) { 063 execute(layer); 064 } 065 066 @Override 067 public void executeMultikeyAction(int index, boolean repeat) { 068 Layer l = LayerListDialog.getLayerForIndex(index); 069 if (l != null) { 070 if (l instanceof JumpToMarkerLayer) { 071 execute(l); 072 } 073 } else if (repeat && lastLayer != null) { 074 l = lastLayer.get(); 075 if (LayerListDialog.isLayerValid(l)) { 076 execute(l); 077 } 078 } 079 } 080 081 private void execute(Layer l) { 082 ((JumpToMarkerLayer)l).jumpToNextMarker(); 083 lastLayer = new WeakReference<Layer>(l); 084 } 085 086 @Override 087 public List<MultikeyInfo> getMultikeyCombinations() { 088 return LayerListDialog.getLayerInfoByClass(JumpToMarkerLayer.class); 089 } 090 091 @Override 092 public MultikeyInfo getLastMultikeyAction() { 093 if (lastLayer != null) 094 return LayerListDialog.getLayerInfo(lastLayer.get()); 095 else 096 return null; 097 } 098 099 } 100 101 public static final class JumpToPreviousMarker extends AbstractAction implements MultikeyShortcutAction { 102 103 private WeakReference<Layer> lastLayer; 104 private final Layer layer; 105 private Shortcut multikeyShortcut; 106 107 public JumpToPreviousMarker(JumpToMarkerLayer layer) { 108 this.layer = (Layer)layer; 109 110 multikeyShortcut = Shortcut.registerShortcut("core_multikey:previousMarker", tr("Multikey: {0}", tr("Previos marker")), 111 KeyEvent.VK_P, Shortcut.ALT_CTRL); 112 multikeyShortcut.setAccelerator(this); 113 putValue(SHORT_DESCRIPTION, tr("Jump to previous marker")); 114 putValue(NAME, tr("Jump to previous marker")); 115 } 116 117 @Override 118 public Shortcut getMultikeyShortcut() { 119 return multikeyShortcut; 120 } 121 122 @Override 123 public void actionPerformed(ActionEvent e) { 124 execute(layer); 125 } 126 127 @Override 128 public void executeMultikeyAction(int index, boolean repeat) { 129 Layer l = LayerListDialog.getLayerForIndex(index); 130 if (l != null) { 131 if (l instanceof JumpToMarkerLayer) { 132 execute(l); 133 } 134 } else if (repeat && lastLayer != null) { 135 l = lastLayer.get(); 136 if (LayerListDialog.isLayerValid(l)) { 137 execute(l); 138 } 139 } 140 } 141 142 private void execute(Layer l) { 143 ((JumpToMarkerLayer) l).jumpToPreviousMarker(); 144 lastLayer = new WeakReference<Layer>(l); 145 } 146 147 @Override 148 public List<MultikeyInfo> getMultikeyCombinations() { 149 return LayerListDialog.getLayerInfoByClass(JumpToMarkerLayer.class); 150 } 151 152 @Override 153 public MultikeyInfo getLastMultikeyAction() { 154 if (lastLayer != null) 155 return LayerListDialog.getLayerInfo(lastLayer.get()); 156 else 157 return null; 158 } 159 } 160 }