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