source: osm/applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java@ 27852

Last change on this file since 27852 was 27852, checked in by stoecker, 12 years ago

fix shortcut deprecation

  • Property svn:eol-style set to native
File size: 9.0 KB
Line 
1package imageryadjust;
2
3import java.awt.*;
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.*;
7import java.util.List;
8import java.util.*;
9
10import javax.swing.*;
11import javax.swing.Timer;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.mapmode.MapMode;
15import org.openstreetmap.josm.data.coor.EastNorth;
16import org.openstreetmap.josm.gui.ExtendedDialog;
17import org.openstreetmap.josm.gui.MapFrame;
18import org.openstreetmap.josm.gui.layer.ImageryLayer;
19import org.openstreetmap.josm.gui.layer.Layer;
20import org.openstreetmap.josm.tools.GBC;
21import org.openstreetmap.josm.tools.ImageProvider;
22import org.openstreetmap.josm.tools.Shortcut;
23
24
25public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener, AWTEventListener, MapFrame.MapModeChangeListener{
26 boolean mouseDown;
27 EastNorth prevEastNorth;
28 private ImageryLayer adjustingLayer;
29 private MapMode oldMapMode;
30
31 private final TreeSet<Integer> set = new TreeSet<Integer>();
32 private Timer timer;
33 private KeyEvent releaseEvent;
34
35 public ImageryAdjustMapMode(MapFrame mapFrame) {
36 super(tr("Adjust imagery"), "adjustimg",
37 tr("Adjust the position of the selected imagery layer"),
38 Shortcut.registerShortcut("imageryadjust:adjustmode", tr("Mode: {0}", tr("Adjust imagery")),
39 KeyEvent.VK_Y, Shortcut.ALT_CTRL),
40 mapFrame,
41 ImageProvider.getCursor("normal", "move"));
42 MapFrame.addMapModeChangeListener(this);
43 }
44
45 private List<? extends Layer> getVisibleLayers() {
46 List<? extends Layer> all = new ArrayList<Layer>(Main.map.mapView.getLayersOfType(ImageryLayer.class));
47 Iterator<? extends Layer> it = all.iterator();
48 while (it.hasNext()) {
49 if (!it.next().isVisible()) it.remove();
50 }
51 return all;
52 }
53
54 @Override
55 public void actionPerformed(ActionEvent e) {
56 super.actionPerformed(e);
57 }
58
59
60
61 @Override public void enterMode() {
62 super.enterMode();
63 if (!hasImageryLayersToAdjust()) {
64 warnNoImageryLayers();
65 return;
66 }
67 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
68 if (layers.size() == 1) {
69 adjustingLayer = layers.get(0);
70 } else {
71 adjustingLayer = (ImageryLayer)askAdjustLayer(getVisibleLayers());
72 }
73 if (adjustingLayer == null)
74 return;
75 if (!adjustingLayer.isVisible()) {
76 adjustingLayer.setVisible(true);
77 }
78 Main.map.mapView.addMouseListener(this);
79 Main.map.mapView.addMouseMotionListener(this);
80 timer = new Timer(0, new ActionListener() {
81 @Override
82 public void actionPerformed(ActionEvent ae) {
83 timer.stop();
84 if (set.remove(releaseEvent.getKeyCode())) {
85 doKeyReleaseEvent(releaseEvent);
86 }
87 }
88
89 });
90
91 try {
92 Toolkit.getDefaultToolkit().addAWTEventListener(this,
93 AWTEvent.KEY_EVENT_MASK);
94 } catch (SecurityException ex) {
95 }
96
97
98 }
99
100 @Override public void exitMode() {
101 super.exitMode();
102 Main.map.mapView.removeMouseListener(this);
103 Main.map.mapView.removeMouseMotionListener(this);
104 adjustingLayer = null;
105 try {
106 Toolkit.getDefaultToolkit().removeAWTEventListener(this);
107 } catch (SecurityException ex) {
108 }
109 }
110
111 @Override public void mousePressed(MouseEvent e) {
112 if (e.getButton() != MouseEvent.BUTTON1)
113 return;
114
115 if (adjustingLayer.isVisible()) {
116 prevEastNorth=Main.map.mapView.getEastNorth(e.getX(),e.getY());
117 Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
118 }
119 }
120
121 @Override public void mouseDragged(MouseEvent e) {
122 if (adjustingLayer == null || prevEastNorth == null) return;
123 EastNorth eastNorth=
124 Main.map.mapView.getEastNorth(e.getX(),e.getY());
125 adjustingLayer.displace(
126 eastNorth.east()-prevEastNorth.east(),
127 eastNorth.north()-prevEastNorth.north()
128 );
129 prevEastNorth = eastNorth;
130 Main.map.mapView.repaint();
131 }
132
133 @Override public void mouseReleased(MouseEvent e) {
134 Main.map.mapView.repaint();
135 Main.map.mapView.setCursor(Cursor.getDefaultCursor());
136 prevEastNorth = null;
137 }
138
139 private void doKeyEvent(KeyEvent keyEvent) {
140 }
141
142 private void doKeyReleaseEvent(KeyEvent releaseEvent) {
143 if (releaseEvent.getKeyCode() == getShortcut().getKeyStroke().getKeyCode()) {
144 if (oldMapMode!=null && !(oldMapMode instanceof ImageryAdjustMapMode))
145 Main.map.selectMapMode(oldMapMode);
146 }
147 }
148
149 @Override public boolean layerIsSupported(Layer l) {
150 //return hasImageryLayersToAdjust();
151 return true;
152 }
153
154 @Override
155 public void eventDispatched(AWTEvent event) {
156 if (event instanceof KeyEvent) {
157 KeyEvent e=(KeyEvent) event;
158
159 if (event.getID() == KeyEvent.KEY_PRESSED) {
160 if (timer.isRunning()) {
161 timer.stop();
162 } else {
163 if (set.add((e.getKeyCode()))) doKeyEvent((KeyEvent) event);
164 }
165 }
166 if (event.getID() == KeyEvent.KEY_RELEASED) {
167 if (timer.isRunning()) {
168 timer.stop();
169 if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
170 } else {
171 releaseEvent = e;
172 timer.restart();
173 }
174 }
175 }
176 }
177
178 @Override
179 public void mapModeChange(MapMode oldMapMode, MapMode newMapMode) {
180 this.oldMapMode = oldMapMode;
181 }
182
183
184 /**
185 * the list cell renderer used to render layer list entries
186 *
187 */
188 static public class LayerListCellRenderer extends DefaultListCellRenderer {
189
190 protected boolean isActiveLayer(Layer layer) {
191 if (Main.map == null)
192 return false;
193 if (Main.map.mapView == null)
194 return false;
195 return Main.map.mapView.getActiveLayer() == layer;
196 }
197
198 @Override
199 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
200 boolean cellHasFocus) {
201 Layer layer = (Layer) value;
202 JLabel label = (JLabel) super.getListCellRendererComponent(list, layer.getName(), index, isSelected,
203 cellHasFocus);
204 Icon icon = layer.getIcon();
205 label.setIcon(icon);
206 label.setToolTipText(layer.getToolTipText());
207 return label;
208 }
209 }
210
211 /**
212 * Prompts the user with a list of WMS layers which can be adjusted
213 *
214 * @param adjustableLayers the list of adjustable layers
215 * @return the selected layer; null, if no layer was selected
216 */
217 protected Layer askAdjustLayer(List<? extends Layer> adjustableLayers) {
218 if (adjustableLayers.size()==0) return null;
219 if (adjustableLayers.size()==1) return adjustableLayers.get(0);
220 JComboBox layerList = new JComboBox();
221 layerList.setRenderer(new LayerListCellRenderer());
222 layerList.setModel(new DefaultComboBoxModel(adjustableLayers.toArray()));
223 layerList.setSelectedIndex(0);
224
225 JPanel pnl = new JPanel();
226 pnl.setLayout(new GridBagLayout());
227 pnl.add(new JLabel(tr("Please select the imagery layer to adjust.")), GBC.eol());
228 pnl.add(layerList, GBC.eol());
229
230 ExtendedDialog diag = new ExtendedDialog(
231 Main.parent,
232 tr("Select imagery layer"),
233 new String[] { tr("Start adjusting"),tr("Cancel") }
234 );
235 diag.setContent(pnl);
236 diag.setButtonIcons(new String[] { "mapmode/adjustimg", "cancel" });
237 diag.showDialog();
238 int decision = diag.getValue();
239 if (decision != 1)
240 return null;
241 Layer adjustLayer = (Layer) layerList.getSelectedItem();
242 return adjustLayer;
243 }
244
245 /**
246 * Displays a warning message if there are no imagery layers to adjust
247 *
248 */
249 protected void warnNoImageryLayers() {
250 JOptionPane.showMessageDialog(
251 Main.parent,
252 tr("There are currently no imagery layer to adjust."),
253 tr("No layers to adjust"),
254 JOptionPane.WARNING_MESSAGE
255 );
256 }
257
258 /**
259 * Replies true if there is at least one imagery layer
260 *
261 * @return true if there is at least one imagery layer
262 */
263 protected boolean hasImageryLayersToAdjust() {
264 if (Main.map == null) return false;
265 if (Main.map.mapView == null) return false;
266 boolean b = ! Main.map.mapView.getLayersOfType(ImageryLayer.class).isEmpty();
267 return b;
268 }
269
270 @Override
271 protected void updateEnabledState() {
272
273 setEnabled(hasImageryLayersToAdjust());
274 //setEnabled(hasImageryLayersToAdjust());
275 }
276}
Note: See TracBrowser for help on using the repository browser.