Add Multiport option
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MotorEditor.java
index fe38f04b4a56a1e98aeecf23abb2950a689bcbc2..65febeb0bea93238b6be7df1b7f28de69ef8b205 100644 (file)
@@ -55,6 +55,7 @@ import com.billkuker.rocketry.motorsim.grain.EndBurner;
 import com.billkuker.rocketry.motorsim.grain.Finocyl;\r
 import com.billkuker.rocketry.motorsim.grain.Moonburner;\r
 import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
+import com.billkuker.rocketry.motorsim.grain.MultiPort;\r
 import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
 import com.billkuker.rocketry.motorsim.grain.Star;\r
 import com.billkuker.rocketry.motorsim.visual.BurnPanel;\r
@@ -72,7 +73,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
        BurnTab bt;\r
        Burn burn;\r
        SummaryPanel sp;\r
-       \r
+       JTextArea error;\r
        JTabbedPane tabs;\r
 \r
        private Vector<BurnWatcher> burnWatchers = new Vector<BurnWatcher>();\r
@@ -82,16 +83,24 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                setLayout( new BorderLayout());\r
                tabs = new JTabbedPane(JTabbedPane.TOP);\r
                add(tabs, BorderLayout.CENTER);\r
-               setMotor(m);\r
+               availableFuels.addElement(m.getFuel());\r
+               availableFuels.setSelectedItem(m.getFuel());\r
+               FuelResolver.addFuelsChangeListener(this);\r
                fuelsChanged();\r
+               setMotor(m);\r
+               \r
+               Burn.getBurnSettings().addPropertyChangeListener(this);\r
        }\r
 \r
        @Override\r
        public void fuelsChanged() {\r
-               availableFuels.removeAllElements();\r
-               availableFuels.addElement(motor.getFuel());\r
+               while ( availableFuels.getSize() > 0 && availableFuels.getIndexOf(availableFuels.getSelectedItem()) != 0 )\r
+                       availableFuels.removeElementAt(0);\r
+               while ( availableFuels.getSize() > 1 )\r
+                       availableFuels.removeElementAt(1);\r
                for ( Fuel f : FuelResolver.getFuelMap().values() ){\r
-                       availableFuels.addElement(f);\r
+                       if ( f != availableFuels.getSelectedItem() )\r
+                               availableFuels.addElement(f);\r
                }\r
        }\r
 \r
@@ -109,6 +118,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                grainTypes.add(RodAndTubeGrain.class);\r
                grainTypes.add(CSlot.class);\r
                grainTypes.add(EndBurner.class);\r
+               grainTypes.add(MultiPort.class);\r
        }\r
        \r
        private List<Class<? extends Chamber>> chamberTypes = new Vector<Class<? extends Chamber>>();\r
@@ -134,10 +144,22 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
 \r
                public void reBurn() {\r
                        removeAll();\r
+                       if ( error != null ){\r
+                               MotorEditor.this.remove(error);\r
+                               error = null;\r
+                       }\r
+                       if ( sp != null ){\r
+                               MotorEditor.this.remove(sp);\r
+                               sp = null;\r
+                       }\r
                        currentThread = new Thread() {\r
+                               {\r
+                                       setName("Burn " + motor.getName());\r
+                                       setDaemon(true);\r
+                               }\r
                                public void run() {\r
                                        final Thread me = this;\r
-                                       try {\r
+                                       try {                                           \r
                                                final Burn b = new Burn(motor);\r
                                                b.addBurnProgressListener(\r
                                                                new Burn.BurnProgressListener() {\r
@@ -150,8 +172,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                                                                                }\r
                                                                        }\r
                                                                });\r
-                                               if ( sp != null )\r
-                                                       MotorEditor.this.remove(sp);\r
+\r
                                                MotorEditor.this.add(sp = new SummaryPanel(b), BorderLayout.NORTH);\r
                                                revalidate();\r
                                                b.burn();\r
@@ -168,15 +189,19 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                                                });\r
                                        } catch (BurnCanceled c){\r
                                                log.info("Burn Canceled!");\r
-                                       } catch (Exception e) {\r
-                                               if ( sp != null )\r
-                                                       MotorEditor.this.remove(sp);\r
-                                               JTextArea t = new JTextArea(e.getMessage());\r
-                                               t.setBackground(Colors.RED);\r
-                                               t.setForeground(Color.WHITE);\r
-                                               t.setEditable(false);\r
-                                               MotorEditor.this.add(t, BorderLayout.NORTH);\r
-                                               revalidate();\r
+                                       } catch (final Exception e) {\r
+                                               SwingUtilities.invokeLater(new Thread() {\r
+                                                       public void run() {\r
+                                                               if ( sp != null )\r
+                                                                       MotorEditor.this.remove(sp);\r
+                                                               error = new JTextArea(e.getMessage());\r
+                                                               error.setBackground(Colors.RED);\r
+                                                               error.setForeground(Color.WHITE);\r
+                                                               error.setEditable(false);\r
+                                                               MotorEditor.this.add(error, BorderLayout.NORTH);\r
+                                                               revalidate();\r
+                                                       }\r
+                                               });\r
                                        }\r
                                }\r
                        };\r
@@ -288,6 +313,10 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                                ((ChangeListening.Subject) motor.getChamber())\r
                                                .addPropertyChangeListener(MotorEditor.this);\r
                        }\r
+                       if (motor.getFuel() instanceof ChangeListening.Subject ){\r
+                               ((ChangeListening.Subject) motor.getFuel())\r
+                                               .addPropertyChangeListener(MotorEditor.this);\r
+                       }\r
                }\r
 \r
                public CaseEditor() {\r
@@ -374,11 +403,9 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                                                }\r
                                                return motor.getChamber();\r
                                        } catch (InstantiationException e) {\r
-                                               // TODO Auto-generated catch block\r
-                                               e.printStackTrace();\r
+                                               log.error(e);\r
                                        } catch (IllegalAccessException e) {\r
-                                               // TODO Auto-generated catch block\r
-                                               e.printStackTrace();\r
+                                               log.error(e);\r
                                        }\r
                                        return null;\r
                                }\r
@@ -458,9 +485,10 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR
                tabs.add(bt = new BurnTab(), BURN_TAB);\r
        }\r
 \r
+       private static int idx;\r
        public static Motor defaultMotor() {\r
                Motor m = new Motor();\r
-               m.setName("Example Motor");\r
+               m.setName("New Motor " + ++idx);\r
                try {\r
                        m.setFuel(FuelResolver.getFuel(new URI("motorsim:KNDX")));\r
                } catch (Exception e) {\r