1 package net.sf.openrocket.android.motor;
\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
28 public class MotorHierarchicalBrowser
\r
29 extends PersistentExpandableListActivity
\r
30 implements SharedPreferences.OnSharedPreferenceChangeListener
\r
32 private static final String TAG = "MotorHierarchicalBrowser";
\r
34 private static final int ACTIVITY_DOWNLOAD=0;
\r
36 private static final int CONTEXTMENU_DELETE = Menu.FIRST+1;
\r
38 private String groupColumnPreferenceKey;
\r
39 private String groupColumn = MotorDao.CASE_INFO;
\r
41 private static final String[] groupColumns = new String[] {
\r
44 MotorDao.IMPULSE_CLASS,
\r
45 MotorDao.MANUFACTURER
\r
48 private CursorTreeAdapter mAdapter;
\r
50 private DbAdapter mDbHelper;
\r
52 public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter
\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
60 super(context, cursor, groupLayout, childLayout);
\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
75 public long getGroupId(int groupPosition) {
\r
76 return groupPosition;
\r
79 //new String[] { MotorDao.MANUFACTURER, MotorDao.DESIGNATION, MotorDao.CASE_INFO, MotorDao.TOTAL_IMPULSE }, // Number for child layouts
\r
80 //new int[] { R.id.motorChildManu, R.id.motorChildName, R.id.motorChildDelays, R.id.motorChildImpulse }
\r
83 * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)
\r
86 protected void bindChildView(View arg0, Context arg1, Cursor arg2,
\r
89 TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);
\r
90 manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));
\r
92 TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);
\r
93 desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));
\r
95 TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);
\r
96 delays.setText( MotorDao.extractPrettyDelayString( arg2 ));
\r
98 TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);
\r
99 totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));
\r
103 * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)
\r
106 protected void bindGroupView(View view, Context context, Cursor cursor,
\r
107 boolean isExpanded) {
\r
108 TextView v = (TextView) view.findViewById(R.id.motorGroup);
\r
109 if ( MotorDao.DIAMETER.equals(groupColumn)) {
\r
110 double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));
\r
111 v.setText( String.valueOf(Math.round(d * 1000.0)) );
\r
113 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));
\r
122 public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
\r
123 if ( groupColumnPreferenceKey.equals(arg1) ) {
\r
124 setGroupColumnFromPreferences(arg0);
\r
130 public void onCreate(Bundle savedInstanceState) {
\r
131 super.onCreate(savedInstanceState);
\r
133 mDbHelper = new DbAdapter(this);
\r
136 Resources resources = this.getResources();
\r
137 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);
\r
138 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
\r
140 setGroupColumnFromPreferences(pref);
\r
142 pref.registerOnSharedPreferenceChangeListener(this);
\r
146 registerForContextMenu(getExpandableListView());
\r
151 public boolean onCreateOptionsMenu(Menu menu) {
\r
152 MenuInflater inflater = getMenuInflater();
\r
153 inflater.inflate(R.menu.motor_browser_option_menu, menu);
\r
158 public boolean onMenuItemSelected(int featureId, MenuItem item) {
\r
159 Log.d(TAG,"onMenuItemSelected" + item.getItemId());
\r
160 switch(item.getItemId()) {
\r
161 case R.id.download_from_thrustcurve_menu_option:
\r
164 case R.id.preference_menu_option:
\r
165 Intent intent = new Intent().setClass(this, PreferencesActivity.class);
\r
166 this.startActivity(intent);
\r
169 return super.onMenuItemSelected(featureId, item);
\r
173 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
\r
174 Log.d(TAG,"onCreateContextMenu " + menuInfo);
\r
175 Log.d(TAG, "v.getId() = " + v.getId());
\r
176 Log.d(TAG, "motorListView = " + R.id.motorListView);
\r
177 // if (v.getId() == R.id.motorListView) {
\r
178 ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
\r
179 menu.setHeaderTitle("context menu");
\r
180 menu.add(Menu.NONE,CONTEXTMENU_DELETE,CONTEXTMENU_DELETE,"Delete");
\r
182 super.onCreateContextMenu(menu, v, menuInfo);
\r
186 public boolean onContextItemSelected(MenuItem item) {
\r
187 ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
\r
188 long motorId = info.id;
\r
189 Log.d(TAG,"ContextMenu: " + motorId);
\r
190 switch(item.getItemId()) {
\r
191 case CONTEXTMENU_DELETE:
\r
192 mDbHelper.getMotorDao().deleteMotor(motorId);
\r
196 return super.onContextItemSelected(item);
\r
200 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
\r
201 super.onActivityResult(requestCode, resultCode, intent);
\r
207 public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
\r
208 super.onChildClick(parent, v, groupPosition, childPosition, id);
\r
209 //Intent i = new Intent(this, BurnPlotActivity.class);
\r
210 Intent i = new Intent(this,MotorDetails.class);
\r
211 i.putExtra("Motor", id);
\r
217 protected void onDestroy() {
\r
220 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
\r
221 pref.unregisterOnSharedPreferenceChangeListener(this);
\r
223 // Null out the group cursor. This will cause the group cursor and all of the child cursors
\r
225 mAdapter.changeCursor(null);
\r
231 private void tcDownload() {
\r
232 Intent i = new Intent(this, TCQueryActivity.class);
\r
233 startActivityForResult(i, ACTIVITY_DOWNLOAD);
\r
236 private void setGroupColumnFromPreferences( SharedPreferences prefs ) {
\r
237 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");
\r
239 //Dirty hack, you can't use integer-array in ListPreferences
\r
241 index = Integer.parseInt(indexStr);
\r
242 } catch ( Exception e ) {
\r
245 if ( index >= groupColumns.length ) {
\r
248 groupColumn = groupColumns[index];
\r
251 private void refreshData() {
\r
252 if (mAdapter != null ) {
\r
253 mAdapter.changeCursor(null);
\r
255 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);
\r
256 startManagingCursor(motorCursor);
\r
257 // Set up our adapter
\r
258 mAdapter = new MotorHierarchicalListAdapter(
\r
261 R.layout.motor_list_group,
\r
262 R.layout.motor_list_child);
\r
263 setListAdapter(mAdapter);
\r