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}