00001 package org.math.plot;
00002
00003 import java.awt.*;
00004 import java.awt.event.*;
00005
00006 import javax.swing.*;
00007
00014 public class ParametersPanel extends JPanel implements ActionListener {
00015
00016 private static final long serialVersionUID = 1L;
00017
00018 private Dimension defaultSize;
00019
00020 private String[] paramLabels;
00021
00022 private String[] paramValues;
00023
00024 private boolean[] isList;
00025
00026 private int[] paramValuesIndex;
00027
00028 private String[][] paramChoices;
00029
00030 private JLabel[] labels;
00031
00032 private JComboBox[] fields;
00033
00034 private Runnable action;
00035
00036 public ParametersPanel(String[] lab, String[] val) {
00037 this(lab, new int[lab.length], new String[][] { val });
00038 }
00039
00040 public ParametersPanel(String[] lab) {
00041 this(lab, new String[lab.length]);
00042 }
00043
00044 public ParametersPanel(String[] lab, int[] selected, String[][] ch) {
00045 paramLabels = lab;
00046
00047 isList = new boolean[paramLabels.length];
00048 for (int i = 0; i < isList.length; i++) {
00049 isList[i] = true;
00050 }
00051
00052 paramValuesIndex = selected;
00053
00054 paramChoices = ch;
00055
00056 paramValues = new String[paramLabels.length];
00057 for (int i = 0; i < paramChoices.length; i++) {
00058 paramValues[i] = paramChoices[i][paramValuesIndex[i]];
00059 }
00060
00061 setComponents();
00062 setAppearence();
00063 draw();
00064 }
00065
00066 public ParametersPanel(String[] lab, String[][] ch) {
00067 this(lab, new int[lab.length], ch);
00068 }
00069
00070 private void setComponents() {
00071 labels = new JLabel[paramLabels.length];
00072 fields = new JComboBox[paramLabels.length];
00073 for (int i = 0; i < paramLabels.length; i++) {
00074 labels[i] = new JLabel(paramLabels[i], JLabel.RIGHT);
00075 if (isList[i]) {
00076 fields[i] = new JComboBox(paramChoices[i]);
00077 } else {
00078 fields[i] = new JComboBox();
00079 }
00080 fields[i].setEditable(!isList[i]);
00081 }
00082 defaultSize = new Dimension(400, paramLabels.length * 30);
00083 }
00084
00085 private void setAppearence() {
00086 setPreferredSize(defaultSize);
00087 setSize(defaultSize);
00088 }
00089
00090 private void update() {
00091 updateValues();
00092 updateValuesIndex();
00093 }
00094
00095 private void updateValues() {
00096 for (int i = 0; i < paramLabels.length; i++) {
00097 paramValues[i] = (String) (fields[i].getSelectedItem());
00098 }
00099 }
00100
00101 private void updateValuesIndex() {
00102 for (int i = 0; i < paramLabels.length; i++) {
00103 if (isList[i]) {
00104 paramValuesIndex[i] = fields[i].getSelectedIndex();
00105 }
00106 }
00107 }
00108
00109 public void actionPerformed(ActionEvent e) {
00110 update();
00111 new Thread(action, "PanelParameters " + this.toString() + " selection").start();
00112 }
00113
00114 public int getValueIndex(int i) {
00115 if (!isList[i]) {
00116 throw new IllegalArgumentException("This PanelParameter element is not set to give an Index.");
00117 }
00118 update();
00119 return paramValuesIndex[i];
00120 }
00121
00122 public int[] getValuesIndex() {
00123 update();
00124 return paramValuesIndex;
00125 }
00126
00127 public String[] getValues() {
00128 update();
00129 return paramValues;
00130 }
00131
00132 public String getValue(int i) {
00133 update();
00134 return paramValues[i];
00135 }
00136
00137 public void setAction(Runnable t) {
00138 action = t;
00139 }
00140
00141 private void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {
00142 gbc.gridx = gx;
00143 gbc.gridy = gy;
00144 gbc.gridwidth = gw;
00145 gbc.gridheight = gh;
00146 gbc.weightx = wx;
00147 gbc.weighty = wy;
00148 }
00149
00150 private void draw() {
00151 JPanel panel = new JPanel();
00152
00153 GridBagLayout gbl = new GridBagLayout();
00154 GridBagConstraints c = new GridBagConstraints();
00155 panel.setLayout(gbl);
00156
00157 for (int i = 0; i < paramLabels.length; i++) {
00158 fields[i].addActionListener(this);
00159
00160
00161 buildConstraints(c, 0, i, 1, 1, 50, 20);
00162 c.anchor = GridBagConstraints.EAST;
00163 gbl.setConstraints(labels[i], c);
00164 panel.add(labels[i]);
00165
00166
00167 buildConstraints(c, 1, i, 1, 1, 50, 20);
00168 c.fill = GridBagConstraints.HORIZONTAL;
00169 gbl.setConstraints(fields[i], c);
00170 panel.add(fields[i]);
00171 }
00172
00173 JScrollPane scrollPane = new JScrollPane(panel);
00174
00175 scrollPane.setPreferredSize(getSize());
00176 scrollPane.setSize(getSize());
00177
00178 setLayout(new BorderLayout());
00179 add(scrollPane, BorderLayout.CENTER);
00180
00181 }
00182
00183 }