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.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
32 import com.actionbarsherlock.view.Menu;
\r
33 import com.actionbarsherlock.view.MenuInflater;
\r
34 import com.actionbarsherlock.view.MenuItem;
\r
36 public class Configurations extends ExpandableListFragment {
\r
38 private final static String wizardFrag = "wizardFrag";
\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
50 public void onResume() {
\r
56 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
\r
57 inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);
\r
61 public boolean onOptionsItemSelected(MenuItem item) {
\r
62 switch (item.getItemId())
\r
68 return super.onOptionsItemSelected(item);
\r
72 public void refreshConfigsList() {
\r
76 private void addConfiguration() {
\r
77 CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(getActivity());
\r
80 private void removeConfiguration( String config ) {
\r
81 CurrentRocketHolder.getCurrentRocket().deleteMotorConfig( getActivity(), config );
\r
84 private static class MotorMountInfo {
\r
86 private RocketComponent mmt;
\r
87 private String config;
\r
88 private ExtendedThrustCurveMotor motor;
\r
89 private double delay;
\r
91 String getMotorMountDescription() {
\r
92 String mmtDesc = mmt.getComponentName();
\r
93 mmtDesc += " (" + UnitGroup.UNITS_MOTOR_DIMENSIONS.toStringUnit( ((MotorMount)mmt).getMotorMountDiameter()) + ")";
\r
97 String getMotorDescription() {
\r
98 return motor.getManufacturer().getDisplayName() + " " + motor.getDesignation();
\r
103 class ChildViewHolder {
\r
104 MotorMountInfo info;
\r
105 TextView motorMountName;
\r
106 Button motorDescription;
\r
108 void setMotor( ExtendedThrustCurveMotor motor ) {
\r
109 this.info.motor = motor;
\r
110 ((MotorMount)info.mmt).setMotor(info.config, motor);
\r
112 void setDelay( double delay ) {
\r
113 this.info.delay = delay;
\r
114 ((MotorMount)info.mmt).setMotorDelay(info.config, delay);
\r
118 private void setup() {
\r
119 final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
\r
121 ExpandableListAdapter configurationAdapter = new BaseExpandableListAdapter() {
\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
128 public int getGroupCount() {
\r
129 // don't show the "no motors" configuration, so we have one less than the
\r
131 return rocketDocument.getRocket().getMotorConfigurationIDs().length-1;
\r
135 public int getChildrenCount(int groupPosition) {
\r
136 return mmts.size();
\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
147 public Object getChild(int groupPosition, int childPosition) {
\r
148 MotorMountInfo info = new MotorMountInfo();
\r
149 info.mmt = (RocketComponent)(mmts.get(childPosition));
\r
151 String config = (String) getGroup(groupPosition);
\r
152 info.config = config;
\r
153 info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);
\r
155 if ( info.motor != null ) {
\r
156 info.delay = ((MotorMount)info.mmt).getMotorDelay(config);
\r
165 public long getGroupId(int groupPosition) {
\r
166 // TODO Auto-generated method stub
\r
171 public long getChildId(int groupPosition, int childPosition) {
\r
172 // TODO Auto-generated method stub
\r
177 public boolean hasStableIds() {
\r
178 // TODO Auto-generated method stub
\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
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
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
206 ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();
\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
215 cvHolder.motorDelay.setClickable(true);
\r
216 cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );
\r
217 cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());
\r
219 if( cvHolder.info.delay >=0 ) {
\r
220 if( cvHolder.info.delay == Motor.PLUGGED ) {
\r
221 cvHolder.motorDelay.setText("P");
\r
223 cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));
\r
226 cvHolder.motorDelay.setText(R.string.select_delay);
\r
229 return convertView;
\r
233 public boolean isChildSelectable(int groupPosition, int childPosition) {
\r
239 setListAdapter(configurationAdapter);
\r
243 public boolean onListItemLongClick(ListView l, View v, int position, long id) {
\r
245 Object o = getExpandableListAdapter().getGroup(position);
\r
247 if ( o == null || ! (o instanceof String) ) {
\r
250 final String motorConfigId = (String)o;
\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
257 public void onClick(DialogInterface dialog, int which) {
\r
258 Configurations.this.removeConfiguration(motorConfigId);
\r
263 Dialog dialog = b.create();
\r
265 dialog.setCanceledOnTouchOutside(true);
\r
270 private class MotorWizardOnClickListener implements View.OnClickListener {
\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
279 public void onMotorSelected(long motorId) {
\r
280 DbAdapter mdbHelper = new DbAdapter(getActivity());
\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
291 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
297 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
298 ft.add(f, wizardFrag);
\r
304 private class MotorDelayOnClickListener implements View.OnClickListener {
\r
306 double[] standardDelays;
\r
308 public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {
\r
310 this.standardDelays = motor.getStandardDelays();
\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
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
330 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
331 ft.add(f, wizardFrag);
\r