create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / dialogs / motor / thrustcurve / ThrustCurveMotorPlotDialog.java
1 package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
2
3 import java.awt.BasicStroke;
4 import java.awt.Color;
5 import java.awt.Rectangle;
6 import java.awt.Window;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.util.List;
10
11 import javax.swing.JButton;
12 import javax.swing.JDialog;
13 import javax.swing.JPanel;
14
15 import net.miginfocom.swing.MigLayout;
16 import net.sf.openrocket.gui.util.GUIUtil;
17 import net.sf.openrocket.l10n.Translator;
18 import net.sf.openrocket.motor.ThrustCurveMotor;
19 import net.sf.openrocket.startup.Application;
20 import net.sf.openrocket.unit.UnitGroup;
21
22 import org.jfree.chart.ChartFactory;
23 import org.jfree.chart.ChartPanel;
24 import org.jfree.chart.JFreeChart;
25 import org.jfree.chart.plot.PlotOrientation;
26 import org.jfree.chart.plot.XYPlot;
27 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
28 import org.jfree.data.xy.XYSeries;
29 import org.jfree.data.xy.XYSeriesCollection;
30
31 public class ThrustCurveMotorPlotDialog extends JDialog {
32         private static final Translator trans = Application.getTranslator();
33         
34         public ThrustCurveMotorPlotDialog(List<ThrustCurveMotor> motors, int selected, Window parent) {
35                 super(parent, "Motor thrust curves", ModalityType.APPLICATION_MODAL);
36                 
37                 JPanel panel = new JPanel(new MigLayout("fill"));
38                 
39                 // Thrust curve plot
40                 JFreeChart chart = ChartFactory.createXYLineChart(
41                                 "Motor thrust curves", // title
42                                 "Time / " + UnitGroup.UNITS_SHORT_TIME.getDefaultUnit().getUnit(), // xAxisLabel
43                                 "Thrust / " + UnitGroup.UNITS_FORCE.getDefaultUnit().getUnit(), // yAxisLabel
44                                 null, // dataset
45                                 PlotOrientation.VERTICAL,
46                                 true, // legend
47                                 true, // tooltips
48                                 false // urls
49                                 );
50                 
51
52                 // Add the data and formatting to the plot
53                 XYPlot plot = chart.getXYPlot();
54                 
55                 chart.setBackgroundPaint(panel.getBackground());
56                 plot.setBackgroundPaint(Color.WHITE);
57                 plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
58                 plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
59                 
60                 ChartPanel chartPanel = new ChartPanel(chart,
61                                 false, // properties
62                                 true, // save
63                                 false, // print
64                                 true, // zoom
65                                 true); // tooltips
66                 chartPanel.setMouseWheelEnabled(true);
67                 chartPanel.setEnforceFileExtensions(true);
68                 chartPanel.setInitialDelay(500);
69                 
70                 StandardXYItemRenderer renderer = new StandardXYItemRenderer();
71                 renderer.setBaseShapesVisible(true);
72                 renderer.setBaseShapesFilled(true);
73                 plot.setRenderer(renderer);
74                 
75
76                 // Create the plot data set
77                 XYSeriesCollection dataset = new XYSeriesCollection();
78                 
79                 // Selected thrust curve
80                 int n = 0;
81                 if (selected >= 0) {
82                         dataset.addSeries(generateSeries(motors.get(selected)));
83                         renderer.setSeriesStroke(n, new BasicStroke(1.5f));
84                         renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(selected));
85                 }
86                 n++;
87                 
88                 // Other thrust curves
89                 for (int i = 0; i < motors.size(); i++) {
90                         if (i == selected)
91                                 continue;
92                         
93                         ThrustCurveMotor m = motors.get(i);
94                         dataset.addSeries(generateSeries(m));
95                         renderer.setSeriesStroke(n, new BasicStroke(1.5f));
96                         renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(i));
97                         renderer.setSeriesShape(n, new Rectangle());
98                         n++;
99                 }
100                 
101                 plot.setDataset(dataset);
102                 
103                 panel.add(chartPanel, "width 600:600:, height 400:400:, grow, wrap para");
104                 
105
106                 // Close button
107                 JButton close = new JButton(trans.get("dlg.but.close"));
108                 close.addActionListener(new ActionListener() {
109                         @Override
110                         public void actionPerformed(ActionEvent e) {
111                                 ThrustCurveMotorPlotDialog.this.setVisible(false);
112                         }
113                 });
114                 panel.add(close, "right, tag close");
115                 
116
117                 this.add(panel);
118                 
119                 this.pack();
120                 GUIUtil.setDisposableDialogOptions(this, null);
121         }
122         
123         
124         private XYSeries generateSeries(ThrustCurveMotor motor) {
125                 XYSeries series = new XYSeries(motor.getManufacturer() + " " + motor.getDesignation());
126                 double[] time = motor.getTimePoints();
127                 double[] thrust = motor.getThrustPoints();
128                 
129                 for (int j = 0; j < time.length; j++) {
130                         series.add(time[j], thrust[j]);
131                 }
132                 return series;
133         }
134 }