Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / Configurations.java
diff --git a/android/src/net/sf/openrocket/android/rocket/Configurations.java b/android/src/net/sf/openrocket/android/rocket/Configurations.java
new file mode 100644 (file)
index 0000000..9f381de
--- /dev/null
@@ -0,0 +1,336 @@
+package net.sf.openrocket.android.rocket;\r
+\r
+import java.util.List;\r
+\r
+import net.sf.openrocket.R;\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.db.DbAdapter;\r
+import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;\r
+import net.sf.openrocket.android.motor.MotorDelayDialogFragment;\r
+import net.sf.openrocket.android.motor.MotorListDialogFragment;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.android.util.ExpandableListFragment;\r
+import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.motor.Motor;\r
+import net.sf.openrocket.rocketcomponent.MotorMount;\r
+import net.sf.openrocket.rocketcomponent.RocketComponent;\r
+import net.sf.openrocket.unit.UnitGroup;\r
+import android.app.AlertDialog;\r
+import android.app.Dialog;\r
+import android.content.DialogInterface;\r
+import android.os.Bundle;\r
+import android.support.v4.app.FragmentTransaction;\r
+import android.view.LayoutInflater;\r
+import android.view.View;\r
+import android.view.ViewGroup;\r
+import android.widget.BaseExpandableListAdapter;\r
+import android.widget.Button;\r
+import android.widget.ExpandableListAdapter;\r
+import android.widget.ListView;\r
+import android.widget.TextView;\r
+\r
+import com.actionbarsherlock.view.Menu;\r
+import com.actionbarsherlock.view.MenuInflater;\r
+import com.actionbarsherlock.view.MenuItem;\r
+\r
+public class Configurations extends ExpandableListFragment {\r
+\r
+       private final static String wizardFrag = "wizardFrag";\r
+       \r
+       @Override\r
+       public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+                       Bundle savedInstanceState) {\r
+               setHasOptionsMenu(true);\r
+               View v = inflater.inflate(R.layout.rocket_configurations, container, false);\r
+\r
+               return v;\r
+       }\r
+\r
+       @Override\r
+       public void onResume() {\r
+               setup();\r
+               super.onResume();\r
+       }\r
+\r
+       @Override\r
+       public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\r
+               inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu);\r
+       }\r
+\r
+       @Override\r
+       public boolean onOptionsItemSelected(MenuItem item) {\r
+               switch (item.getItemId())\r
+               {\r
+               case R.id.menu_add:\r
+                       addConfiguration();\r
+                       return true;\r
+               default:\r
+                       return super.onOptionsItemSelected(item);\r
+               }\r
+       }\r
+\r
+       public void refreshConfigsList() {\r
+               setup();\r
+       }\r
+\r
+       private void addConfiguration() {\r
+               CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(getActivity());\r
+       }\r
+       \r
+       private void removeConfiguration( String config ) {\r
+               CurrentRocketHolder.getCurrentRocket().deleteMotorConfig( getActivity(), config );\r
+       }\r
+       \r
+       private static class MotorMountInfo {\r
+\r
+               private RocketComponent mmt;\r
+               private String config;\r
+               private ExtendedThrustCurveMotor motor;\r
+               private double delay;\r
+\r
+               String getMotorMountDescription() {\r
+                       String mmtDesc = mmt.getComponentName();\r
+                       mmtDesc += " (" + UnitGroup.UNITS_MOTOR_DIMENSIONS.toStringUnit( ((MotorMount)mmt).getMotorMountDiameter()) + ")";\r
+                       return mmtDesc;\r
+               }\r
+\r
+               String getMotorDescription() {\r
+                       return motor.getManufacturer().getDisplayName() + " " + motor.getDesignation();\r
+               }\r
+\r
+       }\r
+\r
+       class ChildViewHolder {\r
+               MotorMountInfo info;\r
+               TextView motorMountName;\r
+               Button motorDescription;\r
+               Button motorDelay;\r
+               void setMotor( ExtendedThrustCurveMotor motor ) {\r
+                       this.info.motor = motor;\r
+                       ((MotorMount)info.mmt).setMotor(info.config, motor);\r
+               }\r
+               void setDelay( double delay ) {\r
+                       this.info.delay = delay;\r
+                       ((MotorMount)info.mmt).setMotorDelay(info.config, delay);\r
+               }\r
+       }\r
+\r
+       private void setup() {\r
+               final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
+\r
+               ExpandableListAdapter configurationAdapter = new BaseExpandableListAdapter() {\r
+\r
+                       // Note: the magic 1 you see below is so the "no motors" configuration\r
+                       // does not appear in the configuration list.\r
+                       List<MotorMount> mmts = rocketDocument.getRocket().getMotorMounts();\r
+\r
+                       @Override\r
+                       public int getGroupCount() {\r
+                               // don't show the "no motors" configuration, so we have one less than the\r
+                               // array length.\r
+                               return rocketDocument.getRocket().getMotorConfigurationIDs().length-1;\r
+                       }\r
+\r
+                       @Override\r
+                       public int getChildrenCount(int groupPosition) {\r
+                               return mmts.size();\r
+                       }\r
+\r
+                       @Override\r
+                       public Object getGroup(int groupPosition) {\r
+                               // Skip over the "no motors" configuration\r
+                               String config = rocketDocument.getRocket().getMotorConfigurationIDs()[groupPosition+1];\r
+                               return config;\r
+                       }\r
+\r
+                       @Override\r
+                       public Object getChild(int groupPosition, int childPosition) {\r
+                               MotorMountInfo info = new MotorMountInfo();\r
+                               info.mmt = (RocketComponent)(mmts.get(childPosition));\r
+\r
+                               String config = (String) getGroup(groupPosition);\r
+                               info.config = config;\r
+                               info.motor = (ExtendedThrustCurveMotor) ((MotorMount)info.mmt).getMotor(config);\r
+\r
+                               if ( info.motor != null ) {\r
+                                       info.delay = ((MotorMount)info.mmt).getMotorDelay(config);\r
+                               } else {\r
+                                       info.delay = -1;\r
+                               }\r
+\r
+                               return info;\r
+                       }\r
+\r
+                       @Override\r
+                       public long getGroupId(int groupPosition) {\r
+                               // TODO Auto-generated method stub\r
+                               return 0;\r
+                       }\r
+\r
+                       @Override\r
+                       public long getChildId(int groupPosition, int childPosition) {\r
+                               // TODO Auto-generated method stub\r
+                               return 0;\r
+                       }\r
+\r
+                       @Override\r
+                       public boolean hasStableIds() {\r
+                               // TODO Auto-generated method stub\r
+                               return false;\r
+                       }\r
+\r
+                       @Override\r
+                       public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {\r
+                               if ( convertView == null ) {\r
+                                       convertView = getActivity().getLayoutInflater().inflate(android.R.layout.simple_expandable_list_item_1,null);\r
+                               }\r
+\r
+                               String configDescription = rocketDocument.getRocket().getMotorConfigurationNameOrDescription((String) getGroup(groupPosition));\r
+                               ((TextView)convertView.findViewById(android.R.id.text1)).setText( configDescription );\r
+                               return convertView;\r
+                       }\r
+\r
+                       @Override\r
+                       public View getChildView(int groupPosition, int childPosition,\r
+                                       boolean isLastChild, View convertView, ViewGroup parent) {\r
+                               if ( convertView == null ) {\r
+                                       convertView = getActivity().getLayoutInflater().inflate(R.layout.motor_config_item,null);\r
+                                       ChildViewHolder holder = new ChildViewHolder();\r
+                                       holder.motorMountName = (TextView) convertView.findViewById(R.id.motor_config_motor_mount_name);\r
+                                       holder.motorDescription = (Button) convertView.findViewById(R.id.motor_config_motor_desc);\r
+                                       holder.motorDelay = (Button) convertView.findViewById(R.id.motor_config_motor_delay);\r
+                                       holder.info = (MotorMountInfo) getChild(groupPosition,childPosition);\r
+                                       convertView.setTag(holder);\r
+                               }\r
+\r
+                               ChildViewHolder cvHolder = (ChildViewHolder) convertView.getTag();\r
+\r
+                               cvHolder.motorMountName.setText(cvHolder.info.getMotorMountDescription());\r
+                               cvHolder.motorDescription.setOnClickListener( new MotorWizardOnClickListener() );\r
+                               if ( cvHolder.info.motor == null ) {\r
+                                       cvHolder.motorDelay.setClickable(false);\r
+                                       cvHolder.motorDelay.setOnClickListener(null);\r
+                                       cvHolder.motorDescription.setText(R.string.select_motor);\r
+                               } else {\r
+                                       cvHolder.motorDelay.setClickable(true);\r
+                                       cvHolder.motorDelay.setOnClickListener( new MotorDelayOnClickListener(cvHolder.info.motor) );\r
+                                       cvHolder.motorDescription.setText(cvHolder.info.getMotorDescription());\r
+                               }\r
+                               if( cvHolder.info.delay >=0 ) {\r
+                                       if( cvHolder.info.delay == Motor.PLUGGED ) {\r
+                                               cvHolder.motorDelay.setText("P");\r
+                                       } else {\r
+                                               cvHolder.motorDelay.setText( String.valueOf(Math.round(cvHolder.info.delay)));\r
+                                       }\r
+                               } else {\r
+                                       cvHolder.motorDelay.setText(R.string.select_delay);\r
+                               }\r
+\r
+                               return convertView;\r
+                       }\r
+\r
+                       @Override\r
+                       public boolean isChildSelectable(int groupPosition,     int childPosition) {\r
+                               return false;\r
+                       }\r
+\r
+               };\r
+\r
+               setListAdapter(configurationAdapter);\r
+       }\r
+\r
+       @Override\r
+       public boolean onListItemLongClick(ListView l, View v, int position, long id) {\r
+               \r
+               Object o = getExpandableListAdapter().getGroup(position);\r
+               \r
+               if ( o == null || ! (o instanceof String) ) {\r
+                       return false;\r
+               }\r
+               final String motorConfigId = (String)o;\r
+               \r
+               AlertDialog.Builder b = new AlertDialog.Builder( getActivity() );\r
+               b.setTitle(R.string.DeleteConfigTitle);\r
+               b.setCancelable(true);\r
+               b.setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {\r
+                       @Override\r
+                       public void onClick(DialogInterface dialog, int which) {\r
+                               Configurations.this.removeConfiguration(motorConfigId);\r
+                       }\r
+                       \r
+               });\r
+               \r
+               Dialog dialog = b.create();\r
+               \r
+               dialog.setCanceledOnTouchOutside(true);\r
+               dialog.show();\r
+               return true;\r
+       }\r
+\r
+       private class MotorWizardOnClickListener implements View.OnClickListener {\r
+               @Override\r
+               public void onClick(View v) {\r
+                       final ViewGroup parent = (ViewGroup) v.getParent();\r
+                       final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();\r
+                       final MotorListDialogFragment f = new MotorListDialogFragment();\r
+                       f.setMotorSelectedListener( new MotorListDialogFragment.OnMotorSelectedListener() {\r
+\r
+                               @Override\r
+                               public void onMotorSelected(long motorId) {\r
+                                       DbAdapter mdbHelper = new DbAdapter(getActivity());\r
+                                       mdbHelper.open();\r
+                                       try {\r
+                                               ExtendedThrustCurveMotor motor = mdbHelper.getMotorDao().fetchMotor(motorId);\r
+                                               cvHolder.setMotor( motor );\r
+                                               ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();\r
+                                       } catch (Exception ex) {\r
+                                               AndroidLogWrapper.d(Configurations.class, "BlewUp looking for motor", ex);\r
+                                       } finally {\r
+                                               mdbHelper.close();\r
+                                       }\r
+                                       FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
+                                       ft.remove(f);\r
+                                       ft.commit();\r
+\r
+                               }\r
+                       });\r
+                       FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
+                       ft.add(f, wizardFrag);\r
+                       ft.commit();\r
+               }\r
+\r
+       }\r
+\r
+       private class MotorDelayOnClickListener implements View.OnClickListener {\r
+\r
+               double[] standardDelays;\r
+\r
+               public MotorDelayOnClickListener(ExtendedThrustCurveMotor motor) {\r
+                       super();\r
+                       this.standardDelays = motor.getStandardDelays();\r
+               }\r
+\r
+               @Override\r
+               public void onClick(View v) {\r
+                       final View parent = (View) v.getParent();\r
+                       final ChildViewHolder cvHolder = (ChildViewHolder) parent.getTag();\r
+                       final MotorDelayDialogFragment f = MotorDelayDialogFragment.newInstance(standardDelays);\r
+                       f.setDelaySelectedListener( new MotorDelayDialogFragment.OnDelaySelectedListener() {\r
+\r
+                               @Override\r
+                               public void onDelaySelected(double delay) {\r
+                                       cvHolder.setDelay( delay );\r
+                                       ((BaseExpandableListAdapter)Configurations.this.getExpandableListAdapter()).notifyDataSetInvalidated();\r
+                                       FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
+                                       ft.remove(f);\r
+                                       ft.commit();\r
+\r
+                               }\r
+                       });\r
+                       FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\r
+                       ft.add(f, wizardFrag);\r
+                       ft.commit();\r
+               }\r
+\r
+       }\r
+}\r