source: osm/applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSAdjustAction.java@ 20390

Last change on this file since 20390 was 20281, checked in by pieren, 14 years ago

Improve exitMode if enterMode fails

File size: 7.9 KB
Line 
1// License: GPL. v2 and later. Copyright 2008-2009 by Pieren <pieren3@gmail.com> and others
2package cadastre_fr;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Color;
7import java.awt.Cursor;
8import java.awt.Graphics2D;
9import java.awt.Toolkit;
10import java.awt.event.ActionEvent;
11import java.awt.event.MouseEvent;
12import java.awt.event.MouseListener;
13import java.awt.event.MouseMotionListener;
14import java.util.ArrayList;
15
16import javax.swing.JOptionPane;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.gui.MapFrame;
20import org.openstreetmap.josm.gui.MapView;
21import org.openstreetmap.josm.actions.mapmode.MapMode;
22import org.openstreetmap.josm.data.coor.EastNorth;
23import org.openstreetmap.josm.tools.ImageProvider;
24import org.openstreetmap.josm.gui.layer.Layer;
25
26public class WMSAdjustAction extends MapMode implements
27 MouseListener, MouseMotionListener{
28
29 private static final long serialVersionUID = 1L;
30 private ArrayList<WMSLayer> modifiedLayers = new ArrayList<WMSLayer>();
31 WMSLayer selectedLayer;
32 private boolean rasterMoved;
33 private EastNorth prevEastNorth;
34 enum Mode { moveXY, moveZ, rotate}
35 private static Mode mode = null;
36 private static EastNorth[] croppedRaster = new EastNorth[5];;
37
38 public WMSAdjustAction(MapFrame mapFrame) {
39 super(tr("Adjust WMS"), "adjustxywms",
40 tr("Adjust the position of the WMS layer (raster images only)"), mapFrame,
41 ImageProvider.getCursor("normal", "move"));
42 }
43
44 @Override public void enterMode() {
45 if (Main.map != null) {
46 selectedLayer = null;
47 WMSLayer possibleLayer = null;
48 int cRasterLayers = 0;
49 for (Layer l : Main.map.mapView.getAllLayers()) {
50 if (l instanceof WMSLayer && ((WMSLayer)l).isRaster()) {
51 possibleLayer = (WMSLayer)l;
52 cRasterLayers++;
53 }
54 }
55 Layer activeLayer = Main.map.mapView.getActiveLayer();
56 if (activeLayer instanceof WMSLayer && ((WMSLayer)activeLayer).isRaster()) {
57 selectedLayer = (WMSLayer)activeLayer;
58 } else if (cRasterLayers == 1) {
59 selectedLayer = possibleLayer;
60 }
61 if (selectedLayer != null) {
62 super.enterMode();
63 Main.map.mapView.addMouseListener(this);
64 Main.map.mapView.addMouseMotionListener(this);
65 rasterMoved = false;
66 selectedLayer.adjustModeEnabled = true;
67 } else {
68 JOptionPane.showMessageDialog(Main.parent,tr("This mode works only if active layer is\n"
69 +"a cadastre \"plan image\" (raster image)"));
70 exitMode();
71 Main.map.selectMapMode((MapMode)Main.map.getDefaultButtonAction());
72 }
73 }
74 }
75
76 @Override public void exitMode() {
77 super.exitMode();
78 Main.map.mapView.removeMouseListener(this);
79 Main.map.mapView.removeMouseMotionListener(this);
80 if (rasterMoved && CacheControl.cacheEnabled) {
81 int reply = JOptionPane.showConfirmDialog(null,
82 "Save the changes in cache ?",
83 "Update cache",
84 JOptionPane.YES_NO_OPTION);
85 if (reply == JOptionPane.OK_OPTION) {
86 saveModifiedLayers();
87 }
88 }
89 modifiedLayers.clear();
90 if (selectedLayer != null) {
91 selectedLayer.adjustModeEnabled = false;
92 selectedLayer = null;
93 }
94 }
95
96 @Override
97 public void mousePressed(MouseEvent e) {
98 if (e.getButton() != MouseEvent.BUTTON1)
99 return;
100 boolean ctrl = (e.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0;
101 // boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
102 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
103 if (shift && !ctrl)
104 mode = Mode.moveZ;
105 else if (shift && ctrl)
106 mode = Mode.rotate;
107 else
108 mode = Mode.moveXY;
109 rasterMoved = true;
110 prevEastNorth = Main.map.mapView.getEastNorth(e.getX(), e.getY());
111 Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
112 }
113
114 @Override public void mouseDragged(MouseEvent e) {
115 EastNorth newEastNorth = Main.map.mapView.getEastNorth(e.getX(),e.getY());
116 if (mode == Mode.rotate) {
117 rotateFrameOnly(prevEastNorth, newEastNorth);
118 } else {
119 if (mode == Mode.moveXY) {
120 displace(prevEastNorth, newEastNorth);
121 } else if (mode == Mode.moveZ) {
122 resize(newEastNorth);
123 }
124 prevEastNorth = newEastNorth;
125 }
126 if (!modifiedLayers.contains(selectedLayer))
127 modifiedLayers.add(selectedLayer);
128 Main.map.mapView.repaint();
129 }
130
131 public static void paintAdjustFrames(Graphics2D g, final MapView mv) {
132 if (mode == Mode.rotate && croppedRaster != null) {
133 g.setColor(Color.red);
134 for (int i=0; i<4; i++)
135 g.drawLine(mv.getPoint(croppedRaster[i]).x,
136 mv.getPoint(croppedRaster[i]).y,
137 mv.getPoint(croppedRaster[i+1]).x,
138 mv.getPoint(croppedRaster[i+1]).y);
139 }
140 }
141
142 private void displace(EastNorth start, EastNorth end) {
143 selectedLayer.displace(end.east()-start.east(), end.north()-start.north());
144 }
145
146 private void resize(EastNorth newEastNorth) {
147 EastNorth center = selectedLayer.getRasterCenter();
148 double dPrev = prevEastNorth.distance(center.east(), center.north());
149 double dNew = newEastNorth.distance(center.east(), center.north());
150 selectedLayer.resize(center, dNew/dPrev);
151 }
152
153 private void rotate(EastNorth start, EastNorth end) {
154 EastNorth pivot = selectedLayer.getRasterCenter();
155 double startAngle = Math.atan2(start.east()-pivot.east(), start.north()-pivot.north());
156 double endAngle = Math.atan2(end.east()-pivot.east(), end.north()-pivot.north());
157 double rotationAngle = endAngle - startAngle;
158 selectedLayer.rotate(pivot, rotationAngle);
159 }
160
161 private void rotateFrameOnly(EastNorth start, EastNorth end) {
162 if (start != null && end != null) {
163 EastNorth pivot = selectedLayer.getRasterCenter();
164 double startAngle = Math.atan2(start.east()-pivot.east(), start.north()-pivot.north());
165 double endAngle = Math.atan2(end.east()-pivot.east(), end.north()-pivot.north());
166 double rotationAngle = endAngle - startAngle;
167 if (selectedLayer.images.get(0).orgCroppedRaster != null) {
168 for (int i=0; i<4; i++) {
169 croppedRaster[i] = selectedLayer.images.get(0).orgCroppedRaster[i].rotate(pivot, rotationAngle);
170 }
171 croppedRaster[4] = croppedRaster[0];
172 }
173 }
174 }
175
176 @Override public void mouseReleased(MouseEvent e) {
177 //Main.map.mapView.repaint();
178 if (mode == Mode.rotate) {
179 EastNorth newEastNorth = Main.map.mapView.getEastNorth(e.getX(),e.getY());
180 rotate(prevEastNorth, newEastNorth);
181 Main.map.mapView.repaint();
182 }
183 Main.map.mapView.setCursor(Cursor.getDefaultCursor());
184 prevEastNorth = null;
185 mode = null;
186 }
187
188 public void mouseEntered(MouseEvent e) {
189 }
190 public void mouseExited(MouseEvent e) {
191 }
192 public void mouseMoved(MouseEvent e) {
193 }
194
195 @Override public void mouseClicked(MouseEvent e) {
196 }
197
198 private void saveModifiedLayers() {
199 for (WMSLayer wmsLayer : modifiedLayers) {
200 wmsLayer.saveNewCache();
201 }
202 }
203}
Note: See TracBrowser for help on using the repository browser.