Checkpoint commit with many different changes. Made the Configuration and Simulation "add" buttons to be action bar items. Added Handler to act as a listener mechansims so the OpenRocketViewer can update fragments when the rocket is modified. Added MotorConfigSpinner as custom View which is more usable than MotorConfigSpinnerAdapter.

This commit is contained in:
Kevin Ruland 2012-06-02 04:06:02 +00:00
parent 4b109f74f8
commit cb8faf376e
21 changed files with 518 additions and 237 deletions

View File

@ -4,25 +4,14 @@
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
<!--
Note because my implementation of ExpandableListFragment is stupid, the id
of the ExpandableListView must be @android:id/list
-->
<ExpandableListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical" >
<!-- Note because my implementation of ExpandableListFragment is stupid, the id
of the ExpandableListView must be @android:id/list -->
<ExpandableListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:id="@+id/openrocketviewerAddConfiguration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Add" />
android:layout_height="wrap_content" />
</LinearLayout>

View File

@ -61,7 +61,7 @@
android:layout_height="wrap_content"
android:text="" />
<Spinner
<net.sf.openrocket.android.rocket.MotorConfigSpinner
android:id="@+id/openrocketviewerConfigurationSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -43,6 +43,21 @@
android:layout_height="wrap_content"
android:text="@string/simulationConditionsLaunchRodAngle" />
<EditText
android:id="@+id/simulation_condition_roddirection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="right"
android:inputType="number"
android:text="0" />
<TextView
style="@style/labelTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/simulationConditionsLaunchRodDirection" />
<EditText
android:id="@+id/simulation_condition_rodangle"
android:layout_width="match_parent"
@ -52,10 +67,22 @@
android:inputType="number"
android:text="0" />
<Spinner
<net.sf.openrocket.android.rocket.MotorConfigSpinner
android:id="@+id/simulationConditionConfigurationSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:prompt="@string/simulationConditionSelectMotors" />
<Button
android:id="@+id/simulationConditionDelete"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="@string/Delete"/>
<Button
android:id="@+id/simulationConditionRun"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="@string/Run" />
</LinearLayout>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:orderInCategory="0"
android:id="@+id/menu_add"
android:showAsAction="always"
android:title="@string/Add"/>
</menu>

View File

@ -5,6 +5,7 @@
android:id="@+id/menu_save"
android:title="@string/save"/>
<item
android:orderInCategory="10"
android:id="@+id/motor_list_menu_option"
android:icon="@drawable/ic_motorbrowser"
android:showAsAction="ifRoom"

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:orderInCategory="0"
android:id="@+id/menu_add"
android:showAsAction="always"
android:title="@string/Add"/>
</menu>

View File

@ -4,6 +4,7 @@
<string name="app_name">OpenRocket</string>
<string name="version">version 12.03</string>
<string name="save">Save</string>
<string name="Add">Add</string>
<string name="MotorListTitle">Motor List</string>
<string name="Download">Download</string>
<string name="About">About</string>
@ -80,7 +81,10 @@
<string name="simulationConditionWind">Wind speed</string>
<string name="simulationConditionsRodLength">Launch Rod Length</string>
<string name="simulationConditionsLaunchRodAngle">Launch Rod Angle</string>
<string name="simulationConditionsLaunchRodDirection">Launch Rod Direction</string>
<string name="select_motor">Select Motor</string>
<string name="select_delay">Delay</string>
<string name="Delete">Delete</string>
<string name="Run">Run</string>
</resources>

View File

@ -8,10 +8,13 @@ import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.database.ComponentPresetDatabase;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.file.openrocket.OpenRocketSaver;
import net.sf.openrocket.l10n.DebugTranslator;
import net.sf.openrocket.l10n.ResourceBundleTranslator;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.Rocket;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
import android.preference.PreferenceManager;
@ -66,9 +69,17 @@ public class Application extends android.app.Application {
public void onCreate() {
super.onCreate();
initialize();
boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
AndroidLogWrapper.setLogEnabled(isDebuggable);
PreferencesActivity.initializePreferences(this, PreferenceManager.getDefaultSharedPreferences(this));
}
private RocketChangedEventHandler handler;
public void setHandler( RocketChangedEventHandler handler ) {
this.handler = handler;
}
/**
* @return the rocketDocument
*/
@ -76,6 +87,30 @@ public class Application extends android.app.Application {
return rocketDocument;
}
public void addNewSimulation() {
Rocket rocket = rocketDocument.getRocket();
Simulation newSim = new Simulation(rocket);
newSim.setName(rocketDocument.getNextSimulationName());
rocketDocument.addSimulation(newSim);
if ( handler != null ) {
handler.simsChangedMessage();
}
}
public void deleteSimulation( int simulationPos ) {
rocketDocument.removeSimulation( simulationPos );
if ( handler != null ) {
handler.simsChangedMessage();
}
}
public String addNewMotorConfig() {
String configId = rocketDocument.getRocket().newMotorConfigurationID();
if ( handler != null ) {
handler.configsChangedMessage();
}
return configId;
}
/**
* @param rocketDocument the rocketDocument to set
*/

View File

@ -0,0 +1,56 @@
package net.sf.openrocket.android;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public abstract class RocketChangedEventHandler extends Handler {
public RocketChangedEventHandler() {
}
public RocketChangedEventHandler(Callback callback) {
super(callback);
}
public RocketChangedEventHandler(Looper looper) {
super(looper);
}
public RocketChangedEventHandler(Looper looper, Callback callback) {
super(looper, callback);
}
public static final int MOTOR_CONFIGS_CHANGED = 1;
public static final int SIMS_CHANGED = 2;
public void simsChangedMessage() {
Message m = this.obtainMessage(SIMS_CHANGED);
this.dispatchMessage(m);
}
public void configsChangedMessage() {
Message m = this.obtainMessage(MOTOR_CONFIGS_CHANGED);
this.dispatchMessage(m);
}
@Override
public void handleMessage(Message msg) {
int what = msg.what;
switch ( what ) {
case SIMS_CHANGED:
doSimsChanged();
break;
case MOTOR_CONFIGS_CHANGED:
doMotorConfigsChanged();
break;
default:
super.handleMessage(msg);
}
}
protected abstract void doSimsChanged();
protected abstract void doMotorConfigsChanged();
}

View File

@ -25,6 +25,10 @@ import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.TextView;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public class Configurations extends ExpandableListFragment {
private final static String wizardFrag = "wizardFrag";
@ -32,22 +36,29 @@ public class Configurations extends ExpandableListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View v = inflater.inflate(R.layout.rocket_configurations, container, false);
Button b = (Button) v.findViewById(R.id.openrocketviewerAddConfiguration);
b.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
((Application)getActivity().getApplication()).getRocketDocument().getRocket().newMotorConfigurationID();
Configurations.this.setup();
}
});
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.menu_add:
addConfiguration();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
@ -55,7 +66,15 @@ public class Configurations extends ExpandableListFragment {
setup();
}
public void refreshConfigsList() {
setup();
}
private void addConfiguration() {
((Application)getActivity().getApplication()).addNewMotorConfig();
}
private static class MotorMountInfo {
private RocketComponent mmt;

View File

@ -0,0 +1,87 @@
package net.sf.openrocket.android.rocket;
import net.sf.openrocket.rocketcomponent.Rocket;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class MotorConfigSpinner extends Spinner {
public MotorConfigSpinner(Context context, AttributeSet attrs,
int defStyle, int mode) {
super(context, attrs, defStyle, mode);
}
public MotorConfigSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MotorConfigSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MotorConfigSpinner(Context context, int mode) {
super(context, mode);
}
public MotorConfigSpinner(Context context) {
super(context);
}
public void createAdapter(Rocket rocket ) {
setAdapter(new MotorConfigSpinnerAdapter(this.getContext(), rocket) );
}
public void setSelectedConfiguration( String configId ) {
this.setSelection( ((MotorConfigSpinnerAdapter)getAdapter()).getConfigurationPosition( configId ));
}
public String getSelectedConfiguration() {
return ((MotorConfigSpinnerAdapter)getAdapter()).getConfiguration( this.getSelectedItemPosition() );
}
public class MotorConfigSpinnerAdapter extends ArrayAdapter<String> {
private String[] motorConfigs;
public MotorConfigSpinnerAdapter(Context context, Rocket rocket) {
super(context, android.R.layout.simple_spinner_item);
motorConfigs = rocket.getMotorConfigurationIDs();
for( String config: motorConfigs ) {
this.add(rocket.getMotorConfigurationNameOrDescription(config));
}
}
public int getConfigurationPosition(String configId) {
int selectedIndex = 0;
if ( configId == null ) {
return selectedIndex;
}
for( String s : motorConfigs ) {
// Note - s may be null since it is a valid id.
if ( configId.equals(s) ) {
break;
}
selectedIndex++;
}
if( selectedIndex > motorConfigs.length ) {
selectedIndex = 0;
}
return selectedIndex;
}
public String getConfiguration( int position ) {
return motorConfigs[position];
}
}
}

View File

@ -1,20 +0,0 @@
package net.sf.openrocket.android.rocket;
import net.sf.openrocket.rocketcomponent.Rocket;
import android.content.Context;
import android.widget.ArrayAdapter;
public class MotorConfigSpinnerAdapter extends ArrayAdapter<String> {
public MotorConfigSpinnerAdapter(Context context, Rocket rocket) {
super(context, android.R.layout.simple_spinner_item);
String[] motorConfigs = rocket.getMotorConfigurationIDs();
for( String config: motorConfigs ) {
this.add(rocket.getMotorConfigurationNameOrDescription(config));
}
}
}

View File

@ -32,19 +32,35 @@ implements Simulations.OnSimulationSelectedListener
private Application app;
private final static int OVERVIEW_POS = 0;
private final static int COMPONENT_POS = 1;
private final static int SIMS_POS = 2;
private final static int CONFIGS_POS = 3;
private final static int TABSIZE = 4;
private OpenRocketViewerPagerAdapter viewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (Application) this.getApplication();
setContentView(R.layout.openrocketviewer);
ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
viewPager.setAdapter( new OpenRocketViewerPager( this.getSupportFragmentManager()));
setTitle(app.getRocketDocument().getRocket().getName());
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.openrocketviewer);
ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
viewPagerAdapter = new OpenRocketViewerPagerAdapter( this.getSupportFragmentManager() );
viewPager.setAdapter( viewPagerAdapter );
app.setHandler( new RocketChangedEventHandler( ) );
}
@Override
protected void onPause() {
app.setHandler(null);
super.onPause();
}
@Override
@ -87,7 +103,7 @@ implements Simulations.OnSimulationSelectedListener
Simulation sim = app.getRocketDocument().getSimulation(simulationId);
// Check if there is data for this simulation.
if ( sim.getSimulatedData().getBranchCount() == 0 ) {
if ( sim.getSimulatedData() == null || sim.getSimulatedData().getBranchCount() == 0 ) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("The selected simulation does not have saved data.");
builder.setCancelable(true);
@ -117,25 +133,47 @@ implements Simulations.OnSimulationSelectedListener
}
}
private class OpenRocketViewerPager extends FragmentPagerAdapter {
private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {
public OpenRocketViewerPager( FragmentManager fm ) {
@Override
protected void doSimsChanged() {
Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);
if ( sims != null ) {
sims.refreshSimulationList();
}
}
@Override
protected void doMotorConfigsChanged() {
Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);
if ( configs != null ) {
configs.refreshConfigsList();
}
}
};
private class OpenRocketViewerPagerAdapter extends FragmentPagerAdapter {
public OpenRocketViewerPagerAdapter( FragmentManager fm ) {
super(fm);
}
@Override
public int getCount() {
return 4;
return TABSIZE;
}
@Override
public Fragment getItem( int position ) {
switch (position) {
case 0:
case OVERVIEW_POS:
return new Overview();
case 1:
case COMPONENT_POS:
return new Component();
case 2:
case SIMS_POS:
return new Simulations();
case 3:
case CONFIGS_POS:
return new Configurations();
}
return null;
@ -143,17 +181,23 @@ implements Simulations.OnSimulationSelectedListener
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
case OVERVIEW_POS:
return "Overview";
case 1:
case COMPONENT_POS:
return "Components";
case 2:
case SIMS_POS:
return "Simulations";
case 3:
case CONFIGS_POS:
return "Configurations";
}
return null;
}
public Fragment getFragmentAtPos( int pos ) {
String tag = "android:switcher:"+R.id.pager+":"+pos;
Fragment f = OpenRocketViewer.this.getSupportFragmentManager().findFragmentByTag(tag);
return f;
}
}
}

View File

@ -25,7 +25,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.TextView;
public class Overview extends Fragment
@ -36,7 +35,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
private AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator();
private MassCalculator massCalculator = new BasicMassCalculator();
private Spinner configurationSpinner;
private MotorConfigSpinner configurationSpinner;
@Override
@ -44,7 +43,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
Bundle savedInstanceState) {
AndroidLogWrapper.d(Overview.class, "Created View");
View v = inflater.inflate(R.layout.rocket_overview, container, false);
configurationSpinner = (Spinner) v.findViewById(R.id.openrocketviewerConfigurationSpinner);
configurationSpinner = (MotorConfigSpinner) v.findViewById(R.id.openrocketviewerConfigurationSpinner);
return v;
}
@ -81,29 +80,12 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
// Find the index of the default configuration so we can preselect it.
Configuration defaultConfiguration = rocketDocument.getDefaultConfiguration();
int selectedIndex = 0;
if ( defaultConfiguration != null ) {
String defaultConfigId = defaultConfiguration.getMotorConfigurationID();
if ( defaultConfigId != null ) {
for( String s : rocket.getMotorConfigurationIDs() ) {
// Note - s may be null since it is a valid id.
if ( defaultConfigId.equals(s) ) {
break;
}
selectedIndex++;
}
}
}
if( selectedIndex > rocket.getMotorConfigurationIDs().length ) {
selectedIndex = 0;
}
MotorConfigSpinnerAdapter spinnerAdapter = new MotorConfigSpinnerAdapter(getActivity(),rocket);
AndroidLogWrapper.d(Overview.class, "spinnerAdapter = " + spinnerAdapter);
configurationSpinner.createAdapter(rocket);
AndroidLogWrapper.d(Overview.class, "configurationSpinner = " + configurationSpinner);
configurationSpinner.setAdapter(spinnerAdapter);
configurationSpinner.setSelection(selectedIndex);
if ( defaultConfiguration != null ) {
configurationSpinner.setSelectedConfiguration(defaultConfiguration.getMotorConfigurationID());
}
configurationSpinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() {
/* (non-Javadoc)

View File

@ -0,0 +1,9 @@
package net.sf.openrocket.android.rocket;
import android.os.Handler;
import android.os.Message;
public abstract class RocketChangedMessages {
}

View File

@ -0,0 +1,106 @@
package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.Application;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.simulation.SimulationOptions;
import net.sf.openrocket.unit.UnitGroup;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import com.actionbarsherlock.app.SherlockDialogFragment;
/**
* An activity that encapsulates a graphical view of the chart.
*/
public class SimulationEditFragment extends SherlockDialogFragment {
private int simulationId;
private EditText windspeedField;
private EditText rodlengthField;
private EditText rodangleField;
private EditText roddirectionField;
private MotorConfigSpinner motorSpinner;
public static SimulationEditFragment newInstance( int simulationId ) {
SimulationEditFragment frag = new SimulationEditFragment();
Bundle b = new Bundle();
b.putInt("simulationId", simulationId);
frag.setArguments(b);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE,getTheme());
if ( savedInstanceState != null ) {
simulationId = savedInstanceState.getInt("simulationId");
} else {
Bundle b = getArguments();
simulationId = b.getInt("simulationId");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.simulation_condition_dialog, container, false);
Button deleteButton = (Button) v.findViewById(R.id.simulationConditionDelete);
deleteButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
onDelete();
}
});
windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);
rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);
rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);
roddirectionField = (EditText) v.findViewById(R.id.simulation_condition_roddirection);
motorSpinner = (MotorConfigSpinner) v.findViewById(R.id.simulationConditionConfigurationSpinner);
OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();
motorSpinner.createAdapter(rocketDocument.getRocket());
Simulation sim = rocketDocument.getSimulation(simulationId);
SimulationOptions options = sim.getOptions();
if ( options != null ) {
windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString( options.getWindSpeedAverage() ));
rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString( options.getLaunchRodLength() ));
rodangleField.setText( String.valueOf( options.getLaunchRodLength() ));
roddirectionField.setText( String.valueOf( options.getLaunchRodDirection() ));
motorSpinner.setSelectedConfiguration(options.getMotorConfigurationID());
}
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("simulationId", simulationId);
}
public void onDelete( ) {
((Application)getActivity().getApplication()).deleteSimulation(simulationId);
getDialog().dismiss();
}
}

View File

@ -5,26 +5,35 @@ import net.sf.openrocket.android.Application;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class Simulations extends Fragment
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
public class Simulations extends SherlockFragment
implements SharedPreferences.OnSharedPreferenceChangeListener
{
private final static String wizardFrag = "wizardFrag";
public interface OnSimulationSelectedListener {
public void onSimulationSelected( int simulationId );
}
@ -35,11 +44,28 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View v = inflater.inflate(R.layout.rocket_simulations, container, false);
simulationList = (ListView) v.findViewById(R.id.openrocketviewerSimulationList);
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.rocket_viewer_simulation_option_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.menu_add:
addSimulation();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onAttach(Activity activity) {
@ -81,6 +107,10 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
}
public void refreshSimulationList() {
setup();
}
private void setup() {
final OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();
AndroidLogWrapper.d(Simulations.class,"activity = {0}", this.getActivity());
@ -99,9 +129,14 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
StringBuilder sb = new StringBuilder();
sb.append("motors: ").append(sim.getConfiguration().getMotorConfigurationDescription());
Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();
sb.append(" apogee: ").append( distanceUnit.toStringUnit(sim.getSimulatedData().getMaxAltitude()));
sb.append(" time: ").append(sim.getSimulatedData().getFlightTime()).append("s");
((TextView)v.findViewById(android.R.id.text2)).setText( sb.toString() );
FlightData flightData = sim.getSimulatedData();
if ( flightData != null ) {
sb.append(" apogee: ").append( distanceUnit.toStringUnit(flightData.getMaxAltitude()));
sb.append(" time: ").append(flightData.getFlightTime()).append("s");
((TextView)v.findViewById(android.R.id.text2)).setText( sb.toString() );
} else {
((TextView)v.findViewById(android.R.id.text2)).setText("No simulation data");
}
return v;
}
@ -114,9 +149,27 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
}
}
});
simulationList.setOnItemLongClickListener( new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
final SimulationEditFragment f = SimulationEditFragment.newInstance(position);
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.add(f, wizardFrag);
ft.commit();
return true;
}
});
simulationList.setAdapter(sims);
}
private void addSimulation() {
((Application)getActivity().getApplication()).addNewSimulation();
}
}

View File

@ -1,46 +0,0 @@
package net.sf.openrocket.android.simulation;
import net.sf.openrocket.R;
import net.sf.openrocket.android.ActivityHelpers;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
/**
* An activity that encapsulates a graphical view of the chart.
*/
public class SimulationRunActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int simulationNumber = getIntent().getIntExtra("Simulation", -1);
Fragment graph = SimulationRunFragment.newInstance(simulationNumber);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(android.R.id.content, graph);
ft.commit();
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.preference_menu_option:
ActivityHelpers.startPreferences(this);
return true;
}
return super.onMenuItemSelected(featureId, item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem prefItem = menu.add(Menu.NONE, R.id.preference_menu_option, Menu.CATEGORY_SYSTEM, R.string.Preferences);
prefItem.setIcon(R.drawable.ic_menu_preferences);
return true;
}
}

View File

@ -1,90 +0,0 @@
package net.sf.openrocket.android.simulation;
import net.sf.openrocket.R;
import net.sf.openrocket.android.Application;
import net.sf.openrocket.android.rocket.MotorConfigSpinnerAdapter;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.unit.UnitGroup;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Spinner;
/**
* An activity that encapsulates a graphical view of the chart.
*/
public class SimulationRunFragment extends DialogFragment {
int simulationId;
EditText windspeedField;
EditText rodlengthField;
EditText rodangleField;
Spinner motorSpinner;
public static SimulationRunFragment newInstance( int simulationId ) {
SimulationRunFragment frag = new SimulationRunFragment();
Bundle b = new Bundle();
b.putInt("simulationId", simulationId);
frag.setArguments(b);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE,getTheme());
if ( savedInstanceState != null ) {
simulationId = savedInstanceState.getInt("simulationId");
} else {
Bundle b = getArguments();
simulationId = b.getInt("simulationId");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.simulation_condition_dialog, container, false);
windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);
rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);
rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);
motorSpinner = (Spinner) v.findViewById(R.id.simulationConditionConfigurationSpinner);
OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();
Simulation sim = rocketDocument.getSimulation(simulationId);
windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString(sim.getSimulatedConditions().getWindSpeedAverage()) );
rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString(sim.getSimulatedConditions().getLaunchRodLength()));
rodangleField.setText( String.valueOf( sim.getSimulatedConditions().getLaunchRodLength() ));
MotorConfigSpinnerAdapter spinnerAdapter = new MotorConfigSpinnerAdapter(getActivity(),rocketDocument.getRocket());
motorSpinner.setAdapter(spinnerAdapter);
/* TODO - enable saving.
((Button) v.findViewById(R.id.motorDetailsSaveButton)).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
MotorDetailsFragment.this.saveChanges();
}
});
*/
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("simulationId", simulationId);
}
}

View File

@ -9,7 +9,11 @@ import android.util.Log;
public class AndroidLogWrapper {
private static final boolean logEnabled = false;
private static boolean logEnabled = false;
public static void setLogEnabled( boolean value ) {
logEnabled = value;
}
public static void d( Class clzz, String msg ) {

View File

@ -2,7 +2,6 @@ package net.sf.openrocket.android.util;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Gravity;
@ -19,6 +18,8 @@ import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
/**
*
* Pulled from https://gist.github.com/1316903
@ -30,7 +31,7 @@ import android.widget.TextView;
*
* All ASLv2 licensed.
*/
public class ExpandableListFragment extends Fragment
public class ExpandableListFragment extends SherlockFragment
implements OnCreateContextMenuListener, ExpandableListView.OnChildClickListener,
ExpandableListView.OnGroupCollapseListener, ExpandableListView.OnGroupExpandListener
{