Modified RocketUtils.getCG to take a MassCalcType parameter. In the OpenRocketViewer...
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / OpenRocketViewer.java
1 package net.sf.openrocket.android.rocket;\r
2 \r
3 \r
4 import java.io.File;\r
5 \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
47 \r
48 public class OpenRocketViewer extends Activity\r
49 implements SharedPreferences.OnSharedPreferenceChangeListener\r
50 {\r
51 \r
52         private static final String TAG = "OpenRocketViewer";\r
53 \r
54         private ProgressDialog progress;\r
55 \r
56         private Spinner configurationSpinner;\r
57         private TreeViewList componentTree;\r
58         private ListView simulationList;\r
59 \r
60         private Application app;\r
61 \r
62         private final static int PICK_ORK_FILE_RESULT = 1;\r
63 \r
64         /* (non-Javadoc)\r
65          * @see android.app.Activity#onCreate(android.os.Bundle)\r
66          */\r
67         @Override\r
68         protected void onCreate(Bundle savedInstanceState) {\r
69                 super.onCreate(savedInstanceState);\r
70 \r
71                 Log.d(TAG,"In onCreate");\r
72 \r
73                 app = (Application) this.getApplication();\r
74 \r
75                 setContentView(R.layout.openrocketviewer);\r
76 \r
77                 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r
78                 prefs.registerOnSharedPreferenceChangeListener(this);\r
79 \r
80                 TabHost tabs=(TabHost)findViewById(R.id.openrocketviewerTabHost);\r
81 \r
82                 tabs.setup();\r
83 \r
84                 TabHost.TabSpec spec=tabs.newTabSpec("tag1");\r
85 \r
86                 spec.setContent(R.id.openrocketviewerOverview);\r
87                 spec.setIndicator("Overview");\r
88                 tabs.addTab(spec);\r
89 \r
90                 spec=tabs.newTabSpec("tag2");\r
91                 spec.setContent(R.id.openrocketviewerComponentTree);\r
92                 spec.setIndicator("Components");\r
93                 tabs.addTab(spec);      \r
94 \r
95                 spec=tabs.newTabSpec("tag3");\r
96                 spec.setContent(R.id.openrocketviewerSimulationList);\r
97                 spec.setIndicator("Simulations");\r
98                 tabs.addTab(spec);      \r
99 \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
103 \r
104                 Intent i = getIntent();\r
105                 Uri file = i.getData();\r
106 \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
111 \r
112                 } else {\r
113                         loadOrkFile(file);\r
114                 }\r
115         }\r
116 \r
117         @Override\r
118         protected void onDestroy() {\r
119                 if ( progress != null ) {\r
120                         if ( progress.isShowing() ) {\r
121                                 progress.dismiss();\r
122                         }\r
123                         progress = null;\r
124                 }\r
125                 super.onDestroy();\r
126         }\r
127 \r
128         @Override\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
135                                 loadOrkFile(file);\r
136                         }\r
137                         break;\r
138                 }\r
139         }\r
140 \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
146 \r
147                 final OpenRocketLoaderTask task = new OpenRocketLoaderTask() {\r
148 \r
149                         /* (non-Javadoc)\r
150                          * @see android.os.AsyncTask#onPostExecute(java.lang.Object)\r
151                          */\r
152                         @Override\r
153                         protected void onPostExecute(OpenRocketDocument result) {\r
154                                 super.onPostExecute(result);\r
155                                 app.setRocketDocument( result );\r
156                                 updateContents();\r
157                         }\r
158 \r
159                 };\r
160 \r
161                 task.execute(orkFile);\r
162 \r
163         }\r
164 \r
165         /* (non-Javadoc)\r
166          * @see android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String)\r
167          */\r
168         @Override\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
172                 updateContents();\r
173         }\r
174 \r
175         private void updateContents() {\r
176 \r
177                 OpenRocketDocument rocketDocument = app.getRocketDocument();\r
178                 Rocket rocket = rocketDocument.getRocket();\r
179 \r
180                 setTitle(rocket.getName());\r
181 \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
186                 }\r
187                 \r
188                 configurationSpinner.setAdapter(spinnerAdapter);\r
189                 \r
190                 Unit LengthUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();\r
191                 Unit MassUnit = UnitGroup.UNITS_MASS.getDefaultUnit();\r
192 \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
201 \r
202                 ArrayAdapter<Simulation> sims = new ArrayAdapter<Simulation>(this,android.R.layout.simple_list_item_2,rocketDocument.getSimulations()) {\r
203 \r
204                         @Override\r
205                         public View getView(int position, View convertView,     ViewGroup parent) {\r
206                                 View v = convertView;\r
207                                 if ( v == null ) {\r
208                                         LayoutInflater li = getLayoutInflater();\r
209                                         v = li.inflate(android.R.layout.simple_list_item_2,null);\r
210                                 }\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
214                                 return v;\r
215                         }\r
216 \r
217                 };\r
218                 simulationList.setOnItemClickListener( new OnItemClickListener() {\r
219                         @Override\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
225                         }\r
226 \r
227                 });\r
228                 simulationList.setAdapter(sims);\r
229 \r
230                 componentTree.setAdapter( buildAdapter( rocket ) );\r
231 \r
232                 if ( progress.isShowing() ) {\r
233                         progress.dismiss();\r
234                 }\r
235         }\r
236 \r
237         @Override\r
238         public boolean onCreateOptionsMenu(Menu menu) {\r
239                 MenuInflater inflater = getMenuInflater();\r
240                 inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
241                 return true;\r
242         }\r
243 \r
244         @Override\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
250                         return true;\r
251                 case R.id.preference_menu_option:\r
252                         Intent intent = new Intent().setClass(this, PreferencesActivity.class);\r
253                         this.startActivity(intent);\r
254                         return true;\r
255                 }\r
256                 return super.onMenuItemSelected(featureId, item);\r
257         }\r
258 \r
259         public void startMotorBrowser() {\r
260                 Log.d(TAG,"motorBrowserButton clicked");\r
261                 Intent i = new Intent(OpenRocketViewer.this, MotorHierarchicalBrowser.class);\r
262                 startActivity(i);\r
263         }\r
264 \r
265         private ListAdapter buildAdapter( Rocket rocket ) {\r
266                 /*\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
270 \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
275                 }\r
276 \r
277                 return new SimpleStandardAdapter(this, manager, LEVEL_NUMBER);\r
278                 */\r
279                 \r
280                 TreeStateManager<RocketComponentWithId> manager = new InMemoryTreeStateManager<RocketComponentWithId>();\r
281                 TreeBuilder<RocketComponentWithId> treeBuilder = new TreeBuilder<RocketComponentWithId>(manager);\r
282                 \r
283                 int depth = buildRecursive( rocket, treeBuilder, 0 );\r
284                 return new RocketComponentTreeAdapter(this, manager, depth+1);\r
285         }\r
286         \r
287         long id = 0;\r
288         private int buildRecursive( RocketComponent comp, TreeBuilder<RocketComponentWithId> builder, int depth ) {\r
289                 \r
290                 \r
291                 int maxDepth = depth;\r
292                 \r
293                 RocketComponentWithId rcid = new RocketComponentWithId(comp, id++);\r
294                 \r
295                 // Add this component.\r
296                 builder.sequentiallyAddNextNode(rcid, depth);\r
297                 \r
298                 if ( comp.allowsChildren() ) {\r
299                         \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
304                                 }\r
305                         }\r
306                         \r
307                 }\r
308                 \r
309                 return maxDepth;\r
310         }\r
311 \r
312 \r
313 }\r