Using pl.polidea.treeview for the component tree list. This code is under 2-clause...
[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.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
45 \r
46 public class OpenRocketViewer extends Activity\r
47 implements SharedPreferences.OnSharedPreferenceChangeListener\r
48 {\r
49 \r
50         private static final String TAG = "OpenRocketViewer";\r
51 \r
52         private ProgressDialog progress;\r
53 \r
54         private TreeViewList componentTree;\r
55         private ListView simulationList;\r
56 \r
57         private Application app;\r
58 \r
59         private final static int PICK_ORK_FILE_RESULT = 1;\r
60 \r
61         /* (non-Javadoc)\r
62          * @see android.app.Activity#onCreate(android.os.Bundle)\r
63          */\r
64         @Override\r
65         protected void onCreate(Bundle savedInstanceState) {\r
66                 super.onCreate(savedInstanceState);\r
67 \r
68                 Log.d(TAG,"In onCreate");\r
69 \r
70                 app = (Application) this.getApplication();\r
71 \r
72                 setContentView(R.layout.openrocketviewer);\r
73 \r
74                 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r
75                 prefs.registerOnSharedPreferenceChangeListener(this);\r
76 \r
77                 TabHost tabs=(TabHost)findViewById(R.id.openrocketviewerTabHost);\r
78 \r
79                 tabs.setup();\r
80 \r
81                 TabHost.TabSpec spec=tabs.newTabSpec("tag1");\r
82 \r
83                 spec.setContent(R.id.openrocketviewerOverview);\r
84                 spec.setIndicator("Overview");\r
85                 tabs.addTab(spec);\r
86 \r
87                 spec=tabs.newTabSpec("tag2");\r
88                 spec.setContent(R.id.openrocketviewerComponentTree);\r
89                 spec.setIndicator("Components");\r
90                 tabs.addTab(spec);      \r
91 \r
92                 spec=tabs.newTabSpec("tag3");\r
93                 spec.setContent(R.id.openrocketviewerSimulationList);\r
94                 spec.setIndicator("Simulations");\r
95                 tabs.addTab(spec);      \r
96 \r
97                 \r
98                 componentTree = (TreeViewList) findViewById(R.id.openrocketviewerComponentTree);\r
99                 simulationList = (ListView) findViewById(R.id.openrocketviewerSimulationList);\r
100 \r
101                 Intent i = getIntent();\r
102                 Uri file = i.getData();\r
103 \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
108 \r
109                 } else {\r
110                         loadOrkFile(file);\r
111                 }\r
112         }\r
113 \r
114         @Override\r
115         protected void onDestroy() {\r
116                 if ( progress != null ) {\r
117                         if ( progress.isShowing() ) {\r
118                                 progress.dismiss();\r
119                         }\r
120                         progress = null;\r
121                 }\r
122                 super.onDestroy();\r
123         }\r
124 \r
125         @Override\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
132                                 loadOrkFile(file);\r
133                         }\r
134                         break;\r
135                 }\r
136         }\r
137 \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
143 \r
144                 final OpenRocketLoaderTask task = new OpenRocketLoaderTask() {\r
145 \r
146                         /* (non-Javadoc)\r
147                          * @see android.os.AsyncTask#onPostExecute(java.lang.Object)\r
148                          */\r
149                         @Override\r
150                         protected void onPostExecute(OpenRocketDocument result) {\r
151                                 super.onPostExecute(result);\r
152                                 app.setRocketDocument( result );\r
153                                 updateContents();\r
154                         }\r
155 \r
156                 };\r
157 \r
158                 task.execute(orkFile);\r
159 \r
160         }\r
161 \r
162         /* (non-Javadoc)\r
163          * @see android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String)\r
164          */\r
165         @Override\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
169                 updateContents();\r
170         }\r
171 \r
172         private void updateContents() {\r
173 \r
174                 OpenRocketDocument rocketDocument = app.getRocketDocument();\r
175                 Rocket rocket = rocketDocument.getRocket();\r
176 \r
177                 setTitle(rocket.getName());\r
178 \r
179                 Unit LengthUnit = UnitGroup.UNITS_LENGTH.getDefaultUnit();\r
180                 Unit MassUnit = UnitGroup.UNITS_MASS.getDefaultUnit();\r
181 \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
191 \r
192                 ArrayAdapter<Simulation> sims = new ArrayAdapter<Simulation>(this,android.R.layout.simple_list_item_2,rocketDocument.getSimulations()) {\r
193 \r
194                         @Override\r
195                         public View getView(int position, View convertView,     ViewGroup parent) {\r
196                                 View v = convertView;\r
197                                 if ( v == null ) {\r
198                                         LayoutInflater li = getLayoutInflater();\r
199                                         v = li.inflate(android.R.layout.simple_list_item_2,null);\r
200                                 }\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
204                                 return v;\r
205                         }\r
206 \r
207                 };\r
208                 simulationList.setOnItemClickListener( new OnItemClickListener() {\r
209                         @Override\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
215                         }\r
216 \r
217                 });\r
218                 simulationList.setAdapter(sims);\r
219 \r
220                 componentTree.setAdapter( buildAdapter( rocket ) );\r
221 \r
222                 if ( progress.isShowing() ) {\r
223                         progress.dismiss();\r
224                 }\r
225         }\r
226 \r
227         @Override\r
228         public boolean onCreateOptionsMenu(Menu menu) {\r
229                 MenuInflater inflater = getMenuInflater();\r
230                 inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
231                 return true;\r
232         }\r
233 \r
234         @Override\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
240                         return true;\r
241                 case R.id.preference_menu_option:\r
242                         Intent intent = new Intent().setClass(this, PreferencesActivity.class);\r
243                         this.startActivity(intent);\r
244                         return true;\r
245                 }\r
246                 return super.onMenuItemSelected(featureId, item);\r
247         }\r
248 \r
249         public void startMotorBrowser() {\r
250                 Log.d(TAG,"motorBrowserButton clicked");\r
251                 Intent i = new Intent(OpenRocketViewer.this, MotorHierarchicalBrowser.class);\r
252                 startActivity(i);\r
253         }\r
254 \r
255         private ListAdapter buildAdapter( Rocket rocket ) {\r
256                 /*\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
260 \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
265                 }\r
266 \r
267                 return new SimpleStandardAdapter(this, manager, LEVEL_NUMBER);\r
268                 */\r
269                 \r
270                 TreeStateManager<RocketComponentWithId> manager = new InMemoryTreeStateManager<RocketComponentWithId>();\r
271                 TreeBuilder<RocketComponentWithId> treeBuilder = new TreeBuilder<RocketComponentWithId>(manager);\r
272                 \r
273                 int depth = buildRecursive( rocket, treeBuilder, 0 );\r
274                 return new RocketComponentTreeAdapter(this, manager, depth+1);\r
275         }\r
276         \r
277         long id = 0;\r
278         private int buildRecursive( RocketComponent comp, TreeBuilder<RocketComponentWithId> builder, int depth ) {\r
279                 \r
280                 \r
281                 int maxDepth = depth;\r
282                 \r
283                 RocketComponentWithId rcid = new RocketComponentWithId(comp, id++);\r
284                 \r
285                 // Add this component.\r
286                 builder.sequentiallyAddNextNode(rcid, depth);\r
287                 \r
288                 if ( comp.allowsChildren() ) {\r
289                         \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
294                                 }\r
295                         }\r
296                         \r
297                 }\r
298                 \r
299                 return maxDepth;\r
300         }\r
301 \r
302 \r
303 }\r