Implement color indicators (green, yellow, red) for the Simulation Status in the...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Tue, 26 Jun 2012 18:26:06 +0000 (18:26 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Tue, 26 Jun 2012 18:26:06 +0000 (18:26 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@810 180e2498-e6e9-4542-8430-84ac67f01cd8

android/res/drawable/simulation_state.xml [new file with mode: 0644]
android/res/drawable/simulation_state_green.xml [new file with mode: 0644]
android/res/drawable/simulation_state_red.xml [new file with mode: 0644]
android/res/drawable/simulation_state_yellow.xml [new file with mode: 0644]
android/res/layout/simulation_list_item.xml [new file with mode: 0644]
android/res/values/simulation_states.xml [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/Simulations.java
android/src/net/sf/openrocket/android/simulation/SimulationListItem.java [new file with mode: 0644]

diff --git a/android/res/drawable/simulation_state.xml b/android/res/drawable/simulation_state.xml
new file mode 100644 (file)
index 0000000..28e5923
--- /dev/null
@@ -0,0 +1,8 @@
+<?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
diff --git a/android/res/drawable/simulation_state_green.xml b/android/res/drawable/simulation_state_green.xml
new file mode 100644 (file)
index 0000000..4ccef18
--- /dev/null
@@ -0,0 +1,9 @@
+<?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
diff --git a/android/res/drawable/simulation_state_red.xml b/android/res/drawable/simulation_state_red.xml
new file mode 100644 (file)
index 0000000..37c5b52
--- /dev/null
@@ -0,0 +1,9 @@
+<?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
diff --git a/android/res/drawable/simulation_state_yellow.xml b/android/res/drawable/simulation_state_yellow.xml
new file mode 100644 (file)
index 0000000..1d25847
--- /dev/null
@@ -0,0 +1,9 @@
+<?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
diff --git a/android/res/layout/simulation_list_item.xml b/android/res/layout/simulation_list_item.xml
new file mode 100644 (file)
index 0000000..4d34918
--- /dev/null
@@ -0,0 +1,35 @@
+<?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
diff --git a/android/res/values/simulation_states.xml b/android/res/values/simulation_states.xml
new file mode 100644 (file)
index 0000000..836f7b4
--- /dev/null
@@ -0,0 +1,9 @@
+<?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
index 4ceb210f53e70a222c37ea26b49a8d856a4cbb34..807d6be955f84f3fd5b4a21d21f83d620ed15adf 100644 (file)
@@ -2,12 +2,10 @@ package net.sf.openrocket.android.rocket;
 \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
@@ -21,7 +19,6 @@ import android.widget.AdapterView.OnItemClickListener;
 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
@@ -124,26 +121,16 @@ implements SharedPreferences.OnSharedPreferenceChangeListener
 \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
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 (file)
index 0000000..16d12ba
--- /dev/null
@@ -0,0 +1,91 @@
+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