package com.isti.traceview.transformations.ppm;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.event.ChartChangeEvent;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.XYDataset;
import com.isti.traceview.common.TimeInterval;
import com.isti.traceview.common.TraceViewChartPanel;
import com.isti.traceview.filters.IFilter;
/**
* Dialog to view PPM results.
*
* @author Max Kokoulin
*/
class ViewPPM extends JDialog implements PropertyChangeListener {
private static final long serialVersionUID = 1L;
private JOptionPane optionPane;
private static PPMPolarItemRenderer renderer = new PPMPolarItemRenderer();
private static TraceViewChartPanel cp = null;
private static JPanel ret = null;
private double altAngle = 180;
ViewPPM(Frame owner, XYDataset dataset, TimeInterval ti, String annotation, IFilter filter) {
super(owner, "Particle Motion", true);
Object[] options = { "Close", "Print", "Enter Angle", "+1", "+5", "+30", "-1", "-5", "-30" };
// Create the JOptionPane.
optionPane = new JOptionPane(createChartPanel(dataset, ti, annotation, filter), JOptionPane.PLAIN_MESSAGE,
JOptionPane.CLOSED_OPTION, null, options, options[0]);
// Make this dialog display it.
setContentPane(optionPane);
optionPane.addPropertyChangeListener(this);
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
/*
* Instead of directly closing the window, we're going to change
* the JOptionPane's value property.
*/
optionPane.setValue("Close");
}
});
pack();
setLocationRelativeTo(owner);
setVisible(true);
}
@Override
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) {
Object value = optionPane.getValue();
optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
// If you were going to check something
// before closing the window, you'd do
// it here.
if (value.equals("Close")) {
setVisible(false);
dispose();
} else if (value.equals("Print")) {
cp.createChartPrintJob();
} else if (value.equals("Enter Angle")) {
double angle = getAngle();
if(angle >= 180)
altAngle = angle - 180;
else
altAngle = angle + 180;
if (angle != Double.POSITIVE_INFINITY) {
renderer.setRulerAngle(angle);
cp.setRefreshBuffer(true);
cp.repaint();
}
} else if (value.equals("+1")) {
renderer.setRulerAngle(renderer.getRulerAngle() + 1);
altAngle = altAngle + 1;
cp.setRefreshBuffer(true);
cp.repaint();
} else if (value.equals("+5")) {
renderer.setRulerAngle(renderer.getRulerAngle() + 5);
cp.setRefreshBuffer(true);
altAngle = altAngle + 5;
cp.repaint();
} else if (value.equals("+30")) {
renderer.setRulerAngle(renderer.getRulerAngle() + 30);
cp.setRefreshBuffer(true);
altAngle = altAngle + 30;
cp.repaint();
} else if (value.equals("-1")) {
renderer.setRulerAngle(renderer.getRulerAngle() - 1);
cp.setRefreshBuffer(true);
altAngle = altAngle - 1;
cp.repaint();
} else if (value.equals("-5")) {
renderer.setRulerAngle(renderer.getRulerAngle() - 5);
cp.setRefreshBuffer(true);
altAngle = altAngle - 5;
cp.repaint();
} else if (value.equals("-30")) {
renderer.setRulerAngle(renderer.getRulerAngle() - 30);
cp.setRefreshBuffer(true);
altAngle = altAngle - 30;
cp.repaint();
}
if(renderer.getRulerAngle() < 0)
renderer.setRulerAngle(renderer.getRulerAngle() + 360);
else if (renderer.getRulerAngle() >= 360)
renderer.setRulerAngle(renderer.getRulerAngle() - 360);
if(altAngle < 0)
altAngle = altAngle + 360;
else if (altAngle >= 360)
altAngle = altAngle - 360;
TextTitle subTitle = new TextTitle("Angle: " + renderer.getRulerAngle() + "\u00b0/" + altAngle + "\u00b0", ret.getFont());
cp.getChart().removeSubtitle(cp.getChart().getSubtitle(0));
cp.getChart().addSubtitle(subTitle);
cp.chartChanged(new ChartChangeEvent(cp.getChart()));
}
}
private double getAngle() {
AngleInputDialog ai = new AngleInputDialog(this, renderer.getRulerAngle());
double ret = ai.getAngle();
return ret;
}
private static JPanel createChartPanel(XYDataset dataset, TimeInterval ti, String annotation, IFilter filter) {
ret = new JPanel();
BoxLayout retLayout = new BoxLayout(ret, javax.swing.BoxLayout.Y_AXIS);
ret.setLayout(retLayout);
JFreeChart chart = ChartFactory.createPolarChart(null, // title
dataset, // dataset
false, // legend
true, // tooltips
false// include URLs
);
String filterName = "None";
if (filter != null) {
filterName = filter.getName();
}
TextTitle title = new TextTitle("Start time: "
+ TimeInterval.formatDate(ti.getStartTime(), TimeInterval.DateFormatType.DATE_FORMAT_NORMAL)
+ ", Duration: " + ti.convert() + ". Filter: " + filterName + ".", ret.getFont());
chart.setTitle(title);
TextTitle subTitle = new TextTitle("Angle: 0\u00b0/180\u00b0", ret.getFont());
chart.addSubtitle(0, subTitle);
PolarPlot plot = (PolarPlot) chart.getPlot();
plot.setRenderer(renderer);
renderer.setRulerAngle(0.);
plot.addCornerTextItem(annotation);
cp = new TraceViewChartPanel(chart, true);
ret.add(cp);
return ret;
}
}