package org.esa.snap.rcp.spectrum;
import com.bc.ceres.glayer.support.ImageLayer;
import org.esa.snap.ui.PixelPositionListener;
import javax.swing.SwingWorker;
import java.awt.event.MouseEvent;
public class CursorSpectrumPixelPositionListener implements PixelPositionListener {
private final SpectrumTopComponent topComponent;
private final WorkerChain workerChain;
private final WorkerChainSupport support;
public CursorSpectrumPixelPositionListener(SpectrumTopComponent topComponent) {
this.topComponent = topComponent;
workerChain = new WorkerChain();
support = new WorkerChainSupport() {
@Override
public void removeWorkerAndStartNext(SwingWorker worker) {
workerChain.removeCurrentWorkerAndExecuteNext(worker);
}
};
}
@Override
public void pixelPosChanged(ImageLayer imageLayer,
int pixelX,
int pixelY,
int currentLevel,
boolean pixelPosValid,
MouseEvent e) {
CursorSpectraUpdater worker = new CursorSpectraUpdater(pixelPosValid, pixelX, pixelY, currentLevel, e.isShiftDown(), support);
workerChain.setOrExecuteNextWorker(worker, false);
}
@Override
public void pixelPosNotAvailable() {
CursorSpectraRemover worker = new CursorSpectraRemover(support);
workerChain.setOrExecuteNextWorker(worker, false);
}
private boolean shouldUpdateCursorPosition() {
return topComponent.isVisible() && topComponent.isShowingCursorSpectrum();
}
private class CursorSpectraRemover extends SwingWorker<Void, Void> {
private final WorkerChainSupport support;
CursorSpectraRemover(WorkerChainSupport support) {
this.support = support;
}
@Override
protected Void doInBackground() throws Exception {
if (shouldUpdateCursorPosition()) {
topComponent.removeCursorSpectraFromDataset();
}
return null;
}
@Override
protected void done() {
topComponent.updateChart();
support.removeWorkerAndStartNext(this);
}
}
private class CursorSpectraUpdater extends SwingWorker<Void, Void> {
private final boolean pixelPosValid;
private final int pixelX;
private final int pixelY;
private final int currentLevel;
private final boolean adjustAxes;
private final WorkerChainSupport support;
CursorSpectraUpdater(boolean pixelPosValid, int pixelX, int pixelY, int currentLevel, boolean adjustAxes,
WorkerChainSupport support) {
this.pixelPosValid = pixelPosValid;
this.pixelX = pixelX;
this.pixelY = pixelY;
this.currentLevel = currentLevel;
this.adjustAxes = adjustAxes;
this.support = support;
}
@Override
protected Void doInBackground() throws Exception {
if (shouldUpdateCursorPosition()) {
Waiter waiter = new Waiter();
waiter.execute();
topComponent.updateData(pixelX, pixelY, currentLevel, pixelPosValid);
waiter.cancel(true);
}
return null;
}
@Override
protected void done() {
try {
topComponent.updateChart(adjustAxes);
} finally {
support.removeWorkerAndStartNext(this);
}
}
}
private class Waiter extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
Thread.sleep(1000);
return null;
}
@Override
protected void done() {
topComponent.setPrepareForUpdateMessage();
}
}
//todo copied (and changed very slightly) from time-series-tool: Move to BEAM or Ceres
static interface WorkerChainSupport {
void removeWorkerAndStartNext(SwingWorker worker);
}
}