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
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
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
--- /dev/null
+<?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
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
--- /dev/null
+<?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
<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
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
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
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
--- /dev/null
+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
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
@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
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
--- /dev/null
+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
+++ /dev/null
-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
\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
\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
}\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
@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
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
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
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
\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
--- /dev/null
+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
--- /dev/null
+\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
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
@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
}\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
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
}\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
+++ /dev/null
-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
+++ /dev/null
-\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
\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
\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
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
*\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