1 package prefuse.data.query; 2 3 import java.awt.event.FocusEvent ; 4 import java.awt.event.FocusListener ; 5 6 import javax.swing.JComponent ; 7 import javax.swing.JSlider ; 8 import javax.swing.event.ChangeEvent ; 9 import javax.swing.event.ChangeListener ; 10 11 import prefuse.data.expression.ColumnExpression; 12 import prefuse.data.expression.Literal; 13 import prefuse.data.expression.RangePredicate; 14 import prefuse.data.tuple.TupleSet; 15 import prefuse.util.DataLib; 16 import prefuse.util.TypeLib; 17 import prefuse.util.ui.JRangeSlider; 18 import prefuse.util.ui.ValuedRangeModel; 19 20 25 public class RangeQueryBinding extends DynamicQueryBinding { 26 27 private Class m_type; 28 private Listener m_lstnr; 29 private ValuedRangeModel m_model; 30 private boolean m_ordinal; 31 32 private static FocusListener s_sliderAdj; 33 34 39 public RangeQueryBinding(TupleSet ts, String field) { 40 this(ts, field, false); 41 } 42 43 56 public RangeQueryBinding(TupleSet ts, String field, boolean forceOrdinal) { 57 super(ts, field); 58 m_type = DataLib.inferType(ts, field); 59 m_ordinal = forceOrdinal; 60 m_lstnr = new Listener (); 61 initPredicate(); 62 initModel(); 63 } 64 65 private void initPredicate() { 66 Object min = DataLib.min(m_tuples, m_field).get(m_field); 68 Object max = DataLib.max(m_tuples, m_field).get(m_field); 69 70 Literal left = Literal.getLiteral(min, m_type); 72 Literal right = Literal.getLiteral(max, m_type); 73 ColumnExpression ce = new ColumnExpression(m_field); 74 RangePredicate rp = new RangePredicate(ce, left, right); 75 setPredicate(rp); 76 } 77 78 public void initModel() { 79 if ( m_model != null ) 80 m_model.removeChangeListener(m_lstnr); 81 82 ValuedRangeModel model = null; 84 if ( TypeLib.isNumericType(m_type) && !m_ordinal ) { 85 Number min = (Number )DataLib.min(m_tuples, m_field).get(m_field); 86 Number max = (Number )DataLib.max(m_tuples, m_field).get(m_field); 87 model = new NumberRangeModel(min, max, min, max); 88 } else { 89 model = new ObjectRangeModel( 90 DataLib.ordinalArray(m_tuples, m_field)); 91 } 92 m_model = model; 93 m_model.addChangeListener(m_lstnr); 94 } 95 96 102 public ValuedRangeModel getModel() { 103 return m_model; 104 } 105 106 113 public NumberRangeModel getNumberModel() { 114 return (m_model instanceof NumberRangeModel ? 115 (NumberRangeModel)m_model : null); 116 } 117 118 125 public ObjectRangeModel getObjectModel() { 126 return (m_model instanceof ObjectRangeModel ? 127 (ObjectRangeModel)m_model : null); 128 } 129 130 132 138 public JComponent createComponent() { 139 return createHorizontalRangeSlider(); 140 } 141 142 147 public JRangeSlider createHorizontalRangeSlider() { 148 return createRangeSlider(JRangeSlider.HORIZONTAL, 149 JRangeSlider.LEFTRIGHT_TOPBOTTOM); 150 } 151 152 157 public JRangeSlider createVerticalRangeSlider() { 158 return createRangeSlider(JRangeSlider.VERTICAL, 159 JRangeSlider.RIGHTLEFT_BOTTOMTOP); 160 } 161 162 172 public JRangeSlider createRangeSlider(int orientation, int direction) { 173 return new JRangeSlider(m_model, orientation, direction); 174 } 175 176 181 public JSlider createSlider() { 182 JSlider slider = new JSlider (m_model); 183 slider.addFocusListener(getSliderAdjuster()); 184 return slider; 185 } 186 187 private synchronized static FocusListener getSliderAdjuster() { 188 if ( s_sliderAdj == null ) 189 s_sliderAdj = new SliderAdjuster(); 190 return s_sliderAdj; 191 } 192 193 195 private static class SliderAdjuster implements FocusListener { 196 public void focusGained(FocusEvent e) { 197 ((JSlider )e.getSource()).setExtent(0); 198 } 199 public void focusLost(FocusEvent e) { 200 } 202 } 204 private class Listener implements ChangeListener { 205 public void stateChanged(ChangeEvent e) { 206 ValuedRangeModel model = (ValuedRangeModel)e.getSource(); 207 Object lo = model.getLowValue(); 208 Object hi = model.getHighValue(); 209 210 RangePredicate rp = (RangePredicate)m_query; 211 rp.setLeftExpression(Literal.getLiteral(lo, m_type)); 212 rp.setRightExpression(Literal.getLiteral(hi, m_type)); 213 } 214 } 216 } | Popular Tags |