package uk.co.mmscomputing.device.sane.option; import java.io.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.border.*; import uk.co.mmscomputing.device.sane.*; public class FixedRangePanel extends DescriptorPanel{ JSlider[] sliders=null; JTextField[] tfs=null; public FixedRangePanel(FixedRange od){ super(od); Dictionary dict=createSliderDictionary(); int len=od.size>>2; JPanel p=new JPanel(); p.setLayout(new GridLayout(len,1)); tfs=new JTextField[len]; sliders=new JSlider[len]; for(int i=0;i<len;i++){ p.add(createRangePanel(i)); sliders[i].setLabelTable(dict); } sliders[len-1].setPaintLabels(true); addValuePanel(new JScrollPane(p)); /* String valstr="Value"; if(od.unit!=0){ valstr+=" in ["+SANE_UNIT[od.unit]+"]";} p.setBorder(new TitledBorder(valstr)); add(new JScrollPane(p),BorderLayout.NORTH); */ } private Dictionary createSliderDictionary(){ FixedRange od=(FixedRange)this.od; int extent=(od.max-od.min)/5; Dictionary dict=new Hashtable(); int ival=od.min; for(int i=0;i<=5;i++){ dict.put(new Integer(ival), new JLabel(od.unfixstr(ival))); ival+=extent; } return dict; } private JPanel createRangePanel(int i){ FixedRange od=(FixedRange)this.od; JSlider slider=new JSlider(JSlider.HORIZONTAL,od.min,od.max,od.min); slider.addChangeListener(this); checkCapabilities(slider); // int extent=od.max-od.min; // slider.setMinorTickSpacing(extent / 50); // slider.setMajorTickSpacing(extent / 10); // slider.setPaintTicks(true); // slider.setLabelTable(dict); // slider.setPaintLabels(true); JTextField tf=new JTextField(10); tf.setHorizontalAlignment(SwingConstants.RIGHT); tf.addActionListener(this); checkCapabilities(tf); tf.setText(od.getStringValue(i)); JPanel p=new JPanel(); p.setLayout(new BorderLayout()); p.add(slider,BorderLayout.CENTER); p.add(tf,BorderLayout.EAST); // tf.setText(od.getStringValue(i)); slider.setValue(od.getWordValue(i)); // calls stateChanged sliders[i]=slider; tfs[i]=tf; return p; } // call from Descriptor : PreviewPanel value has changed void signalNewValue(){ sliders[0].setValue(od.getWordValue(0)); // calls stateChanged } public void stateChanged(ChangeEvent e){ JSlider slider=(JSlider)e.getSource(); for(int i=0;i<sliders.length;i++){ if(sliders[i]==slider){ JTextField tf=tfs[i]; tf.setText(((FixedRange)od).unfixstr(slider.getValue())); if(!slider.getValueIsAdjusting()){ try{ od.setWordValue(i,slider.getValue()); tf.setText(od.getStringValue(i)); }catch(SaneIOException sioe){ sioe.printStackTrace(); } } } } } public void actionPerformed(ActionEvent e){ JTextField tf=(JTextField)e.getSource(); for(int i=0;i<tfs.length;i++){ if(tfs[i]==tf){ try{ od.setStringValue(i,tf.getText()); sliders[i].setValue(od.getWordValue(i)); }catch(SaneIOException sioe){ sioe.printStackTrace(); } } } } }