package pl.edu.fuw.fid.signalanalysis.waveform;
import javafx.collections.FXCollections;
import javafx.event.EventHandler;
import javafx.scene.chart.Axis;
import javafx.scene.chart.XYChart;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
/**
* Subclass of XYChart (from JFreeChart) adapted to display time-frequency data
* as an image laid over an empty chart.
*
* @author ptr@mimuw.edu.pl
*/
public class ImageChart extends XYChart<Number, Number> {
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(ImageChart.class);
private final ImageView imageView = new ImageView();
private final ImageRenderer renderer;
private final Runnable onResize;
public ImageChart(Axis<Number> xAxis, Axis<Number> yAxis, ImageRenderer renderer, Runnable onResize) {
super(xAxis, yAxis);
this.renderer = renderer;
setData(FXCollections.<Series<Number,Number>>emptyObservableList());
this.imageView.setPreserveRatio(false);
getPlotChildren().add(this.imageView);
this.imageView.relocate(0, 0);
this.onResize = onResize;
}
// must be called from JavaFX thread
public void hideImage() {
imageView.setOpacity(0.0);
}
// must be called from JavaFX thread
public void showImage(Image image) {
imageView.setImage(image);
imageView.setOpacity(1.0);
}
public TimeFrequency getTimeFrequency(int x, int y) {
return renderer.getTimeFrequency(x, y);
}
@Override
protected void dataItemAdded(Series series, int itemIndex, Data item) {
throw new UnsupportedOperationException("this operation is not supported");
}
@Override
protected void dataItemRemoved(Data item, Series series) {
throw new UnsupportedOperationException("this operation is not supported");
}
@Override
protected void layoutPlotChildren() {
imageView.setFitWidth(getXAxis().getWidth());
imageView.setFitHeight(getYAxis().getHeight());
onResize.run();
}
@Override
protected void dataItemChanged(Data item) {
throw new UnsupportedOperationException("this operation is not supported");
}
@Override
protected void seriesAdded(Series series, int seriesIndex) {
throw new UnsupportedOperationException("this operation is not supported");
}
@Override
protected void seriesRemoved(Series series) {
throw new UnsupportedOperationException("this operation is not supported");
}
public void setOnCursorOnChart(EventHandler<? super MouseEvent> value) {
imageView.setOnMouseMoved(value);
}
public void setOnCursorOffChart(EventHandler<? super MouseEvent> value) {
imageView.setOnMouseExited(value);
}
}