1 package com.billkuker.rocketry.motorsim.visual.workbench;
3 import java.awt.Component;
4 import java.beans.PropertyChangeEvent;
5 import java.beans.PropertyChangeListener;
6 import java.util.Enumeration;
8 import javax.swing.tree.DefaultMutableTreeNode;
9 import javax.swing.tree.DefaultTreeModel;
10 import javax.swing.tree.MutableTreeNode;
11 import javax.swing.tree.TreeNode;
13 import com.billkuker.rocketry.motorsim.ChangeListening;
14 import com.billkuker.rocketry.motorsim.Fuel;
15 import com.billkuker.rocketry.motorsim.Motor;
16 import com.billkuker.rocketry.motorsim.grain.MultiGrain;
18 public class WorkbenchTreeModel extends DefaultTreeModel {
20 private static final long serialVersionUID = 1L;
22 //TreeNode root = new DefaultMutableTreeNode("Root");
23 DefaultMutableTreeNode motors = new DefaultMutableTreeNode("All Motors");
24 DefaultMutableTreeNode fuel = new DefaultMutableTreeNode("Fuels");
26 public class MultiGrainNode extends PartNode{
27 private static final long serialVersionUID = 1L;
28 public MultiGrainNode(MultiGrain part) {
30 setAllowsChildren(true);
31 add(new PartNode(part.getGrain()));
34 public void propertyChange(PropertyChangeEvent e) {
35 if ( e.getPropertyName().equals("Grain")){
37 add(new PartNode(((MultiGrain)getUserObject()).getGrain()));
38 nodesChanged(this, new int[]{0});
40 super.propertyChange(e);
44 public class FuelNode extends DefaultMutableTreeNode{
45 private static final long serialVersionUID = 1L;
47 public FuelNode(Component c, Fuel f){
53 public Component getUserObject(){
54 return (Component)super.getUserObject();
57 public Fuel getFuel(){
62 public class FuelEditNode extends FuelNode {
63 private static final long serialVersionUID = 1L;
65 public FuelEditNode(SRFuelEditor sr){
66 super(sr, sr.getFuel());
67 sr.getFuel().addPropertyChangeListener(new PropertyChangeListener(){
70 public void propertyChange(PropertyChangeEvent evt) {
71 nodeChanged(FuelEditNode.this);
76 public SRFuelEditor getUserObject(){
77 return (SRFuelEditor)super.getUserObject();
82 public class PartNode extends DefaultMutableTreeNode implements PropertyChangeListener {
83 private static final long serialVersionUID = 1L;
85 public PartNode(Object part) {
87 if (part instanceof ChangeListening.Subject) {
88 ((ChangeListening.Subject) part).addPropertyChangeListener(this);
93 public void propertyChange(PropertyChangeEvent e) {
99 public class MotorNode extends PartNode implements PropertyChangeListener {
100 private static final long serialVersionUID = 1L;
102 PartNode cn, nn, gn, fn;
104 public MotorNode(Motor m) {
106 setAllowsChildren(true);
108 add( cn = new PartNode(m.getChamber()));
109 add( nn = new PartNode(m.getNozzle()));
110 if ( m.getGrain() instanceof MultiGrain ){
111 gn = new MultiGrainNode(((MultiGrain)m.getGrain()));
113 gn = new PartNode(m.getGrain());
116 if (m instanceof ChangeListening.Subject) {
117 ((ChangeListening.Subject) m).addPropertyChangeListener(this);
122 public Motor getUserObject(){
123 return (Motor)super.getUserObject();
127 public void propertyChange(PropertyChangeEvent e) {
129 super.propertyChange(e);
134 public WorkbenchTreeModel() {
135 super(new DefaultMutableTreeNode("Root"), true);
136 getRoot().add(motors);
141 public DefaultMutableTreeNode getRoot(){
142 return (DefaultMutableTreeNode)super.getRoot();
145 public DefaultMutableTreeNode getMotors(){
149 public DefaultMutableTreeNode getFuels(){
153 public void addMotor(Motor m){
154 DefaultMutableTreeNode root = getRoot();
155 motors.add(new MotorNode(m));
156 nodesWereInserted(motors, new int[]{motors.getChildCount()-1});
160 @SuppressWarnings("unchecked")
161 public void removeMotor(Motor m){
162 Enumeration<TreeNode> e = motors.children();
163 while ( e.hasMoreElements() ){
164 TreeNode n = e.nextElement();
165 if ( n instanceof MotorNode ){
166 if ( ((MotorNode)n).getUserObject() == m ){
167 removeNodeFromParent((MotorNode)n);