package org.openstreetmap.josm.plugins.piclayer.actions; import java.awt.Cursor; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Point2D; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.data.coor.EastNorth; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.piclayer.command.TransformCommand; import org.openstreetmap.josm.plugins.piclayer.layer.PicLayerAbstract; import org.openstreetmap.josm.tools.Shortcut; @SuppressWarnings("serial") public abstract class GenericPicTransformAction extends MapMode implements MouseListener, MouseMotionListener { protected boolean isDragging = false; protected PicLayerAbstract currentLayer = null; protected Point2D selectedPoint = null; protected EastNorth prevEastNorth = null; protected Point2D prevMousePoint = null; protected TransformCommand currentCommand = null; private String actionName; public GenericPicTransformAction(String name, String actionName, String iconName, String tooltip, Shortcut shortcut, MapFrame mapFrame, Cursor cursor) { super(name, iconName, tooltip, shortcut, mapFrame, cursor); this.actionName = actionName; } public GenericPicTransformAction(String name, String actionName, String iconName, String tooltip, MapFrame mapFrame, Cursor cursor) { super(name, iconName, tooltip, mapFrame, cursor); this.actionName = actionName; } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); Main.map.mapView.addMouseMotionListener(this); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); Main.map.mapView.removeMouseMotionListener(this); } @Override public void mousePressed(MouseEvent e) { // Start action if (Main.getLayerManager().getActiveLayer() instanceof PicLayerAbstract) { currentLayer = (PicLayerAbstract) Main.getLayerManager().getActiveLayer(); if (currentLayer != null && e.getButton() == MouseEvent.BUTTON1) { requestFocusInMapView(); isDragging = true; prevMousePoint = new Point(e.getPoint()); prevEastNorth = Main.map.mapView.getEastNorth(e.getX(), e.getY()); // try to find and fill selected point if possible selectedPoint = currentLayer.findSelectedPoint(e.getPoint()); currentCommand = new TransformCommand(currentLayer, actionName); } } } @Override public void mouseDragged(MouseEvent e) { // Call action performing if (isDragging && currentLayer != null) { doAction(e); prevMousePoint = new Point(e.getPoint()); prevEastNorth = Main.map.mapView.getEastNorth(e.getX(), e.getY()); Main.map.mapView.repaint(); } } protected abstract void doAction(MouseEvent e); @Override public void mouseReleased(MouseEvent e) { // End action isDragging = false; if (currentCommand != null) currentCommand.addIfChanged(); } @Override public boolean layerIsSupported(Layer l) { return l instanceof PicLayerAbstract; } protected void updateDrawPoints(boolean value) { Layer active = Main.getLayerManager().getActiveLayer(); if (active instanceof PicLayerAbstract) { ((PicLayerAbstract) active).setDrawPoints(value); } Main.map.mapView.repaint(); } }