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();
\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 List<MotorMount> mmts = rocketDocument.getRocket().getMotorMounts();
\r
118 public int getGroupCount() {
\r
119 return rocketDocument.getRocket().getMotorConfigurationIDs().length;
\r
123 public int getChildrenCount(int groupPosition) {
\r
124 return mmts.size();
\r
128 public Object getGroup(int groupPosition) {
\r
129 String config = rocketDocument.getRocket().getMotorConfigurationIDs()[groupPosition];
\r
134 public Object getChild(int groupPosition, int childPosition) {
\r
135 MotorMountInfo info = new MotorMountInfo();
\r
136 info.mmt = (RocketComponent)(mmts.get(childPosition));
\r
138 String config = (String) getGroup(groupPosition);
\r
139 info.config = config;
\r
140 info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);
\r
142 if ( info.motor != null ) {
\r
143 info.delay = ((MotorMount)info.mmt).getMotorDelay(config);
\r
152 public long getGroupId(int groupPosition) {
\r
153 // TODO Auto-generated method stub
\r
158 public long getChildId(int groupPosition, int childPosition) {
\r
159 // TODO Auto-generated method stub
\r
164 public boolean hasStableIds() {
\r
165 // TODO Auto-generated method stub
\r
170 public View getGroupView(int groupPosition, boolean isExpanded,
\r
171 View convertView, ViewGroup parent) {
\r
172 if ( convertView == null ) {
\r
173 convertView = getActivity().getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1,null);
\r
175 String configDescription = rocketDocument.getRocket().getMotorConfigurationNameOrDescription((String) getGroup(groupPosition));
\r
176 ((TextView)convertView.findViewById(android.R.id.text1)).setText( configDescription );
\r
177 return convertView;
\r
181 public View getChildView(int groupPosition, int childPosition,
\r
182 boolean isLastChild, View convertView, ViewGroup parent) {
\r
183 if ( convertView == null ) {
\r
184 convertView = getActivity().getLayoutInflater().inflate(R.layout.motor_config_item,null);
\r
185 ChildViewHolder holder = new ChildViewHolder();
\r
186 holder.motorMountName = (TextView) convertView.findViewById(R.id.motor_config_motor_mount_name);
\r
187 holder.motorDescription = (Button) convertView.findViewById(R.id.motor_config_motor_desc);
\r
188 holder.motorDelay = (Button) convertView.findViewById(R.id.motor_config_motor_delay);
\r
189 holder.info = (MotorMountInfo) getChild(groupPosition,childPosition);
\r
190 convertView.setTag(holder);
\r
193 ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();
\r
195 cvHolder.motorMountName.setText(cvHolder.info.getMotorMountDescription());
\r
196 cvHolder.motorDescription.setOnClickListener( new MotorWizardOnClickListener() );
\r
197 if ( cvHolder.info.motor == null ) {
\r
198 cvHolder.motorDelay.setClickable(false);
\r
199 cvHolder.motorDelay.setOnClickListener(null);
\r
200 cvHolder.motorDescription.setText(R.string.select_motor);
\r
202 cvHolder.motorDelay.setClickable(true);
\r
203 cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );
\r
204 cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());
\r
206 if( cvHolder.info.delay >=0 ) {
\r
207 if( cvHolder.info.delay == Motor.PLUGGED ) {
\r
208 cvHolder.motorDelay.setText("P");
\r
210 cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));
\r
213 cvHolder.motorDelay.setText(R.string.select_delay);
\r
216 return convertView;
\r
220 public boolean isChildSelectable(int groupPosition,
\r
221 int childPosition) {
\r
222 // TODO Auto-generated method stub
\r
228 setListAdapter(configurationAdapter);
\r
231 private class MotorWizardOnClickListener implements View.OnClickListener {
\r
233 public void onClick(View v) {
\r
234 final ViewGroup parent = (ViewGroup) v.getParent();
\r
235 final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();
\r
236 final MotorListDialogFragment f = new MotorListDialogFragment();
\r
237 f.setMotorSelectedListener( new MotorListDialogFragment.OnMotorSelectedListener() {
\r
240 public void onMotorSelected(long motorId) {
\r
241 DbAdapter mdbHelper = new DbAdapter(getActivity());
\r
244 ExtendedThrustCurveMotor motor = mdbHelper.getMotorDao().fetchMotor(motorId);
\r
245 cvHolder.setMotor( motor );
\r
246 ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();
\r
247 } catch (Exception ex) {
\r
248 AndroidLogWrapper.d(Configurations.class, "BlewUp looking for motor", ex);
\r
252 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
258 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
259 ft.add(f, wizardFrag);
\r
265 private class MotorDelayOnClickListener implements View.OnClickListener {
\r
267 double[] standardDelays;
\r
269 public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {
\r
271 this.standardDelays = motor.getStandardDelays();
\r
275 public void onClick(View v) {
\r
276 final View parent = (View) v.getParent();
\r
277 final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();
\r
278 final MotorDelayDialogFragment f = MotorDelayDialogFragment.newInstance(standardDelays);
\r
279 f.setDelaySelectedListener( new MotorDelayDialogFragment.OnDelaySelectedListener() {
\r
282 public void onDelaySelected(double delay) {
\r
283 cvHolder.setDelay( delay );
\r
284 ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();
\r
285 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
291 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
292 ft.add(f, wizardFrag);
\r