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.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
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 onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
\r
47 inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);
\r
51 public boolean onOptionsItemSelected(MenuItem item) {
\r
52 switch (item.getItemId())
\r
58 return super.onOptionsItemSelected(item);
\r
63 public void onActivityCreated(Bundle savedInstanceState) {
\r
64 super.onActivityCreated(savedInstanceState);
\r
70 public void refreshConfigsList() {
\r
74 private void addConfiguration() {
\r
75 ((Application)getActivity().getApplication()).addNewMotorConfig();
\r
78 private static class MotorMountInfo {
\r
80 private RocketComponent mmt;
\r
81 private String config;
\r
82 private ExtendedThrustCurveMotor motor;
\r
83 private double delay;
\r
85 String getMotorMountDescription() {
\r
86 String mmtDesc = mmt.getComponentName();
\r
87 mmtDesc += " (" + UnitGroup.UNITS_MOTOR_DIMENSIONS.toStringUnit( ((MotorMount)mmt).getMotorMountDiameter()) + ")";
\r
91 String getMotorDescription() {
\r
92 return motor.getManufacturer().getDisplayName() + " " + motor.getDesignation();
\r
97 class ChildViewHolder {
\r
98 MotorMountInfo info;
\r
99 TextView motorMountName;
\r
100 Button motorDescription;
\r
102 void setMotor( ExtendedThrustCurveMotor motor ) {
\r
103 this.info.motor = motor;
\r
104 ((MotorMount)info.mmt).setMotor(info.config, motor);
\r
106 void setDelay( double delay ) {
\r
107 this.info.delay = delay;
\r
108 ((MotorMount)info.mmt).setMotorDelay(info.config, delay);
\r
112 private void setup() {
\r
113 final OpenRocketDocument rocketDocument = ((Application)getActivity().getApplication()).getRocketDocument();
\r
115 ExpandableListAdapter configurationAdapter = new BaseExpandableListAdapter() {
\r
117 List<MotorMount> mmts = rocketDocument.getRocket().getMotorMounts();
\r
120 public int getGroupCount() {
\r
121 return rocketDocument.getRocket().getMotorConfigurationIDs().length;
\r
125 public int getChildrenCount(int groupPosition) {
\r
126 return mmts.size();
\r
130 public Object getGroup(int groupPosition) {
\r
131 String config = rocketDocument.getRocket().getMotorConfigurationIDs()[groupPosition];
\r
136 public Object getChild(int groupPosition, int childPosition) {
\r
137 MotorMountInfo info = new MotorMountInfo();
\r
138 info.mmt = (RocketComponent)(mmts.get(childPosition));
\r
140 String config = (String) getGroup(groupPosition);
\r
141 info.config = config;
\r
142 info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);
\r
144 if ( info.motor != null ) {
\r
145 info.delay = ((MotorMount)info.mmt).getMotorDelay(config);
\r
154 public long getGroupId(int groupPosition) {
\r
155 // TODO Auto-generated method stub
\r
160 public long getChildId(int groupPosition, int childPosition) {
\r
161 // TODO Auto-generated method stub
\r
166 public boolean hasStableIds() {
\r
167 // TODO Auto-generated method stub
\r
172 public View getGroupView(int groupPosition, boolean isExpanded,
\r
173 View convertView, ViewGroup parent) {
\r
174 if ( convertView == null ) {
\r
175 convertView = getActivity().getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1,null);
\r
177 String configDescription = rocketDocument.getRocket().getMotorConfigurationNameOrDescription((String) getGroup(groupPosition));
\r
178 ((TextView)convertView.findViewById(android.R.id.text1)).setText( configDescription );
\r
179 return convertView;
\r
183 public View getChildView(int groupPosition, int childPosition,
\r
184 boolean isLastChild, View convertView, ViewGroup parent) {
\r
185 if ( convertView == null ) {
\r
186 convertView = getActivity().getLayoutInflater().inflate(R.layout.motor_config_item,null);
\r
187 ChildViewHolder holder = new ChildViewHolder();
\r
188 holder.motorMountName = (TextView) convertView.findViewById(R.id.motor_config_motor_mount_name);
\r
189 holder.motorDescription = (Button) convertView.findViewById(R.id.motor_config_motor_desc);
\r
190 holder.motorDelay = (Button) convertView.findViewById(R.id.motor_config_motor_delay);
\r
191 holder.info = (MotorMountInfo) getChild(groupPosition,childPosition);
\r
192 convertView.setTag(holder);
\r
195 ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();
\r
197 cvHolder.motorMountName.setText(cvHolder.info.getMotorMountDescription());
\r
198 cvHolder.motorDescription.setOnClickListener( new MotorWizardOnClickListener() );
\r
199 if ( cvHolder.info.motor == null ) {
\r
200 cvHolder.motorDelay.setClickable(false);
\r
201 cvHolder.motorDelay.setOnClickListener(null);
\r
202 cvHolder.motorDescription.setText(R.string.select_motor);
\r
204 cvHolder.motorDelay.setClickable(true);
\r
205 cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );
\r
206 cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());
\r
208 if( cvHolder.info.delay >=0 ) {
\r
209 if( cvHolder.info.delay == Motor.PLUGGED ) {
\r
210 cvHolder.motorDelay.setText("P");
\r
212 cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));
\r
215 cvHolder.motorDelay.setText(R.string.select_delay);
\r
218 return convertView;
\r
222 public boolean isChildSelectable(int groupPosition,
\r
223 int childPosition) {
\r
224 // TODO Auto-generated method stub
\r
230 setListAdapter(configurationAdapter);
\r
233 private class MotorWizardOnClickListener implements View.OnClickListener {
\r
235 public void onClick(View v) {
\r
236 final ViewGroup parent = (ViewGroup) v.getParent();
\r
237 final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();
\r
238 final MotorListDialogFragment f = new MotorListDialogFragment();
\r
239 f.setMotorSelectedListener( new MotorListDialogFragment.OnMotorSelectedListener() {
\r
242 public void onMotorSelected(long motorId) {
\r
243 DbAdapter mdbHelper = new DbAdapter(getActivity());
\r
246 ExtendedThrustCurveMotor motor = mdbHelper.getMotorDao().fetchMotor(motorId);
\r
247 cvHolder.setMotor( motor );
\r
248 ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();
\r
249 } catch (Exception ex) {
\r
250 AndroidLogWrapper.d(Configurations.class, "BlewUp looking for motor", ex);
\r
254 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
260 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
261 ft.add(f, wizardFrag);
\r
267 private class MotorDelayOnClickListener implements View.OnClickListener {
\r
269 double[] standardDelays;
\r
271 public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {
\r
273 this.standardDelays = motor.getStandardDelays();
\r
277 public void onClick(View v) {
\r
278 final View parent = (View) v.getParent();
\r
279 final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();
\r
280 final MotorDelayDialogFragment f = MotorDelayDialogFragment.newInstance(standardDelays);
\r
281 f.setDelaySelectedListener( new MotorDelayDialogFragment.OnDelaySelectedListener() {
\r
284 public void onDelaySelected(double delay) {
\r
285 cvHolder.setDelay( delay );
\r
286 ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();
\r
287 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
293 FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
\r
294 ft.add(f, wizardFrag);
\r