Added mm to browser group labels when set to diameter.
[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 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
27 \r
28 \r
29 /*\r
30  * TODO - make this work with PersistentExpandableListFragment.\r
31  * \r
32  */\r
33 public class MotorListFragment extends PersistentExpandableListFragment\r
34 implements SharedPreferences.OnSharedPreferenceChangeListener\r
35 {\r
36         public interface OnMotorSelectedListener {\r
37                 public void onMotorSelected( long motorId );\r
38         }\r
39 \r
40         public static MotorListFragment newInstance( ) {\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         private static final int CONTEXTMENU_EDIT = Menu.FIRST+2;\r
47 \r
48         private String groupColumnPreferenceKey;\r
49         private String groupColumn = MotorDao.CASE_INFO;\r
50 \r
51         private static final String[] groupColumns = new String[] {\r
52                 MotorDao.CASE_INFO,\r
53                 MotorDao.DIAMETER,\r
54                 MotorDao.IMPULSE_CLASS,\r
55                 MotorDao.MANUFACTURER\r
56         };\r
57 \r
58         private DbAdapter mDbHelper;\r
59 \r
60         private OnMotorSelectedListener motorSelectedListener;\r
61 \r
62         public void setMotorSelectedListener(\r
63                         OnMotorSelectedListener motorSelectedListener) {\r
64                 this.motorSelectedListener = motorSelectedListener;\r
65         }\r
66 \r
67         public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter\r
68         {\r
69 \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
73                                 int childLayout ) {\r
74 \r
75                         super(context, cursor, groupLayout, childLayout);\r
76                 }\r
77 \r
78                 @Override\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
83                         return c;\r
84                 }\r
85 \r
86                 @Override\r
87                 public long getGroupId(int groupPosition) {\r
88                         return groupPosition;\r
89                 }\r
90 \r
91                 /* (non-Javadoc)\r
92                  * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
93                  */\r
94                 @Override\r
95                 protected void bindChildView(View arg0, Context arg1, Cursor arg2,\r
96                                 boolean arg3) {\r
97 \r
98                         TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);\r
99                         manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));\r
100 \r
101                         TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);\r
102                         desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));\r
103 \r
104                         TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);\r
105                         delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));\r
106 \r
107                         TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
108                         totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
109                 }\r
110 \r
111                 /* (non-Javadoc)\r
112                  * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
113                  */\r
114                 @Override\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
121                         } else {\r
122                                 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));\r
123                         }\r
124                 }\r
125 \r
126         }\r
127 \r
128         @Override\r
129         public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
130                 if ( groupColumnPreferenceKey.equals(arg1) ) {\r
131                         setGroupColumnFromPreferences(arg0);\r
132                         refreshData();\r
133                 }\r
134         }\r
135 \r
136         @Override\r
137         public void onViewCreated(View view, Bundle savedInstanceState) {\r
138                 super.onViewCreated(view, savedInstanceState);\r
139 \r
140                 registerForContextMenu(getExpandableListView());\r
141 \r
142         }\r
143 \r
144         \r
145         @Override\r
146         public void onResume() {\r
147 \r
148                 Resources resources = this.getResources();\r
149                 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);\r
150                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
151 \r
152                 setGroupColumnFromPreferences(pref);\r
153 \r
154                 pref.registerOnSharedPreferenceChangeListener(this);\r
155 \r
156                 Activity activity = getActivity();\r
157                 if ( activity instanceof OnMotorSelectedListener ) {\r
158                         motorSelectedListener = (OnMotorSelectedListener) activity;\r
159                 }\r
160 \r
161                 refreshData();\r
162 \r
163                 super.onResume();\r
164 \r
165         }\r
166 \r
167         @Override\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
173         }\r
174 \r
175         @Override\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
183                         refreshData();\r
184                         return true;\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
192                                 ft.remove(prev);\r
193                         }\r
194                         ft.addToBackStack(null);\r
195 \r
196                         // Create and show the dialog.\r
197                         DialogFragment newFragment = MotorDetailsFragment.newInstance(motorId);\r
198                         newFragment.show(ft, "dialog");\r
199                         return true;\r
200                 }\r
201                 return super.onContextItemSelected(item);\r
202         }\r
203 \r
204         @Override\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
209                 }\r
210                 return true;\r
211         }\r
212 \r
213         @Override\r
214         public void onPause() {\r
215                 super.onPause();\r
216                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
217                 pref.unregisterOnSharedPreferenceChangeListener(this);\r
218 \r
219                 mDbHelper.close();\r
220         }\r
221 \r
222         private void setGroupColumnFromPreferences( SharedPreferences prefs ) {\r
223                 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");\r
224                 int index;\r
225                 //Dirty hack, you can't use integer-array in ListPreferences\r
226                 try {\r
227                         index = Integer.parseInt(indexStr);\r
228                 } catch ( Exception e ) {\r
229                         index = 1;\r
230                 }\r
231                 if ( index >= groupColumns.length ) {\r
232                         index = 1;\r
233                 }\r
234                 groupColumn = groupColumns[index];\r
235 \r
236         }\r
237 \r
238         public void refreshData() {\r
239                 if ( mDbHelper == null ) {\r
240                         mDbHelper = new DbAdapter(getActivity());\r
241                 }\r
242                 mDbHelper.open();\r
243 \r
244                 Cursor motorCounter = mDbHelper.getMotorDao().fetchAllMotors();\r
245                 int motorCount = motorCounter.getCount();\r
246                 motorCounter.close();\r
247                 \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
254                 }\r
255 \r
256                 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);\r
257                 MotorHierarchicalListAdapter mAdapter = new MotorHierarchicalListAdapter( \r
258                                 getActivity(),\r
259                                 motorCursor,\r
260                                 R.layout.motor_list_group,\r
261                                 R.layout.motor_list_child);\r
262                 setListAdapter(mAdapter);\r
263                 onContentChanged();\r
264         }\r
265 }\r