Have the SimulationPlotConfigDialog be populated with the currently selected items.
[debian/openrocket] / android / src / net / sf / openrocket / android / simulation / SimulationChart.java
index 20bab823c2708a6f7fe8ce514aa35260548d4b69..601bf859c92f9074e8cd501195ebe980445b9411 100644 (file)
  */\r
 package net.sf.openrocket.android.simulation;\r
 \r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.document.Simulation;\r
 import net.sf.openrocket.simulation.FlightDataBranch;\r
 import net.sf.openrocket.simulation.FlightDataType;\r
 import net.sf.openrocket.simulation.FlightEvent;\r
+import net.sf.openrocket.unit.Unit;\r
 \r
-import org.achartengine.ChartFactory;\r
 import org.achartengine.chart.LineChart;\r
 import org.achartengine.chart.PointStyle;\r
 import org.achartengine.chart.XYChart;\r
@@ -30,70 +35,97 @@ import org.achartengine.model.XYSeries;
 import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
 import org.achartengine.renderer.XYSeriesRenderer;\r
 \r
-import android.content.Context;\r
-import android.content.Intent;\r
 import android.graphics.Color;\r
 import android.graphics.Paint.Align;\r
-import android.util.Log;\r
 \r
 /**\r
- * Multiple temperature demo chart.\r
+ * This is really a flyweight object so we can serialize the\r
+ * values behind a simulation chart.  Since OpenRocketDocument, FlightDataBranch,\r
+ * FlightDataType, Unit and all the other underlying types are not serializable,\r
+ * we have to resort to persisting just the bare minimum of information.\r
+ * \r
+ * This also means without further changes to FlightDataType, we cannot actually\r
+ * restore the displayed series.\r
+ * \r
+ * TODO make FlightDataBranch serializable or at least reconstructable from\r
+ * from some the name.\r
+ * \r
  */\r
-public class SimulationChart {\r
+public class SimulationChart implements Serializable {\r
+       \r
+       private final int simulationIndex;\r
+       private transient FlightDataType series1;\r
+       private transient FlightDataType series2;\r
+       private transient List<FlightEvent> events;\r
        \r
-       private final static String TAG = "SimulationChart";\r
-\r
-       private FlightDataBranch flightDataBranch;\r
-       private FlightDataType series1;\r
-       private FlightDataType series2;\r
-       private final FlightDataType time = FlightDataType.TYPE_TIME;\r
-       private List<FlightEvent> flightEvents;\r
-\r
        // Define 4 different colors and point styles to use for the series.\r
        // For now only 2 series are supported though.\r
        private final static int[] colors = new int[] { Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED };\r
        private final static PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND,\r
                PointStyle.TRIANGLE, PointStyle.SQUARE };\r
 \r
-       /**\r
-        * @param flightDataBranch the flightDataBranch to set\r
-        */\r
-       public void setFlightDataBranch(FlightDataBranch flightDataBranch) {\r
-               this.flightDataBranch = flightDataBranch;\r
+       public SimulationChart(int simulationIndex) {\r
+               super();\r
+               this.simulationIndex = simulationIndex;\r
+       }\r
+\r
+       private static String formatFlightDataTypeAxisLabel( FlightDataType fdt ) {\r
+               return fdt.getName() + " (" + fdt.getUnitGroup().getDefaultUnit().toString() + ")";\r
        }\r
 \r
-       /**\r
-        * @param series1 the series1 to set\r
-        */\r
        public void setSeries1(FlightDataType series1) {\r
                this.series1 = series1;\r
        }\r
 \r
-       /**\r
-        * @param series2 the series2 to set\r
-        */\r
+       public FlightDataType getSeries1() {\r
+               return series1;\r
+       }\r
+\r
        public void setSeries2(FlightDataType series2) {\r
                this.series2 = series2;\r
        }\r
 \r
-       /**\r
-        * @param flightEvents the flightEvents to set\r
-        */\r
-       public void setFlightEvents(List<FlightEvent> flightEvents) {\r
-               this.flightEvents = flightEvents;\r
+       public FlightDataType getSeries2() {\r
+               return series2;\r
        }\r
 \r
-       private static String formatFlightDataTypeAxisLabel( FlightDataType fdt ) {\r
-               return fdt.getName() + " (" + fdt.getUnitGroup().getDefaultUnit().toString() + ")";\r
+       public void setEvents( List<FlightEvent> events ) {\r
+               this.events = events;\r
+       }\r
+       \r
+       public List<FlightEvent> getEvents() {\r
+               return events;\r
        }\r
 \r
+       public FlightDataBranch getFlightDataBranch( OpenRocketDocument rocketDocument ) {\r
+               Simulation sim = rocketDocument.getSimulation(simulationIndex);\r
+               FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);\r
+               return flightDataBranch;\r
+       }\r
        /**\r
         * Executes the chart demo.\r
         * \r
         * @param context the context\r
         * @return the built intent\r
         */\r
-       public Intent execute(Context context) {\r
+       public XYChart buildChart(OpenRocketDocument rocketDocument) {\r
+\r
+               Simulation sim = rocketDocument.getSimulation(simulationIndex);\r
+               FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);\r
+               FlightDataType time = FlightDataType.TYPE_TIME;\r
+               if (series1== null) {\r
+                       series1 = flightDataBranch.getTypes()[1];\r
+               }\r
+               if (series2== null) {\r
+                       series2 = flightDataBranch.getTypes()[2];\r
+               }\r
+               \r
+               if ( events == null ) {\r
+                       events = new ArrayList<FlightEvent>();\r
+                       for ( FlightEvent event : flightDataBranch.getEvents() ) {\r
+                               events.add(event);\r
+                       }\r
+               }\r
 \r
                /*\r
                 * TODO -\r
@@ -116,7 +148,13 @@ public class SimulationChart {
                renderer.setYLabels(10);\r
                renderer.setShowGrid(true);\r
                renderer.setZoomButtonsVisible(true);\r
-               renderer.setChartTitle("Simulation");\r
+               renderer.setChartTitle(sim.getName());\r
+               renderer.setShowCustomTextGrid(true);\r
+               renderer.setXLabelsAlign(Align.RIGHT);\r
+               renderer.setXLabelsAngle(90);  // rotate right\r
+               for( FlightEvent event : events ) {\r
+                       renderer.addXTextLabel(event.getTime(), event.getType().toString());\r
+               }\r
 \r
                renderer.setMargins(new int[] { 50, 30, 0, 20 });\r
                {\r
@@ -149,7 +187,13 @@ public class SimulationChart {
                XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();\r
 \r
                List<Double> timevalues = flightDataBranch.get(time);\r
-               List<Double> series1values = flightDataBranch.get(series1);\r
+               List<Double> series1values = new ArrayList<Double>( flightDataBranch.get(series1).size() );\r
+               {\r
+                       Unit u = series1.getUnitGroup().getDefaultUnit();\r
+                       for( Double d: flightDataBranch.get(series1) ) {\r
+                               series1values.add( u.toUnit(d));\r
+                       }\r
+               }\r
 \r
                // compute the axis limits using timevalues and series1values.\r
                double xmin = 0;\r
@@ -160,7 +204,7 @@ public class SimulationChart {
                double ymax = computeMaxValueWithPadding( series1values );\r
                double xmax = Math.ceil( timevalues.get( timevalues.size()-1));\r
                \r
-               Log.d(TAG,"ymax = " + ymax);\r
+               AndroidLogWrapper.d(SimulationChart.class,"ymax = " + ymax);\r
                renderer.setXAxisMax(xmax);\r
                renderer.setYAxisMax(ymax);\r
 \r
@@ -173,10 +217,19 @@ public class SimulationChart {
 \r
                if ( seriesCount > 1 ) {\r
                        // Add second series\r
-                       addXYSeries(dataset, series2.getName(), timevalues, flightDataBranch.get(series2), 1);\r
+                       List<Double> series2values = new ArrayList<Double>( flightDataBranch.get(series2).size() );\r
+                       {\r
+                               Unit u = series2.getUnitGroup().getDefaultUnit();\r
+                               for( Double d: flightDataBranch.get(series2) ) {\r
+                                       series2values.add( u.toUnit(d));\r
+                               }\r
+                       }\r
+\r
+                       addXYSeries(dataset, series2.getName(), timevalues, series2values, 1);\r
                }\r
-               Intent intent = getLineChartIntent(context, dataset, renderer,"Simulation");\r
-               return intent;\r
+               XYChart chart = new LineChart(dataset, renderer);\r
+               \r
+               return chart;\r
        }\r
 \r
        private static void addXYSeries(XYMultipleSeriesDataset dataset, String titles, List<Double> xValues, List<Double> yValues, int scale) {\r
@@ -189,16 +242,6 @@ public class SimulationChart {
 \r
        }\r
 \r
-       private static Intent getLineChartIntent(Context context, XYMultipleSeriesDataset dataset,\r
-                       XYMultipleSeriesRenderer renderer, String activityTitle) {\r
-               //                  checkParameters(dataset, renderer);\r
-               Intent intent = new Intent(context, GraphicalActivity.class);\r
-               XYChart chart = new LineChart(dataset, renderer);\r
-               intent.putExtra(ChartFactory.CHART, chart);\r
-               intent.putExtra(ChartFactory.TITLE, activityTitle);\r
-               return intent;\r
-       }\r
-\r
        private static double computeMaxValueWithPadding( List<Double> list ) {\r
                double max = list.get(0);\r
                for( double v : list ) {\r