1 package net.sf.openrocket.android.rocket;
\r
3 import java.util.List;
\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
28 import com.actionbarsherlock.view.Menu;
\r
29 import com.actionbarsherlock.view.MenuInflater;
\r
30 import com.actionbarsherlock.view.MenuItem;
\r
32 public class Configurations extends ExpandableListFragment {
\r
34 private final static String wizardFrag = "wizardFrag";
\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
46 public void onResume() {
\r
52 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
\r
53 inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);
\r
57 public boolean onOptionsItemSelected(MenuItem item) {
\r
58 switch (item.getItemId())
\r
64 return super.onOptionsItemSelected(item);
\r
68 public void refreshConfigsList() {
\r
72 private void addConfiguration() {
\r
73 CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(getActivity());
\r
76 private static class MotorMountInfo {
\r
78 private RocketComponent mmt;
\r
79 private String config;
\r
80 private ExtendedThrustCurveMotor motor;
\r
81 private double delay;
\r
83 String getMotorMountDescription() {
\r
84 String mmtDesc = mmt.getComponentName();
\r
85 mmtDesc += " (" + UnitGroup.UNITS_MOTOR_DIMENSIONS.toStringUnit( ((MotorMount)mmt).getMotorMountDiameter()) + ")";
\r
89 String getMotorDescription() {
\r
90 return motor.getManufacturer().getDisplayName() + " " + motor.getDesignation();
\r
95 class ChildViewHolder {
\r
96 MotorMountInfo info;
\r
97 TextView motorMountName;
\r
98 Button motorDescription;
\r
100 void setMotor( ExtendedThrustCurveMotor motor ) {
\r
101 this.info.motor = motor;
\r
102 ((MotorMount)info.mmt).setMotor(info.config, motor);
\r
104 void setDelay( double delay ) {
\r
105 this.info.delay = delay;
\r
106 ((MotorMount)info.mmt).setMotorDelay(info.config, delay);
\r
110 private void setup() {
\r
111 final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
\r
113 ExpandableListAdapter configurationAdapter = new BaseExpandableListAdapter() {
\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
120 public int getGroupCount() {
\r
121 // don't show the "no motors" configuration, so we have one less than the
\r
123 return rocketDocument.getRocket().getMotorConfigurationIDs().length-1;
\r
127 public int getChildrenCount(int groupPosition) {
\r
128 return mmts.size();
\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
139 public Object getChild(int groupPosition, int childPosition) {
\r
140 MotorMountInfo info = new MotorMountInfo();
\r
141 info.mmt = (RocketComponent)(mmts.get(childPosition));
\r
143 String config = (String) getGroup(groupPosition);
\r
144 info.config = config;
\r
145 info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);
\r
147 if ( info.motor != null ) {
\r
148 info.delay = ((MotorMount)info.mmt).getMotorDelay(config);
\r
157 public long getGroupId(int groupPosition) {
\r
158 // TODO Auto-generated method stub
\r
163 public long getChildId(int groupPosition, int childPosition) {
\r
164 // TODO Auto-generated method stub
\r
169 public boolean hasStableIds() {
\r
170 // TODO Auto-generated method stub
\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
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
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
198 ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();
\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
207 cvHolder.motorDelay.setClickable(true);
\r
208 cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );
\r
209 cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());
\r
211 if( cvHolder.info.delay >=0 ) {
\r
212 if( cvHolder.info.delay == Motor.PLUGGED ) {
\r
213 cvHolder.motorDelay.setText("P");
\r
215 cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));
\r
218 cvHolder.motorDelay.setText(R.string.select_delay);
\r
221 return convertView;
\r
225 public boolean isChildSelectable(int groupPosition,
\r
226 int childPosition) {
\r
227 // TODO Auto-generated method stub
\r
233 setListAdapter(configurationAdapter);
\r
236 private class MotorWizardOnClickListener implements View.OnClickListener {
\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
245 public void onMotorSelected(long motorId) {
\r
246 DbAdapter mdbHelper = new DbAdapter(getActivity());
\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
257 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
263 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
264 ft.add(f, wizardFrag);
\r
270 private class MotorDelayOnClickListener implements View.OnClickListener {
\r
272 double[] standardDelays;
\r
274 public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {
\r
276 this.standardDelays = motor.getStandardDelays();
\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
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
296 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
297 ft.add(f, wizardFrag);
\r