1 package com.billkuker.rocketry.motorsim.visual;
\r
2 import java.awt.Component;
\r
3 import java.beans.IntrospectionException;
\r
4 import java.beans.Introspector;
\r
5 import java.beans.PropertyChangeEvent;
\r
6 import java.beans.PropertyChangeListener;
\r
7 import java.beans.PropertyEditorManager;
\r
8 import java.beans.PropertyEditorSupport;
\r
9 import java.lang.reflect.InvocationTargetException;
\r
11 import javax.measure.unit.NonSI;
\r
12 import javax.measure.unit.Unit;
\r
13 import javax.swing.JFrame;
\r
14 import javax.swing.JPanel;
\r
15 import javax.swing.JTextField;
\r
17 import org.apache.log4j.Logger;
\r
18 import org.jscience.physics.amount.Amount;
\r
20 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;
\r
21 import com.l2fprod.common.propertysheet.PropertySheetPanel;
\r
23 public class Editor extends JPanel {
\r
24 private static final long serialVersionUID = 1L;
\r
26 private static Logger log = Logger.getLogger(Editor.class);
\r
30 public Editor(Object o) throws IntrospectionException,
\r
31 IllegalArgumentException, IllegalAccessException,
\r
32 InvocationTargetException {
\r
35 BeanInfo b = Introspector.getBeanInfo(o.getClass());
\r
36 setLayout(new GridLayout(b.getPropertyDescriptors().length - 1, 2));
\r
37 for (PropertyDescriptor p : b.getPropertyDescriptors()) {
\r
38 log.debug(p.getName());
\r
39 if (p.getName().equals("class"))
\r
42 add(new JLabel(p.getName()));
\r
43 if (p.getPropertyType().isAssignableFrom(Amount.class)){
\r
44 add(new AmountEditor(p));
\r
45 } else if ( p.getPropertyType() == boolean.class ){
\r
46 add( new BooleanEditor(p) );
\r
50 log.debug(PropertyEditorManager.findEditor(boolean.class).supportsCustomEditor());*/
\r
52 PropertyEditorManager.registerEditor(Amount.class, AmountPropertyEditor.class);
\r
54 final PropertySheetPanel ps = new PropertySheetPanel();
\r
55 ps.setBeanInfo(Introspector.getBeanInfo(obj.getClass()));
\r
56 ps.readFromObject(obj);
\r
59 ps.addPropertySheetChangeListener(new PropertyChangeListener(){
\r
62 public void propertyChange(PropertyChangeEvent evt) {
\r
63 //When something changes just update the
\r
64 //object, I want the changes to be immediate.
\r
66 ps.writeToObject(obj);
\r
67 } catch ( Exception v ){
\r
69 v.printStackTrace();
\r
70 java.awt.Toolkit.getDefaultToolkit().beep();
\r
72 ps.readFromObject(obj);
\r
79 public static void main(String args[]) throws Exception {
\r
80 CoredCylindricalGrain g = new CoredCylindricalGrain();
\r
81 g.setOD(Amount.valueOf(1, NonSI.INCH));
\r
82 new Editor(g).show();
\r
84 new GrainPanel(g).show();
\r
87 public void show() {
\r
88 JFrame f = new JFrame();
\r
90 f.setContentPane(this);
\r
91 f.setDefaultCloseOperation(f.DISPOSE_ON_CLOSE);
\r
95 public static class AmountPropertyEditor extends PropertyEditorSupport{
\r
96 JTextField editor = new JTextField();
\r
100 public boolean supportsCustomEditor() {
\r
103 @Override public String getAsText(){
\r
104 return editor.getText();
\r
107 @Override public Object getValue(){
\r
108 String text = editor.getText().trim();
\r
111 return Amount.valueOf(Integer.parseInt(text), oldUnit);
\r
112 } catch (NumberFormatException e){
\r
115 Amount a = Amount.valueOf(Double.parseDouble(text), oldUnit);
\r
117 } catch (NumberFormatException e){
\r
118 Amount a = Amount.valueOf(editor.getText());
\r
119 oldUnit = a.getUnit();
\r
124 @Override public void setValue(Object o){
\r
125 Amount a = (Amount)o;
\r
126 oldUnit = a.getUnit();
\r
130 text = a.getExactValue() + " " + a.getUnit();
\r
132 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();
\r
136 @Override public void setAsText(String text) throws IllegalArgumentException {
\r
137 editor.setText(text);
\r
140 public Component getCustomEditor(){
\r