package jass.render; import java.io.*; import java.awt.*; import javax.swing.*; import javax.swing.border.*; public class ControllerPanel extends javax.swing.JPanel { protected static final double MAX_SLIDERVAL = 10000; protected static final int NSLIDERS = 21; // defaults protected static final int NBUTTONS = 4; // defaults protected double[] val; //initial slider values protected String[] names; //slider labels protected double[] min,max; //slider ranges protected int nsliders = NSLIDERS; protected int nbuttons = NBUTTONS; private JScrollPane jScrollPane; // holds sliders private JPanel sliderPanel; // sliders are added to this private JPanel buttonPanel; private JPanel labelPanel; private JPanel valuePanel; private JPanel topPanel; // this contains sliders labels and textfields private JPanel sliderPanelHolder; // this holds the toppanel private static final String DEFAULT_SLIDERDISPLAYFORMAT = "%5.2e"; private String sliderDisplayFormat = DEFAULT_SLIDERDISPLAYFORMAT; private static final int NBUTTONSPERROW = 4; /** Set the values of the sliders and call its handlers. */ public void setSliders(double[] val,double[] min,double[] max,String[] names) { setValues(val,min,max,names); for(int i=0;i<val.length;i++) { onSlider(i); } } /** * s is a printf like format string */ public void setSliderDisplayFormat(String s) { sliderDisplayFormat = s; } /** Set button names */ public void setButtonNames(String[] names) { for(int i=0;i<names.length;i++) { setButtonName(names[i],i); } } /** Set button name */ public void setButtonName(String name,int k) { jButton[k].setText(name); } /** Set the values of the sliders (will not call its handlers) */ public void setValues(double[] val,double[] min,double[] max,String[] names) { for(int i=0;i<val.length;i++) { this.names[i] = names[i]; this.val[i] = val[i]; this.min[i] = min[i]; this.max[i] = max[i]; int x = (int)(MAX_SLIDERVAL * (val[i]-min[i])/(max[i]-min[i])); jSlider[i].setValue(x); jLabel[i].setText(names[i]); String vals = String.format(sliderDisplayFormat,val[i]); jTextField[i].setText(" "+vals+" "); } } private void initValues() { val = new double[nsliders]; min = new double[nsliders]; max = new double[nsliders]; names = new String[nsliders]; for(int i=0;i<nsliders;i++) { names[i] = ""; val[i]=-1.32e23; min[i] = 0; max[i] = 1; } } /** Creates new form Controller with nsl sliders and nbut buttons*/ public ControllerPanel(int nsl,int nbut) { super (); this.nsliders = nsl; this.nbuttons = nbut; jSlider = new javax.swing.JSlider[nsliders]; jTextField = new javax.swing.JTextField[nsliders]; jButton = new javax.swing.JButton[nbuttons]; jLabel = new javax.swing.JLabel[nsliders]; initComponents (); } /** Member class to handle slider events */ class LabeledMouseMotionAdapter extends java.awt.event.MouseMotionAdapter { private int label; public LabeledMouseMotionAdapter(int label) { super(); this.label = label; } public void mouseDragged (java.awt.event.MouseEvent evt) { jSliderMouseDragged (label,evt); } } /** Member class to handle button events */ class LabeledMouseAdapter extends java.awt.event.MouseAdapter { private int label; public LabeledMouseAdapter(int label) { super(); this.label = label; } public void mousePressed (java.awt.event.MouseEvent evt) { jButtonMousePressed (label,evt); } } private void initComponents () { GridBagConstraints gridBagConstraints; setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); sliderPanel = new JPanel(); labelPanel = new JPanel(); valuePanel = new JPanel(); topPanel = new JPanel(); // sliders + labels + values sliderPanelHolder = new JPanel(); sliderPanelHolder.setLayout(new BorderLayout()); // for use in scrollpane sliderPanelHolder.add(topPanel); topPanel.setLayout(new BoxLayout(topPanel,BoxLayout.X_AXIS)); jScrollPane = new JScrollPane(sliderPanelHolder); add(jScrollPane); topPanel.add(sliderPanel); topPanel.add(labelPanel); topPanel.add(valuePanel); buttonPanel = new JPanel(); buttonPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); topPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); add(buttonPanel); sliderPanel.setLayout (new java.awt.GridLayout (nsliders, 1)); labelPanel.setLayout (new java.awt.GridLayout (nsliders, 1)); valuePanel.setLayout (new java.awt.GridLayout (nsliders, 1)); //buttonPanel.setLayout (new java.awt.GridLayout (2, 1)); buttonPanel.setLayout (new java.awt.GridBagLayout()); for(int i=0;i<nsliders;i++) { jSlider[i] = new javax.swing.JSlider(); jLabel[i] = new JLabel(); jTextField[i] = new javax.swing.JTextField(); } for(int i=0;i<nbuttons;i++) { jButton[i] = new javax.swing.JButton (); } for(int i=0;i<nsliders;i++) { jSlider[i].setMaximum ((int)MAX_SLIDERVAL); sliderPanel.add (jSlider[i]); jTextField[i].setEditable (false); String s = String.format(sliderDisplayFormat, -23.32e-23); jTextField[i].setText (s); jTextField[i].setBackground(Color.WHITE); //jTextField[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jTextField[i].setMargin(new Insets(0,0,0,0)); jLabel[i].setText(""); jLabel[i].setHorizontalAlignment(SwingConstants.TRAILING); //jTextField[i].setHorizontalAlignment(JTextField.CENTER); labelPanel.add (jLabel[i]); //jLabel[i].setBorder(BorderFactory.createLineBorder(Color.black)); valuePanel.add (jTextField[i]); } for(int i=0;i<nsliders;i++) { jSlider[i].addMouseMotionListener (new LabeledMouseMotionAdapter(i)); } for(int i=0;i<nbuttons;i++) { jButton[i].addMouseListener (new LabeledMouseAdapter(i)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = i%NBUTTONSPERROW; gridBagConstraints.gridy = i/NBUTTONSPERROW; gridBagConstraints.weightx = .1; gridBagConstraints.weighty = .1; gridBagConstraints.anchor = GridBagConstraints.CENTER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new Insets(0, 0, 0, 0); buttonPanel.add (jButton[i],gridBagConstraints); } initValues(); setValues(val,min,max,names); } /** Save slider states to file */ public void saveToFile(String fn) { try { BufferedWriter br = new BufferedWriter(new FileWriter(fn)); double x = 0; for(int i=0;i<nsliders;i++) { br.write(names[i]); br.newLine(); br.write(new Double(val[i]).toString()); br.newLine(); br.write(new Double(min[i]).toString()); br.newLine(); br.write(new Double(max[i]).toString()); br.newLine(); } br.close(); } catch(Exception e) { System.out.println(this+" "+e); } } /** Load slider states from file and call handlers */ public void loadFromFile(String fn) { try { BufferedReader br = new BufferedReader(new FileReader(fn)); double x = 0; for(int i=0;i<nsliders;i++) { names[i] = br.readLine(); val[i] = (float)(new Double(br.readLine()).doubleValue()); min[i] = (float)(new Double(br.readLine()).doubleValue()); max[i] = (float)(new Double(br.readLine()).doubleValue()); } br.close(); setValues(val,min,max,names); for(int i=0;i<nsliders;i++) { onSlider(i); } } catch(Exception e) { System.out.println(this+" "+e); } } /** User should override this handler*/ public void onSlider(int slider) {;} /** User should override this handler*/ public void onButton(int button) {;} private void jButtonMousePressed (int k, java.awt.event.MouseEvent evt) { onButton(k); } private void jSliderMouseDragged (int k,java.awt.event.MouseEvent evt) { double sval = jSlider[k].getValue()/MAX_SLIDERVAL; val[k] = (float)(sval*(max[k]-min[k])+min[k]); String vals = String.format(sliderDisplayFormat,val[k]); jTextField[k].setText(" "+vals+" "); onSlider(k); } protected javax.swing.JSlider[] jSlider; protected javax.swing.JTextField[] jTextField; protected javax.swing.JLabel[] jLabel; protected javax.swing.JButton[] jButton; }