Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / util / PersistentExpandableListView.java
diff --git a/android/src/net/sf/openrocket/android/util/PersistentExpandableListView.java b/android/src/net/sf/openrocket/android/util/PersistentExpandableListView.java
new file mode 100644 (file)
index 0000000..a22c586
--- /dev/null
@@ -0,0 +1,89 @@
+package net.sf.openrocket.android.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import android.content.Context;\r
+import android.os.Bundle;\r
+import android.os.Parcelable;\r
+import android.util.AttributeSet;\r
+import android.widget.ExpandableListAdapter;\r
+import android.widget.ExpandableListView;\r
+\r
+public class PersistentExpandableListView extends ExpandableListView {\r
+\r
+       public PersistentExpandableListView(Context context, AttributeSet attrs,\r
+                       int defStyle) {\r
+               super(context, attrs, defStyle);\r
+       }\r
+\r
+       public PersistentExpandableListView(Context context, AttributeSet attrs) {\r
+               super(context, attrs);\r
+       }\r
+\r
+       public PersistentExpandableListView(Context context) {\r
+               super(context);\r
+       }\r
+\r
+       @Override\r
+       public Parcelable onSaveInstanceState() {\r
+               Bundle b = new Bundle();\r
+               long[] expandedIds = getExpandedIds();\r
+               b.putLongArray("ExpandedIds", expandedIds);\r
+               return b;\r
+       }\r
+\r
+       @Override\r
+       public void onRestoreInstanceState(Parcelable state) {\r
+               Bundle b = (Bundle) state;\r
+               long[] expandedIds = b.getLongArray("ExpandedIds");\r
+               restoreExpandedState(expandedIds);\r
+       }\r
+\r
+       private long[] getExpandedIds() {\r
+               ExpandableListAdapter adapter = getExpandableListAdapter();\r
+               if (adapter != null) {\r
+                       int length = adapter.getGroupCount();\r
+                       ArrayList<Long> expandedIds = new ArrayList<Long>();\r
+                       for(int i=0; i < length; i++) {\r
+                               if(this.isGroupExpanded(i)) {\r
+                                       expandedIds.add(adapter.getGroupId(i));\r
+                               }\r
+                       }\r
+                       return toLongArray(expandedIds);\r
+               } else {\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       private static long[] toLongArray(List<Long> list)  {\r
+               long[] ret = new long[list.size()];\r
+               int i = 0;\r
+               for (Long e : list)  \r
+                       ret[i++] = e.longValue();\r
+               return ret;\r
+       }\r
+\r
+       private void restoreExpandedState(long[] expandedIds) {\r
+               if (expandedIds != null) {\r
+                       ExpandableListAdapter adapter = getExpandableListAdapter();\r
+                       if (adapter != null) {\r
+                               for (int i=0; i<adapter.getGroupCount(); i++) {\r
+                                       long id = adapter.getGroupId(i);\r
+                                       if (inArray(expandedIds, id)) this.expandGroup(i);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       private static boolean inArray(long[] array, long element) {\r
+               for (long l : array) {\r
+                       if (l == element) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+\r
+\r
+}\r