/* ChannelSelectionModelProvider.java created 2007-10-04
*
*/
package org.signalml.app.model.components;
import javax.swing.AbstractSpinnerModel;
import javax.swing.DefaultComboBoxModel;
/** ChannelSelectionModelProvider
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ChannelSelectionModelProvider {
double maxTime;
double minTime;
double currentTime;
double currentLength;
protected String[] labels;
private StartTimeSpinnerModel startTimeSpinnerModel;
protected LengthSpinnerModel lengthSpinnerModel;
private ChannelComboBoxModel channelComboBoxModel;
public ChannelSelectionModelProvider(double maxTime, float samplingFrequency, String[] labels, double currentTime, double currentLength, int currentLabel) {
this.maxTime = maxTime;
this.minTime = Math.round(1000F / samplingFrequency) / 1000F;
this.currentTime = currentTime;
this.currentLength = currentLength;
this.labels = labels;
startTimeSpinnerModel = new StartTimeSpinnerModel();
lengthSpinnerModel = new LengthSpinnerModel();
channelComboBoxModel = new ChannelComboBoxModel();
if (currentLabel >= 0) {
channelComboBoxModel.setSelectedItem(labels[currentLabel]);
}
}
public double getMaxTime() {
return maxTime;
}
public double getCurrentTime() {
return currentTime;
}
public double getCurrentLength() {
return currentLength;
}
public String[] getLabels() {
return labels;
}
public int getCurrentLabel() {
String currentLabel = (String) channelComboBoxModel.getSelectedItem();
if (currentLabel != null) {
for (int i=0; i<labels.length; i++) {
if (labels[i].equals(currentLabel)) {
return i;
}
}
}
return -1;
}
public StartTimeSpinnerModel getStartTimeSpinnerModel() {
return startTimeSpinnerModel;
}
public LengthSpinnerModel getLengthSpinnerModel() {
return lengthSpinnerModel;
}
public ChannelComboBoxModel getChannelComboBoxModel() {
return channelComboBoxModel;
}
protected class StartTimeSpinnerModel extends AbstractSpinnerModel implements BoundedSpinnerModel {
@Override
public Double getNextValue() {
if (currentTime >= maxTime) {
return null;
}
double newTime = Math.min(maxTime, currentTime+1);
return newTime;
}
@Override
public Double getPreviousValue() {
if (currentTime <= 0) {
return null;
}
double newTime = Math.max(0, currentTime-1);
return newTime;
}
@Override
public Double getValue() {
return currentTime;
}
@Override
public void setValue(Object value) throws IllegalArgumentException {
double time = (Double) value;
if (time < 0 || time > maxTime) {
throw new IllegalArgumentException();
}
if (time != currentTime) {
currentTime = time;
fireStateChanged();
lengthSpinnerModel.update();
}
}
@Override
public Double getMaximum() {
return maxTime;
}
@Override
public Double getMinimum() {
return 0.0;
}
}
protected class LengthSpinnerModel extends AbstractSpinnerModel implements BoundedSpinnerModel {
@Override
public Double getNextValue() {
if (currentTime + currentLength >= maxTime) {
return null;
}
double newLength = Math.min(maxTime-currentTime, currentLength+1);
return newLength;
}
@Override
public Double getPreviousValue() {
if (currentLength <= minTime) {
return null;
}
double newLength = Math.max(minTime, currentLength-1);
return newLength;
}
@Override
public Double getValue() {
return currentLength;
}
@Override
public void setValue(Object value) {
double length = (Double) value;
if (length < minTime || length > (maxTime+1-currentTime)) {
throw new IllegalArgumentException();
}
if (length != currentLength) {
currentLength = length;
fireStateChanged();
}
}
public void update() {
if (currentLength > maxTime-currentTime) {
setValue(maxTime-currentTime);
}
fireStateChanged();
}
@Override
public Double getMaximum() {
return maxTime-currentTime;
}
@Override
public Double getMinimum() {
return minTime;
}
}
private class ChannelComboBoxModel extends DefaultComboBoxModel {
private static final long serialVersionUID = 1L;
public ChannelComboBoxModel() {
super(labels);
}
}
}