1 package com.billkuker.rocketry.motorsim.visual;
\r
3 import java.awt.Component;
\r
4 import java.beans.IntrospectionException;
\r
5 import java.beans.Introspector;
\r
6 import java.beans.PropertyChangeEvent;
\r
7 import java.beans.PropertyChangeListener;
\r
8 import java.beans.PropertyDescriptor;
\r
9 import java.beans.PropertyEditorManager;
\r
10 import java.beans.PropertyEditorSupport;
\r
11 import java.lang.reflect.InvocationTargetException;
\r
12 import java.util.Vector;
\r
14 import javax.measure.unit.NonSI;
\r
15 import javax.measure.unit.Unit;
\r
16 import javax.swing.JFrame;
\r
17 import javax.swing.JPanel;
\r
18 import javax.swing.JTextField;
\r
19 import javax.swing.WindowConstants;
\r
21 import org.apache.log4j.Logger;
\r
22 import org.jscience.physics.amount.Amount;
\r
24 import com.billkuker.rocketry.motorsim.Grain;
\r
25 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;
\r
26 import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;
\r
27 import com.l2fprod.common.propertysheet.PropertySheetPanel;
\r
29 public class Editor extends PropertySheetPanel {
\r
30 private static final long serialVersionUID = 1L;
\r
32 private static Logger log = Logger.getLogger(Editor.class);
\r
36 public Editor(Object o) throws IntrospectionException,
\r
37 IllegalArgumentException, IllegalAccessException,
\r
38 InvocationTargetException {
\r
41 PropertyEditorManager.registerEditor(Amount.class,
\r
42 AmountPropertyEditor.class);
\r
44 // Build the list of properties we want it to edit
\r
45 //final PropertySheetPanel ps = new PropertySheetPanel();
\r
46 PropertyDescriptor props[] = Introspector.getBeanInfo(obj.getClass())
\r
47 .getPropertyDescriptors();
\r
48 Vector<PropertyDescriptor> v = new Vector<PropertyDescriptor>();
\r
49 for (int i = 0; i < props.length; i++) {
\r
50 if (props[i].getName().equals("class"))
\r
54 setProperties(v.toArray(new PropertyDescriptor[v.size()]));
\r
56 readFromObject(obj);
\r
58 addPropertySheetChangeListener(new PropertyChangeListener() {
\r
61 public void propertyChange(PropertyChangeEvent evt) {
\r
62 // When something changes just update the
\r
63 // object, I want the changes to be immediate.
\r
65 log.debug("Writing properties to object.");
\r
67 } catch (Exception v) {
\r
69 v.printStackTrace();
\r
70 java.awt.Toolkit.getDefaultToolkit().beep();
\r
72 readFromObject(obj);
\r
79 public static void main(String args[]) throws Exception {
\r
80 Grain g = new CoredCylindricalGrain();
\r
81 g = new RodAndTubeGrain();
\r
82 new Editor(g).show();
\r
83 new GrainPanel(g).show();
\r
86 public void show() {
\r
87 JFrame f = new JFrame();
\r
88 f.setSize(600, 400);
\r
89 f.setContentPane(this);
\r
90 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
\r
94 public static class AmountPropertyEditor extends PropertyEditorSupport {
\r
95 JTextField editor = new JTextField();
\r
99 public boolean supportsCustomEditor() {
\r
104 public String getAsText() {
\r
105 return editor.getText();
\r
109 public Object getValue() {
\r
110 String text = editor.getText().trim();
\r
112 // Trying to determine if the value is integer or
\r
113 // has a decimal part will prevent the uncertainty
\r
114 // term from appearing when user types an exact value
\r
117 return Amount.valueOf(Integer.parseInt(text), oldUnit);
\r
118 } catch (NumberFormatException e) {
\r
121 Amount a = Amount.valueOf(Double.parseDouble(text), oldUnit);
\r
123 } catch (NumberFormatException e) {
\r
124 // Storing the old unit allows you to type 10 into a field
\r
125 // that says 20 mm and get 10 mm, so you dont have to
\r
126 // type the unit if they havn't changed.
\r
127 Amount a = Amount.valueOf(editor.getText());
\r
128 oldUnit = a.getUnit();
\r
135 public void setValue(Object o) {
\r
136 Amount a = (Amount) o;
\r
137 oldUnit = a.getUnit();
\r
140 //Leave off the fractional part if it is not relevant
\r
142 text = a.getExactValue() + " " + a.getUnit();
\r
144 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();
\r
150 public void setAsText(String text) throws IllegalArgumentException {
\r
151 editor.setText(text);
\r
155 public Component getCustomEditor() {
\r