Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / simulation / SimulationChart.java
index e0b22bd860eb2406b2b2d6dc3b62b8acba3c5f48..9fa41d7ec15924f73836ef85ed1867d6f9e293d8 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
@@ -32,25 +35,28 @@ 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
-       \r
-       private final static String TAG = "SimulationChart";\r
+public class SimulationChart implements Serializable {\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
-       private String simulationName;\r
+       private final int simulationIndex;\r
+       private transient FlightDataType series1;\r
+       private transient FlightDataType series2;\r
+       private transient List<FlightEvent> events;\r
 \r
        // Define 4 different colors and point styles to use for the series.\r
        // For now only 2 series are supported though.\r
@@ -58,52 +64,76 @@ public class SimulationChart {
        private final static PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND,\r
                PointStyle.TRIANGLE, PointStyle.SQUARE };\r
 \r
-       /**\r
-        * @param simulationName the simulationName to set\r
-        */\r
-       public void setSimulationName(String simulationName) {\r
-               this.simulationName = simulationName;\r
+       public SimulationChart(int simulationIndex) {\r
+               super();\r
+               this.simulationIndex = simulationIndex;\r
        }\r
 \r
-       /**\r
-        * @param flightDataBranch the flightDataBranch to set\r
-        */\r
-       public void setFlightDataBranch(FlightDataBranch flightDataBranch) {\r
-               this.flightDataBranch = flightDataBranch;\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
+                               switch( event.getType()) {\r
+                               case LAUNCHROD:\r
+                               case APOGEE:\r
+                               case BURNOUT:\r
+                               case EJECTION_CHARGE:\r
+                                       events.add(event);\r
+                               default:\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
 \r
                /*\r
                 * TODO -\r
@@ -126,7 +156,13 @@ public class SimulationChart {
                renderer.setYLabels(10);\r
                renderer.setShowGrid(true);\r
                renderer.setZoomButtonsVisible(true);\r
-               renderer.setChartTitle(simulationName);\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
@@ -175,8 +211,8 @@ public class SimulationChart {
 \r
                double ymax = computeMaxValueWithPadding( series1values );\r
                double xmax = Math.ceil( timevalues.get( timevalues.size()-1));\r
-               \r
-               Log.d(TAG,"ymax = " + ymax);\r
+\r
+               AndroidLogWrapper.d(SimulationChart.class,"ymax = " + ymax);\r
                renderer.setXAxisMax(xmax);\r
                renderer.setYAxisMax(ymax);\r
 \r
@@ -199,8 +235,9 @@ public class SimulationChart {
 \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
@@ -213,16 +250,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
@@ -239,7 +266,7 @@ public class SimulationChart {
                //  next 100 if 1000 < max < 10,000\r
                //  next 1000 if max >= 10,000\r
                double numdigits = Math.floor(Math.log10(max));\r
-               \r
+\r
                if ( numdigits <= 1.0 ) {\r
                        return 10.0;\r
                } else if ( numdigits <= 3.0 ) {\r
@@ -249,7 +276,7 @@ public class SimulationChart {
                } else {\r
                        return 1000.0 * ( Math.ceil( max / 1000.0 ));\r
                }\r
-               \r
+\r
        }\r
-       \r
+\r
 }\r