c480cbb85b3c76c63f89a139a7150f5eb5e444d3
[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.content.Context;\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.support.v4.app.DialogFragment;\r
16 import android.support.v4.app.Fragment;\r
17 import android.support.v4.app.FragmentTransaction;\r
18 import android.view.ContextMenu;\r
19 import android.view.ContextMenu.ContextMenuInfo;\r
20 import android.view.Menu;\r
21 import android.view.MenuItem;\r
22 import android.view.View;\r
23 import android.widget.CursorTreeAdapter;\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 CursorTreeAdapter mAdapter;\r
59 \r
60         private DbAdapter mDbHelper;\r
61 \r
62         private OnMotorSelectedListener motorSelectedListener;\r
63 \r
64         public void setMotorSelectedListener(\r
65                         OnMotorSelectedListener motorSelectedListener) {\r
66                 this.motorSelectedListener = motorSelectedListener;\r
67         }\r
68 \r
69         public class MotorHierarchicalListAdapter extends ResourceCursorTreeAdapter\r
70         {\r
71 \r
72                 // Note that the constructor does not take a Cursor. This is done to avoid querying the \r
73                 // database on the main thread.\r
74                 public MotorHierarchicalListAdapter(Context context, Cursor cursor, int groupLayout,\r
75                                 int childLayout ) {\r
76 \r
77                         super(context, cursor, groupLayout, childLayout);\r
78                 }\r
79 \r
80                 @Override\r
81                 protected Cursor getChildrenCursor(Cursor arg0) {\r
82                         AndroidLogWrapper.d(MotorListFragment.class,"getChildrenCursor");\r
83                         String group = arg0.getString(arg0.getColumnIndex(groupColumn));\r
84                         Cursor c = mDbHelper.getMotorDao().fetchAllInGroups(groupColumn,group);\r
85                         return c;\r
86                 }\r
87 \r
88                 @Override\r
89                 public long getGroupId(int groupPosition) {\r
90                         return groupPosition;\r
91                 }\r
92 \r
93                 /* (non-Javadoc)\r
94                  * @see android.widget.CursorTreeAdapter#bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
95                  */\r
96                 @Override\r
97                 protected void bindChildView(View arg0, Context arg1, Cursor arg2,\r
98                                 boolean arg3) {\r
99 \r
100                         TextView manu = (TextView) arg0.findViewById(R.id.motorChildManu);\r
101                         manu.setText( arg2.getString(arg2.getColumnIndex(MotorDao.MANUFACTURER)));\r
102 \r
103                         TextView desig = (TextView) arg0.findViewById(R.id.motorChildName);\r
104                         desig.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DESIGNATION)));\r
105 \r
106                         TextView delays = (TextView) arg0.findViewById(R.id.motorChildDelays);\r
107                         delays.setText( arg2.getString(arg2.getColumnIndex(MotorDao.DELAYS)));\r
108 \r
109                         TextView totImpulse = (TextView) arg0.findViewById(R.id.motorChildImpulse);\r
110                         totImpulse.setText( arg2.getString(arg2.getColumnIndex(MotorDao.TOTAL_IMPULSE)));\r
111                 }\r
112 \r
113                 /* (non-Javadoc)\r
114                  * @see android.widget.CursorTreeAdapter#bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean)\r
115                  */\r
116                 @Override\r
117                 protected void bindGroupView(View view, Context context, Cursor cursor,\r
118                                 boolean isExpanded) {\r
119                         TextView v = (TextView) view.findViewById(R.id.motorGroup);\r
120                         if ( MotorDao.DIAMETER.equals(groupColumn)) {\r
121                                 double d = cursor.getDouble( cursor.getColumnIndex(groupColumn));\r
122                                 v.setText( String.valueOf(Math.round(d * 1000.0)) );\r
123                         } else {\r
124                                 v.setText( cursor.getString( cursor.getColumnIndex(groupColumn)));\r
125                         }\r
126                 }\r
127 \r
128         }\r
129 \r
130         @Override\r
131         public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
132                 if ( groupColumnPreferenceKey.equals(arg1) ) {\r
133                         setGroupColumnFromPreferences(arg0);\r
134                         refreshData();\r
135                 }\r
136         }\r
137 \r
138         @Override\r
139         public void onViewCreated(View view, Bundle savedInstanceState) {\r
140                 super.onViewCreated(view, savedInstanceState);\r
141                 refreshData();\r
142 \r
143                 registerForContextMenu(getExpandableListView());\r
144 \r
145         }\r
146 \r
147         @Override\r
148         public void onAttach(Activity activity) {\r
149                 super.onAttach(activity);\r
150                 mDbHelper = new DbAdapter(getActivity());\r
151                 mDbHelper.open();\r
152 \r
153                 Resources resources = this.getResources();\r
154                 groupColumnPreferenceKey = resources.getString(R.string.PreferenceMotorBrowserGroupingOption);\r
155                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\r
156 \r
157                 setGroupColumnFromPreferences(pref);\r
158 \r
159                 pref.registerOnSharedPreferenceChangeListener(this);\r
160 \r
161                 if ( activity instanceof OnMotorSelectedListener ) {\r
162                         motorSelectedListener = (OnMotorSelectedListener) activity;\r
163                 }\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                 //Intent i = new Intent(this, BurnPlotActivity.class);\r
208                 if( motorSelectedListener != null ) {\r
209                         motorSelectedListener.onMotorSelected(id);\r
210                 }\r
211                 return true;\r
212         }\r
213 \r
214         @Override\r
215         public void onDetach() {\r
216                 super.onDetach();\r
217                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());\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 setGroupColumnFromPreferences( SharedPreferences prefs ) {\r
229                 String indexStr = prefs.getString(groupColumnPreferenceKey, "1");\r
230                 int index;\r
231                 //Dirty hack, you can't use integer-array in ListPreferences\r
232                 try {\r
233                         index = Integer.parseInt(indexStr);\r
234                 } catch ( Exception e ) {\r
235                         index = 1;\r
236                 }\r
237                 if ( index >= groupColumns.length ) {\r
238                         index = 1;\r
239                 }\r
240                 groupColumn = groupColumns[index];\r
241 \r
242         }\r
243         private void refreshData() {\r
244                 Cursor motorCursor = mDbHelper.getMotorDao().fetchGroups(groupColumn);\r
245                 if (mAdapter != null ) {\r
246                         mAdapter.changeCursor(motorCursor);\r
247                 }\r
248                 else {\r
249                         // Set up our adapter\r
250                         mAdapter = new MotorHierarchicalListAdapter( \r
251                                         getActivity(),\r
252                                         motorCursor,\r
253                                         R.layout.motor_list_group,\r
254                                         R.layout.motor_list_child);\r
255                         setListAdapter(mAdapter);\r
256                 }\r
257         }\r
258 \r
259 }\r