Added way to delete motor configurations through long click in the configurations...
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / Configurations.java
1 package net.sf.openrocket.android.rocket;\r
2 \r
3 import java.util.List;\r
4 \r
5 import net.sf.openrocket.R;\r
6 import net.sf.openrocket.android.CurrentRocketHolder;\r
7 import net.sf.openrocket.android.db.DbAdapter;\r
8 import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
9 import net.sf.openrocket.android.motor.MotorDelayDialogFragment;\r
10 import net.sf.openrocket.android.motor.MotorListDialogFragment;\r
11 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
12 import net.sf.openrocket.android.util.ExpandableListFragment;\r
13 import net.sf.openrocket.document.OpenRocketDocument;\r
14 import net.sf.openrocket.motor.Motor;\r
15 import net.sf.openrocket.rocketcomponent.MotorMount;\r
16 import net.sf.openrocket.rocketcomponent.RocketComponent;\r
17 import net.sf.openrocket.unit.UnitGroup;\r
18 import android.app.AlertDialog;\r
19 import android.app.Dialog;\r
20 import android.content.DialogInterface;\r
21 import android.os.Bundle;\r
22 import android.support.v4.app.FragmentTransaction;\r
23 import android.view.LayoutInflater;\r
24 import android.view.View;\r
25 import android.view.ViewGroup;\r
26 import android.widget.BaseExpandableListAdapter;\r
27 import android.widget.Button;\r
28 import android.widget.ExpandableListAdapter;\r
29 import android.widget.ListView;\r
30 import android.widget.TextView;\r
31 \r
32 import com.actionbarsherlock.view.Menu;\r
33 import com.actionbarsherlock.view.MenuInflater;\r
34 import com.actionbarsherlock.view.MenuItem;\r
35 \r
36 public class Configurations extends ExpandableListFragment {\r
37 \r
38         private final static String wizardFrag = "wizardFrag";\r
39         \r
40         @Override\r
41         public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
42                         Bundle savedInstanceState) {\r
43                 setHasOptionsMenu(true);\r
44                 View v = inflater.inflate(R.layout.rocket_configurations, container, false);\r
45 \r
46                 return v;\r
47         }\r
48 \r
49         @Override\r
50         public void onResume() {\r
51                 setup();\r
52                 super.onResume();\r
53         }\r
54 \r
55         @Override\r
56         public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\r
57                 inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);\r
58         }\r
59 \r
60         @Override\r
61         public boolean onOptionsItemSelected(MenuItem item) {\r
62                 switch (item.getItemId())\r
63                 {\r
64                 case R.id.menu_add:\r
65                         addConfiguration();\r
66                         return true;\r
67                 default:\r
68                         return super.onOptionsItemSelected(item);\r
69                 }\r
70         }\r
71 \r
72         public void refreshConfigsList() {\r
73                 setup();\r
74         }\r
75 \r
76         private void addConfiguration() {\r
77                 CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(getActivity());\r
78         }\r
79         \r
80         private void removeConfiguration( String config ) {\r
81                 CurrentRocketHolder.getCurrentRocket().deleteMotorConfig( getActivity(), config );\r
82         }\r
83         \r
84         private static class MotorMountInfo {\r
85 \r
86                 private RocketComponent mmt;\r
87                 private String config;\r
88                 private ExtendedThrustCurveMotor motor;\r
89                 private double delay;\r
90 \r
91                 String getMotorMountDescription() {\r
92                         String mmtDesc = mmt.getComponentName();\r
93                         mmtDesc += " (" + UnitGroup.UNITS_MOTOR_DIMENSIONS.toStringUnit( ((MotorMount)mmt).getMotorMountDiameter()) + ")";\r
94                         return mmtDesc;\r
95                 }\r
96 \r
97                 String getMotorDescription() {\r
98                         return motor.getManufacturer().getDisplayName() + " " + motor.getDesignation();\r
99                 }\r
100 \r
101         }\r
102 \r
103         class ChildViewHolder {\r
104                 MotorMountInfo info;\r
105                 TextView motorMountName;\r
106                 Button motorDescription;\r
107                 Button motorDelay;\r
108                 void setMotor( ExtendedThrustCurveMotor motor ) {\r
109                         this.info.motor = motor;\r
110                         ((MotorMount)info.mmt).setMotor(info.config, motor);\r
111                 }\r
112                 void setDelay( double delay ) {\r
113                         this.info.delay = delay;\r
114                         ((MotorMount)info.mmt).setMotorDelay(info.config, delay);\r
115                 }\r
116         }\r
117 \r
118         private void setup() {\r
119                 final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
120 \r
121                 ExpandableListAdapter configurationAdapter = new BaseExpandableListAdapter() {\r
122 \r
123                         // Note: the magic 1 you see below is so the "no motors" configuration\r
124                         // does not appear in the configuration list.\r
125                         List<MotorMount> mmts = rocketDocument.getRocket().getMotorMounts();\r
126 \r
127                         @Override\r
128                         public int getGroupCount() {\r
129                                 // don't show the "no motors" configuration, so we have one less than the\r
130                                 // array length.\r
131                                 return rocketDocument.getRocket().getMotorConfigurationIDs().length-1;\r
132                         }\r
133 \r
134                         @Override\r
135                         public int getChildrenCount(int groupPosition) {\r
136                                 return mmts.size();\r
137                         }\r
138 \r
139                         @Override\r
140                         public Object getGroup(int groupPosition) {\r
141                                 // Skip over the "no motors" configuration\r
142                                 String config = rocketDocument.getRocket().getMotorConfigurationIDs()[groupPosition+1];\r
143                                 return config;\r
144                         }\r
145 \r
146                         @Override\r
147                         public Object getChild(int groupPosition, int childPosition) {\r
148                                 MotorMountInfo info = new MotorMountInfo();\r
149                                 info.mmt = (RocketComponent)(mmts.get(childPosition));\r
150 \r
151                                 String config = (String) getGroup(groupPosition);\r
152                                 info.config = config;\r
153                                 info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);\r
154 \r
155                                 if ( info.motor != null ) {\r
156                                         info.delay = ((MotorMount)info.mmt).getMotorDelay(config);\r
157                                 } else {\r
158                                         info.delay = -1;\r
159                                 }\r
160 \r
161                                 return info;\r
162                         }\r
163 \r
164                         @Override\r
165                         public long getGroupId(int groupPosition) {\r
166                                 // TODO Auto-generated method stub\r
167                                 return 0;\r
168                         }\r
169 \r
170                         @Override\r
171                         public long getChildId(int groupPosition, int childPosition) {\r
172                                 // TODO Auto-generated method stub\r
173                                 return 0;\r
174                         }\r
175 \r
176                         @Override\r
177                         public boolean hasStableIds() {\r
178                                 // TODO Auto-generated method stub\r
179                                 return false;\r
180                         }\r
181 \r
182                         @Override\r
183                         public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {\r
184                                 if ( convertView == null ) {\r
185                                         convertView = getActivity().getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1,null);\r
186                                 }\r
187 \r
188                                 String configDescription = rocketDocument.getRocket().getMotorConfigurationNameOrDescription((String) getGroup(groupPosition));\r
189                                 ((TextView)convertView.findViewById(android.R.id.text1)).setText( configDescription );\r
190                                 return convertView;\r
191                         }\r
192 \r
193                         @Override\r
194                         public View getChildView(int groupPosition, int childPosition,\r
195                                         boolean isLastChild, View convertView, ViewGroup parent) {\r
196                                 if ( convertView == null ) {\r
197                                         convertView = getActivity().getLayoutInflater().inflate(R.layout.motor_config_item,null);\r
198                                         ChildViewHolder holder = new ChildViewHolder();\r
199                                         holder.motorMountName = (TextView) convertView.findViewById(R.id.motor_config_motor_mount_name);\r
200                                         holder.motorDescription = (Button) convertView.findViewById(R.id.motor_config_motor_desc);\r
201                                         holder.motorDelay = (Button) convertView.findViewById(R.id.motor_config_motor_delay);\r
202                                         holder.info = (MotorMountInfo) getChild(groupPosition,childPosition);\r
203                                         convertView.setTag(holder);\r
204                                 }\r
205 \r
206                                 ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();\r
207 \r
208                                 cvHolder.motorMountName.setText(cvHolder.info.getMotorMountDescription());\r
209                                 cvHolder.motorDescription.setOnClickListener( new MotorWizardOnClickListener() );\r
210                                 if ( cvHolder.info.motor == null ) {\r
211                                         cvHolder.motorDelay.setClickable(false);\r
212                                         cvHolder.motorDelay.setOnClickListener(null);\r
213                                         cvHolder.motorDescription.setText(R.string.select_motor);\r
214                                 } else {\r
215                                         cvHolder.motorDelay.setClickable(true);\r
216                                         cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );\r
217                                         cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());\r
218                                 }\r
219                                 if( cvHolder.info.delay >=0 ) {\r
220                                         if( cvHolder.info.delay == Motor.PLUGGED ) {\r
221                                                 cvHolder.motorDelay.setText("P");\r
222                                         } else {\r
223                                                 cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));\r
224                                         }\r
225                                 } else {\r
226                                         cvHolder.motorDelay.setText(R.string.select_delay);\r
227                                 }\r
228 \r
229                                 return convertView;\r
230                         }\r
231 \r
232                         @Override\r
233                         public boolean isChildSelectable(int groupPosition,     int childPosition) {\r
234                                 return false;\r
235                         }\r
236 \r
237                 };\r
238 \r
239                 setListAdapter(configurationAdapter);\r
240         }\r
241 \r
242         @Override\r
243         public boolean onListItemLongClick(ListView l, View v, int position, long id) {\r
244                 \r
245                 Object o = getExpandableListAdapter().getGroup(position);\r
246                 \r
247                 if ( o == null || ! (o instanceof String) ) {\r
248                         return false;\r
249                 }\r
250                 final String motorConfigId = (String)o;\r
251                 \r
252                 AlertDialog.Builder b = new AlertDialog.Builder( getActivity() );\r
253                 b.setTitle(R.string.DeleteConfigTitle);\r
254                 b.setCancelable(true);\r
255                 b.setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {\r
256                         @Override\r
257                         public void onClick(DialogInterface dialog, int which) {\r
258                                 Configurations.this.removeConfiguration(motorConfigId);\r
259                         }\r
260                         \r
261                 });\r
262                 \r
263                 Dialog dialog = b.create();\r
264                 \r
265                 dialog.setCanceledOnTouchOutside(true);\r
266                 dialog.show();\r
267                 return true;\r
268         }\r
269 \r
270         private class MotorWizardOnClickListener implements View.OnClickListener {\r
271                 @Override\r
272                 public void onClick(View v) {\r
273                         final ViewGroup parent = (ViewGroup) v.getParent();\r
274                         final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();\r
275                         final MotorListDialogFragment f = new MotorListDialogFragment();\r
276                         f.setMotorSelectedListener( new MotorListDialogFragment.OnMotorSelectedListener() {\r
277 \r
278                                 @Override\r
279                                 public void onMotorSelected(long motorId) {\r
280                                         DbAdapter mdbHelper = new DbAdapter(getActivity());\r
281                                         mdbHelper.open();\r
282                                         try {\r
283                                                 ExtendedThrustCurveMotor motor = mdbHelper.getMotorDao().fetchMotor(motorId);\r
284                                                 cvHolder.setMotor( motor );\r
285                                                 ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();\r
286                                         } catch (Exception ex) {\r
287                                                 AndroidLogWrapper.d(Configurations.class, "BlewUp looking for motor", ex);\r
288                                         } finally {\r
289                                                 mdbHelper.close();\r
290                                         }\r
291                                         FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
292                                         ft.remove(f);\r
293                                         ft.commit();\r
294 \r
295                                 }\r
296                         });\r
297                         FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
298                         ft.add(f, wizardFrag);\r
299                         ft.commit();\r
300                 }\r
301 \r
302         }\r
303 \r
304         private class MotorDelayOnClickListener implements View.OnClickListener {\r
305 \r
306                 double[] standardDelays;\r
307 \r
308                 public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {\r
309                         super();\r
310                         this.standardDelays = motor.getStandardDelays();\r
311                 }\r
312 \r
313                 @Override\r
314                 public void onClick(View v) {\r
315                         final View parent = (View) v.getParent();\r
316                         final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();\r
317                         final MotorDelayDialogFragment f = MotorDelayDialogFragment.newInstance(standardDelays);\r
318                         f.setDelaySelectedListener( new MotorDelayDialogFragment.OnDelaySelectedListener() {\r
319 \r
320                                 @Override\r
321                                 public void onDelaySelected(double delay) {\r
322                                         cvHolder.setDelay( delay );\r
323                                         ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();\r
324                                         FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
325                                         ft.remove(f);\r
326                                         ft.commit();\r
327 \r
328                                 }\r
329                         });\r
330                         FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
331                         ft.add(f, wizardFrag);\r
332                         ft.commit();\r
333                 }\r
334 \r
335         }\r
336 }\r