create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / utils / MotorPlot.java
1 package net.sf.openrocket.utils;
2
3 import java.awt.Color;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.io.FileInputStream;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.Arrays;
10 import java.util.List;
11
12 import javax.swing.BorderFactory;
13 import javax.swing.JButton;
14 import javax.swing.JDialog;
15 import javax.swing.JFrame;
16 import javax.swing.JPanel;
17 import javax.swing.JTabbedPane;
18 import javax.swing.JTextArea;
19 import javax.swing.SwingUtilities;
20
21 import net.miginfocom.swing.MigLayout;
22 import net.sf.openrocket.file.motor.GeneralMotorLoader;
23 import net.sf.openrocket.gui.util.GUIUtil;
24 import net.sf.openrocket.l10n.Translator;
25 import net.sf.openrocket.motor.Motor;
26 import net.sf.openrocket.motor.ThrustCurveMotor;
27 import net.sf.openrocket.startup.Application;
28
29 import org.jfree.chart.ChartFactory;
30 import org.jfree.chart.ChartPanel;
31 import org.jfree.chart.JFreeChart;
32 import org.jfree.chart.plot.PlotOrientation;
33 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
34 import org.jfree.data.xy.XYSeries;
35 import org.jfree.data.xy.XYSeriesCollection;
36
37 public class MotorPlot extends JDialog {
38         
39         private int selected = -1;
40         private static final Translator trans = Application.getTranslator();
41         
42         public MotorPlot(List<String> filenames, List<ThrustCurveMotor> motors) {
43                 //// Motor plot
44                 super((JFrame) null, trans.get("MotorPlot.title.Motorplot"), true);
45                 
46                 JTabbedPane tabs = new JTabbedPane();
47                 for (int i = 0; i < filenames.size(); i++) {
48                         JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
49                         
50                         //// Select button
51                         JButton button = new JButton(trans.get("MotorPlot.but.Select"));
52                         final int number = i;
53                         button.addActionListener(new ActionListener() {
54                                 @Override
55                                 public void actionPerformed(ActionEvent e) {
56                                         selected = number;
57                                         MotorPlot.this.setVisible(false);
58                                 }
59                         });
60                         pane.add(button, "wrap", 0);
61                         
62                         tabs.addTab(filenames.get(i), pane);
63                 }
64                 
65                 this.add(tabs);
66                 
67                 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
68                 this.setLocationByPlatform(true);
69                 this.validate();
70                 this.pack();
71         }
72         
73         
74         private JPanel createPlotPanel(ThrustCurveMotor motor) {
75                 JPanel panel = new JPanel(new MigLayout());
76                 
77
78                 XYSeries series = new XYSeries("", false, true);
79                 double[] time = motor.getTimePoints();
80                 double[] thrust = motor.getThrustPoints();
81                 
82                 for (int i = 0; i < time.length; i++) {
83                         series.add(time[i], thrust[i]);
84                 }
85                 
86                 // Create the chart using the factory to get all default settings
87                 JFreeChart chart = ChartFactory.createXYLineChart(
88                                 //// Motor thrust curve
89                                 trans.get("MotorPlot.Chart.Motorthrustcurve"),
90                                 //// Time / s
91                                 trans.get("MotorPlot.Chart.Time"),
92                                 //// Thrust / N
93                                 trans.get("MotorPlot.Chart.Thrust"),
94                                 new XYSeriesCollection(series),
95                                 PlotOrientation.VERTICAL,
96                                 true,
97                                 true,
98                                 false
99                                 );
100                 
101                 ((XYLineAndShapeRenderer) chart.getXYPlot().getRenderer()).setShapesVisible(true);
102                 
103                 ChartPanel chartPanel = new ChartPanel(chart,
104                                 false, // properties
105                                 true, // save
106                                 false, // print
107                                 true, // zoom
108                                 true); // tooltips
109                 chartPanel.setMouseWheelEnabled(true);
110                 chartPanel.setEnforceFileExtensions(true);
111                 chartPanel.setInitialDelay(500);
112                 
113                 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
114                 
115                 panel.add(chartPanel, "grow, wrap para");
116                 
117
118                 JTextArea area = new JTextArea(5, 40);
119                 StringBuilder sb = new StringBuilder();
120                 //// Designation:  
121                 sb.append("MotorPlot.txt.Designation" + "  ").append(motor.getDesignation()).append("        ");
122                 //// Manufacturer:
123                 sb.append("MotorPlot.txt.Manufacturer" + " ").append(motor.getManufacturer()).append("        ");
124                 //// Type:
125                 sb.append("MotorPlot.txt.Type" + " ").append(motor.getMotorType()).append('\n');
126                 //// Delays:
127                 sb.append("MotorPlot.txt.Delays" +" ").append(Arrays.toString(motor.getStandardDelays())).append('\n');
128                 //// Comment:\n
129                 sb.append("MotorPlot.txt.Comment" + " ").append(motor.getDescription());
130                 area.setText(sb.toString());
131                 panel.add(area, "grow, wrap");
132                 
133
134                 return panel;
135         }
136         
137         
138
139         public int getSelected() {
140                 return selected;
141         }
142         
143         
144         public static void main(String[] args) throws IOException {
145                 if (args.length == 0) {
146                         System.err.println("MotorPlot <files>");
147                         System.exit(1);
148                 }
149                 
150                 final List<String> filenames = new ArrayList<String>();
151                 final List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>();
152                 
153                 GeneralMotorLoader loader = new GeneralMotorLoader();
154                 for (String file : args) {
155                         for (Motor m : loader.load(new FileInputStream(file), file)) {
156                                 filenames.add(file);
157                                 motors.add((ThrustCurveMotor) m);
158                         }
159                 }
160                 
161                 SwingUtilities.invokeLater(new Runnable() {
162                         
163                         @Override
164                         public void run() {
165                                 GUIUtil.setBestLAF();
166                                 
167                                 MotorPlot plot = new MotorPlot(filenames, motors);
168                                 plot.setVisible(true);
169                         }
170                         
171                 });
172                 
173         }
174         
175
176
177
178 }