1 package net.sf.openrocket.android.rocket;
\r
6 import net.sf.openrocket.R;
\r
7 import net.sf.openrocket.android.Application;
\r
8 import net.sf.openrocket.android.PreferencesActivity;
\r
9 import net.sf.openrocket.android.motor.MotorHierarchicalBrowser;
\r
10 import net.sf.openrocket.android.rocket.RocketComponentTreeAdapter.RocketComponentWithId;
\r
11 import net.sf.openrocket.android.simulation.SimulationViewer;
\r
12 import net.sf.openrocket.document.OpenRocketDocument;
\r
13 import net.sf.openrocket.document.Simulation;
\r
14 import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
\r
15 import net.sf.openrocket.rocketcomponent.Rocket;
\r
16 import net.sf.openrocket.rocketcomponent.RocketComponent;
\r
17 import net.sf.openrocket.rocketcomponent.RocketUtils;
\r
18 import net.sf.openrocket.unit.Unit;
\r
19 import net.sf.openrocket.unit.UnitGroup;
\r
20 import net.sf.openrocket.util.Coordinate;
\r
21 import pl.polidea.treeview.InMemoryTreeStateManager;
\r
22 import pl.polidea.treeview.TreeBuilder;
\r
23 import pl.polidea.treeview.TreeStateManager;
\r
24 import pl.polidea.treeview.TreeViewList;
\r
25 import android.app.Activity;
\r
26 import android.app.ProgressDialog;
\r
27 import android.content.Intent;
\r
28 import android.content.SharedPreferences;
\r
29 import android.net.Uri;
\r
30 import android.os.Bundle;
\r
31 import android.preference.PreferenceManager;
\r
32 import android.util.Log;
\r
33 import android.view.LayoutInflater;
\r
34 import android.view.Menu;
\r
35 import android.view.MenuInflater;
\r
36 import android.view.MenuItem;
\r
37 import android.view.View;
\r
38 import android.view.ViewGroup;
\r
39 import android.widget.AdapterView;
\r
40 import android.widget.AdapterView.OnItemClickListener;
\r
41 import android.widget.ArrayAdapter;
\r
42 import android.widget.ListAdapter;
\r
43 import android.widget.ListView;
\r
44 import android.widget.Spinner;
\r
45 import android.widget.TabHost;
\r
46 import android.widget.TextView;
\r
48 public class OpenRocketViewer extends Activity
\r
49 implements SharedPreferences.OnSharedPreferenceChangeListener
\r
52 private static final String TAG = "OpenRocketViewer";
\r
54 private ProgressDialog progress;
\r
56 private Spinner configurationSpinner;
\r
57 private TreeViewList componentTree;
\r
58 private ListView simulationList;
\r
60 private Application app;
\r
62 private final static int PICK_ORK_FILE_RESULT = 1;
\r
65 * @see android.app.Activity#onCreate(android.os.Bundle)
\r
68 protected void onCreate(Bundle savedInstanceState) {
\r
69 super.onCreate(savedInstanceState);
\r
71 Log.d(TAG,"In onCreate");
\r
73 app = (Application) this.getApplication();
\r
75 setContentView(R.layout.openrocketviewer);
\r
77 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
\r
78 prefs.registerOnSharedPreferenceChangeListener(this);
\r
80 TabHost tabs=(TabHost)findViewById(R.id.openrocketviewerTabHost);
\r
84 TabHost.TabSpec spec=tabs.newTabSpec("tag1");
\r
86 spec.setContent(R.id.openrocketviewerOverview);
\r
87 spec.setIndicator("Overview");
\r
90 spec=tabs.newTabSpec("tag2");
\r
91 spec.setContent(R.id.openrocketviewerComponentTree);
\r
92 spec.setIndicator("Components");
\r
95 spec=tabs.newTabSpec("tag3");
\r
96 spec.setContent(R.id.openrocketviewerSimulationList);
\r
97 spec.setIndicator("Simulations");
\r
100 configurationSpinner = (Spinner) findViewById(R.id.openrocketviewerConfigurationSpinner);
\r
101 componentTree = (TreeViewList) findViewById(R.id.openrocketviewerComponentTree);
\r
102 simulationList = (ListView) findViewById(R.id.openrocketviewerSimulationList);
\r
104 Intent i = getIntent();
\r
105 Uri file = i.getData();
\r
107 if ( file == null ) {
\r
108 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
\r
109 intent.setType("file/*");
\r
110 startActivityForResult(intent,PICK_ORK_FILE_RESULT);
\r
118 protected void onDestroy() {
\r
119 if ( progress != null ) {
\r
120 if ( progress.isShowing() ) {
\r
121 progress.dismiss();
\r
129 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
\r
130 // TODO Auto-generated method stub
\r
131 switch(requestCode){
\r
132 case PICK_ORK_FILE_RESULT:
\r
133 if(resultCode==RESULT_OK){
\r
134 Uri file = data.getData();
\r
141 private void loadOrkFile( Uri file ) {
\r
142 Log.d(TAG,"Use ork file: " + file);
\r
143 String path = file.getPath();
\r
144 File orkFile = new File(path);
\r
145 progress = ProgressDialog.show(this, "Loading file", "");
\r
147 final OpenRocketLoaderTask task = new OpenRocketLoaderTask() {
\r
150 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
\r
153 protected void onPostExecute(OpenRocketDocument result) {
\r
154 super.onPostExecute(result);
\r
155 app.setRocketDocument( result );
\r
161 task.execute(orkFile);
\r
166 * @see android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String)
\r
169 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
\r
170 // just in case the user changed the units, we redraw.
\r
171 PreferencesActivity.initializePreferences(getApplication(), PreferenceManager.getDefaultSharedPreferences(this));
\r
175 private void updateContents() {
\r
177 OpenRocketDocument rocketDocument = app.getRocketDocument();
\r
178 Rocket rocket = rocketDocument.getRocket();
\r
180 setTitle(rocket.getName());
\r
182 String[] motorConfigs = rocket.getMotorConfigurationIDs();
\r
183 ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item);
\r
184 for( String config: motorConfigs ) {
\r
185 spinnerAdapter.add(rocket.getMotorConfigurationNameOrDescription(config));
\r
188 configurationSpinner.setAdapter(spinnerAdapter);
\r
190 Unit LengthUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();
\r
191 Unit MassUnit = UnitGroup.UNITS_MASS.getDefaultUnit();
\r
193 Coordinate cg = RocketUtils.getCG(rocket, MassCalcType.NO_MOTORS);
\r
194 double length = RocketUtils.getLength(rocket);
\r
195 ((TextView)findViewById(R.id.openrocketviewerDesigner)).setText(rocket.getDesigner());
\r
196 ((TextView)findViewById(R.id.openrocketviewerCG)).setText(LengthUnit.toStringUnit(cg.x) );
\r
197 ((TextView)findViewById(R.id.openrocketviewerLength)).setText(LengthUnit.toStringUnit(length));
\r
198 ((TextView)findViewById(R.id.openrocketviewerMass)).setText(MassUnit.toStringUnit(cg.weight));
\r
199 ((TextView)findViewById(R.id.openrocketviewerStageCount)).setText(String.valueOf(rocket.getStageCount()));
\r
200 ((TextView)findViewById(R.id.openrocketviewerComment)).setText(rocket.getComment());
\r
202 ArrayAdapter<Simulation> sims = new ArrayAdapter<Simulation>(this,android.R.layout.simple_list_item_2,rocketDocument.getSimulations()) {
\r
205 public View getView(int position, View convertView, ViewGroup parent) {
\r
206 View v = convertView;
\r
208 LayoutInflater li = getLayoutInflater();
\r
209 v = li.inflate(android.R.layout.simple_list_item_2,null);
\r
211 Simulation sim = this.getItem(position);
\r
212 ((TextView)v.findViewById(android.R.id.text1)).setText( sim.getName() );
\r
213 ((TextView)v.findViewById(android.R.id.text2)).setText( "motors: " + sim.getConfiguration().getMotorConfigurationDescription() + " apogee: " + sim.getSimulatedData().getMaxAltitude() + "m time: " + sim.getSimulatedData().getFlightTime() + "s");
\r
218 simulationList.setOnItemClickListener( new OnItemClickListener() {
\r
220 public void onItemClick(AdapterView l, View v, int position, long id) {
\r
221 Intent i = new Intent(OpenRocketViewer.this, SimulationViewer.class);
\r
222 Log.d(TAG,"onItemClick simulation number " + id );
\r
223 i.putExtra("Simulation",(int)id);
\r
224 startActivityForResult(i, 1/*magic*/);
\r
228 simulationList.setAdapter(sims);
\r
230 componentTree.setAdapter( buildAdapter( rocket ) );
\r
232 if ( progress.isShowing() ) {
\r
233 progress.dismiss();
\r
238 public boolean onCreateOptionsMenu(Menu menu) {
\r
239 MenuInflater inflater = getMenuInflater();
\r
240 inflater.inflate(R.menu.rocket_viewer_option_menu, menu);
\r
245 public boolean onMenuItemSelected(int featureId, MenuItem item) {
\r
246 Log.d(TAG,"onMenuItemSelected" + item.getItemId());
\r
247 switch(item.getItemId()) {
\r
248 case R.id.motor_list_menu_option:
\r
249 startMotorBrowser();
\r
251 case R.id.preference_menu_option:
\r
252 Intent intent = new Intent().setClass(this, PreferencesActivity.class);
\r
253 this.startActivity(intent);
\r
256 return super.onMenuItemSelected(featureId, item);
\r
259 public void startMotorBrowser() {
\r
260 Log.d(TAG,"motorBrowserButton clicked");
\r
261 Intent i = new Intent(OpenRocketViewer.this, MotorHierarchicalBrowser.class);
\r
265 private ListAdapter buildAdapter( Rocket rocket ) {
\r
267 final int[] DEMO_NODES = new int[] { 0, 0, 1, 1, 1, 2, 2, 1,
\r
268 1, 2, 1, 0, 0, 0, 1, 2, 3, 2, 0, 0, 1, 2, 0, 1, 2, 0, 1 };
\r
269 final int LEVEL_NUMBER = 4;
\r
271 TreeStateManager<Long> manager = new InMemoryTreeStateManager<Long>();
\r
272 final TreeBuilder<Long> treeBuilder = new TreeBuilder<Long>(manager);
\r
273 for (int i = 0; i < DEMO_NODES.length; i++) {
\r
274 treeBuilder.sequentiallyAddNextNode((long) i, DEMO_NODES[i]);
\r
277 return new SimpleStandardAdapter(this, manager, LEVEL_NUMBER);
\r
280 TreeStateManager<RocketComponentWithId> manager = new InMemoryTreeStateManager<RocketComponentWithId>();
\r
281 TreeBuilder<RocketComponentWithId> treeBuilder = new TreeBuilder<RocketComponentWithId>(manager);
\r
283 int depth = buildRecursive( rocket, treeBuilder, 0 );
\r
284 return new RocketComponentTreeAdapter(this, manager, depth+1);
\r
288 private int buildRecursive( RocketComponent comp, TreeBuilder<RocketComponentWithId> builder, int depth ) {
\r
291 int maxDepth = depth;
\r
293 RocketComponentWithId rcid = new RocketComponentWithId(comp, id++);
\r
295 // Add this component.
\r
296 builder.sequentiallyAddNextNode(rcid, depth);
\r
298 if ( comp.allowsChildren() ) {
\r
300 for( RocketComponent child : comp.getChildren() ) {
\r
301 int childDepth = buildRecursive( child, builder, depth+1);
\r
302 if ( childDepth > maxDepth) {
\r
303 maxDepth = childDepth;
\r