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.