package com.billkuker.rocketry.motorsim.visual;\r
+\r
import java.awt.Component;\r
import java.beans.IntrospectionException;\r
import java.beans.Introspector;\r
import java.beans.PropertyChangeEvent;\r
import java.beans.PropertyChangeListener;\r
+import java.beans.PropertyDescriptor;\r
import java.beans.PropertyEditorManager;\r
import java.beans.PropertyEditorSupport;\r
import java.lang.reflect.InvocationTargetException;\r
+import java.util.Vector;\r
\r
import javax.measure.unit.NonSI;\r
import javax.measure.unit.Unit;\r
import javax.swing.JFrame;\r
import javax.swing.JPanel;\r
import javax.swing.JTextField;\r
+import javax.swing.WindowConstants;\r
\r
import org.apache.log4j.Logger;\r
import org.jscience.physics.amount.Amount;\r
\r
+import com.billkuker.rocketry.motorsim.Grain;\r
import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
+import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
import com.l2fprod.common.propertysheet.PropertySheetPanel;\r
\r
-public class Editor extends JPanel {\r
+public class Editor extends PropertySheetPanel {\r
private static final long serialVersionUID = 1L;\r
\r
private static Logger log = Logger.getLogger(Editor.class);\r
IllegalArgumentException, IllegalAccessException,\r
InvocationTargetException {\r
obj = o;\r
- /*\r
- BeanInfo b = Introspector.getBeanInfo(o.getClass());\r
- setLayout(new GridLayout(b.getPropertyDescriptors().length - 1, 2));\r
- for (PropertyDescriptor p : b.getPropertyDescriptors()) {\r
- log.debug(p.getName());\r
- if (p.getName().equals("class"))\r
- continue;\r
\r
- add(new JLabel(p.getName()));\r
- if (p.getPropertyType().isAssignableFrom(Amount.class)){\r
- add(new AmountEditor(p));\r
- } else if ( p.getPropertyType() == boolean.class ){\r
- add( new BooleanEditor(p) );\r
- \r
- }\r
+ PropertyEditorManager.registerEditor(Amount.class,\r
+ AmountPropertyEditor.class);\r
+\r
+ // Build the list of properties we want it to edit\r
+ //final PropertySheetPanel ps = new PropertySheetPanel();\r
+ PropertyDescriptor props[] = Introspector.getBeanInfo(obj.getClass())\r
+ .getPropertyDescriptors();\r
+ Vector<PropertyDescriptor> v = new Vector<PropertyDescriptor>();\r
+ for (int i = 0; i < props.length; i++) {\r
+ if (props[i].getName().equals("class"))\r
+ continue;\r
+ v.add(props[i]);\r
}\r
- log.debug(PropertyEditorManager.findEditor(boolean.class).supportsCustomEditor());*/\r
- \r
- PropertyEditorManager.registerEditor(Amount.class, AmountPropertyEditor.class);\r
- \r
- final PropertySheetPanel ps = new PropertySheetPanel();\r
- ps.setBeanInfo(Introspector.getBeanInfo(obj.getClass()));\r
- ps.readFromObject(obj);\r
- add(ps);\r
- \r
- ps.addPropertySheetChangeListener(new PropertyChangeListener(){\r
+ setProperties(v.toArray(new PropertyDescriptor[v.size()]));\r
+\r
+ readFromObject(obj);\r
+\r
+ addPropertySheetChangeListener(new PropertyChangeListener() {\r
\r
@Override\r
public void propertyChange(PropertyChangeEvent evt) {\r
- //When something changes just update the\r
- //object, I want the changes to be immediate.\r
+ // When something changes just update the\r
+ // object, I want the changes to be immediate.\r
try {\r
- ps.writeToObject(obj);\r
- } catch ( Exception v ){\r
- //TODO\r
+ log.debug("Writing properties to object.");\r
+ writeToObject(obj);\r
+ } catch (Exception v) {\r
+ // TODO\r
v.printStackTrace();\r
java.awt.Toolkit.getDefaultToolkit().beep();\r
} finally {\r
- ps.readFromObject(obj);\r
+ readFromObject(obj);\r
}\r
}\r
- \r
+\r
});\r
}\r
\r
public static void main(String args[]) throws Exception {\r
- CoredCylindricalGrain g = new CoredCylindricalGrain();\r
- g.setOD(Amount.valueOf(1, NonSI.INCH));\r
+ Grain g = new CoredCylindricalGrain();\r
+ g = new RodAndTubeGrain();\r
new Editor(g).show();\r
- \r
new GrainPanel(g).show();\r
}\r
\r
public void show() {\r
JFrame f = new JFrame();\r
- f.setSize(600,400);\r
+ f.setSize(600, 400);\r
f.setContentPane(this);\r
- f.setDefaultCloseOperation(f.DISPOSE_ON_CLOSE);\r
+ f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
f.setVisible(true);\r
}\r
- \r
- public static class AmountPropertyEditor extends PropertyEditorSupport{\r
+\r
+ public static class AmountPropertyEditor extends PropertyEditorSupport {\r
JTextField editor = new JTextField();\r
Unit oldUnit;\r
\r
public boolean supportsCustomEditor() {\r
return true;\r
}\r
- @Override public String getAsText(){\r
+\r
+ @Override\r
+ public String getAsText() {\r
return editor.getText();\r
}\r
- \r
- @Override public Object getValue(){\r
+\r
+ @Override\r
+ public Object getValue() {\r
String text = editor.getText().trim();\r
+\r
+ // Trying to determine if the value is integer or\r
+ // has a decimal part will prevent the uncertainty\r
+ // term from appearing when user types an exact value\r
try {\r
try {\r
return Amount.valueOf(Integer.parseInt(text), oldUnit);\r
- } catch (NumberFormatException e){\r
- \r
+ } catch (NumberFormatException e) {\r
+\r
}\r
Amount a = Amount.valueOf(Double.parseDouble(text), oldUnit);\r
return a;\r
- } catch (NumberFormatException e){\r
+ } catch (NumberFormatException e) {\r
+ // Storing the old unit allows you to type 10 into a field\r
+ // that says 20 mm and get 10 mm, so you dont have to\r
+ // type the unit if they havn't changed.\r
Amount a = Amount.valueOf(editor.getText());\r
oldUnit = a.getUnit();\r
return a;\r
}\r
\r
}\r
- @Override public void setValue(Object o){\r
- Amount a = (Amount)o;\r
+\r
+ @Override\r
+ public void setValue(Object o) {\r
+ Amount a = (Amount) o;\r
oldUnit = a.getUnit();\r
- \r
+\r
String text;\r
- if ( a.isExact() )\r
- text = a.getExactValue() + " " + a.getUnit();\r
+ //Leave off the fractional part if it is not relevant\r
+ if (a.isExact())\r
+ text = a.getExactValue() + " " + a.getUnit();\r
else\r
- text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
- \r
+ text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
+\r
setAsText(text);\r
}\r
- @Override public void setAsText(String text) throws IllegalArgumentException {\r
+\r
+ @Override\r
+ public void setAsText(String text) throws IllegalArgumentException {\r
editor.setText(text);\r
};\r
+\r
@Override\r
- public Component getCustomEditor(){\r
+ public Component getCustomEditor() {\r
return editor;\r
}\r
}\r
\r
-\r
-\r
}\r