/[schmitzm]/branches/2.0-RC2/src/skrueger/geotools/XMapPaneAction_Zoom.java
ViewVC logotype

Diff of /branches/2.0-RC2/src/skrueger/geotools/XMapPaneAction_Zoom.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

branches/2.0-RC2/src/skrueger/geotools/XMapPaneAction_ZoomIn.java revision 639 by alfonx, Thu Jan 28 16:07:22 2010 UTC branches/2.0-RC2/src/skrueger/geotools/XMapPaneAction_Zoom.java revision 654 by alfonx, Mon Feb 1 18:13:14 2010 UTC
# Line 1  Line 1 
1  package skrueger.geotools;  package skrueger.geotools;
2    
 import java.awt.Color;  
 import java.awt.Graphics;  
3  import java.awt.Point;  import java.awt.Point;
4    import java.awt.Rectangle;
5  import java.awt.event.MouseEvent;  import java.awt.event.MouseEvent;
6  import java.awt.event.MouseWheelEvent;  import java.awt.event.MouseWheelEvent;
7  import java.awt.geom.Point2D;  import java.awt.geom.Point2D;
8    
9  import org.opengis.geometry.DirectPosition;  import org.opengis.geometry.DirectPosition;
10    
11  public class XMapPaneAction_ZoomIn implements XMapPaneAction {  import schmitzm.geotools.JTSUtil;
12            
13          /**  import com.vividsolutions.jts.geom.Coordinate;
14           * Stores last position of a drag event in window coordinates  import com.vividsolutions.jts.geom.Envelope;
15           */  
16          protected Point lastPos;  public abstract class XMapPaneAction_Zoom implements XMapPaneAction {
           
         @Override  
         public void performClick(XMapPane mapPane, MouseEvent ev,  
                         DirectPosition coord) {  
                   
                 mapPane.zoomTo(ev.getPoint(), 1 / 2.);  
         }  
17    
18          @Override          @Override
19          public void performDragging(XMapPane mapPane, MouseEvent ev,          public void performDragging(XMapPane mapPane, MouseEvent ev,
20                          Point dragStartPos, DirectPosition startCoord,                          Point dragStartPos, Point dragLastPos,
21                          DirectPosition endCoord) {                          DirectPosition startCoord, DirectPosition endCoord) {
                   
                 mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos, ev.getPoint());  
         }  
22    
23          @Override                  if (dragLastPos != null)
24          public void performWheel(XMapPane mapPane, MouseWheelEvent wheelEvt,                          mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos,
25                          DirectPosition coord) {                                          dragLastPos);
26    
27                  final int units = wheelEvt.getUnitsToScroll();                  mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos, ev
28                  if (units > 0)                                  .getPoint());
                         mapPane.zoomTo(wheelEvt.getPoint(), 1. + .11 * units);  
                 else  
                         mapPane.zoomTo(wheelEvt.getPoint(), 2. / -units);  
29          }          }
30    
31          @Override          public static class In extends XMapPaneAction_Zoom {
32          public void performDragged(XMapPane mapPane, MouseEvent ev,  
33                          Point dragStartPos, DirectPosition startCoord,                  @Override
34                          DirectPosition endCoord) {                  public void performClick(XMapPane mapPane, MouseEvent ev,
35                  // TODO Auto-generated method stub                                  DirectPosition coord) {
36    
37                            mapPane.zoomTo(ev.getPoint(), 1 / 2.);
38                    }
39    
40                    @Override
41                    public void performWheel(XMapPane mapPane, MouseWheelEvent wheelEvt,
42                                    DirectPosition coord) {
43    
44                    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                    }
72    
73                    @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                    
118                    /**
119                     * @param param is ignored
120                     */
121                    @Override
122                    public void performKeyboard(XMapPane mapPane, Object param) {
123                            mapPane.setMapArea( JTSUtil.expandEnvelope(mapPane.getMapArea(), -.10) );
124                    }
125    
126          }          }
127    
128  }          public static class Out extends XMapPaneAction_Zoom {
129                    
130                    /**
131                     * @param param is ignored
132                     */
133                    @Override
134                    public void performKeyboard(XMapPane mapPane, Object param) {
135                            mapPane.setMapArea( JTSUtil.expandEnvelope(mapPane.getMapArea(), .10) );
136                            }
137    
138                    @Override
139                    public void performClick(XMapPane mapPane, MouseEvent ev,
140                                    DirectPosition coord) {
141    
142                            mapPane.zoomTo(ev.getPoint(), 2.);
143                    }
144    
145                    @Override
146                    public void performWheel(XMapPane mapPane, MouseWheelEvent wheelEvt,
147                                    DirectPosition coord) {
148              int units = wheelEvt.getUnitsToScroll();
149              // Positiver Wert --> Zoom in --> Faktor < 1
150              // Negativer Wert --> Zoom out --> Faktir > 1
151    
152              // 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                    }
176    
177    
178                    @Override
179                    public void performDragged(XMapPane mapPane, MouseEvent ev,
180                                    Point dragStartPos, Point dragLastPos,
181                                    DirectPosition startCoord, DirectPosition endCoord) {
182    
183                            if (dragLastPos != null)
184                                    mapPane.drawRectangle(mapPane.getGraphics(), dragStartPos,
185                                                    dragLastPos);
186    
187                            // 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    
195                            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    }

Legend:
Removed from v.639  
changed lines
  Added in v.654

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26