package jas.hist;
import jas.hist.normalization.Normalizer;
import jas.util.CheckBoxBorderPanel;
import jas.util.ColorChooser;
import jas.util.DateChooser;
import jas.util.JASTextField;
import jas.util.JTextFieldBinding;
import jas.util.PropertyBinding;
import jas.util.PropertyDialog;
import jas.util.PropertyPage;
import jas.util.PropertySite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Enumeration;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import tablelayout.TableLayout;
public final class JASHistPropertyDialog extends PropertyDialog
{
public JASHistPropertyDialog(Frame f,JASHist bean)
{
this(f, bean, DEFAULT);
}
public JASHistPropertyDialog(final Frame f, final JASHist bean, final byte axis)
{
super(f,"Histogram properties...",bean);
addPage("General",new JASHistPropGeneral(), false);
addPage("Y Axis" ,new JASHistPropYAxis(axis == Y_AXIS_RIGHT), axis == Y_AXIS_LEFT || axis == Y_AXIS_RIGHT);
addPage("X Axis" ,new JASHistPropXAxis(), axis == X_AXIS);
DataManager dm = bean.getDataManager();
if (bean.numberOfDataSets() > 0) addPage("Data",new JASHistPropData(dm), false);
if (dm instanceof SupportsFunctions)
addPage("Functions",new JASHistPropFunctions(), false);
pack();
}
final static byte DEFAULT = 0;
final static byte Y_AXIS_LEFT = 1;
final static byte Y_AXIS_RIGHT = 2;
final static byte X_AXIS = 3;
}
final class JASHistPropGeneral extends PropertyPage
{
public JASHistPropGeneral()
{
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
JPanel p1 = new FixedHeightPanel();
p1.add(new JLabel("Title"));
JASTextField title = new JASTextField(40);
p1.add(title);
add(p1);
JPanel p4 = new FixedHeightPanel();
/*
JCheckBox axis = new JCheckBox("Axis Bounding Box");
axis.setMnemonic('B');
p4.add(axis);
*/
JComboBox legend = new JComboBox();
legend.addItem("Hide Legend");
legend.addItem("Automatic");
legend.addItem("Show Legend");
p4.add(legend);
add(p4);
JPanel p3 = new FixedHeightPanel();
p3.setBorder(BorderFactory.createTitledBorder("Border"));
JComboBox btype = new JComboBox();
btype.addItem("None");
btype.addItem("Bevel In");
btype.addItem("Bevel Out");
btype.addItem("Etched");
btype.addItem("Line");
btype.addItem("Shadow");
p3.add(btype);
/*
p3.add(new JLabel("Width"));
SpinBox bwidth = new SpinBox(2,0,20);
p3.add(bwidth);
*/
add(p3);
JPanel p2 = new FixedHeightPanel();
p2.setBorder(BorderFactory.createTitledBorder("Color"));
p2.add(new JLabel("Background"));
ColorChooser back = new ColorChooser();
p2.add(back);
p2.add(new JLabel("Foreground"));
ColorChooser fore = new ColorChooser();
p2.add(fore);
p2.add(new JLabel("Data Area"));
ColorChooser data = new ColorChooser();
p2.add(data);
add(p2);
add(Box.createVerticalGlue());
addBinding(new PropertyBinding(title,"Title"));
addBinding(new PropertyBinding(back,"Background"));
addBinding(new PropertyBinding(fore,"Foreground"));
addBinding(new PropertyBinding(data,"DataAreaColor"));
addBinding(new PropertyBinding(btype,"DataAreaBorderType"));
/*
addBinding(new PropertyBinding(bwidth,"DataAreaBorderWidth"));
addBinding(new PropertyBinding(axis,"AxisBoundingBox"));
*/
addBinding(new PropertyBinding(legend,"ShowLegend"));
}
public String getHelpTopic()
{
return "userInterface.propertiesDialog.generalTab";
}
}
final class JASHistPropYAxis extends PropertyPage implements ListSelectionListener, PropertySite
{
public JASHistPropYAxis(final boolean selectY2)
{
m_init = false;
setLayout(new BorderLayout());
m_listModel = new DefaultListModel();
m_list = new JList(m_listModel);
if (selectY2) m_list.setSelectedIndex(1);
m_list.addListSelectionListener(this);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(m_list);
scroll.setPreferredSize(new Dimension(100,120));
add(scroll,BorderLayout.WEST);
m_propAxis = new JASHistPropAxis();
m_propAxis.setPropertySite(this);
add(m_propAxis,BorderLayout.CENTER);
}
public String getHelpTopic()
{
return "userInterface.propertiesDialog.axesTabs";
}
public void activate()
{
m_init = false; // Recalculate list of axes each time page is activated
}
public void doDataExchange(boolean set,Object bean)
{
if (!m_init)
{
JASHist hist = (JASHist) bean;
JASHistAxis[] axes = hist.getYAxes();
m_listModel.removeAllElements();
for (int i=0; i<axes.length; i++)
{
if (axes[i] != null) m_listModel.addElement("Y"+i);
}
m_selected = 0;
m_list.setSelectedIndex(0);
m_jHist = hist;
m_init = true;
}
JASHist hist = (JASHist) bean;
JASHistAxis yAxis = hist.getYAxis(m_selected);
m_propAxis.doDataExchange(set,yAxis);
setChanged(false);
}
public void valueChanged(ListSelectionEvent evt)
{
if (!m_init) return;
doDataExchange(true,m_jHist);
m_selected = m_list.getSelectedIndex();
doDataExchange(false,m_jHist);
}
public void callEnable()
{
setChanged(true);
}
private JASHistPropAxis m_propAxis;
private boolean m_init;
private int m_selected;
private DefaultListModel m_listModel;
private JList m_list;
private JASHist m_jHist;
}
final class JASHistPropXAxis extends PropertyPage implements PropertySite
{
public JASHistPropXAxis()
{
setLayout(new BorderLayout());
m_propAxis = new JASHistPropAxis();
m_propAxis.setPropertySite(this);
add(m_propAxis,BorderLayout.CENTER);
}
public void doDataExchange(boolean set,Object bean)
{
JASHist hist = (JASHist) bean;
JASHistAxis xAxis = hist.getXAxis();
m_propAxis.doDataExchange(set,xAxis);
setChanged(false);
}
public void callEnable()
{
setChanged(true);
}
public String getHelpTopic()
{
return "userInterface.propertiesDialog.axesTabs";
}
private JASHistPropAxis m_propAxis;
}
final class JASHistPropAxis extends PropertyPage implements ActionListener
{
public JASHistPropAxis()
{
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
add(createTopPanel());
add(createRangePanel());
add(createBinsPanel());
add(Box.createVerticalGlue());
}
private JPanel createTopPanel()
{
JASTextField label = new JASTextField(20);
m_log = new JCheckBox("Logarithmic");
m_log.setMnemonic('L');
m_type = new JLabel();
addBinding(new PropertyBinding(label,"Label"));
addBinding(new PropertyBinding(m_log,"logarithmic"));
JPanel p = new FixedHeightPanel(new TableLayout());
p.add("0 0 rw", new JLabel("Label:"));
p.add("0 1 rw", new JLabel("Type:"));
p.add("1 0 2",label);
p.add("1 1",m_type);
p.add("2 1",m_log);
return p;
}
private JPanel createRangePanel()
{
min = new JASTextField(15);
max = new JASTextField(15);
JCheckBox auto = new JCheckBox("Automatic");
auto.setMnemonic('u');
m_zero = new JCheckBox("Allow Suppressed Zero");
m_zero.setMnemonic('Z');
t1 = new JButton("...");
t2 = new JButton("...");
addBinding(new PropertyBinding(auto,"RangeAutomatic"));
addBinding(new PropertyBinding(m_zero,"AllowSuppressedZero"));
t1.addActionListener(this);
t2.addActionListener(this);
JPanel p = new FixedHeightPanel(new TableLayout());
p.setBorder(new TitledBorder("Range"));
p.add("0 0 rw",new JLabel("Min:"));
p.add("0 1 rw",new JLabel("Max:"));
p.add("1 0 h",min);
p.add("1 1 h",max);
p.add("2 0 w",t1);
p.add("2 1 w",t2);
p.add("3 0 lW",auto);
p.add("3 1 lW",m_zero);
m_rangePanel = p;
return p;
}
private JPanel createBinsPanel()
{
m_bins = new JASTextField(10);
m_binw = new JASTextField(10);
m_binwUnits = new JComboBox();
m_binwUnits.addItem("Default Units");
m_binwUnits.addItem("Seconds");
m_binwUnits.addItem("Minutes");
m_binwUnits.addItem("Hours");
m_binwUnits.addItem("Days");
m_binwUnits.addItem("Weeks");
m_binwUnits.addItem("Years");
m_showOverflow = new JCheckBox("Under/Overflow");
JPanel p = new FixedHeightPanel(new FlowLayout(FlowLayout.LEFT));
p.setBorder(new TitledBorder("Binning"));
p.add(new JLabel("Bins:"));
p.add(m_bins);
p.add(new JLabel("Bin Width:"));
p.add(m_binw);
p.add(m_binwUnits);
p.add(m_showOverflow);
m_binsPanel = p;
return p;
}
public void doDataExchange(boolean set,Object bean)
{
JASHistAxis axis = (JASHistAxis) bean;
m_axisType = axis.getAxisType();
if (!init)
{
init = true;
if (m_axisType != Rebinnable1DHistogramData.STRING)
{
addBinding(new PropertyBinding(new MinMaxFieldBinding(min),"MinObject"));
addBinding(new PropertyBinding(new MinMaxFieldBinding(max),"MaxObject"));
addBinding(new PropertyBinding(m_bins,"Bins", axis.isBinned() ?
(byte) (JTextFieldBinding.MUST_BE_INTEGER | JTextFieldBinding.MUST_BE_POSITIVE) : (byte) 0));
addBinding(new PropertyBinding(new BinWidthFieldBinding(m_binw),"BinWidth"));
addBinding(new PropertyBinding(m_showOverflow,"ShowOverflows"));
}
}
if (!set)
{
boolean enable = axis.isBinned();
m_binsPanel.setEnabled(enable);
enable = ( m_axisType != Rebinnable1DHistogramData.STRING);
m_rangePanel.setEnabled(enable);
m_log.setEnabled(enable);
enable &= axis.getRangeAutomatic();
m_zero.setEnabled(enable);
enable = ( m_axisType == Rebinnable1DHistogramData.DATE);
t1.setEnabled(enable);
t2.setEnabled(enable);
m_type.setText(types[m_axisType]);
}
super.doDataExchange(set,bean);
}
public void actionPerformed(ActionEvent evt)
{
Container w = this;
while (!(w instanceof Frame)) w = w.getParent();
if (evt.getSource() == t1)
{
Date t = new Date(min.getText());
DateChooser dlg = new DateChooser((Frame) w,t);
if (dlg.doModal()) min.setText(dlg.getDate().toString());
}
else if (evt.getSource() == t2)
{
Date t = new Date(max.getText());
DateChooser dlg = new DateChooser((Frame) w,t);
if (dlg.doModal()) max.setText(dlg.getDate().toString());
}
}
private JASTextField min;
private JASTextField max;
private JButton t1;
private JButton t2;
private int m_axisType;
private JASTextField m_bins;
private JASTextField m_binw;
private JPanel m_binsPanel;
private JPanel m_rangePanel;
private JComboBox m_binwUnits;
private JLabel m_type;
private JCheckBox m_zero;
private JCheckBox m_log;
private JCheckBox m_showOverflow;
private String types[] = {"","Numeric","String","Date/Time"};
private boolean init = false;
private final class MinMaxFieldBinding extends JTextFieldBinding
{
MinMaxFieldBinding(JASTextField field)
{
super(field);
}
protected Object getValue(String s, Class type)
{
if (m_axisType == JASHistAxis.DATE) return new Date(s);
else return new Double(s);
}
}
private final class BinWidthFieldBinding extends JTextFieldBinding implements ActionListener
{
BinWidthFieldBinding(JASTextField field)
{
super(field, JTextFieldBinding.MUST_BE_NUMBER);
m_binwUnits.addActionListener(this);
}
protected String setValue(Object value)
{
if (m_axisType == JASHistAxis.DATE)
{
double d = ((Double) value).doubleValue();
if (conversionIndexIsDefault)
{
int i = 1;
for (;;)
{
i++;
if (i == conversion.length) break;
if (d/conversion[i] < 1) break;
}
conversionIndex = i-1;
}
m_binwUnits.setEnabled(true);
m_binwUnits.setSelectedIndex(conversionIndex);
return String.valueOf(d / conversion[conversionIndex]);
}
else
{
conversionIndex = 0;
m_binwUnits.setEnabled(false);
m_binwUnits.setSelectedIndex(conversionIndex);
return value.toString();
}
}
protected Object getValue(String s, Class type)
{
double d = Double.valueOf(s).doubleValue();
d *= conversion[conversionIndex];
return new Double(d);
}
public void actionPerformed(ActionEvent evt)
{
int i = m_binwUnits.getSelectedIndex();
if (i == conversionIndex) return;
String s = m_binw.getText();
double d = Double.valueOf(s).doubleValue();
d *= conversion[conversionIndex];
conversionIndex = i;
d /= conversion[conversionIndex];
m_binw.setText(String.valueOf(d));
conversionIndexIsDefault = false;
}
private boolean conversionIndexIsDefault = true;
private int conversionIndex;
private double[] conversion = {
1 , // no conversion
1 , // seconds
60 , // minutes
60*60 , // hours
24*60*60 , // days
7*24*60*60 , // weeks
365*24*60*60 , // years TODO: get accurate number
};
}
}
final class JASHistPropData extends PropertyPage implements ListSelectionListener, PropertySite
{
public JASHistPropData(DataManager dm)
{
m_init = false;
setLayout(new BorderLayout());
m_listModel = new DefaultListModel();
m_list = new JList(m_listModel);
m_list.setCellRenderer(DataRenderer.createRenderer());
m_list.addListSelectionListener(this);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(m_list);
scroll.setPreferredSize(new Dimension(100,120));
add(scroll,BorderLayout.WEST);
JPanel b = new JPanel();
JPanel df = new FixedHeightPanel(new FlowLayout(FlowLayout.LEFT));
m_dataStyle = new JASHistPropDataStyle();
m_dataStyle.setPropertySite(this);
df.add(m_dataStyle);
df.add(m_normalized = new JCheckBox("Normalized"));
df.add(m_normalizationSettings = new JButton("Normalization Settings..."));
df.setBorder(BorderFactory.createTitledBorder("Data"));
b.add(df);
b.setLayout(new BoxLayout(b,BoxLayout.Y_AXIS));
if (dm instanceof TwoDDataManager) m_propStyle = new JASHist2DPropStyle();
else m_propStyle = new JASHistPropStyle();
m_propStyle.setPropertySite(this);
b.add(m_propStyle);
b.add(Box.createVerticalGlue());
add(b,BorderLayout.CENTER);
}
public String getHelpTopic()
{
return "userInterface.propertiesDialog.dataTab";
}
public void doDataExchange(boolean set, Object bean)
{
/////////////////////////////////////
// System.out.println("doDataEx called");
if (!m_init)
{
final JASHist hist = (JASHist) bean;
final Enumeration e = hist.getDataSources();
while (e.hasMoreElements())
{
m_listModel.addElement(e.nextElement());
}
m_selected = (JASHistData) m_listModel.elementAt(0);
m_list.setSelectedValue(m_selected,true);
m_jHist = hist;
m_init = true;
}
if (!set)
{
Normalizer norm = m_selected.getNormalization();
m_normalized.setSelected(norm != null);
m_normalizationSettings.setEnabled(norm != null);
}
final JASHistStyle s = m_selected.getStyle();
m_propStyle.doDataExchange(set,s);
m_dataStyle.doDataExchange(set,m_selected);
setChanged(false);
}
public void valueChanged(ListSelectionEvent evt)
{
if (!m_init) return;
doDataExchange(true,m_jHist);
m_selected = (JASHistData) m_list.getSelectedValue();
doDataExchange(false,m_jHist);
}
public void callEnable()
{
setChanged(true);
}
private PropertyPage m_propStyle;
private JASHistPropDataStyle m_dataStyle;
private boolean m_init;
private JASHistData m_selected;
private DefaultListModel m_listModel;
private JList m_list;
private JASHist m_jHist;
private JCheckBox m_normalized;
private JButton m_normalizationSettings;
private JASHist2DHistogramStyle m_histStyle;
}// 1D - JASHistPropData
final class JASHistPropStyle extends PropertyPage
{
JASHistPropStyle()
{
setLayout(new TableLayout());
setBorder(BorderFactory.createTitledBorder("1D Plot Style"));
final JCheckBox hist = new JCheckBox("Histogram Bars");
final ColorChooser histFillColor = new ColorChooser();
final ColorChooser histOutlineColor = new ColorChooser();
final JCheckBox histFilled = new JCheckBox("Filled");
final JComboBox histStyle = new JComboBox();
histStyle.addItem("Solid");
histStyle.addItem("Dotted");
histStyle.addItem("Dashed");
histStyle.addItem("DotDashed");
final JSpinner histWidth = new JSpinner(new SpinnerNumberModel(1,0.0,5.5,0.5));
JPanel p= new JPanel();
p.add(new JLabel("Outline"));
p.add(histFillColor);
p.add(new JLabel("Fill"));
p.add(histFilled);
p.add(histStyle);
p.add(histWidth);
add("0 0 w",hist);
add("1 0 Hw",histOutlineColor);
add("2 0 lW",p);
final JCheckBox error = new JCheckBox("Error Bars");
final ColorChooser errorColor = new ColorChooser();
final JComboBox errorStyle = new JComboBox();
errorStyle.addItem("Solid");
errorStyle.addItem("Dotted");
errorStyle.addItem("Dashed");
errorStyle.addItem("DotDashed");
final JSpinner errorWidth = new JSpinner(new SpinnerNumberModel(1,0.0,5.5,0.5));
p = new JPanel();
p.add(errorStyle);
p.add(errorWidth);
add("0 1 w",error);
add("1 1 Hw",errorColor);
add("2 1 lW",p);
final JCheckBox points = new JCheckBox("Data Points");
final ColorChooser pointColor = new ColorChooser();
final JComboBox pointStyle = new JComboBox();
final JSpinner pointSize = new JSpinner(new SpinnerNumberModel(2,1,99,1));
p = new JPanel();
// p.add(new JLabel("Data Points"));
p.add(pointStyle);
p.add(pointSize);
add("0 2 w",points);
add("1 2 Hw",pointColor);
add("2 2 lW",p);
final JCheckBox lines = new JCheckBox("Lines Between Points");
final ColorChooser lineColor = new ColorChooser();
final JComboBox lineStyle = new JComboBox();
lineStyle.addItem("Solid");
lineStyle.addItem("Dotted");
lineStyle.addItem("Dashed");
lineStyle.addItem("DotDashed");
final JSpinner lineWidth = new JSpinner(new SpinnerNumberModel(1,0.0,5.5,0.5));
p = new JPanel();
p.add(lineStyle);
p.add(lineWidth);
add("0 3 w",lines);
add("1 3 Hw",lineColor);
add("2 3 lW",p);
addBinding(new PropertyBinding(pointColor,"DataPointColor"));
addBinding(new PropertyBinding(pointStyle,"DataPointStyle"));
addBinding(new PropertyBinding(pointSize,"DataPointSize"));
addBinding(new PropertyBinding(hist,"ShowHistogramBars"));
addBinding(new PropertyBinding(error,"ShowErrorBars"));
addBinding(new PropertyBinding(points,"ShowDataPoints"));
addBinding(new PropertyBinding(lines,"ShowLinesBetweenPoints"));
addBinding(new PropertyBinding(histFillColor,"HistogramBarColor"));
addBinding(new PropertyBinding(histOutlineColor,"HistogramBarLineColor"));
addBinding(new PropertyBinding(errorColor,"ErrorBarColor"));
addBinding(new PropertyBinding(lineColor,"LineColor"));
addBinding(new PropertyBinding(histFilled,"HistogramFill"));
addBinding(new PropertyBinding(lineStyle,"LinesBetweenPointsStyle"));
addBinding(new PropertyBinding(lineWidth,"LinesBetweenPointsWidth"));
addBinding(new PropertyBinding(histStyle,"HistogramBarLineStyle"));
addBinding(new PropertyBinding(histWidth,"HistogramBarLineWidth"));
addBinding(new PropertyBinding(errorStyle,"ErrorBarStyle"));
addBinding(new PropertyBinding(errorWidth,"ErrorBarWidth"));
pointStyle.addItem("Dot");
pointStyle.addItem("Box");
pointStyle.addItem("Triangle");
pointStyle.addItem("Diamond");
pointStyle.addItem("Star");
pointStyle.addItem("Vert Line");
pointStyle.addItem("Horiz Line");
pointStyle.addItem("Cross");
pointStyle.addItem("Circle");
pointStyle.addItem("Square");
}
public Dimension getMaximumSize()
{
Dimension d1 = super.getMaximumSize();
Dimension d2 = super.getPreferredSize();
d1.height = d2.height;
return d1;
}
}// 1D JASHistPropStyle
final class JASHistScatterPropStyle extends PropertyPage
{
JASHistScatterPropStyle()
{
setLayout(new BorderLayout());
final ColorChooser pointColor = new ColorChooser();
final JComboBox pointStyle = new JComboBox();
final JSpinner pointSize = new JSpinner(new SpinnerNumberModel(2,1,20,1));
JPanel p = new JPanel();
p.add(new JLabel("Data Points"));
p.add(pointColor);
p.add(pointStyle);
p.add(pointSize);
add(p,BorderLayout.NORTH);
addBinding(new PropertyBinding(pointColor,"DataPointColor"));
addBinding(new PropertyBinding(pointStyle,"DataPointStyle"));
addBinding(new PropertyBinding(pointSize,"DataPointSize"));
pointStyle.addItem("Box");
pointStyle.addItem("Triangle");
pointStyle.addItem("Diamond");
pointStyle.addItem("Star");
pointStyle.addItem("Vert Line");
pointStyle.addItem("Horiz Line");
pointStyle.addItem("Cross");
pointStyle.addItem("Square");
}
public Dimension getMaximumSize()
{
Dimension d1 = super.getMaximumSize();
Dimension d2 = super.getPreferredSize();
d1.height = d2.height;
return d1;
}
}// 1D JASHistPropStyle
// JASHistPropDataStyle
/////////////////////////
// Begin 2D Properties //
/////////////////////////
/*
final class JAS2DHistPropData extends PropertyPage implements ListSelectionListener, PropertySite
{
public JAS2DHistPropData()
{
m_init = false;
setLayout(new BorderLayout());
m_listModel = new DefaultListModel();
m_list = new JList(m_listModel);
m_list.setCellRenderer(DataRenderer.createRenderer());
m_list.addListSelectionListener(this);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(m_list);
scroll.setPreferredSize(new Dimension(100,120));
add(scroll,BorderLayout.WEST);
JPanel b = new JPanel();
m2D_propStyle = new JAS2DHistPropStyle();
m2D_propStyle.setPropertySite(this);
m2D_propStyle.setBorder(BorderFactory.createTitledBorder("2D-Plot Style"));
b.add(m2D_propStyle);
b.setLayout(new BoxLayout(b,BoxLayout.Y_AXIS));
// b.add(Box.createVerticalGlue());
add(b,BorderLayout.CENTER);
}
public String getHelpTopic()
{
return "2D-Data";
}
public void doDataExchange(boolean set, Object bean)
{
super.doDataExchange(set,bean);
if (!m_init)
{
final JASHist hist = (JASHist) bean;
final Enumeration e = hist.get1DDataElements();
while (e.hasMoreElements())
{
m_listModel.addElement(e.nextElement());
}
m_selected = (JASHist1DData) m_listModel.elementAt(0);
m_list.setSelectedValue(m_selected,true);
m2D_propStyle.init(m_selected instanceof JASHist2DHistogramData);
m_jHist = hist;
m_init = true;
}
final JASHist1DStyle s = m_selected.getStyle();
m2D_propStyle.doDataExchange(set,s);
// m2D_dataStyle.doDataExchange(set,m_selected);
setChanged(false);
}
public void valueChanged(ListSelectionEvent evt)
{
System.out.println("Value Changed");
if (!m_init) return;
doDataExchange(true,m_jHist);
m_selected = (JASHist1DData) m_list.getSelectedValue();
doDataExchange(false,m_jHist);
}
public void callEnable()
{
setChanged(true);
}
private JAS2DHistPropStyle m2D_propStyle;
private boolean m_init;
private JASHist1DData m_selected;
private DefaultListModel m_listModel;
private JList m_list;
private JASHist m_jHist;
//test area//
private JASHist2DHistogramStyle m2D_histStyle;
}// 2D - JASHistPropData
*/
final class JASHist2DPropStyle extends PropertyPage
{
JASHist2DPropStyle()
{
setLayout(new BorderLayout());
CheckBoxBorderPanel p1 = create2DPanel();
CheckBoxBorderPanel p2 = createScatterPanel();
twoDCheckBox = p1.getCheckBox();
scatCheckBox = p2.getCheckBox();
ButtonGroup bg = new ButtonGroup();
bg.add(twoDCheckBox);
bg.add(scatCheckBox);
scatCheckBox.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
callEnable();
}
});
add(p1, BorderLayout.CENTER);
add(p2, BorderLayout.SOUTH);
}
private CheckBoxBorderPanel create2DPanel()
{
CheckBoxBorderPanel p = new CheckBoxBorderPanel("2D Plot Style");
p.setLayout(new TableLayout());
//////////Plot Scheme//////////
plotSchemePanel = new JPanel(new FlowLayout());
plotLabel = new JLabel("Plot Scheme:");
plotScheme = new JComboBox();
plotScheme.addItem("Box");
plotScheme.addItem("Ellipse");
plotScheme.addItem("ColorMap");
plotSchemePanel.add(plotLabel);
plotSchemePanel.add(plotScheme);
colorMapLabel = new JLabel("ColorMap Scheme:");
colorMapScheme = new JComboBox();
colorMapScheme.addItem("Warm");
colorMapScheme.addItem("Cool");
colorMapScheme.addItem("Thermal");
colorMapScheme.addItem("Rainbow");
colorMapScheme.addItem("GrayScale");
colorMapScheme.addItem("Select Range");
plotSchemePanel.add(colorMapLabel);
plotSchemePanel.add(colorMapScheme);
p.add("0 0 5 1",plotSchemePanel);
shapeColorLabel = new JLabel("Bin Color");
shapeColor = new ColorChooser(Color.black);
p.add("1 1 w",shapeColor);
p.add("0 1 Wr",shapeColorLabel);
startColorLabel = new JLabel("Set Range Min");
startColor = new ColorChooser(Color.white);
p.add("3 1 w",startColor);
p.add("2 1 Wr",startColorLabel);
overFlowColorLabel = new JLabel("OverFlow Color");
overFlowColor = new ColorChooser(Color.red);
p.add("1 2 w",overFlowColor);
p.add("0 2 Wr",overFlowColorLabel);
endColorLabel = new JLabel("Set Range Max");
endColor = new ColorChooser(Color.black);
p.add("3 2 w",endColor);
p.add("2 2 Wr",endColorLabel);
invertRange = new JButton("Invert")
{
final protected void fireActionPerformed(final ActionEvent e)
{
Color tempColor = startColor.getColor();
startColor.setColor(endColor.getColor());
endColor.setColor(tempColor);
}
};
p.add("4 1 1 2 HWl",invertRange);
addBinding(new PropertyBinding(plotScheme,"HistStyle"));
addBinding(new PropertyBinding(colorMapScheme,"ColorMapScheme"));
addBinding(new PropertyBinding(shapeColor,"ShapeColor"));
addBinding(new PropertyBinding(overFlowColor,"OverflowBinColor"));
addBinding(new PropertyBinding(startColor,"StartDataColor"));
addBinding(new PropertyBinding(endColor,"EndDataColor"));
return p;
}
private CheckBoxBorderPanel createScatterPanel()
{
final ColorChooser pointColor = new ColorChooser();
final JComboBox pointStyle = new JComboBox();
final JSpinner pointSize = new JSpinner(new SpinnerNumberModel(2,1,20,1));
CheckBoxBorderPanel p = new CheckBoxBorderPanel("Scatter Plot Style",new FlowLayout());
p.add(new JLabel("Data Points"));
p.add(pointColor);
p.add(pointStyle);
p.add(pointSize);
add(p,BorderLayout.NORTH);
addConditionalBinding(new PropertyBinding(pointColor,"DataPointColor"));
addConditionalBinding(new PropertyBinding(pointStyle,"DataPointStyle"));
addConditionalBinding(new PropertyBinding(pointSize,"DataPointSize"));
pointStyle.addItem("Box");
pointStyle.addItem("Triangle");
pointStyle.addItem("Diamond");
pointStyle.addItem("Star");
pointStyle.addItem("Vert Line");
pointStyle.addItem("Horiz Line");
pointStyle.addItem("Cross");
pointStyle.addItem("Square");
return p;
}
public void addConditionalBinding(PropertyBinding b)
{
b.setBeanClass(JASHistScatterPlotStyle.class);
addBinding(b);
}
public void doDataExchange(boolean set, Object bean)
{
super.doDataExchange(set,bean);
s2D = (JASHist2DHistogramStyle) bean;
if (s2D instanceof JASHistScatterPlotStyle)
{
JASHistScatterPlotStyle ss = (JASHistScatterPlotStyle) s2D;
if (set) ss.setDisplayAsScatterPlot(scatCheckBox.isSelected());
scatCheckBox.setSelected(ss.getDisplayAsScatterPlot());
twoDCheckBox.setSelected(!ss.getDisplayAsScatterPlot());
scatCheckBox.setEnabled(true);
}
else
{
twoDCheckBox.setSelected(true);
scatCheckBox.setEnabled(false);
}
boolean colormap = s2D.getHistStyle() == s2D.STYLE_COLORMAP;
shapeColor.setEnabled(!colormap);
shapeColorLabel.setEnabled(!colormap);
colorMapScheme.setEnabled(colormap);
colorMapLabel.setEnabled(colormap);
boolean overflow = !colormap && s2D.getShowOverflow();
overFlowColor.setEnabled(overflow);
overFlowColorLabel.setEnabled(overflow);
boolean userDefined = colormap &&
s2D.getColorMapScheme() == s2D.COLORMAP_USERDEFINED;
invertRange.setEnabled(userDefined);
startColor.setEnabled(userDefined);
startColorLabel.setEnabled(userDefined);
endColorLabel.setEnabled(userDefined);
endColor.setEnabled(userDefined);
}
public void valueChanged(ListSelectionEvent evt)
{
System.out.println("2D valueChanged called");
}
public void callEnable()
{
setChanged(true);
}
public Dimension getMaximumSize()
{
Dimension d1 = super.getMaximumSize();
Dimension d2 = super.getPreferredSize();
d1.height = d2.height;
return d1;
}
void init(final boolean isHistData)
{
System.out.println("2D - Its really Alive!");
}
private JCheckBox twoDCheckBox;
private JCheckBox scatCheckBox;
private JPanel plotSchemePanel;
private JComboBox plotScheme;
private JLabel plotLabel;
private ColorChooser shapeColor;
private JLabel shapeColorLabel;
private ColorChooser overFlowColor;
private JLabel overFlowColorLabel;
private JComboBox colorMapScheme;
private JLabel colorMapLabel;
private ColorChooser startColor;
private JLabel startColorLabel;
private ColorChooser endColor;
private JLabel endColorLabel;
private JCheckBox showOverFlow;
private JButton invertRange;
private JASHist2DHistogramStyle s2D;
private JASHist2DHistogramStyle m_selected;
}// JAS2DHistPropStyle
///////////////////////
// End 2D Properties //
///////////////////////
final class CheckBoxBorder extends AbstractBorder
{
CheckBoxBorder(JCheckBox cb)
{
this.cb = cb;
}
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height)
{
border1.paintBorder(c,g,x,y,width,height);
System.out.println("x="+x+" y="+y+" w="+width+" h="+height);
}
public Insets getBorderInsets(Component c)
{
System.out.println("insets="+border1.getBorderInsets(c));
Insets insets = border1.getBorderInsets(c);
Dimension cbSize = cb.getPreferredSize();
insets.top = 2 + cbSize.height;
System.out.println("insets="+border1.getBorderInsets(c));
return insets;
}
private JCheckBox cb;
private Border border1 = UIManager.getBorder("TitledBorder.border");
}
final class FixedHeightPanel extends DisabledPanel
{
FixedHeightPanel()
{
super();
}
FixedHeightPanel(LayoutManager layout)
{
super(layout);
}
public Dimension getMaximumSize()
{
Dimension d1 = super.getMaximumSize();
Dimension d2 = super.getPreferredSize();
d1.height = d2.height;
return d1;
}
}
class DisabledPanel extends JPanel
{
DisabledPanel()
{
super();
}
DisabledPanel(LayoutManager layout)
{
super(layout);
}
final public void setEnabled(boolean value)
{
Component[] children = getComponents();
for (int i=0; i<children.length; i++)
children[i].setEnabled(value);
super.setEnabled(value);
}
}