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