package IBA_J.resources.lib;
import ij.IJ;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.ui.RectangleEdge;
public class CustomChartPanel extends ChartPanel implements MouseListener {
private XYPlotSp parentXYPlotSp;
private JFreeChart chart = null;
private float startValueX;
private boolean pressShift=false;
/**
* constructor
* @param chart
* @param parentXYPlotSp
*/
public CustomChartPanel(JFreeChart chart, XYPlotSp parentXYPlotSp) {
super(chart);
this.chart = chart;
this.parentXYPlotSp=parentXYPlotSp;
}
private boolean isACheckBoxSelected(){
return !parentXYPlotSp.getSelectedCheckBox().isEmpty();
}
/**
* override the mouse pressed method
* Handles a 'mouse pressed' event.
* @param mEvt information about the event.
*/
public void mousePressed(MouseEvent mEvt) {
pressShift = (mEvt.getModifiers() & InputEvent.SHIFT_MASK) != 0;
if (isACheckBoxSelected() && !pressShift) {
setMouseZoomable(false,true); //zoom desactivation
super.mousePressed(mEvt);//call to the initial method
startValueX = getPointInChart(mEvt,false); //to have correspondance with actual values
setMouseZoomable(true,false); //zomm activation
}
else{
super.mousePressed(mEvt); //call to the initial method
}
}
/**
* override the mouse released method
* Handles a 'mouse released' event.
* @param mEvt information about the event.
*/
public void mouseReleased(MouseEvent mEvt) {
if (isACheckBoxSelected() && !pressShift) {
setMouseZoomable(false,true);
super.mouseReleased(mEvt);
float endValueX = getPointInChart(mEvt,true);
setMouseZoomable(true,false);
update(endValueX);
}
else {
super.mouseReleased(mEvt);
}
}
public void update(float endValueX){
JCheckBox checkBoxToChange = parentXYPlotSp.getLastActivatedCheckBox();
if (!checkBoxToChange.isSelected()){
ArrayList<JCheckBox> checkBoxsSelected = parentXYPlotSp.getSelectedCheckBox();
int nbOfCheckBox = checkBoxsSelected.size();
checkBoxToChange = checkBoxsSelected.get(nbOfCheckBox-1);
}
JTextField minField = parentXYPlotSp.getField(checkBoxToChange,"Min");
JTextField maxField = parentXYPlotSp.getField(checkBoxToChange,"Max");
if (startValueX<=endValueX){
minField.setText(String.valueOf(startValueX));
maxField.setText(String.valueOf(endValueX));
}
//parentXYPlotSp.updateLinesOnChart(checkBoxToChange);
}
/**
* Receives chart x,y axis.
* @param mEvt mouse event.
* @param rightIncluded
* @return
*/
public float getPointInChart(MouseEvent mEvt, boolean rightIncluded) {
Insets insets = getInsets();
int mouseX = (int) ((mEvt.getX() - insets.left) / this.getScaleX());
int mouseY = (int) ((mEvt.getY() - insets.top) / this.getScaleY());
Point2D pointOfInterest = this.translateScreenToJava2D(new Point(mouseX, mouseY));
XYPlot plot = (XYPlot) chart.getPlot();
ChartRenderingInfo info = this.getChartRenderingInfo();
Rectangle2D dataArea = info.getPlotInfo().getDataArea();
ValueAxis domainAxis = plot.getDomainAxis();
RectangleEdge domainAxisEdge = plot.getDomainAxisEdge();
ValueAxis rangeAxis = plot.getRangeAxis();
RectangleEdge rangeAxisEdge = plot.getRangeAxisEdge();
double chartX = domainAxis.java2DToValue(pointOfInterest.getX(), dataArea, domainAxisEdge);
double chartY = rangeAxis.java2DToValue(pointOfInterest.getY(), dataArea, rangeAxisEdge);
//here we want only chartX
float valueX=parentXYPlotSp.getRealXValue(chartX,rightIncluded);
return valueX;
}
}