Add Multiport option
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MotorEditor.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.awt.Color;\r
5 import java.awt.Dimension;\r
6 import java.awt.event.ActionEvent;\r
7 import java.awt.event.ActionListener;\r
8 import java.awt.event.ComponentEvent;\r
9 import java.awt.event.ComponentListener;\r
10 import java.awt.event.FocusEvent;\r
11 import java.awt.event.FocusListener;\r
12 import java.beans.PropertyChangeEvent;\r
13 import java.beans.PropertyChangeListener;\r
14 import java.beans.PropertyVetoException;\r
15 import java.net.URI;\r
16 import java.util.List;\r
17 import java.util.Vector;\r
18 \r
19 import javax.measure.unit.SI;\r
20 import javax.swing.Box;\r
21 import javax.swing.BoxLayout;\r
22 import javax.swing.DefaultComboBoxModel;\r
23 import javax.swing.JComboBox;\r
24 import javax.swing.JFrame;\r
25 import javax.swing.JLabel;\r
26 import javax.swing.JPanel;\r
27 import javax.swing.JSplitPane;\r
28 import javax.swing.JTabbedPane;\r
29 import javax.swing.JTextArea;\r
30 import javax.swing.JTextField;\r
31 import javax.swing.SwingUtilities;\r
32 import javax.swing.UIManager;\r
33 import javax.swing.WindowConstants;\r
34 \r
35 import org.apache.log4j.Logger;\r
36 import org.jscience.physics.amount.Amount;\r
37 \r
38 import com.billkuker.rocketry.motorsim.Burn;\r
39 import com.billkuker.rocketry.motorsim.Chamber;\r
40 import com.billkuker.rocketry.motorsim.ChangeListening;\r
41 import com.billkuker.rocketry.motorsim.Colors;\r
42 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
43 import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
44 import com.billkuker.rocketry.motorsim.Fuel;\r
45 import com.billkuker.rocketry.motorsim.Grain;\r
46 import com.billkuker.rocketry.motorsim.Motor;\r
47 import com.billkuker.rocketry.motorsim.Nozzle;\r
48 import com.billkuker.rocketry.motorsim.cases.Schedule40;\r
49 import com.billkuker.rocketry.motorsim.cases.Schedule80;\r
50 import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
51 import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
52 import com.billkuker.rocketry.motorsim.grain.CSlot;\r
53 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
54 import com.billkuker.rocketry.motorsim.grain.EndBurner;\r
55 import com.billkuker.rocketry.motorsim.grain.Finocyl;\r
56 import com.billkuker.rocketry.motorsim.grain.Moonburner;\r
57 import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
58 import com.billkuker.rocketry.motorsim.grain.MultiPort;\r
59 import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
60 import com.billkuker.rocketry.motorsim.grain.Star;\r
61 import com.billkuker.rocketry.motorsim.visual.BurnPanel;\r
62 import com.billkuker.rocketry.motorsim.visual.ClassChooser;\r
63 import com.billkuker.rocketry.motorsim.visual.Editor;\r
64 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
65 import com.billkuker.rocketry.motorsim.visual.HardwarePanel;\r
66 import com.billkuker.rocketry.motorsim.visual.SummaryPanel;\r
67 \r
68 public class MotorEditor extends JPanel implements PropertyChangeListener, FuelResolver.FuelsChangeListener{\r
69         private static final long serialVersionUID = 1L;\r
70         private static Logger log = Logger.getLogger(MotorEditor.class);\r
71         Motor motor;\r
72         GrainEditor grainEditor;\r
73         BurnTab bt;\r
74         Burn burn;\r
75         SummaryPanel sp;\r
76         JTextArea error;\r
77         JTabbedPane tabs;\r
78 \r
79         private Vector<BurnWatcher> burnWatchers = new Vector<BurnWatcher>();\r
80         private DefaultComboBoxModel availableFuels = new DefaultComboBoxModel();\r
81         \r
82         public MotorEditor(Motor m) {\r
83                 setLayout( new BorderLayout());\r
84                 tabs = new JTabbedPane(JTabbedPane.TOP);\r
85                 add(tabs, BorderLayout.CENTER);\r
86                 availableFuels.addElement(m.getFuel());\r
87                 availableFuels.setSelectedItem(m.getFuel());\r
88                 FuelResolver.addFuelsChangeListener(this);\r
89                 fuelsChanged();\r
90                 setMotor(m);\r
91                 \r
92                 Burn.getBurnSettings().addPropertyChangeListener(this);\r
93         }\r
94 \r
95         @Override\r
96         public void fuelsChanged() {\r
97                 while ( availableFuels.getSize() > 0 && availableFuels.getIndexOf(availableFuels.getSelectedItem()) != 0 )\r
98                         availableFuels.removeElementAt(0);\r
99                 while ( availableFuels.getSize() > 1 )\r
100                         availableFuels.removeElementAt(1);\r
101                 for ( Fuel f : FuelResolver.getFuelMap().values() ){\r
102                         if ( f != availableFuels.getSelectedItem() )\r
103                                 availableFuels.addElement(f);\r
104                 }\r
105         }\r
106 \r
107         //private static final int XML_TAB = 0;\r
108         private static final int CASING_TAB = 0;\r
109         private static final int GRAIN_TAB = 1;\r
110         private static final int BURN_TAB = 2;\r
111 \r
112         private List<Class<? extends Grain>> grainTypes = new Vector<Class<? extends Grain>>();\r
113         {\r
114                 grainTypes.add(CoredCylindricalGrain.class);\r
115                 grainTypes.add(Finocyl.class);\r
116                 grainTypes.add(Star.class);\r
117                 grainTypes.add(Moonburner.class);\r
118                 grainTypes.add(RodAndTubeGrain.class);\r
119                 grainTypes.add(CSlot.class);\r
120                 grainTypes.add(EndBurner.class);\r
121                 grainTypes.add(MultiPort.class);\r
122         }\r
123         \r
124         private List<Class<? extends Chamber>> chamberTypes = new Vector<Class<? extends Chamber>>();\r
125         {\r
126                 chamberTypes.add(CylindricalChamber.class);\r
127                 chamberTypes.add(Schedule40.class);\r
128                 chamberTypes.add(Schedule80.class);\r
129         }\r
130 \r
131         private class BurnTab extends JPanel {\r
132                 private static final long serialVersionUID = 1L;\r
133                 private Thread currentThread;\r
134                 \r
135                 public BurnTab() {\r
136                         setLayout(new BorderLayout());\r
137                         setName("Simulation Results");\r
138                         reBurn();\r
139                 }\r
140                 \r
141                 private class BurnCanceled extends RuntimeException{\r
142                         private static final long serialVersionUID = 1L;\r
143                 };\r
144 \r
145                 public void reBurn() {\r
146                         removeAll();\r
147                         if ( error != null ){\r
148                                 MotorEditor.this.remove(error);\r
149                                 error = null;\r
150                         }\r
151                         if ( sp != null ){\r
152                                 MotorEditor.this.remove(sp);\r
153                                 sp = null;\r
154                         }\r
155                         currentThread = new Thread() {\r
156                                 {\r
157                                         setName("Burn " + motor.getName());\r
158                                         setDaemon(true);\r
159                                 }\r
160                                 public void run() {\r
161                                         final Thread me = this;\r
162                                         try {                                           \r
163                                                 final Burn b = new Burn(motor);\r
164                                                 b.addBurnProgressListener(\r
165                                                                 new Burn.BurnProgressListener() {\r
166                                                                         @Override\r
167                                                                         public void burnComplete(){};\r
168                                                                         @Override\r
169                                                                         public void setProgress(float f) {\r
170                                                                                 if ( currentThread != me ){\r
171                                                                                         throw new BurnCanceled();\r
172                                                                                 }\r
173                                                                         }\r
174                                                                 });\r
175 \r
176                                                 MotorEditor.this.add(sp = new SummaryPanel(b), BorderLayout.NORTH);\r
177                                                 revalidate();\r
178                                                 b.burn();\r
179 \r
180                                                 final BurnPanel bp = new BurnPanel(b);\r
181                                                 SwingUtilities.invokeLater(new Thread() {\r
182                                                         public void run() {\r
183                                                                 add(bp, BorderLayout.CENTER);\r
184                                                                 for (BurnWatcher bw : burnWatchers)\r
185                                                                         bw.replace(burn, b);\r
186                                                                 burn = b;\r
187                                                                 revalidate();\r
188                                                         }\r
189                                                 });\r
190                                         } catch (BurnCanceled c){\r
191                                                 log.info("Burn Canceled!");\r
192                                         } catch (final Exception e) {\r
193                                                 SwingUtilities.invokeLater(new Thread() {\r
194                                                         public void run() {\r
195                                                                 if ( sp != null )\r
196                                                                         MotorEditor.this.remove(sp);\r
197                                                                 error = new JTextArea(e.getMessage());\r
198                                                                 error.setBackground(Colors.RED);\r
199                                                                 error.setForeground(Color.WHITE);\r
200                                                                 error.setEditable(false);\r
201                                                                 MotorEditor.this.add(error, BorderLayout.NORTH);\r
202                                                                 revalidate();\r
203                                                         }\r
204                                                 });\r
205                                         }\r
206                                 }\r
207                         };\r
208                         currentThread.start();\r
209                 }\r
210         }\r
211 \r
212         private class GrainEditor extends JSplitPane {\r
213                 private static final long serialVersionUID = 1L;\r
214 \r
215                 public GrainEditor(final Grain g) {\r
216                         super(JSplitPane.HORIZONTAL_SPLIT);\r
217                         setName("Grain Geometry");\r
218                         setRightComponent(new GrainPanel(g));\r
219                         if (g instanceof Grain.Composite) {\r
220                                 final JPanel p = new JPanel();\r
221                                 p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));\r
222                                 \r
223                                 Editor grainEditor = new Editor(g);\r
224                                 grainEditor.setAlignmentX(LEFT_ALIGNMENT);\r
225                                 p.add(grainEditor);\r
226                                 \r
227                                 for (Grain gg : ((Grain.Composite) g).getGrains()) {\r
228                                         final int grainEditorIndex = p.getComponentCount() + 2;\r
229                                         \r
230                                         JLabel l = new JLabel("Grain Type:");\r
231                                         l.setAlignmentX(LEFT_ALIGNMENT);\r
232                                         p.add(l);\r
233                                         \r
234                                         p.add(new ClassChooser<Grain>(grainTypes, gg) {\r
235                                                 private static final long serialVersionUID = 1L;\r
236                                                 {setAlignmentX(LEFT_ALIGNMENT);}\r
237                                                 @Override\r
238                                                 protected Grain classSelected(\r
239                                                                 Class<? extends Grain> clazz, Grain ng) {\r
240                                                         if ( ng == null ){\r
241                                                                 try {\r
242                                                                         ng = clazz.newInstance();\r
243                                                                 } catch (InstantiationException e) {\r
244                                                                         e.printStackTrace();\r
245                                                                 } catch (IllegalAccessException e) {\r
246                                                                         e.printStackTrace();\r
247                                                                 }\r
248                                                         }\r
249                                                         if (g instanceof MultiGrain) {\r
250                                                                 ((MultiGrain) g).setGrain(ng);\r
251                                                                 p.remove(grainEditorIndex);\r
252                                                                 p.add(new Editor(ng), grainEditorIndex);\r
253                                                                 p.remove(0);\r
254                                                                 p.add(new Editor(g), 0);\r
255                                                         }\r
256                                                         return ng;\r
257 \r
258                                                 }\r
259                                         });\r
260                                         \r
261                                         Editor ggEditor = new Editor(gg);\r
262                                         ggEditor.setAlignmentX(LEFT_ALIGNMENT);\r
263                                         p.add(ggEditor);\r
264                                         \r
265                                         if (gg instanceof ChangeListening.Subject) {\r
266                                                 ((ChangeListening.Subject) gg)\r
267                                                                 .addPropertyChangeListener(MotorEditor.this);\r
268                                         }\r
269                                 }\r
270                                 setLeftComponent(p);\r
271                         } else {\r
272                                 setLeftComponent(new Editor(g));\r
273                         }\r
274                         // setDividerLocation(.25);\r
275                         // setResizeWeight(.25);\r
276                         if (g instanceof ChangeListening.Subject) {\r
277                                 ((ChangeListening.Subject) g)\r
278                                                 .addPropertyChangeListener(MotorEditor.this);\r
279                         }\r
280                 }\r
281         }\r
282 \r
283         private class CaseEditor extends JSplitPane implements ComponentListener {\r
284                 private static final long serialVersionUID = 1L;\r
285                 \r
286                 private HardwarePanel hp;\r
287                 private JPanel casing;\r
288                 private JPanel nozzle;\r
289                 private Editor casingEditor;\r
290                 private Editor nozzleEditor;\r
291                 \r
292                 private void setup() {\r
293                         if (casingEditor != null)\r
294                                 casing.remove(casingEditor);\r
295                         casingEditor = new Editor(motor.getChamber());\r
296                         casingEditor.setAlignmentX(LEFT_ALIGNMENT);\r
297                         casing.add(casingEditor);\r
298                         \r
299                         if (nozzleEditor != null)\r
300                                 nozzle.remove(nozzleEditor);\r
301                         nozzleEditor = new Editor(motor.getNozzle());\r
302                         nozzleEditor.setAlignmentX(LEFT_ALIGNMENT);\r
303                         nozzle.add(nozzleEditor);\r
304                         \r
305                         if (hp != null)\r
306                                 remove(hp);\r
307                         setBottomComponent(hp = new HardwarePanel(motor));\r
308                         if (motor.getNozzle() instanceof ChangeListening.Subject) {\r
309                                 ((ChangeListening.Subject) motor.getNozzle())\r
310                                                 .addPropertyChangeListener(MotorEditor.this);\r
311                         }\r
312                         if (motor.getChamber() instanceof ChangeListening.Subject) {\r
313                                 ((ChangeListening.Subject) motor.getChamber())\r
314                                                 .addPropertyChangeListener(MotorEditor.this);\r
315                         }\r
316                         if (motor.getFuel() instanceof ChangeListening.Subject ){\r
317                                 ((ChangeListening.Subject) motor.getFuel())\r
318                                                 .addPropertyChangeListener(MotorEditor.this);\r
319                         }\r
320                 }\r
321 \r
322                 public CaseEditor() {\r
323                         super(JSplitPane.VERTICAL_SPLIT);\r
324                         setName("General Parameters");\r
325                         this.addComponentListener(this);\r
326                         \r
327                         JPanel parts = new JPanel();\r
328                         parts.setLayout(new BoxLayout(parts, BoxLayout.X_AXIS));\r
329                         setTopComponent(parts);\r
330                         \r
331                         JPanel nameAndFuel = new JPanel();\r
332                         nameAndFuel.setLayout(new BoxLayout(nameAndFuel, BoxLayout.Y_AXIS));\r
333 \r
334                         JLabel l = new JLabel("Name:");\r
335                         l.setAlignmentX(LEFT_ALIGNMENT);\r
336                         nameAndFuel.add(l);\r
337                         nameAndFuel.add(new JTextField(motor.getName()) {\r
338                                 private static final long serialVersionUID = 1L;\r
339                                 {\r
340                                         setAlignmentX(LEFT_ALIGNMENT);\r
341                                         setMinimumSize(new Dimension(200, 20));\r
342                                         setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
343                                         final JTextField t = this;\r
344                                         addFocusListener(new FocusListener() {\r
345 \r
346                                                 @Override\r
347                                                 public void focusLost(FocusEvent e) {\r
348                                                         String n = t.getText();\r
349                                                         if (!"".equals(n) && !n.equals(motor.getName())) {\r
350                                                                 motor.setName(n);\r
351                                                         } else {\r
352                                                                 t.setText(motor.getName());\r
353                                                         }\r
354                                                 }\r
355 \r
356                                                 @Override\r
357                                                 public void focusGained(FocusEvent e) {\r
358 \r
359                                                 }\r
360                                         });\r
361 \r
362                                 }\r
363                         });\r
364                         \r
365                         l = new JLabel("Fuel:");\r
366                         l.setAlignmentX(LEFT_ALIGNMENT);\r
367                         nameAndFuel.add(l);\r
368                         \r
369                         nameAndFuel.add( new JComboBox(availableFuels){\r
370                                 private static final long serialVersionUID = 1L;\r
371                                 {\r
372                                         setAlignmentX(LEFT_ALIGNMENT);\r
373                                         this.setSelectedItem(motor.getFuel());\r
374                                         setMinimumSize(new Dimension(200, 20));\r
375                                         setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
376                                         addActionListener(new ActionListener(){\r
377                                                 @Override\r
378                                                 public void actionPerformed(ActionEvent e) {\r
379                                                         motor.setFuel((Fuel)getSelectedItem());\r
380                                                         System.out.println("FUEL CHANGED");\r
381                                                 }});\r
382                                 }\r
383                         });\r
384                         \r
385                         l = new JLabel("Casing:");\r
386                         l.setAlignmentX(LEFT_ALIGNMENT);\r
387                         nameAndFuel.add(l);\r
388                         \r
389                         nameAndFuel.add(new ClassChooser<Chamber>(chamberTypes, motor.getChamber()) {\r
390                                 private static final long serialVersionUID = 1L;\r
391                                 {\r
392                                         setAlignmentX(LEFT_ALIGNMENT);\r
393                                         setMinimumSize(new Dimension(200, 20));\r
394                                         setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
395                                 }\r
396                                 @Override\r
397                                 protected Chamber classSelected(Class<? extends Chamber> clazz, Chamber c) {\r
398                                         try {\r
399                                                 if ( c != null ){\r
400                                                         motor.setChamber(c);\r
401                                                 } else {\r
402                                                         motor.setChamber(clazz.newInstance());\r
403                                                 }\r
404                                                 return motor.getChamber();\r
405                                         } catch (InstantiationException e) {\r
406                                                 log.error(e);\r
407                                         } catch (IllegalAccessException e) {\r
408                                                 log.error(e);\r
409                                         }\r
410                                         return null;\r
411                                 }\r
412                         });\r
413                         \r
414                         \r
415                         nameAndFuel.add(Box.createVerticalGlue());\r
416                         parts.add(nameAndFuel);\r
417                         \r
418                         casing = new JPanel();\r
419                         casing.setLayout(new BoxLayout(casing, BoxLayout.Y_AXIS));\r
420                         l = new JLabel("Casing:");\r
421                         l.setAlignmentX(LEFT_ALIGNMENT);\r
422                         casing.add(l);\r
423                         parts.add(casing);\r
424                         \r
425                         nozzle = new JPanel();\r
426                         nozzle.setLayout(new BoxLayout(nozzle, BoxLayout.Y_AXIS));\r
427                         l = new JLabel("Nozzle:");\r
428                         l.setAlignmentX(LEFT_ALIGNMENT);\r
429                         nozzle.add(l);\r
430                         parts.add(nozzle);\r
431                         \r
432                         motor.addPropertyChangeListener(new PropertyChangeListener() {\r
433                                 @Override\r
434                                 public void propertyChange(PropertyChangeEvent arg0) {\r
435                                         setup();\r
436                                         setResizeWeight(.5);\r
437                                         setDividerLocation(.5);\r
438                                 }\r
439                         });\r
440                         \r
441                         setup();\r
442                 }\r
443 \r
444                 @Override\r
445                 public void componentHidden(ComponentEvent arg0) {\r
446 \r
447                 }\r
448 \r
449                 @Override\r
450                 public void componentMoved(ComponentEvent arg0) {\r
451 \r
452                 }\r
453 \r
454                 @Override\r
455                 public void componentResized(ComponentEvent arg0) {\r
456                         setResizeWeight(.5);\r
457                         setDividerLocation(.5);\r
458                 }\r
459 \r
460                 @Override\r
461                 public void componentShown(ComponentEvent arg0) {\r
462 \r
463                 }\r
464         }\r
465 \r
466 \r
467 \r
468 \r
469         public Motor getMotor() {\r
470                 return motor;\r
471         }\r
472 \r
473 \r
474         private void setMotor(Motor m) {\r
475                 if (motor != null)\r
476                         motor.removePropertyChangeListener(this);\r
477                 motor = m;\r
478                 motor.addPropertyChangeListener(this);\r
479                 if (grainEditor != null)\r
480                         remove(grainEditor);\r
481                 while (tabs.getTabCount() > 1)\r
482                         tabs.removeTabAt(1);\r
483                 tabs.add(new CaseEditor(), CASING_TAB);\r
484                 tabs.add(new GrainEditor(motor.getGrain()), GRAIN_TAB);\r
485                 tabs.add(bt = new BurnTab(), BURN_TAB);\r
486         }\r
487 \r
488         private static int idx;\r
489         public static Motor defaultMotor() {\r
490                 Motor m = new Motor();\r
491                 m.setName("New Motor " + ++idx);\r
492                 try {\r
493                         m.setFuel(FuelResolver.getFuel(new URI("motorsim:KNDX")));\r
494                 } catch (Exception e) {\r
495                         throw new Error(e);\r
496                 }\r
497 \r
498                 CylindricalChamber c = new CylindricalChamber();\r
499                 c.setLength(Amount.valueOf(420, SI.MILLIMETER));\r
500                 c.setID(Amount.valueOf(70, SI.MILLIMETER));\r
501                 c.setOD(Amount.valueOf(72, SI.MILLIMETER));\r
502                 m.setChamber(c);\r
503 \r
504                 CoredCylindricalGrain g = new CoredCylindricalGrain();\r
505                 try {\r
506                         g.setLength(Amount.valueOf(100, SI.MILLIMETER));\r
507                         g.setOD(Amount.valueOf(62, SI.MILLIMETER));\r
508                         g.setID(Amount.valueOf(20, SI.MILLIMETER));\r
509                 } catch (PropertyVetoException v) {\r
510                         throw new Error(v);\r
511                 }\r
512                 \r
513                 MultiGrain mg = new MultiGrain(g, 4);\r
514                 mg.setSpacing(Amount.valueOf(6, SI.MILLIMETER));\r
515                 m.setGrain(mg);\r
516 \r
517                 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
518                 n.setThroatDiameter(Amount.valueOf(14.089, SI.MILLIMETER));\r
519                 n.setExitDiameter(Amount.valueOf(44.55, SI.MILLIMETER));\r
520                 n.setEfficiency(.85);\r
521                 m.setNozzle(n);\r
522 \r
523                 return m;\r
524         }\r
525 \r
526         public void focusOnObject(Object o) {\r
527                 if (o instanceof Grain)\r
528                         tabs.setSelectedIndex(GRAIN_TAB);\r
529                 if (o instanceof Chamber || o instanceof Nozzle)\r
530                         tabs.setSelectedIndex(CASING_TAB);\r
531         }\r
532 \r
533         public void addBurnWatcher(BurnWatcher bw) {\r
534                 burnWatchers.add(bw);\r
535         }\r
536 \r
537         @Deprecated\r
538         public void showAsWindow() {\r
539                 JFrame f = new JFrame();\r
540                 f.setSize(1024, 768);\r
541                 f.setContentPane(this);\r
542                 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
543                 f.setVisible(true);\r
544         }\r
545 \r
546         public static void main(String args[]) throws Exception {\r
547                 try {\r
548                         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\r
549                 } catch (Exception e1) {\r
550                         e1.printStackTrace();\r
551                 }\r
552                 Vector<Fuel> ff = new Vector<Fuel>();\r
553                 ff.add(new KNSU());\r
554                 //new MotorEditor(defaultMotor(), ff).showAsWindow();\r
555         }\r
556 \r
557         public void propertyChange(PropertyChangeEvent evt) {\r
558                 // Dont re-burn for a name change!\r
559                 if (!evt.getPropertyName().equals("Name")){\r
560                         bt.reBurn();\r
561                 } else {\r
562                         for (BurnWatcher bw : burnWatchers)\r
563                                 bw.replace(burn, burn);\r
564                 }\r
565         }\r
566 \r
567 \r
568 }\r