/*
Copyright 2013 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.util.media.chart;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.io.*;
import java.awt.image.*;
import sim.util.gui.*;
import sim.util.gui.Utilities;
import sim.util.*;
import sim.display.*;
import sim.util.media.*;
// From JFreeChart
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.event.*;
import org.jfree.chart.plot.*;
import org.jfree.data.general.*;
import org.jfree.chart.title.*;
import org.jfree.data.xy.*;
// from iText (www.lowagie.com/iText/)
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
/* // looks like we'll have to move to these soon
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
*/
/**
An abstract subclass of ChartGenerator for charts which involve X-Y data, such
as Time Series, Histograms, and Scatter Plots.
*/
public abstract class XYChartGenerator extends ChartGenerator
{
/** The global attributes domain axis field. */
PropertyField xLabel;
/** The global attributes range axis field. */
PropertyField yLabel;
/** The global attributes logarithmic range axis check box. */
JCheckBox yLog;
/** The global attributes logarithmic domain axis check box. */
JCheckBox xLog;
public void setXAxisLogScaled(boolean isLogScaled){xLog.setSelected(isLogScaled);}
public boolean isXAxisLogScaled(){return xLog.isSelected();}
public void setYAxisLogScaled(boolean isLogScaled){yLog.setSelected(isLogScaled);}
public boolean isYAxisLogScaled(){return yLog.isSelected();}
public Dataset getSeriesDataset() { return ((XYPlot)(chart.getPlot())).getDataset(); }
public void setSeriesDataset(Dataset obj) { ((XYPlot)(chart.getPlot())).setDataset((XYDataset)obj); }
/** Assumes that the underlying Dataset is an XYDataset. Override this for other datasets. */
public int getSeriesCount()
{
return ((XYDataset)getSeriesDataset()).getSeriesCount();
}
/** @deprecated
Sets the name of the Range Axis label -- usually this is the Y axis. */
public void setRangeAxisLabel(String val) { setYAxisLabel(val); }
/** Sets the name of the Y Axis label. */
public void setYAxisLabel(String val)
{
XYPlot xyplot = (XYPlot)(chart.getPlot());
xyplot.getRangeAxis().setLabel(val);
xyplot.axisChanged(new AxisChangeEvent(xyplot.getRangeAxis()));
yLabel.setValue(val);
}
/** @deprecated
Returns the name of the Range Axis Label -- usually this is the Y axis. */
public String getRangeAxisLabel() { return getYAxisLabel(); }
/** Returns the name of the Y Axis label. */
public String getYAxisLabel()
{
return ((XYPlot)(chart.getPlot())).getRangeAxis().getLabel();
}
/** @deprecated
Sets the name of the Domain Axis label -- usually this is the X axis. */
public void setDomainAxisLabel(String val) { setXAxisLabel(val); }
/** Sets the name of the X Axis label. */
public void setXAxisLabel(String val)
{
XYPlot xyplot = (XYPlot)(chart.getPlot());
xyplot.getDomainAxis().setLabel(val);
xyplot.axisChanged(new AxisChangeEvent(xyplot.getDomainAxis()));
xLabel.setValue(val);
}
/** @deprecated Returns the name of the Domain Axis label -- usually this is the X axis. */
public String getDomainAxisLabel() { return getXAxisLabel(); }
/** Returns the name of the X Axis label. */
public String getXAxisLabel()
{
return ((XYPlot)(chart.getPlot())).getDomainAxis().getLabel();
}
/** Returns the underlying chart. **/
public JFreeChart getChart()
{
return chart;
}
protected void buildGlobalAttributes(LabelledList list)
{
// create the chart
((XYPlot)(chart.getPlot())).setDomainGridlinesVisible(false);
((XYPlot)(chart.getPlot())).setRangeGridlinesVisible(false);
((XYPlot)(chart.getPlot())).setDomainGridlinePaint(new Color(200,200,200));
((XYPlot)(chart.getPlot())).setRangeGridlinePaint(new Color(200,200,200));
xLabel = new PropertyField()
{
public String newValue(String newValue)
{
setXAxisLabel(newValue);
getChartPanel().repaint();
return newValue;
}
};
xLabel.setValue(getXAxisLabel());
list.add(new JLabel("X Label"), xLabel);
yLabel = new PropertyField()
{
public String newValue(String newValue)
{
setYAxisLabel(newValue);
getChartPanel().repaint();
return newValue;
}
};
yLabel.setValue(getYAxisLabel());
list.add(new JLabel("Y Label"), yLabel);
xLog = new JCheckBox();
xLog.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e)
{
if(xLog.isSelected())
{
LogarithmicAxis logAxis = new LogarithmicAxis(xLabel.getValue());
logAxis.setStrictValuesFlag(false);
chart.getXYPlot().setDomainAxis(logAxis);
}
else
chart.getXYPlot().setDomainAxis(new NumberAxis(xLabel.getValue()));
}
});
yLog = new JCheckBox();
yLog.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e)
{
if(yLog.isSelected())
{
LogarithmicAxis logAxis = new LogarithmicAxis(yLabel.getValue());
logAxis.setStrictValuesFlag(false);
chart.getXYPlot().setRangeAxis(logAxis);
}
else
chart.getXYPlot().setRangeAxis(new NumberAxis(yLabel.getValue()));
}
});
Box box = Box.createHorizontalBox();
box.add(new JLabel("X"));
box.add(xLog);
box.add(new JLabel(" Y"));
box.add(yLog);
box.add(Box.createGlue());
list.add(new JLabel("Log Axis"), box);
final JCheckBox xgridlines = new JCheckBox();
xgridlines.setSelected(false);
ItemListener il = new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
chart.getXYPlot().setDomainGridlinesVisible(true);
}
else
{
chart.getXYPlot().setDomainGridlinesVisible(false);
}
}
};
xgridlines.addItemListener(il);
final JCheckBox ygridlines = new JCheckBox();
ygridlines.setSelected(false);
il = new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
chart.getXYPlot().setRangeGridlinesVisible(true);
}
else
{
chart.getXYPlot().setRangeGridlinesVisible(false);
}
}
};
ygridlines.addItemListener(il);
box = Box.createHorizontalBox();
box.add(new JLabel("X"));
box.add(xgridlines);
box.add(new JLabel(" Y"));
box.add(ygridlines);
box.add(Box.createGlue());
list.add(new JLabel("Grid Lines"), box);
}
/** @deprecated */
public void setRangeAxisRange(double lower, double upper) { setYAxisRange(lower, upper); }
public void setYAxisRange(double lower, double upper)
{
XYPlot xyplot = (XYPlot)(chart.getPlot());
xyplot.getRangeAxis().setRange(lower, upper);
}
/** @deprecated */
public void setDomainAxisRange(double lower, double upper) { setXAxisRange(lower, upper); }
public void setXAxisRange(double lower, double upper)
{
XYPlot xyplot = (XYPlot)(chart.getPlot());
xyplot.getDomainAxis().setRange(lower, upper);
}
}