package net.sharenav.osmToShareNav;
//License: GPL. Copyright 2008 by Jan Peter Stotz
import java.awt.Color;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.JMapController;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.MapArea;
import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
import net.sharenav.osmToShareNav.model.Bounds;
/**
* This code is adapted from the DefaultMapController of the
* org.openstreetmap.gui.jmapviewer package.
* It implements map moving by dragging with the left
* mouse button, region marking by dragging with the right mouse button,
* region selecting with double click and zooming by mouse wheel.
*/
public class SelectionMapController extends JMapController implements
MouseListener, MouseMotionListener, MouseWheelListener {
private static final int MOUSE_BUTTONS_MASK = MouseEvent.BUTTON3_DOWN_MASK
| MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON2_DOWN_MASK;
private Point mLastDragPoint;
private Coordinate mStartSelPoint;
private MapArea mSelRegion;
private boolean mIsMoving = false;
private boolean mIsSelecting = false;
private boolean mMovementEnabled = true;
private boolean mWheelZoomEnabled = true;
private SelectionListener mSelListener;
public SelectionMapController(JMapViewer map, SelectionListener selListener) {
super(map);
mSelListener = selListener;
}
public void mouseDragged(MouseEvent e) {
if (mMovementEnabled && mIsMoving) {
// Is only the selected mouse button pressed?
if ((e.getModifiersEx() & MOUSE_BUTTONS_MASK) == MouseEvent.BUTTON1_DOWN_MASK) {
Point p = e.getPoint();
if (mLastDragPoint != null) {
int diffx = mLastDragPoint.x - p.x;
int diffy = mLastDragPoint.y - p.y;
map.moveMap(diffx, diffy);
}
mLastDragPoint = p;
}
}
if (mIsSelecting) {
if (((e.getModifiersEx() & MOUSE_BUTTONS_MASK) == MouseEvent.BUTTON3_DOWN_MASK) ||
((((e.getModifiersEx() & MOUSE_BUTTONS_MASK) == MouseEvent.BUTTON1_DOWN_MASK))
&& ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) > 0))) {
Coordinate endSelPoint = map.getPosition(e.getPoint());
mSelRegion.setRectangle(mStartSelPoint, endSelPoint);
map.repaint();
}
}
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
Coordinate clickPoint = map.getPosition(e.getPoint());
mSelListener.pointDoubleClicked((float)clickPoint.getLat(),
(float)clickPoint.getLon());
} else if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1 && ((e.getModifiersEx() & (MouseEvent.ALT_DOWN_MASK | MouseEvent.SHIFT_DOWN_MASK)) > 0)){
Coordinate clickPoint = map.getPosition(e.getPoint());
mSelListener.addRouteDestination(clickPoint);
map.addMapMarker(new MapMarkerDot(clickPoint.getLat(), clickPoint.getLon()));
map.repaint();
}
}
public void mousePressed(MouseEvent e) {
if ((e.getButton() == MouseEvent.BUTTON3) ||
((e.getButton() == MouseEvent.BUTTON1)
&& ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) > 0))) {
mIsSelecting = true;
mStartSelPoint = map.getPosition(e.getPoint());
mSelRegion = new MapArea(Color.BLACK, new Color(0x9fafafaf, true),
mStartSelPoint, mStartSelPoint);
map.addMapRectangle(mSelRegion);
} else if (e.getButton() == MouseEvent.BUTTON1) {
mLastDragPoint = null;
mIsMoving = true;
}
}
public void mouseReleased(MouseEvent e) {
mLastDragPoint = null;
mIsMoving = false;
if (mIsSelecting) {
mIsSelecting = false;
Coordinate endSelPoint = map.getPosition(e.getPoint());
Bounds bound = new Bounds();
bound.maxLat = Math.max((float)mStartSelPoint.getLat(), (float)endSelPoint.getLat());
bound.maxLon = Math.max((float)mStartSelPoint.getLon(), (float)endSelPoint.getLon());
bound.minLat = Math.min((float)mStartSelPoint.getLat(), (float)endSelPoint.getLat());
bound.minLon = Math.min((float)mStartSelPoint.getLon(), (float)endSelPoint.getLon());
mSelListener.regionMarked(bound);
map.removeMapRectangle(mSelRegion);
}
}
public void mouseWheelMoved(MouseWheelEvent e) {
if (mWheelZoomEnabled) {
map.setZoom(map.getZoom() - e.getWheelRotation(), e.getPoint());
}
}
public boolean isMovementEnabled() {
return mMovementEnabled;
}
/**
* Enables or disables that the map pane can be moved using the mouse.
*
* @param movementEnabled
*/
public void setMovementEnabled(boolean movementEnabled) {
mMovementEnabled = movementEnabled;
}
public boolean isWheelZoomEnabled() {
return mWheelZoomEnabled;
}
public void setWheelZoomEnabled(boolean wheelZoomEnabled) {
mWheelZoomEnabled = wheelZoomEnabled;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
}