package jas2.cuts;
import jas2.jds.interfaces.CutProperties;
import jas2.swingstudio.*;
import jas2.jds.interfaces.CutInterface;
import java.awt.event.*;
import java.awt.BorderLayout;
import javax.swing.*;
import jas2.hist.JASHist;
import jas2.hist.Rebinnable1DHistogramData;
import jas2.hist.JASHistData;
import javax.swing.event.*;
public class DoubleCutAdjustmentDialog extends CutAdjustmentDialog implements HasSlider, HasPlot
{
public DoubleCutAdjustmentDialog(CutInterface peer, CutProperties initialProperties)
{
super(peer, initialProperties, new DoubleCutPanel());
m_panel = (DoubleCutPanel) getPropertiesPanel();
m_cutoffField = m_panel.getCutoffField();
}
public CutDialogPanel getSliderPanel(CutInterface peer)
{
return new SliderPanel(peer);
}
public CutDialogPanel getPlotPanel(CutInterface peer)
{
final Object o = peer.getValuesApplied();
if (o instanceof Rebinnable1DHistogramData)
return new PlotPanel((Rebinnable1DHistogramData) o);
return null;
}
private DoubleCutPanel m_panel;
private JTextField m_cutoffField;
private class PlotPanel extends CutDialogPanel
{
PlotPanel(Rebinnable1DHistogramData data)
{
super(new BorderLayout());
m_plot.setPreferredSize(new java.awt.Dimension(150, 150));
add(BorderLayout.CENTER, m_plot);
m_data = data;
}
public void afterClosing()
{
m_plot.removeAllData();
}
public boolean beforeShowing()
{
m_plot.addData(m_data).show(true);
return true;
}
private final JASHist m_plot = new JASHist();
private final Rebinnable1DHistogramData m_data;
}
private class SliderPanel extends CutDialogPanel implements ActionListener
{
SliderPanel(CutInterface peer)
{
super(new BorderLayout());
m_peer = peer;
add(BorderLayout.WEST, m_minField);
add(BorderLayout.EAST, m_maxField);
add(BorderLayout.CENTER, m_slider);
m_minField.addActionListener(this);
m_maxField.addActionListener(this);
m_cutoffField.addActionListener(this);
m_slider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (m_ignoreChangeEvents) return;
m_cutoffValue = (m_rangeMax - m_rangeMin) * m_slider.getValue() / 100 + m_rangeMin;
m_cutoffField.setText(m_format.format(m_cutoffValue));
changeNotify(true);
}
});
m_format.setMaximumFractionDigits(3);
m_format.setGroupingUsed(false);
}
public void actionPerformed(ActionEvent e)
{
final JTextField source = (JTextField) e.getSource();
final String text = source.getText();
try
{
final double value = Double.valueOf(text).doubleValue();
// if no exception...
if (source == m_cutoffField)
{
m_cutoffValue = value;
if (m_cutoffValue < m_rangeMin)
{
m_rangeMin = m_cutoffValue;
m_minField.setText(m_format.format(m_rangeMin));
}
else if (m_cutoffValue > m_rangeMax)
{
m_rangeMax = m_cutoffValue;
m_maxField.setText(m_format.format(m_rangeMax));
}
}
else
{
if (source == m_minField && value >= m_rangeMax ||
source == m_maxField && m_rangeMin >= value)
{
JOptionPane.showMessageDialog(DoubleCutAdjustmentDialog.this,
"min must be less than max", "Error",
JOptionPane.ERROR_MESSAGE);
return;
}
if (source == m_minField)
m_rangeMin = value;
else
m_rangeMax = value;
}
setSliderPosition();
}
catch (NumberFormatException x)
{
JOptionPane.showMessageDialog(DoubleCutAdjustmentDialog.this,
"\""+ text +"\" is not a number", "Error",
JOptionPane.ERROR_MESSAGE);
}
}
public boolean beforeShowing()
{
final String value = m_cutoffField.getText();
try
{
m_cutoffValue = Double.valueOf(value).doubleValue();
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(DoubleCutAdjustmentDialog.this,
"\""+ value +"\" is not a number", "Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
final Rebinnable1DHistogramData data = (Rebinnable1DHistogramData) m_peer.getValuesApplied();
m_rangeMin = Math.min(m_cutoffValue, data != null ? data.getMin() : 0.0);
m_rangeMax = Math.max(m_cutoffValue, data != null ? data.getMax() : 10.0);
m_minField.setText(m_format.format(m_rangeMin));
m_maxField.setText(m_format.format(m_rangeMax));
setSliderPosition();
return true;
}
public void afterClosing()
{
m_cutoffField.removeActionListener(this);
}
private void setSliderPosition()
{
m_ignoreChangeEvents = true;
m_slider.setValue((int) ((m_cutoffValue - m_rangeMin) * 100 / (m_rangeMax - m_rangeMin)));
m_ignoreChangeEvents = false;
}
private CutInterface m_peer;
private boolean m_ignoreChangeEvents = false;
private double m_rangeMin, m_rangeMax;
private double m_cutoffValue; // kept current
private final JTextField m_minField = new JTextField(4);
private final JTextField m_maxField = new JTextField(4);
private final JSlider m_slider = new JSlider(); // horizontal, range = 0:100
private final java.text.NumberFormat m_format = java.text.NumberFormat.getInstance();
}
}
Ads help maintain this website.