--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<selector xmlns:android="http://schemas.android.com/apk/res/android" \r
+ xmlns:openrocket="http://schemas.android.com/apk/res/net.sf.openrocket"\r
+ android:constantSize="true" android:dither="true" android:variablePadding="false">\r
+ <item android:drawable="@drawable/simulation_state_red" openrocket:simulation_invalid="true"/>\r
+ <item android:drawable="@drawable/simulation_state_yellow" openrocket:simulation_stale="true"/>\r
+ <item android:drawable="@drawable/simulation_state_green"/>\r
+</selector>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<shape xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:shape="oval" >\r
+\r
+ <corners android:radius="12dp"/>\r
+ <solid android:color="#CC00FF00"/>\r
+ <size android:width="24dp" android:height="24dp"/>\r
+ \r
+</shape>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<shape xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:shape="oval" >\r
+\r
+ <corners android:radius="12dp"/>\r
+ <solid android:color="#CCFF0000"/>\r
+ <size android:width="24dp" android:height="24dp"/>\r
+ \r
+</shape>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<shape xmlns:android="http://schemas.android.com/apk/res/android"\r
+ android:shape="oval" >\r
+\r
+ <corners android:radius="12dp"/>\r
+ <solid android:color="#CCFFFF00"/>\r
+ <size android:width="24dp" android:height="24dp"/>\r
+ \r
+</shape>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <ImageView
+ android:id="@+id/simulation_status"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:src="@drawable/simulation_state"
+ android:duplicateParentState="true"
+ android:paddingRight="5dp" />
+
+ <TwoLineListItem
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingTop="10px" >
+
+ <TextView
+ android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="30px"
+ android:text="TextView"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </TwoLineListItem>
+
+</merge>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<resources>\r
+\r
+ <declare-styleable name="SimulationState">\r
+ <attr name="simulation_invalid" format="boolean"/>\r
+ <attr name="simulation_stale" format="boolean"/>\r
+ </declare-styleable>\r
+\r
+</resources>
\ No newline at end of file
\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.simulation.SimulationListItem;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.document.Simulation;\r
-import net.sf.openrocket.simulation.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.widget.AdapterView.OnItemLongClickListener;\r
import android.widget.ArrayAdapter;\r
import android.widget.ListView;\r
-import android.widget.TextView;\r
\r
import com.actionbarsherlock.app.SherlockFragment;\r
import com.actionbarsherlock.view.Menu;\r
\r
@Override\r
public View getView(int position, View convertView, ViewGroup parent) {\r
- View v = convertView;\r
- if ( v == null ) {\r
- LayoutInflater li = getActivity().getLayoutInflater();\r
- v = li.inflate(android.R.layout.simple_list_item_2,null);\r
- }\r
+ SimulationListItem listItemView = (SimulationListItem) convertView;\r
+\r
+ if (listItemView == null) {\r
+ listItemView = new SimulationListItem(parent.getContext());\r
+ }\r
+\r
Simulation sim = this.getItem(position);\r
- ((TextView)v.findViewById(android.R.id.text1)).setText( sim.getName() );\r
- StringBuilder sb = new StringBuilder();\r
- String motorConfig = sim.getOptions().getMotorConfigurationID();\r
- sb.append("motors: ").append(rocketDocument.getRocket().getMotorConfigurationNameOrDescription(motorConfig));\r
- Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();\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
+ listItemView.setSimulation(sim);\r
+\r
+ return listItemView;\r
}\r
\r
};\r
--- /dev/null
+package net.sf.openrocket.android.simulation;\r
+\r
+\r
+import net.sf.openrocket.R;\r
+import net.sf.openrocket.document.Simulation;\r
+import net.sf.openrocket.document.Simulation.Status;\r
+import net.sf.openrocket.simulation.FlightData;\r
+import net.sf.openrocket.unit.Unit;\r
+import net.sf.openrocket.unit.UnitGroup;\r
+import android.content.Context;\r
+import android.util.AttributeSet;\r
+import android.view.LayoutInflater;\r
+import android.widget.LinearLayout;\r
+import android.widget.TextView;\r
+\r
+public class SimulationListItem extends LinearLayout {\r
+\r
+ private int[] SIMULATION_INVALID = { R.attr.simulation_invalid };\r
+ private int[] SIMULATION_STALE = { R.attr.simulation_stale };\r
+ \r
+ private TextView text1;\r
+ private TextView text2;\r
+ private Status simStatus;\r
+ \r
+ public SimulationListItem(Context context, AttributeSet attrs, int defStyle) {\r
+ super(context, attrs, defStyle);\r
+ loadViews();\r
+ }\r
+\r
+ public SimulationListItem(Context context, AttributeSet attrs) {\r
+ super(context, attrs);\r
+ loadViews();\r
+ }\r
+\r
+ public SimulationListItem(Context context) {\r
+ this(context, null);\r
+ }\r
+\r
+ public void setSimulation(Simulation sim) {\r
+\r
+ text1.setText( sim.getName() );\r
+\r
+ StringBuilder sb = new StringBuilder();\r
+ String motorConfig = sim.getOptions().getMotorConfigurationID();\r
+ sb.append("motors: ").append(sim.getRocket().getMotorConfigurationNameOrDescription(motorConfig));\r
+ Unit distanceUnit = UnitGroup.UNITS_DISTANCE.getDefaultUnit();\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
+ } else {\r
+ sb.append(" No simulation data");\r
+ }\r
+ text2.setText( sb.toString() );\r
+ \r
+ simStatus = sim.getStatus();\r
+\r
+ // Refresh the drawable state so that it includes the status if required.\r
+ refreshDrawableState();\r
+\r
+ }\r
+\r
+ private void loadViews() {\r
+ this.setOrientation(LinearLayout.HORIZONTAL);\r
+ \r
+ LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
+ layoutInflater.inflate(R.layout.simulation_list_item, this, true);\r
+\r
+ // setPadding(fiveDPInPixels, fiveDPInPixels, fiveDPInPixels, fiveDPInPixels);\r
+ // setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, fiftyDPInPixels));\r
+ // setBackgroundResource(R.drawable.message_list_item_background);\r
+\r
+ text1 = (TextView) findViewById(android.R.id.text1);\r
+ text2 = (TextView) findViewById(android.R.id.text2);\r
+ }\r
+\r
+ @Override\r
+ protected int[] onCreateDrawableState(int extraSpace) {\r
+ // We are going to add extra state.\r
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);\r
+ if ( simStatus == Status.OUTDATED || simStatus == Status.NOT_SIMULATED ) {\r
+ return mergeDrawableStates(drawableState, SIMULATION_INVALID );\r
+ \r
+ } else if ( simStatus == Status.LOADED || simStatus == Status.EXTERNAL ) {\r
+ return mergeDrawableStates(drawableState, SIMULATION_STALE);\r
+ } else {\r
+ return super.onCreateDrawableState(extraSpace);\r
+ }\r
+ }\r
+\r
+}\r