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