package timeflow.app.ui.filter; import timeflow.data.db.*; import timeflow.data.db.filter.*; import timeflow.model.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import timeflow.util.*; public class FilterNumberPanel extends FilterDefinitionPanel { BabyHistogram histogram; Field field; JTextField lowEntry; JTextField highEntry; JCheckBox nullBox; Runnable action; public FilterNumberPanel(final Field field, final Runnable action, final FilterControlPanel parent) { this.field=field; this.action=action; setLayout(new BorderLayout()); setBackground(Color.white); setBorder(BorderFactory.createEmptyBorder(0,5,0,5)); setBackground(Color.white); add(new FilterTitle(field, parent, false), BorderLayout.NORTH); Runnable fullAction=new Runnable() { public void run() { lowEntry.setText(format(histogram.getLow())); highEntry.setText(format(histogram.getHigh())); action.run(); } }; histogram=new BabyHistogram(fullAction); add(histogram, BorderLayout.CENTER); JPanel bottomStuff=new JPanel(); bottomStuff.setLayout(new GridLayout(2,1)); add(bottomStuff, BorderLayout.SOUTH); bottomStuff.setBackground(Color.white); JPanel lowHighPanel=new JPanel(); bottomStuff.add(lowHighPanel); lowHighPanel.setBackground(Color.white); lowHighPanel.setLayout(new BorderLayout()); Font small=parent.getModel().getDisplay().small(); lowEntry=new JTextField(7); lowEntry.setFont(small); lowEntry.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setLowFromText(); action.run(); }}); lowHighPanel.add(lowEntry, BorderLayout.WEST); JLabel rangeLabel=new JLabel("to", JLabel.CENTER); rangeLabel.setFont(small); rangeLabel.setForeground(Color.gray); lowHighPanel.add(rangeLabel, BorderLayout.CENTER); highEntry=new JTextField(7); lowHighPanel.add(highEntry, BorderLayout.EAST); highEntry.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setHighFromText(); action.run(); }}); highEntry.setFont(small); nullBox=new JCheckBox("Include Missing Values"); nullBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { action.run(); }}); bottomStuff.add(nullBox); nullBox.setBackground(Color.white); nullBox.setForeground(Color.gray); nullBox.setFont(small); } String format(double x) { if (Math.abs(x)>10) return Display.format(Math.round(x)); return Display.format(x); } void setLowFromText() { try { double low=Double.parseDouble(lowEntry.getText()); double high=histogram.getHigh(); if (low>high) { high=low; highEntry.setText(lowEntry.getText()); } histogram.setTrueRange(low,high); } catch (Exception e) { } } void setHighFromText() { try { double high=Double.parseDouble(highEntry.getText()); double low=histogram.getLow(); if (low>high) { low=high; lowEntry.setText(highEntry.getText()); } histogram.setTrueRange(low,high); } catch (Exception e) { } } public void setData(double[] data) { histogram.setData(data); lowEntry.setText(Display.format(histogram.getLow())); highEntry.setText(Display.format(histogram.getHigh())); repaint(); } public Dimension getPreferredSize() { return new Dimension(200,160); } @Override public ActFilter defineFilter() { double low=histogram.getLow(); double high=histogram.getHigh(); boolean acceptNull=nullBox.isSelected(); return new NumericRangeFilter(field, low, high, acceptNull); } @Override public void clearFilter() { histogram.setRelRange(0, 1); } }