Checkpoint commit with many different changes. Made the Configuration and Simulation...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 2 Jun 2012 04:06:02 +0000 (04:06 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 2 Jun 2012 04:06:02 +0000 (04:06 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@735 180e2498-e6e9-4542-8430-84ac67f01cd8

21 files changed:
android/res/layout/rocket_configurations.xml
android/res/layout/rocket_overview.xml
android/res/layout/simulation_condition_dialog.xml
android/res/menu/rocket_viewer_configurations_option_menu.xml [new file with mode: 0644]
android/res/menu/rocket_viewer_option_menu.xml
android/res/menu/rocket_viewer_simulation_option_menu.xml [new file with mode: 0644]
android/res/values/strings.xml
android/src/net/sf/openrocket/android/Application.java
android/src/net/sf/openrocket/android/RocketChangedEventHandler.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/Configurations.java
android/src/net/sf/openrocket/android/rocket/MotorConfigSpinner.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/MotorConfigSpinnerAdapter.java [deleted file]
android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java
android/src/net/sf/openrocket/android/rocket/Overview.java
android/src/net/sf/openrocket/android/rocket/RocketChangedMessages.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/Simulations.java
android/src/net/sf/openrocket/android/simulation/SimulationRunActivity.java [deleted file]
android/src/net/sf/openrocket/android/simulation/SimulationRunFragment.java [deleted file]
android/src/net/sf/openrocket/android/util/AndroidLogWrapper.java
android/src/net/sf/openrocket/android/util/ExpandableListFragment.java

index 51b976b92b9b417d90c8887fa9444849f0281ffb..001c52012d5196fbc0583eacf3007f131aa03b47 100644 (file)
@@ -4,25 +4,14 @@
     android:layout_height="match_parent"\r
     android:orientation="vertical" >\r
 \r
-    <LinearLayout\r
-        android:layout_width="match_parent"\r
-        android:layout_height="0dp"\r
-        android:layout_weight="1"\r
-        android:orientation="vertical" >\r
-\r
-        <!--  Note because my implementation of ExpandableListFragment is stupid, the id\r
-        of the ExpandableListView must be @android:id/list -->\r
-        <ExpandableListView\r
-            android:id="@android:id/list"\r
-            android:layout_width="match_parent"\r
-            android:layout_height="wrap_content" />\r
-    </LinearLayout>\r
+    <!--\r
+        Note because my implementation of ExpandableListFragment is stupid, the id\r
+        of the ExpandableListView must be @android:id/list\r
+    -->\r
 \r
-    <Button\r
-        android:id="@+id/openrocketviewerAddConfiguration"\r
-        android:layout_width="wrap_content"\r
-        android:layout_height="wrap_content"\r
-        android:layout_gravity="center_horizontal"\r
-        android:text="Add" />\r
+    <ExpandableListView\r
+        android:id="@android:id/list"\r
+        android:layout_width="match_parent"\r
+        android:layout_height="wrap_content" />\r
 \r
 </LinearLayout>
\ No newline at end of file
index 4ebc0b08db5be254c9dfe9bdb76f2c9b3f8c2c69..6a881a49d511cbfe2244218e0331155993f2fd4b 100644 (file)
@@ -61,7 +61,7 @@
             android:layout_height="wrap_content"\r
             android:text="" />\r
 \r
-        <Spinner\r
+        <net.sf.openrocket.android.rocket.MotorConfigSpinner\r
             android:id="@+id/openrocketviewerConfigurationSpinner"\r
             android:layout_width="match_parent"\r
             android:layout_height="wrap_content"\r
index 8e53119d305d854e264668047b6bb0f2c1f07b21..d4149d2d7cea0868f3463240236bf9c91f2ab489 100644 (file)
         android:layout_height="wrap_content"\r
         android:text="@string/simulationConditionsLaunchRodAngle" />\r
 \r
+    <EditText\r
+        android:id="@+id/simulation_condition_roddirection"\r
+        android:layout_width="match_parent"\r
+        android:layout_height="wrap_content"\r
+        android:ems="10"\r
+        android:gravity="right"\r
+        android:inputType="number"\r
+        android:text="0" />\r
+\r
+    <TextView\r
+        style="@style/labelTextStyle"\r
+        android:layout_width="wrap_content"\r
+        android:layout_height="wrap_content"\r
+        android:text="@string/simulationConditionsLaunchRodDirection" />\r
+\r
     <EditText\r
         android:id="@+id/simulation_condition_rodangle"\r
         android:layout_width="match_parent"\r
         android:inputType="number"\r
         android:text="0" />\r
 \r
-    <Spinner\r
+    <net.sf.openrocket.android.rocket.MotorConfigSpinner\r
         android:id="@+id/simulationConditionConfigurationSpinner"\r
         android:layout_width="match_parent"\r
         android:layout_height="wrap_content"\r
         android:prompt="@string/simulationConditionSelectMotors" />\r
+\r\r
+    <Button\r
+        android:id="@+id/simulationConditionDelete"\r
+        android:layout_width="250dp"\r
+        android:layout_height="wrap_content"\r
+        android:text="@string/Delete"/>\r
+\r\r
+    <Button\r
+        android:id="@+id/simulationConditionRun"\r
+        android:layout_width="250dp"\r
+        android:layout_height="wrap_content"\r
+        android:text="@string/Run" />\r
 \r
 </LinearLayout>
\ No newline at end of file
diff --git a/android/res/menu/rocket_viewer_configurations_option_menu.xml b/android/res/menu/rocket_viewer_configurations_option_menu.xml
new file mode 100644 (file)
index 0000000..dc83f50
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >\r
+\r
+    <item\r
+        android:orderInCategory="0"\r
+        android:id="@+id/menu_add"\r
+        android:showAsAction="always"\r
+        android:title="@string/Add"/>\r
+\r
+</menu>
\ No newline at end of file
index 349893b60c95f69b1304ff5b068ddc8fd5069c4f..9f4d709ec898d8193a83440c39a8dcd62da0aa56 100644 (file)
@@ -5,6 +5,7 @@
         android:id="@+id/menu_save"\r
         android:title="@string/save"/>\r
     <item\r
+        android:orderInCategory="10"\r
         android:id="@+id/motor_list_menu_option"\r
         android:icon="@drawable/ic_motorbrowser"\r
         android:showAsAction="ifRoom"\r
diff --git a/android/res/menu/rocket_viewer_simulation_option_menu.xml b/android/res/menu/rocket_viewer_simulation_option_menu.xml
new file mode 100644 (file)
index 0000000..dc83f50
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >\r
+\r
+    <item\r
+        android:orderInCategory="0"\r
+        android:id="@+id/menu_add"\r
+        android:showAsAction="always"\r
+        android:title="@string/Add"/>\r
+\r
+</menu>
\ No newline at end of file
index d6045eaa97bdcaf318e358bb497ac88e038ab51c..8eb5f4222c0e88a9583b3e6a327e38fc7a36a9d6 100644 (file)
@@ -4,6 +4,7 @@
     <string name="app_name">OpenRocket</string>\r
     <string name="version">version 12.03</string>\r
     <string name="save">Save</string>\r
+    <string name="Add">Add</string>\r
     <string name="MotorListTitle">Motor List</string>\r
     <string name="Download">Download</string>\r
     <string name="About">About</string>\r
         <string name="simulationConditionWind">Wind speed</string>\r
         <string name="simulationConditionsRodLength">Launch Rod Length</string>\r
         <string name="simulationConditionsLaunchRodAngle">Launch Rod Angle</string>\r
+        <string name="simulationConditionsLaunchRodDirection">Launch Rod Direction</string>\r
         <string name="select_motor">Select Motor</string>\r
         <string name="select_delay">Delay</string>\r
+        <string name="Delete">Delete</string>\r
+        <string name="Run">Run</string>\r
 \r
 </resources>
\ No newline at end of file
index a06fde4618ca246cf0aed29336f2177b890d3075..43e6254221dac01080b4567cd472733b204e23c0 100644 (file)
@@ -8,10 +8,13 @@ import net.sf.openrocket.aerodynamics.WarningSet;
 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
 import net.sf.openrocket.database.ComponentPresetDatabase;\r
 import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.document.Simulation;\r
 import net.sf.openrocket.file.openrocket.OpenRocketSaver;\r
 import net.sf.openrocket.l10n.DebugTranslator;\r
 import net.sf.openrocket.l10n.ResourceBundleTranslator;\r
 import net.sf.openrocket.l10n.Translator;\r
+import net.sf.openrocket.rocketcomponent.Rocket;\r
+import android.content.pm.ApplicationInfo;\r
 import android.net.Uri;\r
 import android.preference.PreferenceManager;\r
 \r
@@ -66,9 +69,17 @@ public class Application extends android.app.Application {
        public void onCreate() {\r
                super.onCreate();\r
                initialize();\r
+               boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));\r
+               AndroidLogWrapper.setLogEnabled(isDebuggable);\r
                PreferencesActivity.initializePreferences(this, PreferenceManager.getDefaultSharedPreferences(this));\r
        }\r
 \r
+       private RocketChangedEventHandler handler;\r
+       \r
+       public void setHandler( RocketChangedEventHandler handler ) {\r
+               this.handler = handler;\r
+       }\r
+       \r
        /**\r
         * @return the rocketDocument\r
         */\r
@@ -76,6 +87,30 @@ public class Application extends android.app.Application {
                return rocketDocument;\r
        }\r
 \r
+       public void addNewSimulation() {\r
+               Rocket rocket = rocketDocument.getRocket();\r
+               Simulation newSim = new Simulation(rocket);\r
+               newSim.setName(rocketDocument.getNextSimulationName());\r
+               rocketDocument.addSimulation(newSim);\r
+               if ( handler != null ) {\r
+                       handler.simsChangedMessage();\r
+               }\r
+       }\r
+       \r
+       public void deleteSimulation( int simulationPos ) {\r
+               rocketDocument.removeSimulation( simulationPos );\r
+               if ( handler != null ) {\r
+                       handler.simsChangedMessage();\r
+               }\r
+       }\r
+       \r
+       public String addNewMotorConfig() {\r
+               String configId = rocketDocument.getRocket().newMotorConfigurationID();\r
+               if ( handler != null ) {\r
+                       handler.configsChangedMessage();\r
+               }\r
+               return configId;\r
+       }\r
        /**\r
         * @param rocketDocument the rocketDocument to set\r
         */\r
diff --git a/android/src/net/sf/openrocket/android/RocketChangedEventHandler.java b/android/src/net/sf/openrocket/android/RocketChangedEventHandler.java
new file mode 100644 (file)
index 0000000..99bc1e8
--- /dev/null
@@ -0,0 +1,56 @@
+package net.sf.openrocket.android;\r
+\r
+import android.os.Handler;\r
+import android.os.Looper;\r
+import android.os.Message;\r
+\r
+public abstract class RocketChangedEventHandler extends Handler {\r
+\r
+       public RocketChangedEventHandler() {\r
+       }\r
+\r
+       public RocketChangedEventHandler(Callback callback) {\r
+               super(callback);\r
+       }\r
+\r
+       public RocketChangedEventHandler(Looper looper) {\r
+               super(looper);\r
+       }\r
+\r
+       public RocketChangedEventHandler(Looper looper, Callback callback) {\r
+               super(looper, callback);\r
+       }\r
+\r
+       public static final int MOTOR_CONFIGS_CHANGED = 1;\r
+       public static final int SIMS_CHANGED = 2;\r
+\r
+       public void simsChangedMessage() {\r
+               Message m = this.obtainMessage(SIMS_CHANGED);\r
+               this.dispatchMessage(m);\r
+       }\r
+       \r
+       public void configsChangedMessage() {\r
+               Message m = this.obtainMessage(MOTOR_CONFIGS_CHANGED);\r
+               this.dispatchMessage(m);\r
+       }\r
+\r
+       @Override\r
+       public void handleMessage(Message msg) {\r
+               int what = msg.what;\r
+               switch ( what ) {\r
+               case SIMS_CHANGED:\r
+                       doSimsChanged();\r
+                       break;\r
+               case MOTOR_CONFIGS_CHANGED:\r
+                       doMotorConfigsChanged();\r
+                       break;\r
+               default:\r
+                       super.handleMessage(msg);\r
+               }\r
+       }\r
+\r
+       protected abstract void doSimsChanged();\r
+       \r
+       protected abstract void doMotorConfigsChanged();\r
+\r
+}\r
index b986a91a2fb17fc7e1101c7f3ad2b8949c469456..9e4e9183aa1e6453a225ec344e170464c5603629 100644 (file)
@@ -25,6 +25,10 @@ import android.widget.Button;
 import android.widget.ExpandableListAdapter;\r
 import android.widget.TextView;\r
 \r
+import com.actionbarsherlock.view.Menu;\r
+import com.actionbarsherlock.view.MenuInflater;\r
+import com.actionbarsherlock.view.MenuItem;\r
+\r
 public class Configurations extends ExpandableListFragment {\r
 \r
        private final static String wizardFrag = "wizardFrag";\r
@@ -32,20 +36,27 @@ public class Configurations extends ExpandableListFragment {
        @Override\r
        public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
                        Bundle savedInstanceState) {\r
+               setHasOptionsMenu(true);\r
                View v = inflater.inflate(R.layout.rocket_configurations, container, false);\r
 \r
-               Button b = (Button) v.findViewById(R.id.openrocketviewerAddConfiguration);\r
-\r
-               b.setOnClickListener( new View.OnClickListener() {\r
+               return v;\r
+       }\r
 \r
-                       @Override\r
-                       public void onClick(View v) {\r
-                               ((Application)getActivity().getApplication()).getRocketDocument().getRocket().newMotorConfigurationID();\r
-                               Configurations.this.setup();\r
-                       }\r
-               });\r
+       @Override\r
+       public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\r
+               inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);\r
+       }\r
 \r
-               return v;\r
+       @Override\r
+       public boolean onOptionsItemSelected(MenuItem item) {\r
+               switch (item.getItemId())\r
+               {\r
+               case R.id.menu_add:\r
+                       addConfiguration();\r
+                       return true;\r
+               default:\r
+                       return super.onOptionsItemSelected(item);\r
+               }\r
        }\r
 \r
        @Override\r
@@ -55,7 +66,15 @@ public class Configurations extends ExpandableListFragment {
                setup();\r
 \r
        }\r
+       \r
+       public void refreshConfigsList() {\r
+               setup();\r
+       }\r
 \r
+       private void addConfiguration() {\r
+               ((Application)getActivity().getApplication()).addNewMotorConfig();\r
+       }\r
+       \r
        private static class MotorMountInfo {\r
 \r
                private RocketComponent mmt;\r
diff --git a/android/src/net/sf/openrocket/android/rocket/MotorConfigSpinner.java b/android/src/net/sf/openrocket/android/rocket/MotorConfigSpinner.java
new file mode 100644 (file)
index 0000000..886d573
--- /dev/null
@@ -0,0 +1,87 @@
+package net.sf.openrocket.android.rocket;\r
+\r
+import net.sf.openrocket.rocketcomponent.Rocket;\r
+import android.content.Context;\r
+import android.util.AttributeSet;\r
+import android.widget.ArrayAdapter;\r
+import android.widget.Spinner;\r
+\r
+public class MotorConfigSpinner extends Spinner {\r
+\r
+       public MotorConfigSpinner(Context context, AttributeSet attrs,\r
+                       int defStyle, int mode) {\r
+               super(context, attrs, defStyle, mode);\r
+       }\r
+\r
+       public MotorConfigSpinner(Context context, AttributeSet attrs, int defStyle) {\r
+               super(context, attrs, defStyle);\r
+       }\r
+\r
+       public MotorConfigSpinner(Context context, AttributeSet attrs) {\r
+               super(context, attrs);\r
+       }\r
+\r
+       public MotorConfigSpinner(Context context, int mode) {\r
+               super(context, mode);\r
+       }\r
+\r
+       public MotorConfigSpinner(Context context) {\r
+               super(context);\r
+       }\r
+\r
+       public void createAdapter(Rocket rocket ) {\r
+       \r
+               setAdapter(new MotorConfigSpinnerAdapter(this.getContext(), rocket) );\r
+               \r
+       }\r
+       \r
+       public void setSelectedConfiguration( String configId ) {\r
+               this.setSelection( ((MotorConfigSpinnerAdapter)getAdapter()).getConfigurationPosition( configId ));\r
+       }\r
+       \r
+       public String getSelectedConfiguration() {\r
+               return ((MotorConfigSpinnerAdapter)getAdapter()).getConfiguration( this.getSelectedItemPosition() );\r
+       }\r
+       \r
+       public class MotorConfigSpinnerAdapter extends ArrayAdapter<String> {\r
+\r
+               private String[] motorConfigs;\r
+\r
+               public MotorConfigSpinnerAdapter(Context context, Rocket rocket) {\r
+                       super(context, android.R.layout.simple_spinner_item);\r
+\r
+                       motorConfigs = rocket.getMotorConfigurationIDs();\r
+\r
+                       for( String config: motorConfigs ) {\r
+                               this.add(rocket.getMotorConfigurationNameOrDescription(config));\r
+                       }\r
+\r
+               }\r
+\r
+               public int getConfigurationPosition(String configId) {\r
+\r
+                       int selectedIndex = 0;\r
+\r
+                       if ( configId == null ) {\r
+                               return selectedIndex;\r
+                       }\r
+\r
+                       for( String s : motorConfigs ) {\r
+                               // Note - s may be null since it is a valid id.\r
+                               if ( configId.equals(s) ) {\r
+                                       break;\r
+                               }\r
+                               selectedIndex++;\r
+                       }\r
+                       if( selectedIndex > motorConfigs.length ) {\r
+                               selectedIndex = 0;\r
+                       }\r
+\r
+                       return selectedIndex;\r
+               }\r
+               \r
+               public String getConfiguration( int position ) {\r
+                       return motorConfigs[position];\r
+               }\r
+       }\r
+}\r
diff --git a/android/src/net/sf/openrocket/android/rocket/MotorConfigSpinnerAdapter.java b/android/src/net/sf/openrocket/android/rocket/MotorConfigSpinnerAdapter.java
deleted file mode 100644 (file)
index 9669e61..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.sf.openrocket.android.rocket;\r
-\r
-import net.sf.openrocket.rocketcomponent.Rocket;\r
-import android.content.Context;\r
-import android.widget.ArrayAdapter;\r
-\r
-public class MotorConfigSpinnerAdapter extends ArrayAdapter<String> {\r
-\r
-       public MotorConfigSpinnerAdapter(Context context, Rocket rocket) {\r
-               super(context, android.R.layout.simple_spinner_item);\r
-               \r
-               String[] motorConfigs = rocket.getMotorConfigurationIDs();\r
-\r
-               for( String config: motorConfigs ) {\r
-                       this.add(rocket.getMotorConfigurationNameOrDescription(config));\r
-               }\r
-               \r
-       }\r
-\r
-}\r
index a80b5df80e47832420ef8cd767a180bb9aaf0e4e..a0de21bfbc0dfde30dd4d6c2564a069611d98f2b 100644 (file)
@@ -32,19 +32,35 @@ implements Simulations.OnSimulationSelectedListener
 \r
        private Application app;\r
 \r
+       private final static int OVERVIEW_POS = 0;\r
+       private final static int COMPONENT_POS = 1;\r
+       private final static int SIMS_POS = 2;\r
+       private final static int CONFIGS_POS = 3;\r
+       private final static int TABSIZE = 4;\r
+\r
+       private OpenRocketViewerPagerAdapter viewPagerAdapter;\r
+\r
        @Override\r
        protected void onCreate(Bundle savedInstanceState) {\r
                super.onCreate(savedInstanceState);\r
 \r
                app = (Application) this.getApplication();\r
-               setContentView(R.layout.openrocketviewer);\r
-               ViewPager viewPager = (ViewPager)findViewById(R.id.pager);\r
-               viewPager.setAdapter( new OpenRocketViewerPager( this.getSupportFragmentManager()));\r
 \r
                setTitle(app.getRocketDocument().getRocket().getName());\r
-\r
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);\r
 \r
+               setContentView(R.layout.openrocketviewer);\r
+               ViewPager viewPager = (ViewPager)findViewById(R.id.pager);\r
+               viewPagerAdapter = new OpenRocketViewerPagerAdapter( this.getSupportFragmentManager() );\r
+               viewPager.setAdapter( viewPagerAdapter );\r
+\r
+               app.setHandler( new RocketChangedEventHandler( ) );\r
+       }\r
+\r
+       @Override\r
+       protected void onPause() {\r
+               app.setHandler(null);\r
+               super.onPause();\r
        }\r
 \r
        @Override\r
@@ -87,7 +103,7 @@ implements Simulations.OnSimulationSelectedListener
 \r
                Simulation sim = app.getRocketDocument().getSimulation(simulationId);\r
                // Check if there is data for this simulation.\r
-               if ( sim.getSimulatedData().getBranchCount() == 0 ) {\r
+               if ( sim.getSimulatedData() == null || sim.getSimulatedData().getBranchCount() == 0 ) {\r
                        AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
                        builder.setMessage("The selected simulation does not have saved data.");\r
                        builder.setCancelable(true);\r
@@ -117,25 +133,47 @@ implements Simulations.OnSimulationSelectedListener
                }\r
        }\r
 \r
-       private class OpenRocketViewerPager extends FragmentPagerAdapter {\r
+       private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {\r
+\r
+               \r
+               @Override\r
+               protected void doSimsChanged() {\r
+                       Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);\r
+                       if ( sims != null ) {\r
+                               sims.refreshSimulationList();\r
+                       }\r
+               }\r
+\r
+               @Override\r
+               protected void doMotorConfigsChanged() {\r
+                       Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);\r
+                       if ( configs != null ) {\r
+                               configs.refreshConfigsList();\r
+                       }\r
+               }\r
+\r
+       };\r
+\r
 \r
-               public OpenRocketViewerPager( FragmentManager fm ) {\r
+       private class OpenRocketViewerPagerAdapter extends FragmentPagerAdapter {\r
+\r
+               public OpenRocketViewerPagerAdapter( FragmentManager fm ) {\r
                        super(fm);\r
                }\r
                @Override\r
                public int getCount() {\r
-                       return 4;\r
+                       return TABSIZE;\r
                }\r
                @Override\r
                public Fragment getItem( int position ) {\r
                        switch (position) {\r
-                       case 0:\r
+                       case OVERVIEW_POS:\r
                                return new Overview();\r
-                       case 1:\r
+                       case COMPONENT_POS:\r
                                return new Component();\r
-                       case 2:\r
+                       case SIMS_POS:\r
                                return new Simulations();\r
-                       case 3:\r
+                       case CONFIGS_POS:\r
                                return new Configurations();\r
                        }\r
                        return null;\r
@@ -143,17 +181,23 @@ implements Simulations.OnSimulationSelectedListener
                @Override\r
                public CharSequence getPageTitle(int position) {\r
                        switch (position) {\r
-                       case 0:\r
+                       case OVERVIEW_POS:\r
                                return "Overview";\r
-                       case 1:\r
+                       case COMPONENT_POS:\r
                                return "Components";\r
-                       case 2:\r
+                       case SIMS_POS:\r
                                return "Simulations";\r
-                       case 3:\r
+                       case CONFIGS_POS:\r
                                return "Configurations";\r
                        }\r
                        return null;\r
                }\r
+\r
+               public Fragment getFragmentAtPos( int pos ) {\r
+                       String tag = "android:switcher:"+R.id.pager+":"+pos;\r
+                       Fragment f = OpenRocketViewer.this.getSupportFragmentManager().findFragmentByTag(tag);\r
+                       return f;\r
+               }\r
        }\r
 \r
 }\r
index 2f5c3dd6660916032c402f1718efb86237e10f84..88c71868b0c7d2dd224b081fdf1edf0d4a63c1de 100644 (file)
@@ -25,7 +25,6 @@ import android.view.LayoutInflater;
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.widget.AdapterView;\r
-import android.widget.Spinner;\r
 import android.widget.TextView;\r
 \r
 public class Overview extends Fragment\r
@@ -36,7 +35,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
        private AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator();\r
        private MassCalculator massCalculator  = new BasicMassCalculator();\r
 \r
-       private Spinner configurationSpinner;\r
+       private MotorConfigSpinner configurationSpinner;\r
 \r
 \r
        @Override\r
@@ -44,7 +43,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
                        Bundle savedInstanceState) {\r
                AndroidLogWrapper.d(Overview.class, "Created View");\r
                View v = inflater.inflate(R.layout.rocket_overview, container, false);\r
-               configurationSpinner = (Spinner) v.findViewById(R.id.openrocketviewerConfigurationSpinner);\r
+               configurationSpinner = (MotorConfigSpinner) v.findViewById(R.id.openrocketviewerConfigurationSpinner);\r
 \r
                return v;\r
        }\r
@@ -81,29 +80,12 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
 \r
                // Find the index of the default configuration so we can preselect it.\r
                Configuration defaultConfiguration = rocketDocument.getDefaultConfiguration();\r
-               int selectedIndex = 0;\r
-               if ( defaultConfiguration != null ) {\r
-                       String defaultConfigId = defaultConfiguration.getMotorConfigurationID();\r
-                       if ( defaultConfigId != null ) {\r
-                               for( String s : rocket.getMotorConfigurationIDs() ) {\r
-                                       // Note - s may be null since it is a valid id.\r
-                                       if ( defaultConfigId.equals(s) ) {\r
-                                               break;\r
-                                       }\r
-                                       selectedIndex++;\r
-                               }\r
-                       }\r
-               }\r
-               if( selectedIndex > rocket.getMotorConfigurationIDs().length ) {\r
-                       selectedIndex = 0;\r
-               }\r
-               MotorConfigSpinnerAdapter spinnerAdapter = new MotorConfigSpinnerAdapter(getActivity(),rocket);\r
-\r
-               AndroidLogWrapper.d(Overview.class, "spinnerAdapter = " + spinnerAdapter);\r
+               configurationSpinner.createAdapter(rocket);\r
                AndroidLogWrapper.d(Overview.class, "configurationSpinner = " + configurationSpinner);\r
 \r
-               configurationSpinner.setAdapter(spinnerAdapter);\r
-               configurationSpinner.setSelection(selectedIndex);\r
+               if ( defaultConfiguration != null ) {\r
+                       configurationSpinner.setSelectedConfiguration(defaultConfiguration.getMotorConfigurationID());\r
+               }\r
                configurationSpinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() {\r
 \r
                        /* (non-Javadoc)\r
diff --git a/android/src/net/sf/openrocket/android/rocket/RocketChangedMessages.java b/android/src/net/sf/openrocket/android/rocket/RocketChangedMessages.java
new file mode 100644 (file)
index 0000000..862e166
--- /dev/null
@@ -0,0 +1,9 @@
+package net.sf.openrocket.android.rocket;\r
+\r
+import android.os.Handler;\r
+import android.os.Message;\r
+\r
+public abstract class RocketChangedMessages {\r
+\r
+       \r
+}\r
diff --git a/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java b/android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java
new file mode 100644 (file)
index 0000000..593e2cd
--- /dev/null
@@ -0,0 +1,106 @@
+\r
+package net.sf.openrocket.android.rocket;\r
+\r
+import net.sf.openrocket.R;\r
+import net.sf.openrocket.android.Application;\r
+import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.document.Simulation;\r
+import net.sf.openrocket.simulation.SimulationOptions;\r
+import net.sf.openrocket.unit.UnitGroup;\r
+import android.os.Bundle;\r
+import android.support.v4.app.DialogFragment;\r
+import android.view.LayoutInflater;\r
+import android.view.View;\r
+import android.view.View.OnClickListener;\r
+import android.view.ViewGroup;\r
+import android.widget.Button;\r
+import android.widget.EditText;\r
+\r
+import com.actionbarsherlock.app.SherlockDialogFragment;\r
+\r
+/**\r
+ * An activity that encapsulates a graphical view of the chart.\r
+ */\r
+public class SimulationEditFragment extends SherlockDialogFragment {\r
+\r
+       private int simulationId;\r
+\r
+       private EditText windspeedField;\r
+       private EditText rodlengthField;\r
+       private EditText rodangleField;\r
+       private EditText roddirectionField;\r
+       private MotorConfigSpinner motorSpinner;\r
+\r
+       public static SimulationEditFragment newInstance( int simulationId ) {\r
+               SimulationEditFragment frag = new SimulationEditFragment();\r
+               Bundle b = new Bundle();\r
+               b.putInt("simulationId", simulationId);\r
+               frag.setArguments(b);\r
+               return frag;\r
+       }\r
+\r
+       @Override\r
+       public void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setStyle(DialogFragment.STYLE_NO_TITLE,getTheme());\r
+\r
+               if ( savedInstanceState != null ) {\r
+                       simulationId = savedInstanceState.getInt("simulationId");\r
+               } else {\r
+                       Bundle b = getArguments();\r
+                       simulationId = b.getInt("simulationId");\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+                       Bundle savedInstanceState) {\r
+               View v = inflater.inflate(R.layout.simulation_condition_dialog, container, false);\r
+               \r
+               Button deleteButton = (Button) v.findViewById(R.id.simulationConditionDelete);\r
+               deleteButton.setOnClickListener( new OnClickListener() {\r
+\r
+                       @Override\r
+                       public void onClick(View v) {\r
+                               onDelete();\r
+                       }\r
+                       \r
+               });\r
+               windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);\r
+               rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);\r
+               rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);\r
+               roddirectionField = (EditText) v.findViewById(R.id.simulation_condition_roddirection);\r
+\r
+               motorSpinner = (MotorConfigSpinner) v.findViewById(R.id.simulationConditionConfigurationSpinner);\r
+\r
+               OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();\r
+\r
+               motorSpinner.createAdapter(rocketDocument.getRocket());\r
+\r
+               Simulation sim = rocketDocument.getSimulation(simulationId);\r
+\r
+               SimulationOptions options = sim.getOptions();\r
+               if ( options != null ) {\r
+                       windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString( options.getWindSpeedAverage() ));\r
+                       rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString( options.getLaunchRodLength() ));\r
+                       rodangleField.setText( String.valueOf( options.getLaunchRodLength() ));\r
+                       roddirectionField.setText( String.valueOf( options.getLaunchRodDirection() ));\r
+                       motorSpinner.setSelectedConfiguration(options.getMotorConfigurationID());\r
+               }\r
+\r
+               return v;\r
+       }\r
+\r
+       @Override\r
+       public void onSaveInstanceState(Bundle outState) {\r
+               super.onSaveInstanceState(outState);\r
+               outState.putInt("simulationId", simulationId);\r
+\r
+       }\r
+\r
+       public void onDelete( ) {\r
+               ((Application)getActivity().getApplication()).deleteSimulation(simulationId);\r
+               getDialog().dismiss();\r
+       }\r
+       \r
+}
\ No newline at end of file
index b306141754964d4eeb8a5305c749b98d692258ad..79a9a5f660e37319d0eef1d75bc08143c3ad257e 100644 (file)
@@ -5,26 +5,35 @@ import net.sf.openrocket.android.Application;
 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.FlightData;\r
 import net.sf.openrocket.unit.Unit;\r
 import net.sf.openrocket.unit.UnitGroup;\r
 import android.app.Activity;\r
 import android.content.SharedPreferences;\r
 import android.os.Bundle;\r
 import android.preference.PreferenceManager;\r
-import android.support.v4.app.Fragment;\r
+import android.support.v4.app.FragmentTransaction;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.widget.AdapterView;\r
 import android.widget.AdapterView.OnItemClickListener;\r
+import android.widget.AdapterView.OnItemLongClickListener;\r
 import android.widget.ArrayAdapter;\r
 import android.widget.ListView;\r
 import android.widget.TextView;\r
 \r
-public class Simulations extends Fragment\r
+import com.actionbarsherlock.app.SherlockFragment;\r
+import com.actionbarsherlock.view.Menu;\r
+import com.actionbarsherlock.view.MenuInflater;\r
+import com.actionbarsherlock.view.MenuItem;\r
+\r
+public class Simulations extends SherlockFragment\r
 implements SharedPreferences.OnSharedPreferenceChangeListener\r
 {\r
 \r
+       private final static String wizardFrag = "wizardFrag";\r
+\r
        public interface OnSimulationSelectedListener {\r
                public void onSimulationSelected( int simulationId );\r
        }\r
@@ -35,11 +44,28 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
        @Override\r
        public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
                        Bundle savedInstanceState) {\r
+               setHasOptionsMenu(true);\r
                View v = inflater.inflate(R.layout.rocket_simulations, container, false);\r
                simulationList = (ListView) v.findViewById(R.id.openrocketviewerSimulationList);\r
-\r
                return v;\r
        }\r
+       \r
+       @Override\r
+       public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\r
+               inflater.inflate(R.menu.rocket_viewer_simulation_option_menu, menu);\r
+       }\r
+\r
+       @Override\r
+       public boolean onOptionsItemSelected(MenuItem item) {\r
+               switch (item.getItemId())\r
+               {\r
+               case R.id.menu_add:\r
+                       addSimulation();\r
+                       return true;\r
+               default:\r
+                       return super.onOptionsItemSelected(item);\r
+               }\r
+       }\r
 \r
        @Override\r
        public void onAttach(Activity activity) {\r
@@ -81,6 +107,10 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
        }\r
 \r
 \r
+       public void refreshSimulationList() {\r
+               setup();\r
+       }\r
+       \r
        private void setup() {\r
                final OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();\r
                AndroidLogWrapper.d(Simulations.class,"activity = {0}", this.getActivity());\r
@@ -99,9 +129,14 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
                                StringBuilder sb = new StringBuilder();\r
                                sb.append("motors: ").append(sim.getConfiguration().getMotorConfigurationDescription());\r
                                Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();\r
-                               sb.append(" apogee: ").append( distanceUnit.toStringUnit(sim.getSimulatedData().getMaxAltitude()));\r
-                               sb.append(" time: ").append(sim.getSimulatedData().getFlightTime()).append("s");\r
-                               ((TextView)v.findViewById(android.R.id.text2)).setText( sb.toString() );\r
+                               FlightData flightData  = sim.getSimulatedData();\r
+                               if ( flightData != null ) {\r
+                                       sb.append(" apogee: ").append( distanceUnit.toStringUnit(flightData.getMaxAltitude()));\r
+                                       sb.append(" time: ").append(flightData.getFlightTime()).append("s");\r
+                                       ((TextView)v.findViewById(android.R.id.text2)).setText( sb.toString() );\r
+                               } else {\r
+                                       ((TextView)v.findViewById(android.R.id.text2)).setText("No simulation data");\r
+                               }\r
                                return v;\r
                        }\r
 \r
@@ -114,9 +149,27 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
                                }\r
                        }\r
 \r
+               });\r
+               simulationList.setOnItemLongClickListener( new OnItemLongClickListener() {\r
+\r
+                       @Override\r
+                       public boolean onItemLongClick(AdapterView<?> parent, View view,\r
+                                       int position, long id) {\r
+                               final SimulationEditFragment f = SimulationEditFragment.newInstance(position);\r
+                               FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
+                               ft.add(f, wizardFrag);\r
+                               ft.commit();\r
+\r
+                               return true;\r
+                       }\r
+                       \r
                });\r
                simulationList.setAdapter(sims);\r
 \r
        }\r
 \r
+       private void addSimulation() {\r
+               ((Application)getActivity().getApplication()).addNewSimulation();\r
+       }\r
+       \r
 }\r
diff --git a/android/src/net/sf/openrocket/android/simulation/SimulationRunActivity.java b/android/src/net/sf/openrocket/android/simulation/SimulationRunActivity.java
deleted file mode 100644 (file)
index a8e3b18..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-package net.sf.openrocket.android.simulation;\r
-\r
-import net.sf.openrocket.R;\r
-import net.sf.openrocket.android.ActivityHelpers;\r
-import android.os.Bundle;\r
-import android.support.v4.app.Fragment;\r
-import android.support.v4.app.FragmentActivity;\r
-import android.support.v4.app.FragmentTransaction;\r
-import android.view.Menu;\r
-import android.view.MenuItem;\r
-\r
-/**\r
- * An activity that encapsulates a graphical view of the chart.\r
- */\r
-public class SimulationRunActivity extends FragmentActivity {\r
-\r
-       @Override\r
-       protected void onCreate(Bundle savedInstanceState) {\r
-               super.onCreate(savedInstanceState);\r
-               int simulationNumber = getIntent().getIntExtra("Simulation", -1);\r
-\r
-               Fragment graph = SimulationRunFragment.newInstance(simulationNumber);\r
-\r
-               FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
-               ft.replace(android.R.id.content, graph);\r
-               ft.commit();\r
-       }\r
-\r
-       @Override\r
-       public boolean onMenuItemSelected(int featureId, MenuItem item) {\r
-               switch (item.getItemId()) {\r
-               case R.id.preference_menu_option:\r
-                       ActivityHelpers.startPreferences(this);\r
-                       return true;\r
-               }\r
-               return super.onMenuItemSelected(featureId, item);\r
-       }\r
-\r
-       @Override\r
-       public boolean onCreateOptionsMenu(Menu menu) {\r
-               MenuItem prefItem = menu.add(Menu.NONE, R.id.preference_menu_option, Menu.CATEGORY_SYSTEM, R.string.Preferences);\r
-               prefItem.setIcon(R.drawable.ic_menu_preferences);\r
-               return true;\r
-       }\r
-\r
-}
\ No newline at end of file
diff --git a/android/src/net/sf/openrocket/android/simulation/SimulationRunFragment.java b/android/src/net/sf/openrocket/android/simulation/SimulationRunFragment.java
deleted file mode 100644 (file)
index 758b23e..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-\r
-package net.sf.openrocket.android.simulation;\r
-\r
-import net.sf.openrocket.R;\r
-import net.sf.openrocket.android.Application;\r
-import net.sf.openrocket.android.rocket.MotorConfigSpinnerAdapter;\r
-import net.sf.openrocket.document.OpenRocketDocument;\r
-import net.sf.openrocket.document.Simulation;\r
-import net.sf.openrocket.unit.UnitGroup;\r
-import android.os.Bundle;\r
-import android.support.v4.app.DialogFragment;\r
-import android.view.LayoutInflater;\r
-import android.view.View;\r
-import android.view.ViewGroup;\r
-import android.widget.EditText;\r
-import android.widget.Spinner;\r
-\r
-/**\r
- * An activity that encapsulates a graphical view of the chart.\r
- */\r
-public class SimulationRunFragment extends DialogFragment {\r
-       \r
-       int simulationId;\r
-\r
-       EditText windspeedField;\r
-       EditText rodlengthField;\r
-       EditText rodangleField;\r
-       Spinner motorSpinner;\r
-\r
-       public static SimulationRunFragment newInstance( int simulationId ) {\r
-               SimulationRunFragment frag = new SimulationRunFragment();\r
-               Bundle b = new Bundle();\r
-               b.putInt("simulationId", simulationId);\r
-               frag.setArguments(b);\r
-               return frag;\r
-       }\r
-\r
-       @Override\r
-       public void onCreate(Bundle savedInstanceState) {\r
-               super.onCreate(savedInstanceState);\r
-               setStyle(DialogFragment.STYLE_NO_TITLE,getTheme());\r
-\r
-               if ( savedInstanceState != null ) {\r
-                       simulationId = savedInstanceState.getInt("simulationId");\r
-               } else {\r
-                       Bundle b = getArguments();\r
-                       simulationId = b.getInt("simulationId");\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
-                       Bundle savedInstanceState) {\r
-               View v = inflater.inflate(R.layout.simulation_condition_dialog, container, false);\r
-               windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);\r
-               rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);\r
-               rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);\r
-               \r
-               motorSpinner = (Spinner) v.findViewById(R.id.simulationConditionConfigurationSpinner);\r
-               \r
-               OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();\r
-\r
-               Simulation sim = rocketDocument.getSimulation(simulationId);\r
-               \r
-               windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString(sim.getSimulatedConditions().getWindSpeedAverage()) );\r
-               rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString(sim.getSimulatedConditions().getLaunchRodLength()));\r
-               rodangleField.setText( String.valueOf( sim.getSimulatedConditions().getLaunchRodLength() ));\r
-\r
-               MotorConfigSpinnerAdapter spinnerAdapter = new MotorConfigSpinnerAdapter(getActivity(),rocketDocument.getRocket());\r
-               motorSpinner.setAdapter(spinnerAdapter);\r
-               /* TODO - enable saving.\r
-               ((Button) v.findViewById(R.id.motorDetailsSaveButton)).setOnClickListener(\r
-                               new View.OnClickListener() {\r
-                                       @Override\r
-                                       public void onClick(View v) {\r
-                                               MotorDetailsFragment.this.saveChanges();\r
-                                       }\r
-                               });\r
-                               */\r
-               return v;\r
-       }\r
-\r
-       @Override\r
-       public void onSaveInstanceState(Bundle outState) {\r
-               super.onSaveInstanceState(outState);\r
-               outState.putInt("simulationId", simulationId);\r
-\r
-       }\r
-       \r
-}
\ No newline at end of file
index 0bc1e8144ad727bf5b30aa7978f1a43de814d61a..eac9a83ee43e4a39b17b1c15eb3d9e9615fc5dec 100644 (file)
@@ -9,7 +9,11 @@ import android.util.Log;
 \r
 public class AndroidLogWrapper {\r
 \r
-       private static final boolean logEnabled = false;\r
+       private static boolean logEnabled = false;\r
+       \r
+       public static void setLogEnabled( boolean value ) {\r
+               logEnabled = value;\r
+       }\r
        \r
        public static void d( Class clzz, String msg ) {\r
                \r
index e72cc36fd3ac21baa1e4c8410c09f623368b7257..00ed6d5fcec953ee90a36b215864f750ca45a364 100644 (file)
@@ -2,7 +2,6 @@ package net.sf.openrocket.android.util;
 \r
 import android.os.Bundle;\r
 import android.os.Handler;\r
-import android.support.v4.app.Fragment;\r
 import android.view.ContextMenu;\r
 import android.view.ContextMenu.ContextMenuInfo;\r
 import android.view.Gravity;\r
@@ -19,6 +18,8 @@ import android.widget.ListAdapter;
 import android.widget.ListView;\r
 import android.widget.TextView;\r
 \r
+import com.actionbarsherlock.app.SherlockFragment;\r
+\r
 /**\r
  * \r
  * Pulled from https://gist.github.com/1316903\r
@@ -30,7 +31,7 @@ import android.widget.TextView;
  *\r
  * All ASLv2 licensed.\r
  */\r
-public class ExpandableListFragment extends Fragment\r
+public class ExpandableListFragment extends SherlockFragment\r
 implements OnCreateContextMenuListener, ExpandableListView.OnChildClickListener,\r
 ExpandableListView.OnGroupCollapseListener, ExpandableListView.OnGroupExpandListener\r
 {\r