package com.tlabs.labeltool.gui;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.tlabs.labeltool.IPlayer;
import com.tlabs.labeltool.WavPositionChangeEvent;
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
public class CustomSliderRangeModel extends DefaultBoundedRangeModel implements ChangeListener {
private static final long serialVersionUID = 1L;
private IPlayer _player;
private boolean _userChangedValue;
private boolean _wasPlaying;
private int _sliderPosition;
public CustomSliderRangeModel() {
super();
_player = null;
_userChangedValue = false;
_wasPlaying = false;
_sliderPosition = -1;
}
public CustomSliderRangeModel(int arg0, int arg1, int arg2, int arg3) {
super(arg0, arg1, arg2, arg3);
_player = null;
_userChangedValue = false;
_wasPlaying = false;
_sliderPosition = -1;
}
public CustomSliderRangeModel(IPlayer player) {
super();
setPlayer( player );
_userChangedValue = false;
_wasPlaying = false;
_sliderPosition = -1;
}
public void setPlayer(IPlayer player) {
_player = player;
_player.addChangeListener( this );
setMinimum( 0 );
setMaximum( player.getRecording().getSize() );
super.setValue( player.getCurrentPosition() );
}
/* (non-Javadoc)
* @see javax.swing.DefaultBoundedRangeModel#setValue(int)
*/
@Override
public void setValue(int arg0) {
// only directly called from slider to set new value after user has moved
// System.out.println( "adjust: " + getValueIsAdjusting() + ", setValue: " + arg0 );
if ( getValueIsAdjusting() ) {
if ( !_userChangedValue ) {
_userChangedValue = true;
_wasPlaying = _player.isPlaying();
// hier wird nur Thread gestoppt, aber nicht Button betaetigt
//if ( _wasPlaying ) _player.stopMe();
if ( _wasPlaying ) _player.getRecorder().stopRecordingPlayback();
}
super.setValue(arg0);
_sliderPosition = arg0;
}
}
/* (non-Javadoc)
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
@Override
public void stateChanged(ChangeEvent arg0) {
// message from playback to set new position within audiostream (for display)
if ( arg0 instanceof WavPositionChangeEvent ) {
// System.out.println( "stateChanged: " + ((WavPositionChangeEvent)arg0).getPosition() +
// "," + getValueIsAdjusting() );
super.setValue( ((WavPositionChangeEvent)arg0).getPosition() );
}
// message from slider that it was/is moved
else if ( arg0.getSource() instanceof JSlider ) {
if ( !getValueIsAdjusting() ) {
if ( _userChangedValue ) {
// System.out.println( "stateChanged JSlider: " + getValueIsAdjusting() +
// "," + _userChangedValue + "," + _wasPlaying);
// _player.getRecorder().stopRecordingPlayback();
_userChangedValue = false;
if ( _wasPlaying ) {
// System.out.println( "restart at: " + getValue() );
_wasPlaying = false;
// hier direkt Thread gestoppt
//_player.startMe( getValue() );
_player.getRecorder().play();
}
}
}
}
else {
// System.out.println( "stateChanged ???: " + arg0.getSource() );
}
}
public int getSliderPosition() {
return _sliderPosition;
}
}