Add zoom controls to mapview drawing, avoid triggering drawingclick events with zoom control.
This commit is contained in:
		
							parent
							
								
									dede97bc68
								
							
						
					
					
						commit
						f56d735d90
					
				
					 3 changed files with 82 additions and 21 deletions
				
			
		|  | @ -9,7 +9,6 @@ import java.awt.event.ActionEvent; | |||
| import java.awt.event.ActionListener; | ||||
| import java.awt.event.MouseAdapter; | ||||
| import java.awt.event.MouseEvent; | ||||
| import java.awt.event.MouseListener; | ||||
| import java.awt.geom.AffineTransform; | ||||
| import java.awt.geom.NoninvertibleTransformException; | ||||
| import java.awt.geom.Point2D; | ||||
|  | @ -17,10 +16,8 @@ import java.awt.image.BufferedImage; | |||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.IdentityHashMap; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import javax.swing.JPanel; | ||||
| 
 | ||||
|  | @ -288,7 +285,7 @@ public class BasicDrawing extends JPanel implements Drawing { | |||
|     private List<BasicOverlay> overlays = Collections.synchronizedList(new ArrayList<BasicOverlay>()); | ||||
| 
 | ||||
|     // Mapping DrawingClickListener -> MouseEventListener | ||||
|     private Map<DrawingClickListener, MouseListener> listenerMapping = new IdentityHashMap<>(); | ||||
|     private List<DrawingClickListener> drawingClickListeners = new ArrayList<>(); | ||||
| 
 | ||||
|     // Zoom controls | ||||
|     private MapZoomControls zoomControls; | ||||
|  | @ -319,6 +316,25 @@ public class BasicDrawing extends JPanel implements Drawing { | |||
|         catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| 
 | ||||
|         this.addMouseListener(new MouseAdapter() { | ||||
|             @Override | ||||
|             public void mouseClicked(MouseEvent evt) { | ||||
|                 if (zoomControls.contains(evt.getPoint())) { | ||||
|                     return; | ||||
|                 } | ||||
|                 Point lonlat = null; | ||||
|                 try { | ||||
|                     lonlat = getLongitudeLatitude(evt); | ||||
|                 } | ||||
|                 catch (NoninvertibleTransformException e) { | ||||
|                     return; | ||||
|                 } | ||||
|                 for (DrawingClickListener listener: drawingClickListeners) { | ||||
|                     listener.mouseClicked(lonlat); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -345,7 +361,7 @@ public class BasicDrawing extends JPanel implements Drawing { | |||
|         if (this.zoomControls != null) { | ||||
|             this.zoomControls.setZoomLevel(this.zoomAndPanListener.getZoomLevel()); | ||||
|             this.zoomControls.draw(g, getWidth() - this.zoomControls.getWidth() - 20, | ||||
|                     this.getHeight() - this.zoomControls.getHeight() - 20, this); | ||||
|                     this.getHeight() - this.zoomControls.getHeight() - 10, this); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|  | @ -392,24 +408,12 @@ public class BasicDrawing extends JPanel implements Drawing { | |||
| 
 | ||||
|     @Override | ||||
|     public void addDrawingClickListener(DrawingClickListener listener) { | ||||
|         MouseListener mListener = new MouseAdapter() { | ||||
|             @Override | ||||
|             public void mouseClicked(MouseEvent evt) { | ||||
|                 try { | ||||
|                     listener.mouseClicked(getLongitudeLatitude(evt)); | ||||
|                 } | ||||
|                 catch (NoninvertibleTransformException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|         this.addMouseListener(mListener); | ||||
|         this.listenerMapping.put(listener, mListener); | ||||
|         this.drawingClickListeners.add(listener); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void removeDrawingClickListener(DrawingClickListener listener) { | ||||
|         this.removeMouseListener(this.listenerMapping.get(listener)); | ||||
|         this.drawingClickListeners.remove(listener); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  |  | |||
|  | @ -1,7 +1,12 @@ | |||
| package org.insa.graphics.drawing.components; | ||||
| 
 | ||||
| import java.awt.Color; | ||||
| import java.awt.Graphics; | ||||
| import java.awt.Graphics2D; | ||||
| import java.awt.event.ActionEvent; | ||||
| import java.awt.event.ActionListener; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
|  | @ -207,6 +212,9 @@ public class MapViewDrawing extends MapView implements Drawing { | |||
|     // Tile size | ||||
|     private int tileSize; | ||||
| 
 | ||||
|     // Zoom controls | ||||
|     private MapZoomControls zoomControls; | ||||
| 
 | ||||
|     public MapViewDrawing() { | ||||
|         super(); | ||||
|         Parameters.NUMBER_OF_THREADS = 2; | ||||
|  | @ -219,6 +227,37 @@ public class MapViewDrawing extends MapView implements Drawing { | |||
| 
 | ||||
|         this.setZoomLevelMin((byte) 0); | ||||
|         this.setZoomLevelMax((byte) 20); | ||||
| 
 | ||||
|         // Try... | ||||
|         try { | ||||
|             this.zoomControls = new MapZoomControls(this, 0, 0, 20); | ||||
|             this.zoomControls.addZoomInListener(new ActionListener() { | ||||
|                 @Override | ||||
|                 public void actionPerformed(ActionEvent e) { | ||||
|                     getModel().mapViewPosition.zoomIn(); | ||||
|                 } | ||||
|             }); | ||||
|             this.zoomControls.addZoomOutListener(new ActionListener() { | ||||
|                 @Override | ||||
|                 public void actionPerformed(ActionEvent e) { | ||||
|                     getModel().mapViewPosition.zoomOut(); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void paint(Graphics graphics) { | ||||
|         super.paint(graphics); | ||||
|         if (this.zoomControls != null) { | ||||
|             this.zoomControls.setZoomLevel(this.getModel().mapViewPosition.getZoomLevel()); | ||||
|             this.zoomControls.draw((Graphics2D) graphics, getWidth() - this.zoomControls.getWidth() - 20, | ||||
|                     this.getHeight() - this.zoomControls.getHeight() - 10, this); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     protected LatLong convertPoint(Point point) { | ||||
|  | @ -232,6 +271,9 @@ public class MapViewDrawing extends MapView implements Drawing { | |||
|             @Override | ||||
|             public boolean onTap(LatLong tapLatLong, org.mapsforge.core.model.Point layerXY, | ||||
|                     org.mapsforge.core.model.Point tapXY) { | ||||
|                 if (zoomControls.contains(new java.awt.Point((int) tapXY.x, (int) tapXY.y))) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 Point pt = new Point(tapLatLong.getLongitude(), tapLatLong.getLatitude()); | ||||
|                 for (DrawingClickListener listener: MapViewDrawing.this.drawingClickListeners) { | ||||
|                     listener.mouseClicked(pt); | ||||
|  | @ -301,6 +343,7 @@ public class MapViewDrawing extends MapView implements Drawing { | |||
|             byte zoomLevel = LatLongUtils.zoomForBounds(model.mapViewDimension.getDimension(), boundingBox, | ||||
|                     model.displayModel.getTileSize()); | ||||
|             model.mapViewPosition.setMapPosition(new MapPosition(boundingBox.getCenterPoint(), zoomLevel)); | ||||
|             zoomControls.setZoomLevel(zoomLevel); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import java.awt.Color; | |||
| import java.awt.Component; | ||||
| import java.awt.Graphics2D; | ||||
| import java.awt.Image; | ||||
| import java.awt.Point; | ||||
| import java.awt.Rectangle; | ||||
| import java.awt.event.ActionEvent; | ||||
| import java.awt.event.ActionListener; | ||||
|  | @ -27,10 +28,10 @@ public class MapZoomControls { | |||
|     private static final String ZOOM_OUT_ACTION_NAME = "ZoomOut"; | ||||
| 
 | ||||
|     // Height | ||||
|     private static final int DEFAULT_HEIGHT = 18; | ||||
|     private static final int DEFAULT_HEIGHT = 20; | ||||
| 
 | ||||
|     // Default spacing between mark | ||||
|     private static final int DEFAULT_SPACING = 3; | ||||
|     private static final int DEFAULT_SPACING = 4; | ||||
| 
 | ||||
|     // Zoom ticks ratio from height (not the current one) | ||||
|     private static final double ZOOM_TICK_HEIGHT_RATIO = 0.3; | ||||
|  | @ -138,6 +139,19 @@ public class MapZoomControls { | |||
|         return DEFAULT_HEIGHT + 2 + (this.maxLevel - this.minLevel) * DEFAULT_SPACING + 1 + 2 + DEFAULT_HEIGHT; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if a point is contained inside an element of this zoom controls, useful | ||||
|      * to avoid spurious click listeners. | ||||
|      *  | ||||
|      * @param point | ||||
|      *  | ||||
|      * @return true if the given point correspond to an element of this zoom | ||||
|      *         controls. | ||||
|      */ | ||||
|     public boolean contains(Point point) { | ||||
|         return zoomInRect.contains(point) || zoomOutRect.contains(point); | ||||
|     } | ||||
| 
 | ||||
|     protected void draw(Graphics2D g, int xoffset, int yoffset, ImageObserver observer) { | ||||
| 
 | ||||
|         int height = getHeight(); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue