1 package net.sf.openrocket.android.motor;
\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 android.app.Activity;
\r
9 import android.app.AlertDialog;
\r
10 import android.content.Context;
\r
11 import android.content.SharedPreferences;
\r
12 import android.content.res.Resources;
\r
13 import android.database.Cursor;
\r
14 import android.os.Bundle;
\r
15 import android.preference.PreferenceManager;
\r
16 import android.support.v4.app.DialogFragment;
\r
17 import android.support.v4.app.Fragment;
\r
18 import android.support.v4.app.FragmentTransaction;
\r
19 import android.view.ContextMenu;
\r
20 import android.view.ContextMenu.ContextMenuInfo;
\r
21 import android.view.Menu;
\r
22 import android.view.MenuItem;
\r
23 import android.view.View;
\r
24 import android.widget.ExpandableListView;
\r
25 import android.widget.ResourceCursorTreeAdapter;
\r
26 import android.widget.TextView;
\r
30 * TODO - make this work with PersistentExpandableListFragment.
\r
33 public class MotorListFragment extends PersistentExpandableListFragment
\r
34 implements SharedPreferences.OnSharedPreferenceChangeListener
\r
36 public interface OnMotorSelectedListener {
\r
37 public void onMotorSelected( long motorId );
\r
40 public static MotorListFragment newInstance( ) {
\r
41 MotorListFragment frag = new MotorListFragment();
\r
45 private static final int CONTEXTMENU_DELETE = Menu.FIRST+1;
\r
46 private static final int CONTEXTMENU_EDIT = Menu.FIRST+2;
\r
48 private String groupColumnPreferenceKey;
\r
49 private String groupColumn = MotorDao.CASE_INFO;
\r
51 private static final String[] groupColumns = new String[] {
\r
54 MotorDao.IMPULSE_CLASS,
\r
55 MotorDao.MANUFACTURER
\r
58 private DbAdapter mDbHelper;
\r
60 private OnMotorSelectedListener motorSelectedListener;
\r
62 public void setMotorSelectedListener(
\r
63 OnMotorSelectedListener motorSelectedListener) {
\r
64 this.motorSelectedListener = motorSelectedListener;
\r
67 public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter
\r
70 // Note that the constructor does not take a Cursor. This is done to avoid querying the
\r
71 // database on the main thread.
\r
72 public MotorHierarchicalListAdapter(Context context, Cursor cursor, int groupLayout,
\r
75 super(context, cursor, groupLayout, childLayout);
\r
79 protected Cursor getChildrenCursor(Cursor arg0) {
\r
80 AndroidLogWrapper.d(MotorListFragment.class,"getChildrenCursor");
\r
81 String group = arg0.getString(arg0.getColumnIndex(groupColumn));
\r
82 Cursor c = mDbHelper.getMotorDao().fetchAllInGroups(groupColumn,group);
\r
87 public long getGroupId(int groupPosition) {
\r
88 return groupPosition;
\r
92 * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)
\r
95 protected void bindChildView(View arg0, Context arg1, Cursor arg2,
\r
98 TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);
\r
99 manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));
\r
101 TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);
\r
102 desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));
\r
104 TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);
\r
105 delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));
\r
107 TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);
\r
108 totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));
\r
112 * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)
\r
115 protected void bindGroupView(View view, Context context, Cursor cursor,
\r
116 boolean isExpanded) {
\r
117 TextView v = (TextView) view.findViewById(R.id.motorGroup);
\r
118 if ( MotorDao.DIAMETER.equals(groupColumn)) {
\r
119 double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));
\r
120 v.setText( String.valueOf(Math.round(d * 1000.0)) + " mm");
\r
122 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));
\r
129 public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
\r
130 if ( groupColumnPreferenceKey.equals(arg1) ) {
\r
131 setGroupColumnFromPreferences(arg0);
\r
137 public void onViewCreated(View view, Bundle savedInstanceState) {
\r
138 super.onViewCreated(view, savedInstanceState);
\r
140 registerForContextMenu(getExpandableListView());
\r
146 public void onResume() {
\r
148 Resources resources = this.getResources();
\r
149 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);
\r
150 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
\r
152 setGroupColumnFromPreferences(pref);
\r
154 pref.registerOnSharedPreferenceChangeListener(this);
\r
156 Activity activity = getActivity();
\r
157 if ( activity instanceof OnMotorSelectedListener ) {
\r
158 motorSelectedListener = (OnMotorSelectedListener) activity;
\r
168 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
\r
169 menu.setHeaderTitle("Motor Operations");
\r
170 menu.add(Menu.NONE,CONTEXTMENU_DELETE,CONTEXTMENU_DELETE,"Delete");
\r
171 menu.add(Menu.NONE,CONTEXTMENU_EDIT,CONTEXTMENU_EDIT,"Edit");
\r
172 super.onCreateContextMenu(menu, v, menuInfo);
\r
176 public boolean onContextItemSelected(MenuItem item) {
\r
177 ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
\r
178 long motorId = info.id;
\r
179 AndroidLogWrapper.d(MotorListFragment.class,"ContextMenu: " + motorId);
\r
180 switch(item.getItemId()) {
\r
181 case CONTEXTMENU_DELETE:
\r
182 mDbHelper.getMotorDao().deleteMotor(motorId);
\r
185 case CONTEXTMENU_EDIT:
\r
186 // DialogFragment.show() will take care of adding the fragment
\r
187 // in a transaction. We also want to remove any currently showing
\r
188 // dialog, so make our own transaction and take care of that here.
\r
189 FragmentTransaction ft = getFragmentManager().beginTransaction();
\r
190 Fragment prev = getFragmentManager().findFragmentByTag("dialog");
\r
191 if (prev != null) {
\r
194 ft.addToBackStack(null);
\r
196 // Create and show the dialog.
\r
197 DialogFragment newFragment = MotorDetailsFragment.newInstance(motorId);
\r
198 newFragment.show(ft, "dialog");
\r
201 return super.onContextItemSelected(item);
\r
205 public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
\r
206 super.onChildClick(parent, v, groupPosition, childPosition, id);
\r
207 if( motorSelectedListener != null ) {
\r
208 motorSelectedListener.onMotorSelected(id);
\r
214 public void onPause() {
\r
216 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
\r
217 pref.unregisterOnSharedPreferenceChangeListener(this);
\r
222 private void setGroupColumnFromPreferences( SharedPreferences prefs ) {
\r
223 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");
\r
225 //Dirty hack, you can't use integer-array in ListPreferences
\r
227 index = Integer.parseInt(indexStr);
\r
228 } catch ( Exception e ) {
\r
231 if ( index >= groupColumns.length ) {
\r
234 groupColumn = groupColumns[index];
\r
238 public void refreshData() {
\r
239 if ( mDbHelper == null ) {
\r
240 mDbHelper = new DbAdapter(getActivity());
\r
244 Cursor motorCounter = mDbHelper.getMotorDao().fetchAllMotors();
\r
245 int motorCount = motorCounter.getCount();
\r
246 motorCounter.close();
\r
248 if ( motorCount == 0 ) {
\r
249 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
\r
250 builder.setTitle("No Motors Found");
\r
251 builder.setMessage("Motors can be downloaded from thrustcurve");
\r
252 builder.setCancelable(true);
\r
253 builder.create().show();
\r
256 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);
\r
257 MotorHierarchicalListAdapter mAdapter = new MotorHierarchicalListAdapter(
\r
260 R.layout.motor_list_group,
\r
261 R.layout.motor_list_child);
\r
262 setListAdapter(mAdapter);
\r
263 onContentChanged();
\r