/[schmitzm]/trunk/src/skrueger/geotools/XMapPaneAction_Zoom.java
ViewVC logotype

Annotation of /trunk/src/skrueger/geotools/XMapPaneAction_Zoom.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 654 - (hide annotations)
Mon Feb 1 18:13:14 2010 UTC (15 years ago) by alfonx
Original Path: branches/2.0-RC2/src/skrueger/geotools/XMapPaneAction_Zoom.java
File MIME type: text/plain
File size: 8715 byte(s)
* GP-Cleanup: Moved SelectionTOol to new XMapTool concept.
* GPAV-Feature: Added keyboard stroke support to XMapPane
1 alfonx 639 package skrueger.geotools;
2    
3     import java.awt.Point;
4 alfonx 644 import java.awt.Rectangle;
5 alfonx 639 import java.awt.event.MouseEvent;
6     import java.awt.event.MouseWheelEvent;
7 mojays 650 import java.awt.geom.Point2D;
8 alfonx 639
9     import org.opengis.geometry.DirectPosition;
10    
11 alfonx 654 import schmitzm.geotools.JTSUtil;
12    
13 alfonx 644 import com.vividsolutions.jts.geom.Coordinate;
14     import com.vividsolutions.jts.geom.Envelope;
15    
16 alfonx 646 public abstract class XMapPaneAction_Zoom implements XMapPaneAction {
17 alfonx 644
18 alfonx 649 @Override
19     public void performDragging(XMapPane mapPane, MouseEvent ev,
20     Point dragStartPos, Point dragLastPos,
21     DirectPosition startCoord, DirectPosition endCoord) {
22    
23     if (dragLastPos != null)
24     mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos,
25     dragLastPos);
26    
27     mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos, ev
28     .getPoint());
29     }
30    
31 alfonx 648 public static class In extends XMapPaneAction_Zoom {
32 alfonx 646
33 alfonx 648 @Override
34     public void performClick(XMapPane mapPane, MouseEvent ev,
35     DirectPosition coord) {
36 alfonx 644
37 alfonx 648 mapPane.zoomTo(ev.getPoint(), 1 / 2.);
38     }
39 alfonx 639
40 alfonx 648 @Override
41     public void performWheel(XMapPane mapPane, MouseWheelEvent wheelEvt,
42     DirectPosition coord) {
43 alfonx 639
44 mojays 650 int units = wheelEvt.getUnitsToScroll();
45     // Positiver Wert --> Zoom in --> Faktor < 1
46     // Negativer Wert --> Zoom out --> Faktir > 1
47    
48     // SK: 9.9.2007 zoom jetzt wie bei GoogleEarth
49     double zFactor = units > 0 ? 1.3 : 1 / 1.3;
50     // vorher double zFactor = units > 0 ? 1/1.2 : 1.2;
51    
52     // Fenster-Koordinaten zu Karten-Koordinaten transformieren
53     Point2D mapCoord = XMapPane.getMapCoordinatesFromEvent(wheelEvt);
54     // Relative Position des Mauszeigers zum Kartenausschnitt
55     // -> Nach Zoom soll dieselbe Kartenposition unterhalb des Mauszeigers
56     // erscheinen, wie vor dem Zoom
57     double relX = (mapCoord.getX() - mapPane.getMapArea().getMinX())
58     / mapPane.getMapArea().getWidth();
59     double relY = (mapCoord.getY() - mapPane.getMapArea().getMinY())
60     / mapPane.getMapArea().getHeight();
61    
62     // Neuen Karten-Ausschnitt berechnen
63     Coordinate ll = new Coordinate(mapCoord.getX()
64     - mapPane.getMapArea().getWidth() * relX * zFactor, mapCoord.getY()
65     - mapPane.getMapArea().getHeight() * relY * zFactor);
66     Coordinate ur = new Coordinate(mapCoord.getX()
67     + mapPane.getMapArea().getWidth() * (1 - relX) * zFactor, mapCoord
68     .getY()
69     + mapPane.getMapArea().getHeight() * (1 - relY) * zFactor);
70     mapPane.setMapArea(new Envelope(ll, ur));
71 alfonx 648 }
72 alfonx 639
73 alfonx 648 @Override
74     public void performDragged(XMapPane mapPane, MouseEvent ev,
75     Point dragStartPos, Point dragLastPos,
76     DirectPosition startCoord, DirectPosition endCoord) {
77    
78     if (dragLastPos != null)
79     mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos,
80     dragLastPos);
81    
82     // If this is similar to a click, let mouseClicked handle it!
83     if ((Math.abs(dragStartPos.x - ev.getPoint().x) * Math.abs(ev
84     .getPoint().y
85     - dragStartPos.y)) < 160) {
86     // performClick(mapPane, ev, coord)
87     return;
88     }
89    
90     final Rectangle bounds = mapPane.getBounds();
91    
92     Envelope mapArea = mapPane.getMapArea();
93    
94     // Replace with transform and translate
95     final double mapWidth = mapArea.getWidth();
96     final double mapHeight = mapArea.getHeight();
97    
98     final double startX = ((dragStartPos.x * mapWidth) / (double) bounds.width)
99     + mapArea.getMinX();
100     final double startY = (((bounds.getHeight() - dragStartPos.y) * mapHeight) / (double) bounds.height)
101     + mapArea.getMinY();
102     final double endX = ((ev.getPoint().x * mapWidth) / (double) bounds.width)
103     + mapArea.getMinX();
104     final double endY = (((bounds.getHeight() - ev.getPoint().y) * mapHeight) / (double) bounds.height)
105     + mapArea.getMinY();
106    
107     final double left = Math.min(startX, endX);
108     final double right = Math.max(startX, endX);
109     final double bottom = Math.min(startY, endY);
110     final double top = Math.max(startY, endY);
111     final Coordinate ll = new Coordinate(left, bottom);
112     final Coordinate ur = new Coordinate(right, top);
113    
114     mapPane.setMapArea(new Envelope(ll, ur));
115    
116     }
117 alfonx 653
118     /**
119     * @param param is ignored
120     */
121     @Override
122     public void performKeyboard(XMapPane mapPane, Object param) {
123 alfonx 654 mapPane.setMapArea( JTSUtil.expandEnvelope(mapPane.getMapArea(), -.10) );
124 alfonx 653 }
125    
126 alfonx 644 }
127    
128 alfonx 648 public static class Out extends XMapPaneAction_Zoom {
129 alfonx 653
130     /**
131     * @param param is ignored
132     */
133 alfonx 648 @Override
134 alfonx 653 public void performKeyboard(XMapPane mapPane, Object param) {
135 alfonx 654 mapPane.setMapArea( JTSUtil.expandEnvelope(mapPane.getMapArea(), .10) );
136     }
137 alfonx 653
138     @Override
139 alfonx 648 public void performClick(XMapPane mapPane, MouseEvent ev,
140     DirectPosition coord) {
141 alfonx 644
142 alfonx 648 mapPane.zoomTo(ev.getPoint(), 2.);
143 alfonx 644 }
144    
145 alfonx 648 @Override
146     public void performWheel(XMapPane mapPane, MouseWheelEvent wheelEvt,
147     DirectPosition coord) {
148 mojays 650 int units = wheelEvt.getUnitsToScroll();
149     // Positiver Wert --> Zoom in --> Faktor < 1
150     // Negativer Wert --> Zoom out --> Faktir > 1
151 alfonx 644
152 mojays 650 // SK: 9.9.2007 zoom jetzt wie bei GoogleEarth
153     double zFactor = units > 0 ? 1.3 : 1 / 1.3;
154     // vorher double zFactor = units > 0 ? 1/1.2 : 1.2;
155    
156     // Fenster-Koordinaten zu Karten-Koordinaten transformieren
157     Point2D mapCoord = XMapPane.getMapCoordinatesFromEvent(wheelEvt);
158     // Relative Position des Mauszeigers zum Kartenausschnitt
159     // -> Nach Zoom soll dieselbe Kartenposition unterhalb des Mauszeigers
160     // erscheinen, wie vor dem Zoom
161     double relX = (mapCoord.getX() - mapPane.getMapArea().getMinX())
162     / mapPane.getMapArea().getWidth();
163     double relY = (mapCoord.getY() - mapPane.getMapArea().getMinY())
164     / mapPane.getMapArea().getHeight();
165    
166     // Neuen Karten-Ausschnitt berechnen
167     Coordinate ll = new Coordinate(mapCoord.getX()
168     - mapPane.getMapArea().getWidth() * relX * zFactor, mapCoord.getY()
169     - mapPane.getMapArea().getHeight() * relY * zFactor);
170     Coordinate ur = new Coordinate(mapCoord.getX()
171     + mapPane.getMapArea().getWidth() * (1 - relX) * zFactor, mapCoord
172     .getY()
173     + mapPane.getMapArea().getHeight() * (1 - relY) * zFactor);
174     mapPane.setMapArea(new Envelope(ll, ur));
175 alfonx 648 }
176 alfonx 644
177    
178 alfonx 648 @Override
179     public void performDragged(XMapPane mapPane, MouseEvent ev,
180     Point dragStartPos, Point dragLastPos,
181     DirectPosition startCoord, DirectPosition endCoord) {
182 alfonx 644
183 alfonx 648 if (dragLastPos != null)
184     mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos,
185     dragLastPos);
186 alfonx 639
187 alfonx 648 // If this is similar to a click, let mouseClicked handle it!
188     if ((Math.abs(dragStartPos.x - ev.getPoint().x) * Math.abs(ev
189     .getPoint().y
190     - dragStartPos.y)) < 160) {
191     // performClick(mapPane, ev, coord)
192     return;
193     }
194 alfonx 646
195 alfonx 648 final Rectangle bounds = mapPane.getBounds();
196    
197     Envelope mapArea = mapPane.getMapArea();
198    
199     // Replace with transform and translate
200     final double mapWidth = mapArea.getWidth();
201     final double mapHeight = mapArea.getHeight();
202    
203     final double startX = ((dragStartPos.x * mapWidth) / (double) bounds.width)
204     + mapArea.getMinX();
205     final double startY = (((bounds.getHeight() - dragStartPos.y) * mapHeight) / (double) bounds.height)
206     + mapArea.getMinY();
207     final double endX = ((ev.getPoint().x * mapWidth) / (double) bounds.width)
208     + mapArea.getMinX();
209     final double endY = (((bounds.getHeight() - ev.getPoint().y) * mapHeight) / (double) bounds.height)
210     + mapArea.getMinY();
211    
212     // make the dragged rectangle in screen coords the new map size?
213     final double left = Math.min(startX, endX);
214     final double right = Math.max(startX, endX);
215     final double bottom = Math.min(startY, endY);
216     final double top = Math.max(startY, endY);
217     final double nWidth = (mapWidth * mapWidth) / (right - left);
218     final double nHeight = (mapHeight * mapHeight) / (top - bottom);
219     final double deltaX1 = left - mapArea.getMinX();
220     final double nDeltaX1 = (deltaX1 * nWidth) / mapWidth;
221     final double deltaY1 = bottom - mapArea.getMinY();
222     final double nDeltaY1 = (deltaY1 * nHeight) / mapHeight;
223     final Coordinate ll = new Coordinate(mapArea.getMinX() - nDeltaX1,
224     mapArea.getMinY() - nDeltaY1);
225     final double deltaX2 = mapArea.getMaxX() - right;
226     final double nDeltaX2 = (deltaX2 * nWidth) / mapWidth;
227     final double deltaY2 = mapArea.getMaxY() - top;
228     final double nDeltaY2 = (deltaY2 * nHeight) / mapHeight;
229     final Coordinate ur = new Coordinate(mapArea.getMaxX() + nDeltaX2,
230     mapArea.getMaxY() + nDeltaY2);
231    
232     mapPane.setMapArea(new Envelope(ll, ur));
233    
234     }
235     }
236 alfonx 646 }

Properties

Name Value
svn:eol-style native
svn:keywords Id URL
svn:mime-type text/plain

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26