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