diff --git a/android/res/drawable/simulation_state.xml b/android/res/drawable/simulation_state.xml
new file mode 100644
index 000000000..28e592341
--- /dev/null
+++ b/android/res/drawable/simulation_state.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/drawable/simulation_state_green.xml b/android/res/drawable/simulation_state_green.xml
new file mode 100644
index 000000000..4ccef1898
--- /dev/null
+++ b/android/res/drawable/simulation_state_green.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/drawable/simulation_state_red.xml b/android/res/drawable/simulation_state_red.xml
new file mode 100644
index 000000000..37c5b523f
--- /dev/null
+++ b/android/res/drawable/simulation_state_red.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/drawable/simulation_state_yellow.xml b/android/res/drawable/simulation_state_yellow.xml
new file mode 100644
index 000000000..1d2584784
--- /dev/null
+++ b/android/res/drawable/simulation_state_yellow.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/layout/simulation_list_item.xml b/android/res/layout/simulation_list_item.xml
new file mode 100644
index 000000000..4d349188b
--- /dev/null
+++ b/android/res/layout/simulation_list_item.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/res/values/simulation_states.xml b/android/res/values/simulation_states.xml
new file mode 100644
index 000000000..836f7b419
--- /dev/null
+++ b/android/res/values/simulation_states.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/net/sf/openrocket/android/rocket/Simulations.java b/android/src/net/sf/openrocket/android/rocket/Simulations.java
index 4ceb210f5..807d6be95 100644
--- a/android/src/net/sf/openrocket/android/rocket/Simulations.java
+++ b/android/src/net/sf/openrocket/android/rocket/Simulations.java
@@ -2,12 +2,10 @@ package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.CurrentRocketHolder;
+import net.sf.openrocket.android.simulation.SimulationListItem;
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;
@@ -21,7 +19,6 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
-import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
@@ -124,26 +121,16 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- View v = convertView;
- if ( v == null ) {
- LayoutInflater li = getActivity().getLayoutInflater();
- v = li.inflate(android.R.layout.simple_list_item_2,null);
- }
+ SimulationListItem listItemView = (SimulationListItem) convertView;
+
+ if (listItemView == null) {
+ listItemView = new SimulationListItem(parent.getContext());
+ }
+
Simulation sim = this.getItem(position);
- ((TextView)v.findViewById(android.R.id.text1)).setText( sim.getName() );
- StringBuilder sb = new StringBuilder();
- String motorConfig = sim.getOptions().getMotorConfigurationID();
- sb.append("motors: ").append(rocketDocument.getRocket().getMotorConfigurationNameOrDescription(motorConfig));
- Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();
- 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;
+ listItemView.setSimulation(sim);
+
+ return listItemView;
}
};
diff --git a/android/src/net/sf/openrocket/android/simulation/SimulationListItem.java b/android/src/net/sf/openrocket/android/simulation/SimulationListItem.java
new file mode 100644
index 000000000..16d12baa4
--- /dev/null
+++ b/android/src/net/sf/openrocket/android/simulation/SimulationListItem.java
@@ -0,0 +1,91 @@
+package net.sf.openrocket.android.simulation;
+
+
+import net.sf.openrocket.R;
+import net.sf.openrocket.document.Simulation;
+import net.sf.openrocket.document.Simulation.Status;
+import net.sf.openrocket.simulation.FlightData;
+import net.sf.openrocket.unit.Unit;
+import net.sf.openrocket.unit.UnitGroup;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class SimulationListItem extends LinearLayout {
+
+ private int[] SIMULATION_INVALID = { R.attr.simulation_invalid };
+ private int[] SIMULATION_STALE = { R.attr.simulation_stale };
+
+ private TextView text1;
+ private TextView text2;
+ private Status simStatus;
+
+ public SimulationListItem(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ loadViews();
+ }
+
+ public SimulationListItem(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ loadViews();
+ }
+
+ public SimulationListItem(Context context) {
+ this(context, null);
+ }
+
+ public void setSimulation(Simulation sim) {
+
+ text1.setText( sim.getName() );
+
+ StringBuilder sb = new StringBuilder();
+ String motorConfig = sim.getOptions().getMotorConfigurationID();
+ sb.append("motors: ").append(sim.getRocket().getMotorConfigurationNameOrDescription(motorConfig));
+ Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();
+ FlightData flightData = sim.getSimulatedData();
+ if ( flightData != null ) {
+ sb.append(" apogee: ").append( distanceUnit.toStringUnit(flightData.getMaxAltitude()));
+ sb.append(" time: ").append(flightData.getFlightTime()).append("s");
+ } else {
+ sb.append(" No simulation data");
+ }
+ text2.setText( sb.toString() );
+
+ simStatus = sim.getStatus();
+
+ // Refresh the drawable state so that it includes the status if required.
+ refreshDrawableState();
+
+ }
+
+ private void loadViews() {
+ this.setOrientation(LinearLayout.HORIZONTAL);
+
+ LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ layoutInflater.inflate(R.layout.simulation_list_item, this, true);
+
+ // setPadding(fiveDPInPixels, fiveDPInPixels, fiveDPInPixels, fiveDPInPixels);
+ // setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, fiftyDPInPixels));
+ // setBackgroundResource(R.drawable.message_list_item_background);
+
+ text1 = (TextView) findViewById(android.R.id.text1);
+ text2 = (TextView) findViewById(android.R.id.text2);
+ }
+
+ @Override
+ protected int[] onCreateDrawableState(int extraSpace) {
+ // We are going to add extra state.
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+ if ( simStatus == Status.OUTDATED || simStatus == Status.NOT_SIMULATED ) {
+ return mergeDrawableStates(drawableState, SIMULATION_INVALID );
+
+ } else if ( simStatus == Status.LOADED || simStatus == Status.EXTERNAL ) {
+ return mergeDrawableStates(drawableState, SIMULATION_STALE);
+ } else {
+ return super.onCreateDrawableState(extraSpace);
+ }
+ }
+
+}