Initial commit
[debian/openrocket] / src / net / sf / openrocket / unit / CaliberUnit.java
1 package net.sf.openrocket.unit;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.Iterator;
6
7 import javax.swing.event.ChangeEvent;
8 import javax.swing.event.ChangeListener;
9
10 import net.sf.openrocket.rocketcomponent.Configuration;
11 import net.sf.openrocket.rocketcomponent.Rocket;
12 import net.sf.openrocket.rocketcomponent.RocketComponent;
13 import net.sf.openrocket.rocketcomponent.SymmetricComponent;
14 import net.sf.openrocket.util.MathUtil;
15
16
17 public class CaliberUnit extends GeneralUnit {
18
19         public static final double DEFAULT_CALIBER = 0.01;
20         
21         private final Configuration configuration;
22         private final Rocket rocket;
23         
24         private double caliber = -1;
25         
26         
27         /* Listener for rocket and configuration, resets the caliber to -1. */
28         private final ChangeListener listener = new ChangeListener() {
29                 @Override
30                 public void stateChanged(ChangeEvent e) {
31                         caliber = -1;
32                 }
33         };
34         
35         
36         
37         public CaliberUnit(Configuration configuration) {
38                 super(1.0, "cal");
39                 this.configuration = configuration;
40                 
41                 if (configuration == null) {
42                         this.rocket = null;
43                 } else {
44                         this.rocket = configuration.getRocket();
45                         configuration.addChangeListener(listener);
46                 }
47         }
48         
49         public CaliberUnit(Rocket rocket) {
50                 super(1.0, "cal");
51                 this.configuration = null;
52                 this.rocket = rocket;
53                 if (rocket != null) {
54                         rocket.addChangeListener(listener);
55                 }
56         }
57         
58         
59         @Override
60         public double fromUnit(double value) {
61                 if (caliber < 0)
62                         calculateCaliber();
63                 
64                 return value * caliber;
65         }
66
67         @Override
68         public double toUnit(double value) {
69                 if (caliber < 0)
70                         calculateCaliber();
71                 
72                 return value / caliber;
73         }
74
75         
76         // TODO: HIGH:  Check caliber calculation method...
77         private void calculateCaliber() {
78                 caliber = 0;
79                 
80                 Iterator<RocketComponent> iterator;
81                 if (configuration != null) {
82                         iterator = configuration.iterator();
83                 } else if (rocket != null) {
84                         iterator = rocket.deepIterator();
85                 } else {
86                         Collection<RocketComponent> set = Collections.emptyList();
87                         iterator = set.iterator();
88                 }
89                 
90                 while (iterator.hasNext()) {
91                         RocketComponent c = iterator.next();
92                         if (c instanceof SymmetricComponent) {
93                                 double r1 = ((SymmetricComponent)c).getForeRadius() * 2;
94                                 double r2 = ((SymmetricComponent)c).getAftRadius() * 2;
95                                 caliber = MathUtil.max(caliber, r1, r2);
96                         }
97                 }
98                 
99                 if (caliber <= 0)
100                         caliber = DEFAULT_CALIBER;
101         }
102 }