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.rocketcomponent.Rocket;
\r
15 import net.sf.openrocket.rocketcomponent.RocketComponent;
\r
16 import net.sf.openrocket.rocketcomponent.RocketUtils;
\r
17 import net.sf.openrocket.unit.Unit;
\r
18 import net.sf.openrocket.unit.UnitGroup;
\r
19 import net.sf.openrocket.util.Coordinate;
\r
20 import pl.polidea.treeview.InMemoryTreeStateManager;
\r
21 import pl.polidea.treeview.TreeBuilder;
\r
22 import pl.polidea.treeview.TreeStateManager;
\r
23 import pl.polidea.treeview.TreeViewList;
\r
24 import android.app.Activity;
\r
25 import android.app.ProgressDialog;
\r
26 import android.content.Intent;
\r
27 import android.content.SharedPreferences;
\r
28 import android.net.Uri;
\r
29 import android.os.Bundle;
\r
30 import android.preference.PreferenceManager;
\r
31 import android.util.Log;
\r
32 import android.view.LayoutInflater;
\r
33 import android.view.Menu;
\r
34 import android.view.MenuInflater;
\r
35 import android.view.MenuItem;
\r
36 import android.view.View;
\r
37 import android.view.ViewGroup;
\r
38 import android.widget.AdapterView;
\r
39 import android.widget.AdapterView.OnItemClickListener;
\r
40 import android.widget.ArrayAdapter;
\r
41 import android.widget.ListAdapter;
\r
42 import android.widget.ListView;
\r
43 import android.widget.TabHost;
\r
44 import android.widget.TextView;
\r
46 public class OpenRocketViewer extends Activity
\r
47 implements SharedPreferences.OnSharedPreferenceChangeListener
\r
50 private static final String TAG = "OpenRocketViewer";
\r
52 private ProgressDialog progress;
\r
54 private TreeViewList componentTree;
\r
55 private ListView simulationList;
\r
57 private Application app;
\r
59 private final static int PICK_ORK_FILE_RESULT = 1;
\r
62 * @see android.app.Activity#onCreate(android.os.Bundle)
\r
65 protected void onCreate(Bundle savedInstanceState) {
\r
66 super.onCreate(savedInstanceState);
\r
68 Log.d(TAG,"In onCreate");
\r
70 app = (Application) this.getApplication();
\r
72 setContentView(R.layout.openrocketviewer);
\r
74 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
\r
75 prefs.registerOnSharedPreferenceChangeListener(this);
\r
77 TabHost tabs=(TabHost)findViewById(R.id.openrocketviewerTabHost);
\r
81 TabHost.TabSpec spec=tabs.newTabSpec("tag1");
\r
83 spec.setContent(R.id.openrocketviewerOverview);
\r
84 spec.setIndicator("Overview");
\r
87 spec=tabs.newTabSpec("tag2");
\r
88 spec.setContent(R.id.openrocketviewerComponentTree);
\r
89 spec.setIndicator("Components");
\r
92 spec=tabs.newTabSpec("tag3");
\r
93 spec.setContent(R.id.openrocketviewerSimulationList);
\r
94 spec.setIndicator("Simulations");
\r
98 componentTree = (TreeViewList) findViewById(R.id.openrocketviewerComponentTree);
\r
99 simulationList = (ListView) findViewById(R.id.openrocketviewerSimulationList);
\r
101 Intent i = getIntent();
\r
102 Uri file = i.getData();
\r
104 if ( file == null ) {
\r
105 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
\r
106 intent.setType("file/*");
\r
107 startActivityForResult(intent,PICK_ORK_FILE_RESULT);
\r
115 protected void onDestroy() {
\r
116 if ( progress != null ) {
\r
117 if ( progress.isShowing() ) {
\r
118 progress.dismiss();
\r
126 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
\r
127 // TODO Auto-generated method stub
\r
128 switch(requestCode){
\r
129 case PICK_ORK_FILE_RESULT:
\r
130 if(resultCode==RESULT_OK){
\r
131 Uri file = data.getData();
\r
138 private void loadOrkFile( Uri file ) {
\r
139 Log.d(TAG,"Use ork file: " + file);
\r
140 String path = file.getPath();
\r
141 File orkFile = new File(path);
\r
142 progress = ProgressDialog.show(this, "Loading file", "");
\r
144 final OpenRocketLoaderTask task = new OpenRocketLoaderTask() {
\r
147 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
\r
150 protected void onPostExecute(OpenRocketDocument result) {
\r
151 super.onPostExecute(result);
\r
152 app.setRocketDocument( result );
\r
158 task.execute(orkFile);
\r
163 * @see android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String)
\r
166 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
\r
167 // just in case the user changed the units, we redraw.
\r
168 PreferencesActivity.initializePreferences(getApplication(), PreferenceManager.getDefaultSharedPreferences(this));
\r
172 private void updateContents() {
\r
174 OpenRocketDocument rocketDocument = app.getRocketDocument();
\r
175 Rocket rocket = rocketDocument.getRocket();
\r
177 setTitle(rocket.getName());
\r
179 Unit LengthUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();
\r
180 Unit MassUnit = UnitGroup.UNITS_MASS.getDefaultUnit();
\r
182 Coordinate cg = RocketUtils.getCG(rocket);
\r
183 double length = RocketUtils.getLength(rocket);
\r
184 ((TextView) findViewById(R.id.openrocketviewerRocketName)).setText( rocket.getName());
\r
185 ((TextView)findViewById(R.id.openrocketviewerDesigner)).setText(rocket.getDesigner());
\r
186 ((TextView)findViewById(R.id.openrocketviewerCG)).setText(LengthUnit.toStringUnit(cg.x) );
\r
187 ((TextView)findViewById(R.id.openrocketviewerLength)).setText(LengthUnit.toStringUnit(length));
\r
188 ((TextView)findViewById(R.id.openrocketviewerMass)).setText(MassUnit.toStringUnit(cg.weight));
\r
189 ((TextView)findViewById(R.id.openrocketviewerStageCount)).setText(String.valueOf(rocket.getStageCount()));
\r
190 ((TextView)findViewById(R.id.openrocketviewerComment)).setText(rocket.getComment());
\r
192 ArrayAdapter<Simulation> sims = new ArrayAdapter<Simulation>(this,android.R.layout.simple_list_item_2,rocketDocument.getSimulations()) {
\r
195 public View getView(int position, View convertView, ViewGroup parent) {
\r
196 View v = convertView;
\r
198 LayoutInflater li = getLayoutInflater();
\r
199 v = li.inflate(android.R.layout.simple_list_item_2,null);
\r
201 Simulation sim = this.getItem(position);
\r
202 ((TextView)v.findViewById(android.R.id.text1)).setText( sim.getName() );
\r
203 ((TextView)v.findViewById(android.R.id.text2)).setText( "motors: " + sim.getConfiguration().getMotorConfigurationDescription() + " apogee: " + sim.getSimulatedData().getMaxAltitude() + "m time: " + sim.getSimulatedData().getFlightTime() + "s");
\r
208 simulationList.setOnItemClickListener( new OnItemClickListener() {
\r
210 public void onItemClick(AdapterView l, View v, int position, long id) {
\r
211 Intent i = new Intent(OpenRocketViewer.this, SimulationViewer.class);
\r
212 Log.d(TAG,"onItemClick simulation number " + id );
\r
213 i.putExtra("Simulation",(int)id);
\r
214 startActivityForResult(i, 1/*magic*/);
\r
218 simulationList.setAdapter(sims);
\r
220 componentTree.setAdapter( buildAdapter( rocket ) );
\r
222 if ( progress.isShowing() ) {
\r
223 progress.dismiss();
\r
228 public boolean onCreateOptionsMenu(Menu menu) {
\r
229 MenuInflater inflater = getMenuInflater();
\r
230 inflater.inflate(R.menu.rocket_viewer_option_menu, menu);
\r
235 public boolean onMenuItemSelected(int featureId, MenuItem item) {
\r
236 Log.d(TAG,"onMenuItemSelected" + item.getItemId());
\r
237 switch(item.getItemId()) {
\r
238 case R.id.motor_list_menu_option:
\r
239 startMotorBrowser();
\r
241 case R.id.preference_menu_option:
\r
242 Intent intent = new Intent().setClass(this, PreferencesActivity.class);
\r
243 this.startActivity(intent);
\r
246 return super.onMenuItemSelected(featureId, item);
\r
249 public void startMotorBrowser() {
\r
250 Log.d(TAG,"motorBrowserButton clicked");
\r
251 Intent i = new Intent(OpenRocketViewer.this, MotorHierarchicalBrowser.class);
\r
255 private ListAdapter buildAdapter( Rocket rocket ) {
\r
257 final int[] DEMO_NODES = new int[] { 0, 0, 1, 1, 1, 2, 2, 1,
\r
258 1, 2, 1, 0, 0, 0, 1, 2, 3, 2, 0, 0, 1, 2, 0, 1, 2, 0, 1 };
\r
259 final int LEVEL_NUMBER = 4;
\r
261 TreeStateManager<Long> manager = new InMemoryTreeStateManager<Long>();
\r
262 final TreeBuilder<Long> treeBuilder = new TreeBuilder<Long>(manager);
\r
263 for (int i = 0; i < DEMO_NODES.length; i++) {
\r
264 treeBuilder.sequentiallyAddNextNode((long) i, DEMO_NODES[i]);
\r
267 return new SimpleStandardAdapter(this, manager, LEVEL_NUMBER);
\r
270 TreeStateManager<RocketComponentWithId> manager = new InMemoryTreeStateManager<RocketComponentWithId>();
\r
271 TreeBuilder<RocketComponentWithId> treeBuilder = new TreeBuilder<RocketComponentWithId>(manager);
\r
273 int depth = buildRecursive( rocket, treeBuilder, 0 );
\r
274 return new RocketComponentTreeAdapter(this, manager, depth+1);
\r
278 private int buildRecursive( RocketComponent comp, TreeBuilder<RocketComponentWithId> builder, int depth ) {
\r
281 int maxDepth = depth;
\r
283 RocketComponentWithId rcid = new RocketComponentWithId(comp, id++);
\r
285 // Add this component.
\r
286 builder.sequentiallyAddNextNode(rcid, depth);
\r
288 if ( comp.allowsChildren() ) {
\r
290 for( RocketComponent child : comp.getChildren() ) {
\r
291 int childDepth = buildRecursive( child, builder, depth+1);
\r
292 if ( childDepth > maxDepth) {
\r
293 maxDepth = childDepth;
\r