create changelog entry
[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 public class MotorListFragment extends PersistentExpandableListFragment\r
30 implements SharedPreferences.OnSharedPreferenceChangeListener\r
31 {\r
32         public interface OnMotorSelectedListener {\r
33                 public void onMotorSelected( long motorId );\r
34         }\r
35 \r
36         public static MotorListFragment newInstance( ) {\r
37                 MotorListFragment frag = new MotorListFragment();\r
38                 return frag;\r
39         }\r
40 \r
41         private static final int CONTEXTMENU_DELETE = Menu.FIRST+1;\r
42         private static final int CONTEXTMENU_EDIT = Menu.FIRST+2;\r
43 \r
44         private String groupColumnPreferenceKey;\r
45         private String groupColumn = MotorDao.CASE_INFO;\r
46 \r
47         private static final String[] groupColumns = new String[] {\r
48                 MotorDao.CASE_INFO,\r
49                 MotorDao.DIAMETER,\r
50                 MotorDao.IMPULSE_CLASS,\r
51                 MotorDao.MANUFACTURER\r
52         };\r
53 \r
54         private DbAdapter mDbHelper;\r
55 \r
56         private OnMotorSelectedListener motorSelectedListener;\r
57 \r
58         public void setMotorSelectedListener(\r
59                         OnMotorSelectedListener motorSelectedListener) {\r
60                 this.motorSelectedListener = motorSelectedListener;\r
61         }\r
62 \r
63         public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter\r
64         {\r
65 \r
66                 // Note that the constructor does not take a Cursor. This is done to avoid querying the \r
67                 // database on the main thread.\r
68                 public MotorHierarchicalListAdapter(Context context, Cursor cursor, int groupLayout,\r
69                                 int childLayout ) {\r
70 \r
71                         super(context, cursor, groupLayout, childLayout);\r
72                 }\r
73 \r
74                 @Override\r
75                 protected Cursor getChildrenCursor(Cursor arg0) {\r
76                         AndroidLogWrapper.d(MotorListFragment.class,"getChildrenCursor");\r
77                         String group = arg0.getString(arg0.getColumnIndex(groupColumn));\r
78                         Cursor c = mDbHelper.getMotorDao().fetchAllInGroups(groupColumn,group);\r
79                         return c;\r
80                 }\r
81 \r
82                 @Override\r
83                 public long getGroupId(int groupPosition) {\r
84                         return groupPosition;\r
85                 }\r
86 \r
87                 /* (non-Javadoc)\r
88                  * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
89                  */\r
90                 @Override\r
91                 protected void bindChildView(View arg0, Context arg1, Cursor arg2,\r
92                                 boolean arg3) {\r
93 \r
94                         TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);\r
95                         manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));\r
96 \r
97                         TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);\r
98                         desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));\r
99 \r
100                         TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);\r
101                         delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));\r
102 \r
103                         TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
104                         totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
105                 }\r
106 \r
107                 /* (non-Javadoc)\r
108                  * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
109                  */\r
110                 @Override\r
111                 protected void bindGroupView(View view, Context context, Cursor cursor,\r
112                                 boolean isExpanded) {\r
113                         TextView v = (TextView) view.findViewById(R.id.motorGroup);\r
114                         if ( MotorDao.DIAMETER.equals(groupColumn)) {\r
115                                 double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));\r
116                                 v.setText( String.valueOf(Math.round(d * 1000.0)) + " mm");\r
117                         } else {\r
118                                 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));\r
119                         }\r
120                 }\r
121 \r
122         }\r
123 \r
124         @Override\r
125         public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
126                 if ( groupColumnPreferenceKey.equals(arg1) ) {\r
127                         setGroupColumnFromPreferences(arg0);\r
128                         refreshData();\r
129                 }\r
130         }\r
131 \r
132         @Override\r
133         public void onViewCreated(View view, Bundle savedInstanceState) {\r
134                 super.onViewCreated(view, savedInstanceState);\r
135 \r
136                 registerForContextMenu(getExpandableListView());\r
137 \r
138         }\r
139 \r
140         \r
141         @Override\r
142         public void onResume() {\r
143 \r
144                 Resources resources = this.getResources();\r
145                 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);\r
146                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
147 \r
148                 setGroupColumnFromPreferences(pref);\r
149 \r
150                 pref.registerOnSharedPreferenceChangeListener(this);\r
151 \r
152                 Activity activity = getActivity();\r
153                 if ( activity instanceof OnMotorSelectedListener ) {\r
154                         motorSelectedListener = (OnMotorSelectedListener) activity;\r
155                 }\r
156 \r
157                 refreshData();\r
158 \r
159                 super.onResume();\r
160 \r
161         }\r
162 \r
163         @Override\r
164         public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {\r
165                 menu.setHeaderTitle("Motor Operations");\r
166                 menu.add(Menu.NONE,CONTEXTMENU_DELETE,CONTEXTMENU_DELETE,"Delete");\r
167                 menu.add(Menu.NONE,CONTEXTMENU_EDIT,CONTEXTMENU_EDIT,"Edit");\r
168                 super.onCreateContextMenu(menu, v, menuInfo);\r
169         }\r
170 \r
171         @Override\r
172         public boolean onContextItemSelected(MenuItem item) {\r
173                 ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();\r
174                 long motorId = info.id;\r
175                 AndroidLogWrapper.d(MotorListFragment.class,"ContextMenu: " + motorId);\r
176                 switch(item.getItemId()) {\r
177                 case CONTEXTMENU_DELETE:\r
178                         mDbHelper.getMotorDao().deleteMotor(motorId);\r
179                         refreshData();\r
180                         return true;\r
181                 case CONTEXTMENU_EDIT:\r
182                         // DialogFragment.show() will take care of adding the fragment\r
183                         // in a transaction.  We also want to remove any currently showing\r
184                         // dialog, so make our own transaction and take care of that here.\r
185                         FragmentTransaction ft = getFragmentManager().beginTransaction();\r
186                         Fragment prev = getFragmentManager().findFragmentByTag("dialog");\r
187                         if (prev != null) {\r
188                                 ft.remove(prev);\r
189                         }\r
190                         ft.addToBackStack(null);\r
191 \r
192                         // Create and show the dialog.\r
193                         DialogFragment newFragment = MotorDetailsFragment.newInstance(motorId);\r
194                         newFragment.show(ft, "dialog");\r
195                         return true;\r
196                 }\r
197                 return super.onContextItemSelected(item);\r
198         }\r
199 \r
200         @Override\r
201         public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {\r
202                 super.onChildClick(parent, v, groupPosition, childPosition, id);\r
203                 if( motorSelectedListener != null ) {\r
204                         motorSelectedListener.onMotorSelected(id);\r
205                 }\r
206                 return true;\r
207         }\r
208 \r
209         @Override\r
210         public void onPause() {\r
211                 super.onPause();\r
212                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
213                 pref.unregisterOnSharedPreferenceChangeListener(this);\r
214 \r
215                 mDbHelper.close();\r
216         }\r
217 \r
218         private void setGroupColumnFromPreferences( SharedPreferences prefs ) {\r
219                 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");\r
220                 int index;\r
221                 //Dirty hack, you can't use integer-array in ListPreferences\r
222                 try {\r
223                         index = Integer.parseInt(indexStr);\r
224                 } catch ( Exception e ) {\r
225                         index = 1;\r
226                 }\r
227                 if ( index >= groupColumns.length ) {\r
228                         index = 1;\r
229                 }\r
230                 groupColumn = groupColumns[index];\r
231 \r
232         }\r
233 \r
234         public void refreshData() {\r
235                 if ( mDbHelper == null ) {\r
236                         mDbHelper = new DbAdapter(getActivity());\r
237                 }\r
238                 mDbHelper.open();\r
239 \r
240                 Cursor motorCounter = mDbHelper.getMotorDao().fetchAllMotors();\r
241                 int motorCount = motorCounter.getCount();\r
242                 motorCounter.close();\r
243                 \r
244                 if ( motorCount == 0 ) {\r
245                         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
246                         builder.setTitle("No Motors Found");\r
247                         builder.setMessage("Motors can be downloaded from thrustcurve");\r
248                         builder.setCancelable(true);\r
249                         builder.create().show();\r
250                 }\r
251 \r
252                 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);\r
253                 MotorHierarchicalListAdapter mAdapter = new MotorHierarchicalListAdapter( \r
254                                 getActivity(),\r
255                                 motorCursor,\r
256                                 R.layout.motor_list_group,\r
257                                 R.layout.motor_list_child);\r
258                 setListAdapter(mAdapter);\r
259                 onContentChanged();\r
260         }\r
261 }\r