1 23 package info.monitorenter.gui.chart.layout.controls; 24 25 import info.monitorenter.util.Range; 26 import infovis.panel.DoubleBoundedRangeModel; 27 import infovis.panel.dqinter.DoubleRangeSlider; 28 29 import java.awt.Dimension ; 30 import java.awt.event.ActionEvent ; 31 import java.awt.event.ActionListener ; 32 import java.text.NumberFormat ; 33 import java.text.ParseException ; 34 import java.util.Locale ; 35 36 import javax.swing.Box ; 37 import javax.swing.BoxLayout ; 38 import javax.swing.JPanel ; 39 import javax.swing.JTextField ; 40 import javax.swing.event.ChangeEvent ; 41 import javax.swing.event.ChangeListener ; 42 43 44 56 public class RangeChooserPanel extends JPanel { 57 58 61 private static final long serialVersionUID = 3258413911148410931L; 62 63 64 private NumberFormat m_nf = NumberFormat.getNumberInstance(Locale.getDefault()); 65 66 67 private DoubleRangeSlider m_slider; 68 69 77 public RangeChooserPanel(final Range range) { 78 79 super(); 80 this.m_nf.setMinimumFractionDigits(2); 81 this.m_nf.setMaximumFractionDigits(2); 82 83 double min = range.getMin(); 85 double max = range.getMax(); 86 double minBound = min; 87 double maxBound = max; 88 if (minBound == Double.NEGATIVE_INFINITY || minBound == Double.NaN 89 || minBound == Double.POSITIVE_INFINITY || minBound == -Double.MAX_VALUE) { 90 min = -100; 91 } 92 minBound = min - (max - min) / 2; 93 94 if (maxBound == Double.NEGATIVE_INFINITY || maxBound == Double.NaN 95 || maxBound == Double.POSITIVE_INFINITY || maxBound == Double.MAX_VALUE) { 96 max = 100; 97 } 98 maxBound = max + (max - min) / 2; 99 100 this.m_slider = new DoubleRangeSlider(minBound, maxBound, min, max); 101 102 this.setLayout(new BoxLayout (this, BoxLayout.Y_AXIS)); 103 this.m_slider.setMaximumSize(new Dimension (300, 40)); 104 this.m_slider.setEnabled(true); 105 this.add(Box.createVerticalStrut(10)); 106 this.add(this.m_slider); 107 final JTextField rangeMinView = new JTextField (); 110 rangeMinView.setText(this.m_nf.format(new Double (this.m_slider.getLowValue()))); 111 DoubleBoundedRangeModel rangeModel = this.m_slider.getModel(); 112 rangeMinView.setEditable(true); 113 rangeModel.addChangeListener(new ChangeListener () { 114 public void stateChanged(final ChangeEvent e) { 115 rangeMinView.setText(RangeChooserPanel.this.m_nf.format(new Double ( 116 RangeChooserPanel.this.m_slider.getLowValue()))); 117 } 118 }); 119 rangeMinView.setPreferredSize(new Dimension (120, 20)); 120 rangeMinView.addActionListener(new ActionListener () { 121 public void actionPerformed(final ActionEvent ae) { 122 JTextField textField = (JTextField ) ae.getSource(); 123 try { 124 Number entered = RangeChooserPanel.this.m_nf.parse(textField.getText()); 125 double low = entered.doubleValue(); 126 double high = RangeChooserPanel.this.m_slider.getHighValue(); 127 double minSlider = low - (high - low) / 2; 128 RangeChooserPanel.this.m_slider.setMinimum(minSlider); 129 RangeChooserPanel.this.m_slider.setLowValue(low); 130 } catch (ParseException e) { 131 textField.setText(RangeChooserPanel.this.m_nf.format(RangeChooserPanel.this.m_slider 133 .getLowValue())); 134 } 135 } 136 }); 137 rangeMinView.setToolTipText("Enter a number and hit Return."); 138 139 final JTextField rangeMaxView = new JTextField (); 141 rangeMaxView.setText(new Double (this.m_slider.getHighValue()).toString()); 142 rangeMaxView.setEditable(true); 143 rangeModel.addChangeListener(new ChangeListener () { 144 public void stateChanged(final ChangeEvent e) { 145 rangeMaxView.setText(RangeChooserPanel.this.m_nf.format(new Double ( 146 RangeChooserPanel.this.m_slider.getHighValue()))); 147 } 148 }); 149 rangeMaxView.setPreferredSize(new Dimension (120, 20)); 150 rangeMaxView.addActionListener(new ActionListener () { 151 public void actionPerformed(final ActionEvent ae) { 152 JTextField textField = (JTextField ) ae.getSource(); 153 try { 154 Number entered = RangeChooserPanel.this.m_nf.parse(textField.getText()); 155 double low = RangeChooserPanel.this.m_slider.getLowValue(); 156 double high = entered.doubleValue(); 157 double maxSlider = high + (high - low) / 2; 158 RangeChooserPanel.this.m_slider.setMaximum(maxSlider); 159 RangeChooserPanel.this.m_slider.setHighValue(high); 160 } catch (ParseException e) { 161 textField.setText(RangeChooserPanel.this.m_nf.format(RangeChooserPanel.this.m_slider 163 .getHighValue())); 164 } 165 } 166 }); 167 rangeMaxView.setToolTipText("Enter a number and hit Return."); 168 169 JPanel rangeViewPanel = new JPanel (); 171 rangeViewPanel.setMaximumSize(new Dimension (300, 30)); 172 rangeViewPanel.setLayout(new BoxLayout (rangeViewPanel, BoxLayout.X_AXIS)); 173 rangeViewPanel.add(Box.createHorizontalGlue()); 174 rangeViewPanel.add(rangeMinView); 175 rangeViewPanel.add(Box.createHorizontalStrut(10)); 176 rangeViewPanel.add(rangeMaxView); 177 rangeViewPanel.add(Box.createHorizontalGlue()); 178 this.add(Box.createVerticalStrut(10)); 179 this.add(rangeViewPanel); 180 this.add(Box.createVerticalGlue()); 181 } 182 183 189 public Range getRange() { 190 return new Range(this.m_slider.getLowValue(), this.m_slider.getHighValue()); 191 } 192 } 193 | Popular Tags |