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 final 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 mouseStart = null; 069 if (ev.getButton() != MouseEvent.BUTTON1 || !dragging) 070 return; 071 072 requestFocusInMapView(); 073 updateKeyModifiers(ev); 074 075 EastNorth en = Main.map.mapView.getEastNorth(ev.getX(), ev.getY()); 076 if (!shift) { 077 playHeadMarker.reposition(en); 078 } else { 079 playHeadMarker.synchronize(en); 080 } 081 mousePos = null; 082 dragging = false; 083 } 084 085 @Override public String getModeHelpText() { 086 return tr("Drag play head and release near track to play audio from there; SHIFT+release to synchronize audio at that point."); 087 } 088}