org » gecode » gist » swing
ConfigDialog.java
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 package org.gecode.gist.swing;
00039
00040 import java.awt.*;
00041 import java.awt.event.*;
00042 import javax.swing.*;
00043 import javax.swing.event.*;
00044 import javax.swing.text.JTextComponent;
00045 import javax.swing.Box;
00046
00047 import org.gecode.gist.Config;
00048
00049 class ConfigDialog extends JDialog {
00050
00051 public ConfigDialog(Frame owner) {
00052 super(owner, "Gecode/J Gist Preferences");
00053 setVisible(false);
00054
00055 Box b = new Box(BoxLayout.Y_AXIS);
00056
00057 Box b1 = new Box(BoxLayout.Y_AXIS);
00058 b1.setBorder(BorderFactory.createTitledBorder("Computation parameters"));
00059 b1.add(makeField("Adaptive distance", "Adaptive recomputation distance",
00060 new IValue() {
00061 void setImp(int i) { Config.a_d(i); }
00062 int getImp() { return Config.a_d(); }
00063 }));
00064 b1.add(makeField("Max distance", "Maximum recomputation distance",
00065 new IValue() {
00066 void setImp(int i) { Config.mrd(i); }
00067 int getImp() { return Config.mrd(); }
00068 }));
00069 b1.add(makeField("N solutions", "Number of solutions for \"Search N\"",
00070 new IValue() {
00071 void setImp(int i) { Config.n(i); }
00072 int getImp() { return Config.n(); }
00073 }));
00074 b1.add(makeField("Cutoff", "Maximum number of nodes to\nsearch before cutoff.",
00075 new IValue() {
00076 void setImp(int i) { Config.searchCutoff(i); }
00077 int getImp() { return Config.searchCutoff(); }
00078 }));
00079 b1.add(Box.createGlue());
00080 b.add(b1);
00081
00082 Box b2 = new Box(BoxLayout.Y_AXIS);
00083 b2.setBorder(BorderFactory.createTitledBorder("Display parameters"));
00084 b2.add(makeField("Hide", "Hide failed subtrees automatically",
00085 new BValue() {
00086 void setImp(boolean b) { Config.hide(b); }
00087 boolean getImp() { return Config.hide(); }
00088 }));
00089 b2.add(makeField("Zoom", "Zoom to fit automatically",
00090 new BValue() {
00091 void setImp(boolean b) { Config.zoom(b); }
00092 boolean getImp() { return Config.zoom(); }
00093 }));
00094 b2.add(Box.createGlue());
00095 b.add(b2);
00096
00097 add(b);
00098 pack();
00099 }
00100
00101 public void open() {
00102 setVisible(true);
00103 }
00104
00105 private JComponent makeField(String s, String tt, Value v) {
00106 JLabel jl = new JLabel(s);
00107 JPanel jp = new JPanel(new BorderLayout());
00108 jp.add(jl, BorderLayout.WEST);
00109 jp.setToolTipText(tt);
00110 if (v instanceof IValue) {
00111 JTextField jtf = new JTextField("" + v, 10);
00112 jp.add(jtf, BorderLayout.EAST);
00113 TextFieldEventHandler a = new TextFieldEventHandler(jtf, v);
00114 jtf.addActionListener(a);
00115 jtf.addFocusListener(a);
00116 } else {
00117 JCheckBox jcb = new JCheckBox();
00118 jp.add(jcb, BorderLayout.EAST);
00119 CheckFieldEventHandler a = new CheckFieldEventHandler(jcb, (BValue)v);
00120 jcb.setSelected( ((BValue) v).getImp() );
00121 jcb.addActionListener(a);
00122 jcb.addFocusListener(a);
00123 }
00124 Dimension d = new Dimension(jp.getMaximumSize().width,
00125 jp.getPreferredSize().height);
00126 jp.setMaximumSize(d);
00127 return jp;
00128 }
00129 }
00130
00131 class Value {
00132 public void set(String s) {}
00133 }
00134
00135 class IValue extends Value {
00136 public void set(String s) {
00137 try {
00138 setImp(Integer.parseInt(s));
00139 } catch(NumberFormatException nfe) {}
00140 }
00141 public String toString() {
00142 return "" + getImp();
00143 }
00144 void setImp(int i) {}
00145 int getImp() { return 0; }
00146 }
00147
00148 class BValue extends Value {
00149 public void set(String s) {
00150 try {
00151 setImp(Boolean.parseBoolean(s));
00152 } catch(NumberFormatException nfe) {}
00153 }
00154 public String toString() {
00155 return "" + getImp();
00156 }
00157 void setImp(boolean b) {}
00158 boolean getImp() {return false; }
00159 }
00160
00161
00162 class TextFieldEventHandler
00163 extends FocusAdapter
00164 implements ActionListener {
00165
00166 private JTextComponent jtc;
00167 private Value v;
00168
00169 public TextFieldEventHandler(JTextComponent jtc, Value v) {
00170 super();
00171 this.jtc = jtc;
00172 this.v = v;
00173 }
00174
00175 public void actionPerformed(ActionEvent e) {
00176 update();
00177 jtc.transferFocus();
00178 }
00179
00180 public void focusLost(FocusEvent e) {
00181 update();
00182 }
00183
00184 private void update() {
00185 v.set(jtc.getText());
00186 jtc.setText("" + v);
00187 }
00188 }
00189
00190 class CheckFieldEventHandler
00191 extends FocusAdapter
00192 implements ActionListener {
00193
00194 private JToggleButton jtb;
00195 private BValue v;
00196
00197 public CheckFieldEventHandler(JToggleButton jtb, BValue v) {
00198 super();
00199 this.jtb = jtb;
00200 this.v = v;
00201 }
00202
00203 public void actionPerformed(ActionEvent e) {
00204 update();
00205 jtb.transferFocus();
00206 }
00207
00208 public void focusLost(FocusEvent e) {
00209 update();
00210 }
00211
00212 private void update() {
00213 v.setImp(jtb.isSelected());
00214 jtb.setSelected(v.getImp());
00215 }
00216 }