]> git.gag.com Git - debian/openrocket/blob - android/src/net/sf/openrocket/android/motor/MotorListFragment.java
Rewrite MotorBrowser to use a fragment for the list. This is the first step in makin...
[debian/openrocket] / android / src / net / sf / openrocket / android / motor / MotorListFragment.java
1 package net.sf.openrocket.android.motor;\r
2 \r
3 import net.sf.openrocket.R;\r
4 import net.sf.openrocket.android.db.DbAdapter;\r
5 import net.sf.openrocket.android.db.MotorDao;\r
6 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
7 import net.sf.openrocket.android.util.PersistentExpandableListFragment;\r
8 import net.sf.openrocket.motor.Motor;\r
9 import android.app.Activity;\r
10 import android.content.Context;\r
11 import android.content.Intent;\r
12 import android.content.SharedPreferences;\r
13 import android.content.res.Resources;\r
14 import android.database.Cursor;\r
15 import android.os.Bundle;\r
16 import android.preference.PreferenceManager;\r
17 import android.view.ContextMenu;\r
18 import android.view.ContextMenu.ContextMenuInfo;\r
19 import android.view.Menu;\r
20 import android.view.MenuItem;\r
21 import android.view.View;\r
22 import android.widget.CursorTreeAdapter;\r
23 import android.widget.ExpandableListView;\r
24 import android.widget.ResourceCursorTreeAdapter;\r
25 import android.widget.TextView;\r
26 \r
27 \r
28 /*\r
29  * TODO - make this work with PersistentExpandableListFragment.\r
30  * \r
31  */\r
32 public class MotorListFragment extends PersistentExpandableListFragment\r
33 implements SharedPreferences.OnSharedPreferenceChangeListener\r
34 {\r
35         public interface OnMotorSelectedListener {\r
36                 public void onMotorSelected( long motorId );\r
37         }\r
38         \r
39         public static MotorListFragment newInstance( ) {\r
40                 \r
41                 MotorListFragment frag = new MotorListFragment();\r
42                 return frag;\r
43         }\r
44         \r
45         private static final int CONTEXTMENU_DELETE = Menu.FIRST+1;\r
46 \r
47         private String groupColumnPreferenceKey;\r
48         private String groupColumn = MotorDao.CASE_INFO;\r
49 \r
50         private static final String[] groupColumns = new String[] {\r
51                 MotorDao.CASE_INFO,\r
52                 MotorDao.DIAMETER,\r
53                 MotorDao.IMPULSE_CLASS,\r
54                 MotorDao.MANUFACTURER\r
55         };\r
56 \r
57         private CursorTreeAdapter mAdapter;\r
58 \r
59         private DbAdapter mDbHelper;\r
60         \r
61         private OnMotorSelectedListener motorSelectedListener;\r
62         \r
63         public void setMotorSelectedListener(\r
64                         OnMotorSelectedListener motorSelectedListener) {\r
65                 this.motorSelectedListener = motorSelectedListener;\r
66         }\r
67 \r
68         public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter\r
69         {\r
70 \r
71                 // Note that the constructor does not take a Cursor. This is done to avoid querying the \r
72                 // database on the main thread.\r
73                 public MotorHierarchicalListAdapter(Context context, Cursor cursor, int groupLayout,\r
74                                 int childLayout ) {\r
75 \r
76                         super(context, cursor, groupLayout, childLayout);\r
77                 }\r
78 \r
79                 @Override\r
80                 protected Cursor getChildrenCursor(Cursor arg0) {\r
81                         AndroidLogWrapper.d(MotorListFragment.class,"getChildrenCursor");\r
82                         String group = arg0.getString(arg0.getColumnIndex(groupColumn));\r
83                         AndroidLogWrapper.d(MotorListFragment.class,"  for: "+ groupColumn + " = " + group);\r
84                         Cursor c = mDbHelper.getMotorDao().fetchAllInGroups(groupColumn,group);\r
85                         AndroidLogWrapper.d(MotorListFragment.class,"  got cursor");\r
86                         getActivity().startManagingCursor(c);\r
87                         return c;\r
88                 }\r
89 \r
90                 @Override\r
91                 public long getGroupId(int groupPosition) {\r
92                         return groupPosition;\r
93                 }\r
94 \r
95                 /* (non-Javadoc)\r
96                  * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
97                  */\r
98                 @Override\r
99                 protected void bindChildView(View arg0, Context arg1, Cursor arg2,\r
100                                 boolean arg3) {\r
101                         \r
102                         TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);\r
103                         manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));\r
104                         \r
105                         TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);\r
106                         desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));\r
107                         \r
108                         TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);\r
109                         delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));\r
110                         \r
111                         TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
112                         totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
113                 }\r
114 \r
115                 /* (non-Javadoc)\r
116                  * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
117                  */\r
118                 @Override\r
119                 protected void bindGroupView(View view, Context context, Cursor cursor,\r
120                                 boolean isExpanded) {\r
121                         TextView v = (TextView) view.findViewById(R.id.motorGroup);\r
122                         if ( MotorDao.DIAMETER.equals(groupColumn)) {\r
123                                 double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));\r
124                                 v.setText( String.valueOf(Math.round(d * 1000.0)) );\r
125                         } else {\r
126                                 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));\r
127                         }\r
128                 }\r
129                 \r
130         }\r
131 \r
132         @Override\r
133         public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
134                 if ( groupColumnPreferenceKey.equals(arg1) ) {\r
135                         setGroupColumnFromPreferences(arg0);\r
136                         refreshData();\r
137                 }\r
138         }\r
139 \r
140         @Override\r
141         public void onViewCreated(View view, Bundle savedInstanceState) {\r
142                 super.onViewCreated(view, savedInstanceState);\r
143                 refreshData();\r
144 \r
145                 registerForContextMenu(getExpandableListView());\r
146 \r
147         }\r
148 \r
149         @Override\r
150         public void onAttach(Activity activity) {\r
151                 super.onAttach(activity);\r
152                 mDbHelper = new DbAdapter(getActivity());\r
153                 mDbHelper.open();\r
154 \r
155                 Resources resources = this.getResources();\r
156                 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);\r
157                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
158 \r
159                 setGroupColumnFromPreferences(pref);\r
160 \r
161                 pref.registerOnSharedPreferenceChangeListener(this);\r
162                 \r
163                 if ( activity instanceof OnMotorSelectedListener ) {\r
164                         motorSelectedListener = (OnMotorSelectedListener) activity;\r
165                 }\r
166 \r
167         }\r
168 \r
169         @Override\r
170         public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {\r
171                 menu.setHeaderTitle("Motor Operations");\r
172                 menu.add(Menu.NONE,CONTEXTMENU_DELETE,CONTEXTMENU_DELETE,"Delete");\r
173                 super.onCreateContextMenu(menu, v, menuInfo);\r
174         }\r
175 \r
176         @Override\r
177         public boolean onContextItemSelected(MenuItem item) {\r
178                 ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();\r
179                 long motorId = info.id;\r
180                 AndroidLogWrapper.d(MotorListFragment.class,"ContextMenu: " + motorId);\r
181                 switch(item.getItemId()) {\r
182                 case CONTEXTMENU_DELETE:\r
183                         mDbHelper.getMotorDao().deleteMotor(motorId);\r
184                         refreshData();\r
185                         return true;\r
186                 }\r
187                 return super.onContextItemSelected(item);\r
188         }\r
189 \r
190         @Override\r
191         public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {\r
192                 super.onChildClick(parent, v, groupPosition, childPosition, id);\r
193                 //Intent i = new Intent(this, BurnPlotActivity.class);\r
194                 if( motorSelectedListener != null ) {\r
195                         motorSelectedListener.onMotorSelected(id);\r
196                 }\r
197                 return true;\r
198         }\r
199 \r
200         @Override\r
201         public void onDetach() {\r
202                 super.onDetach();\r
203                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
204                 pref.unregisterOnSharedPreferenceChangeListener(this);\r
205 \r
206                 // Null out the group cursor. This will cause the group cursor and all of the child cursors\r
207                 // to be closed.\r
208                 mAdapter.changeCursor(null);\r
209                 mAdapter = null;\r
210 \r
211                 mDbHelper.close();\r
212         }\r
213 \r
214         private void setGroupColumnFromPreferences( SharedPreferences prefs ) {\r
215                 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");\r
216                 int index;\r
217                 //Dirty hack, you can't use integer-array in ListPreferences\r
218                 try {\r
219                         index = Integer.parseInt(indexStr);\r
220                 } catch ( Exception e ) {\r
221                         index = 1;\r
222                 }\r
223                 if ( index >= groupColumns.length ) {\r
224                         index = 1;\r
225                 }\r
226                 groupColumn = groupColumns[index];\r
227 \r
228         }\r
229         private void refreshData() {\r
230                 if (mAdapter != null ) {\r
231                         mAdapter.changeCursor(null);\r
232                 }\r
233                 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);\r
234                 getActivity().startManagingCursor(motorCursor);\r
235                 // Set up our adapter\r
236                 mAdapter = new MotorHierarchicalListAdapter( \r
237                                 getActivity(),\r
238                                 motorCursor,\r
239                                 R.layout.motor_list_group,\r
240                                 R.layout.motor_list_child);\r
241                 setListAdapter(mAdapter);\r
242         }\r
243 }\r