1 package com.billkuker.rocketry.motorsim.visual;
\r
3 import java.awt.Component;
\r
4 import java.awt.Dimension;
\r
5 import java.beans.IntrospectionException;
\r
6 import java.beans.Introspector;
\r
7 import java.beans.PropertyChangeEvent;
\r
8 import java.beans.PropertyChangeListener;
\r
9 import java.beans.PropertyDescriptor;
\r
10 import java.beans.PropertyEditorManager;
\r
11 import java.beans.PropertyEditorSupport;
\r
12 import java.text.DecimalFormat;
\r
13 import java.text.NumberFormat;
\r
14 import java.util.EnumSet;
\r
15 import java.util.Vector;
\r
17 import javax.measure.unit.SI;
\r
18 import javax.measure.unit.Unit;
\r
19 import javax.swing.DefaultComboBoxModel;
\r
20 import javax.swing.JComboBox;
\r
21 import javax.swing.JFrame;
\r
22 import javax.swing.JLabel;
\r
23 import javax.swing.JTable;
\r
24 import javax.swing.JTextField;
\r
25 import javax.swing.WindowConstants;
\r
26 import javax.swing.table.TableCellRenderer;
\r
28 import org.apache.log4j.Logger;
\r
29 import org.jscience.physics.amount.Amount;
\r
31 import com.billkuker.rocketry.motorsim.CylindricalChamber;
\r
32 import com.billkuker.rocketry.motorsim.RocketScience;
\r
33 import com.billkuker.rocketry.motorsim.cases.PVCCase;
\r
34 import com.l2fprod.common.propertysheet.PropertySheetPanel;
\r
35 import com.sun.org.apache.xml.internal.security.utils.EncryptionElementProxy;
\r
37 public class Editor extends PropertySheetPanel {
\r
38 private static final long serialVersionUID = 1L;
\r
39 private static final NumberFormat nf = new DecimalFormat("##########.###");
\r
40 private static final Logger log = Logger.getLogger(Editor.class);
\r
44 @SuppressWarnings("deprecation")
\r
45 public Editor(Object o) {
\r
48 PropertyEditorManager.registerEditor(Amount.class,
\r
49 AmountPropertyEditor.class);
\r
51 setToolBarVisible(false);
\r
52 //setMinimumSize(new Dimension(150,200));
\r
54 getRendererRegistry().registerRenderer(Amount.class, AmountRenderer.class);
\r
56 // Build the list of properties we want it to edit
\r
57 //final PropertySheetPanel ps = new PropertySheetPanel();
\r
58 PropertyDescriptor props[];
\r
60 props = Introspector.getBeanInfo(obj.getClass())
\r
61 .getPropertyDescriptors();
\r
62 } catch (IntrospectionException e) {
\r
65 Vector<PropertyDescriptor> v = new Vector<PropertyDescriptor>();
\r
66 for (int i = 0; i < props.length; i++) {
\r
67 if (props[i].getName().equals("class"))
\r
71 if ( Enum.class.isAssignableFrom( props[i].getPropertyType() ) ){
\r
72 getEditorRegistry().registerEditor(props[i].getPropertyType(), new EnumPropertyEditor(props[i].getPropertyType()));
\r
76 setProperties(v.toArray(new PropertyDescriptor[v.size()]));
\r
78 readFromObject(obj);
\r
80 getTable().setRowHeight(22);
\r
82 setMinimumSize(new Dimension(
\r
83 getTable().getPreferredSize().width,
\r
84 getTable().getPreferredSize().height + 10));
\r
86 addPropertySheetChangeListener(new PropertyChangeListener() {
\r
88 public void propertyChange(PropertyChangeEvent evt) {
\r
89 // When something changes just update the
\r
90 // object, I want the changes to be immediate.
\r
92 log.debug("Writing properties to object.");
\r
94 } catch (Exception v) {
\r
96 v.printStackTrace();
\r
97 java.awt.Toolkit.getDefaultToolkit().beep();
\r
99 readFromObject(obj);
\r
106 public void showAsWindow() {
\r
107 JFrame f = new JFrame();
\r
108 f.setTitle(obj.getClass().getName());
\r
109 f.setSize(600, 400);
\r
110 f.setContentPane(this);
\r
111 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
\r
112 f.setVisible(true);
\r
115 public static void main(String args[]){
\r
116 PVCCase o = new PVCCase();
\r
117 o.setLength(Amount.valueOf(100, SI.MILLIMETER));
\r
118 Editor e = new Editor(o);
\r
122 public static class AmountRenderer implements TableCellRenderer {
\r
124 public Component getTableCellRendererComponent(JTable table,
\r
125 Object value, boolean isSelected, boolean hasFocus, int row,
\r
127 return new JLabel(RocketScience.ammountToString((Amount<?>)value));
\r
132 public static class EnumPropertyEditor<E extends Enum<E>> extends PropertyEditorSupport {
\r
133 JComboBox editor = new JComboBox();
\r
134 DefaultComboBoxModel model = new DefaultComboBoxModel();
\r
136 public EnumPropertyEditor(Class<E> clazz){
\r
137 this.clazz = clazz;
\r
138 for ( E e : EnumSet.allOf(clazz) ){
\r
139 model.addElement(e);
\r
141 editor.setModel(model);
\r
145 public Object getValue() {
\r
146 return editor.getSelectedItem();
\r
150 public boolean supportsCustomEditor() {
\r
155 public Component getCustomEditor() {
\r
160 public static class AmountPropertyEditor extends PropertyEditorSupport {
\r
161 JTextField editor = new JTextField();
\r
165 public boolean supportsCustomEditor() {
\r
170 public String getAsText() {
\r
171 return editor.getText();
\r
175 public Object getValue() {
\r
176 String text = editor.getText().trim();
\r
178 // Trying to determine if the value is integer or
\r
179 // has a decimal part will prevent the uncertainty
\r
180 // term from appearing when user types an exact value
\r
183 return Amount.valueOf(Integer.parseInt(text), oldUnit);
\r
184 } catch (NumberFormatException e) {
\r
187 Amount<?> a = Amount.valueOf(Double.parseDouble(text), oldUnit);
\r
189 } catch (NumberFormatException e) {
\r
190 // Storing the old unit allows you to type 10 into a field
\r
191 // that says 20 mm and get 10 mm, so you dont have to
\r
192 // type the unit if they havn't changed.
\r
194 //Amount wants a leading 0
\r
195 if (text.startsWith(".")){
\r
199 Amount<?> a = Amount.valueOf(text);
\r
200 oldUnit = a.getUnit();
\r
206 @SuppressWarnings("unchecked")
\r
208 public void setValue(Object o) {
\r
209 Amount a = (Amount) o;
\r
210 oldUnit = a.getUnit();
\r
213 //Leave off the fractional part if it is not relevant
\r
215 text = a.getExactValue() + " " + a.getUnit();
\r
217 text = nf.format(a.doubleValue(a.getUnit())) + " " + a.getUnit();
\r
223 public void setAsText(String text) throws IllegalArgumentException {
\r
224 editor.setText(text);
\r
228 public Component getCustomEditor() {
\r