// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.mapmode.MapMode;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.gui.MapFrame;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.ChannelDiGraph;
/**
* Diese Klasse wurde aus der Klasse EditGpxMode Klasse des editGPX-Plugins erzeugt und nur an wenigen Stellen an
* die eigenen Bedürfnisse angepaßt
*/
public class JunctionCheckerMapMode extends MapMode implements ActiveLayerChangeListener {
MapFrame frame;
Point pointPressed;
ChannelDiGraphLayer layer;
Rectangle oldRect;
ChannelDiGraph digraph;
private static final long serialVersionUID = 3442408951505263850L;
public JunctionCheckerMapMode(String name, String desc) {
super(name, "junctionchecker.png", desc, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
@Override public void enterMode() {
super.enterMode();
Main.map.mapView.addMouseListener(this);
Main.map.mapView.addMouseMotionListener(this);
Main.getLayerManager().addActiveLayerChangeListener(this);
}
@Override public void exitMode() {
super.exitMode();
Main.map.mapView.removeMouseListener(this);
Main.map.mapView.removeMouseMotionListener(this);
}
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
Layer newLayer = Main.getLayerManager().getActiveLayer();
if (newLayer instanceof ChannelDiGraphLayer) {
layer = (ChannelDiGraphLayer) newLayer;
}
}
public void setFrame(MapFrame newFrame) {
frame = newFrame;
}
@Override public void mousePressed(MouseEvent e) {
pointPressed = new Point(e.getPoint());
}
@Override public void mouseDragged(MouseEvent e) {
if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK) {
//if button1 is hold, draw the rectangle.
paintRect(pointPressed, e.getPoint());
}
}
@Override public void mouseReleased(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
return;
}
requestFocusInMapView();
digraph.ereaseJunctioncandidate(); //um zu verhindern, dass gefundene Kreuzungen/Kandidaten weiterhin weiß gezeichnet werden
Point pointReleased = e.getPoint();
Rectangle r = createRect(pointReleased, pointPressed);
//boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
//boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
if (shift == false) {
digraph.ereaseSelectedChannels();
}
//go through nodes and mark the ones in the selection rect as deleted
if (layer != null && digraph != null) {
LatLon lefttop = Main.map.mapView.getLatLon(r.x + r.width, r.y + r.height);
LatLon rightbottom = Main.map.mapView.getLatLon(r.x, r.y);
digraph.detectSelectedChannels(rightbottom.lon(), rightbottom.lat(), lefttop.lon(), lefttop.lat());
}
oldRect = null;
Main.map.mapView.repaint();
}
/**
* create rectangle out of two given corners
*/
public Rectangle createRect(Point p1, Point p2) {
int x, y, w, h;
if (p1.x == p2.x && p1.y == p2.y) {
//if p1 and p2 same points draw a small rectangle around them
x = p1.x -1;
y = p1.y -1;
w = 3;
h = 3;
} else {
if (p1.x < p2.x) {
x = p1.x;
w = p2.x-p1.x;
} else {
x = p2.x;
w = p1.x-p2.x;
}
if (p1.y < p2.y) {
y = p1.y;
h = p2.y-p1.y;
} else {
y = p2.y;
h = p1.y-p2.y;
}
}
return new Rectangle(x, y, w, h);
}
/**
* Draw a selection rectangle on screen.
*/
private void paintRect(Point p1, Point p2) {
if (frame != null) {
Graphics g = frame.getGraphics();
Rectangle r = oldRect;
if (r != null) {
//overwrite old rct
g.setXORMode(Color.BLACK);
g.setColor(Color.WHITE);
g.drawRect(r.x, r.y, r.width, r.height);
}
g.setXORMode(Color.BLACK);
g.setColor(Color.WHITE);
r = createRect(p1, p2);
g.drawRect(r.x, r.y, r.width, r.height);
oldRect = r;
}
}
public ChannelDiGraph getDigraph() {
return digraph;
}
public void setDigraph(ChannelDiGraph digraph) {
this.digraph = digraph;
}
@Override
public void destroy() {
super.destroy();
Main.getLayerManager().removeActiveLayerChangeListener(this);
}
}