001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.mapmode;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Cursor;
007import java.awt.Point;
008import java.awt.event.MouseEvent;
009
010import org.openstreetmap.josm.Main;
011import org.openstreetmap.josm.data.coor.EastNorth;
012import org.openstreetmap.josm.gui.layer.markerlayer.PlayHeadMarker;
013
014/**
015 * Singleton marker class to track position of audio.
016 *
017 * @author david.earl
018 *
019 */
020public class PlayHeadDragMode extends MapMode {
021
022    private boolean dragging;
023    private Point mousePos;
024    private Point mouseStart;
025    private transient PlayHeadMarker playHeadMarker;
026
027    /**
028     * Constructs a new {@code PlayHeadDragMode}.
029     * @param m Audio marker
030     */
031    public PlayHeadDragMode(PlayHeadMarker m) {
032        super(tr("Drag play head"), "playheaddrag", tr("Drag play head"), null,
033                Main.map, Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
034        playHeadMarker = m;
035    }
036
037    @Override public void enterMode() {
038        super.enterMode();
039        Main.map.mapView.addMouseListener(this);
040        Main.map.mapView.addMouseMotionListener(this);
041    }
042
043    @Override public void exitMode() {
044        super.exitMode();
045        Main.map.mapView.removeMouseListener(this);
046        Main.map.mapView.removeMouseMotionListener(this);
047    }
048
049    @Override public void mousePressed(MouseEvent ev) {
050        mouseStart = mousePos = ev.getPoint();
051    }
052
053    @Override public void mouseDragged(MouseEvent ev) {
054        if (mouseStart == null || mousePos == null) return;
055        if ((ev.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == 0) return;
056        Point p = ev.getPoint();
057        if (!dragging) {
058            if (p.distance(mouseStart) < 3) return;
059            playHeadMarker.startDrag();
060            dragging = true;
061        }
062        if (p.distance(mousePos) == 0) return;
063        playHeadMarker.drag(Main.map.mapView.getEastNorth(ev.getX(), ev.getY()));
064        mousePos = p;
065    }
066
067    @Override public void mouseReleased(MouseEvent ev) {
068        Point p = ev.getPoint();
069        mouseStart = null;
070        if (ev.getButton() != MouseEvent.BUTTON1 || p == null || !dragging)
071            return;
072
073        requestFocusInMapView();
074        updateKeyModifiers(ev);
075
076        EastNorth en = Main.map.mapView.getEastNorth(ev.getX(), ev.getY());
077        if (!shift) {
078            playHeadMarker.reposition(en);
079        } else {
080            playHeadMarker.synchronize(en);
081        }
082        mousePos = null;
083        dragging = false;
084    }
085
086    @Override public String getModeHelpText() {
087        return tr("Drag play head and release near track to play audio from there; SHIFT+release to synchronize audio at that point.");
088    }
089}