package maps.gml.editor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Point;
import java.awt.Insets;
import javax.swing.undo.AbstractUndoableEdit;
import maps.gml.GMLNode;
import maps.gml.GMLCoordinates;
/**
A tool for creating nodes.
*/
public class CreateNodeTool extends AbstractTool {
private Listener listener;
/**
Construct a CreateNodeTool.
@param editor The editor instance.
*/
public CreateNodeTool(GMLEditor editor) {
super(editor);
listener = new Listener();
}
@Override
public String getName() {
return "Create node";
}
@Override
public void activate() {
editor.getViewer().addMouseListener(listener);
editor.getViewer().addMouseMotionListener(listener);
}
@Override
public void deactivate() {
editor.getViewer().removeMouseListener(listener);
editor.getViewer().removeMouseMotionListener(listener);
}
private class Listener implements MouseListener, MouseMotionListener {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
Point p = fixEventPoint(e.getPoint());
GMLCoordinates c = editor.snap(editor.getViewer().getCoordinatesAtPoint(p.x, p.y));
GMLNode node = editor.getMap().createNode(c);
editor.setChanged();
editor.addEdit(new CreateNodeEdit(node));
editor.getViewer().repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
private Point fixEventPoint(Point p) {
Insets insets = editor.getViewer().getInsets();
return new Point(p.x - insets.left, p.y - insets.top);
}
}
private class CreateNodeEdit extends AbstractUndoableEdit {
private GMLNode node;
public CreateNodeEdit(GMLNode node) {
this.node = node;
}
@Override
public void undo() {
super.undo();
editor.getMap().removeNode(node);
editor.getViewer().repaint();
}
@Override
public void redo() {
super.redo();
editor.getMap().addNode(node);
editor.getViewer().repaint();
}
}
}