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