package maps.gml.editor; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.Color; import java.awt.Point; import java.awt.Insets; import javax.swing.undo.AbstractUndoableEdit; import maps.gml.view.FilledShapeDecorator; import maps.gml.GMLRoad; import maps.gml.GMLBuilding; import maps.gml.GMLSpace; import maps.gml.GMLShape; import maps.gml.GMLCoordinates; /** A tool for deleting shapes. */ public class DeleteShapeTool extends AbstractTool { private static final Color HIGHLIGHT_COLOUR = Color.BLUE; private Listener listener; private FilledShapeDecorator highlight; private GMLShape shape; /** Construct a DeleteShapeTool. @param editor The editor instance. */ public DeleteShapeTool(GMLEditor editor) { super(editor); listener = new Listener(); highlight = new FilledShapeDecorator(HIGHLIGHT_COLOUR, HIGHLIGHT_COLOUR, HIGHLIGHT_COLOUR); } @Override public String getName() { return "Delete shape"; } @Override public void activate() { editor.getViewer().addMouseListener(listener); editor.getViewer().addMouseMotionListener(listener); shape = null; } @Override public void deactivate() { editor.getViewer().removeMouseListener(listener); editor.getViewer().removeMouseMotionListener(listener); editor.getViewer().clearAllBuildingDecorators(); editor.getViewer().clearAllRoadDecorators(); editor.getViewer().clearAllSpaceDecorators(); editor.getViewer().repaint(); } private void highlightShape(GMLShape newShape) { if (shape == newShape) { return; } if (shape != null) { if (shape instanceof GMLBuilding) { editor.getViewer().clearBuildingDecorator((GMLBuilding)shape); } if (shape instanceof GMLRoad) { editor.getViewer().clearRoadDecorator((GMLRoad)shape); } if (shape instanceof GMLSpace) { editor.getViewer().clearSpaceDecorator((GMLSpace)shape); } } shape = newShape; if (shape != null) { if (shape instanceof GMLBuilding) { editor.getViewer().setBuildingDecorator(highlight, (GMLBuilding)shape); } if (shape instanceof GMLRoad) { editor.getViewer().setRoadDecorator(highlight, (GMLRoad)shape); } if (shape instanceof GMLSpace) { editor.getViewer().setSpaceDecorator(highlight, (GMLSpace)shape); } } editor.getViewer().repaint(); } private class Listener implements MouseListener, MouseMotionListener { @Override public void mouseClicked(MouseEvent e) { if (shape != null && e.getButton() == MouseEvent.BUTTON1) { editor.getMap().remove(shape); editor.getViewer().repaint(); editor.setChanged(); editor.addEdit(new DeleteShapeEdit(shape)); } } @Override public void mouseMoved(MouseEvent e) { Point p = fixEventPoint(e.getPoint()); GMLCoordinates c = editor.snap(editor.getViewer().getCoordinatesAtPoint(p.x, p.y)); highlightShape(editor.getMap().findShapeUnder(c.getX(), c.getY())); } @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 DeleteShapeEdit extends AbstractUndoableEdit { private GMLShape shape; public DeleteShapeEdit(GMLShape shape) { this.shape = shape; } @Override public void undo() { super.undo(); editor.getMap().add(shape); editor.getViewer().repaint(); } @Override public void redo() { super.redo(); editor.getMap().remove(shape); editor.getViewer().repaint(); } } }