package uk.co.mmscomputing.device.sane.option;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.text.*;

import uk.co.mmscomputing.device.sane.*;

public class IntRangePanel extends DescriptorPanel /*implements DocumentListener*/{

  JSlider[]    sliders=null;
  JTextField[] tfs=null;

  public IntRangePanel(IntRange od){
    super(od);

    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));
    }

    int extent=od.max-od.min;
    sliders[len-1].setMajorTickSpacing(extent / 10);
//    sliders[len-1].setPaintTicks(true);
    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 JPanel createRangePanel(int i){
    IntRange od=(IntRange)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 / 20);
//    slider.setMajorTickSpacing(extent / 4);
//    slider.setPaintTicks(true);
//    slider.setPaintLabels(true);

    JTextField tf=new JTextField(10);    
    tf.addActionListener(this);
//    Document td=tf.getDocument();
//    td.addDocumentListener(this);
//    td.putProperty("index",new Integer(i));
//    td.putProperty("slider",slider);

    tf.setHorizontalAlignment(SwingConstants.RIGHT);
    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(){
    System.out.println("9\b"+getClass().getName()+".signalNewValue:\n\t");
    sliders[0].setValue(od.getWordValue(0));// calls stateChanged
  }

/*
  public void stateChanged(ChangeEvent e){
    JSlider slider=(JSlider)e.getSource();
//    if(!slider.getValueIsAdjusting()){
      for(int i=0;i<sliders.length;i++){
        if(sliders[i]==slider){
          JTextField tf=tfs[i];

          String newValue=String.valueOf(slider.getValue());
          String oldValue=tf.getText();

          if(!newValue.equals(oldValue)){
            try{
              od.setWordValue(i,slider.getValue());
              tf.setText(od.getStringValue(i));
            }catch(SaneIOException sioe){
              sioe.printStackTrace();
            }
          }
          break;
        }
      }
//    }
  }
*/
  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(""+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();
        }
      }
    }
  }

/*
  public void changedUpdate(DocumentEvent de){setSlider(de);}
  public void insertUpdate(DocumentEvent de){setSlider(de);}
  public void removeUpdate(DocumentEvent de){setSlider(de);}

  private void setSlider(DocumentEvent de){    
    try{
      Document d       = de.getDocument();
      String   value   = d.getText(d.getStartPosition().getOffset(),d.getEndPosition().getOffset()).trim();
      int      index   = ((Integer)d.getProperty("index")).intValue();

      int proposed = Integer.parseInt(value);

      od.setStringValue(index,value);
      int newValue=od.getWordValue(index);

      if(proposed==newValue){
        JSlider  slider  = (JSlider)d.getProperty("slider");
        int oldValue=slider.getValue();
        if(newValue!=oldValue){slider.setValue(newValue);}
      }
//    }catch(NumberFormatException nfe){
//    }catch(BadLocationException ble){
//    }catch(SaneIOException sioe){
    }catch(Exception e){
      throw new IllegalArgumentException(getClass().getName()+".setSlider:\n\t option name = "+od.getName()+" "+e.getMessage());
//      System.out.println("9\b"+getClass().getName()+".setSlider:\n\t"+e);
//      e.printStackTrace();
    }
  }
*/
}

