create changelog entry
[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 net.sf.openrocket.R;\r
5 import net.sf.openrocket.android.ActivityHelpers;\r
6 import net.sf.openrocket.android.CurrentRocketHolder;\r
7 import net.sf.openrocket.android.events.ChangeEventBroadcastReceiver;\r
8 import net.sf.openrocket.android.simulation.SimulationChart;\r
9 import net.sf.openrocket.android.simulation.SimulationViewActivity;\r
10 import net.sf.openrocket.android.simulation.SimulationViewFragment;\r
11 import net.sf.openrocket.android.simulation.Simulations;\r
12 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
13 import net.sf.openrocket.document.OpenRocketDocument;\r
14 import net.sf.openrocket.document.Simulation;\r
15 import android.app.AlertDialog;\r
16 import android.content.DialogInterface;\r
17 import android.content.Intent;\r
18 import android.content.SharedPreferences;\r
19 import android.content.res.Resources;\r
20 import android.os.Bundle;\r
21 import android.preference.PreferenceManager;\r
22 import android.support.v4.app.Fragment;\r
23 import android.support.v4.app.FragmentManager;\r
24 import android.support.v4.app.FragmentPagerAdapter;\r
25 import android.support.v4.app.FragmentTransaction;\r
26 import android.support.v4.view.ViewPager;\r
27 import android.view.View;\r
28 import android.widget.Toast;\r
29 \r
30 import com.actionbarsherlock.view.Menu;\r
31 import com.actionbarsherlock.view.MenuInflater;\r
32 import com.actionbarsherlock.view.MenuItem;\r
33 import com.actionbarsherlock.view.Window;\r
34 \r
35 public class OpenRocketViewer extends OpenRocketLoaderActivity\r
36 implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnOpenRocketFileSaved, SharedPreferences.OnSharedPreferenceChangeListener\r
37 {\r
38 \r
39         private final static int OVERVIEW_POS = 0;\r
40         private final static int COMPONENT_POS = 1;\r
41         private final static int SIMS_POS = 2;\r
42         private final static int CONFIGS_POS = 3;\r
43         private final static int TABSIZE = 4;\r
44 \r
45         private OpenRocketViewerPagerAdapter viewPagerAdapter;\r
46 \r
47         private final static String LOAD_AFTER_SAVE = "net.sf.openrocket.android.loadAfterSave";\r
48         private boolean loadAfterSave = false;\r
49         private String autoSaveEnabledKey;\r
50         private boolean autoSaveEnabled = false;\r
51         \r
52         private RocketChangedEventHandler handler = new RocketChangedEventHandler();\r
53 \r
54 \r
55         @Override\r
56         protected void onCreate(Bundle savedInstanceState) {\r
57                 super.onCreate(savedInstanceState);\r
58 \r
59                 // If the application sleeps for a long time, the CurrentRocketHolder might get cleaned\r
60                 // up.  When this happens, we cannot restore this state, so instead we just\r
61                 // go home.\r
62                 OpenRocketDocument rocDoc = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
63                 if ( rocDoc == null ) {\r
64                         AndroidLogWrapper.d(OpenRocketViewer.class, "No document - go home");\r
65                         ActivityHelpers.goHome(this);\r
66                         finish();\r
67                         return;\r
68                 }\r
69                 if (savedInstanceState != null ) {\r
70                         loadAfterSave = savedInstanceState.getBoolean(LOAD_AFTER_SAVE);\r
71                 }\r
72                 // Must use com.actionbarsherlock.view.Window.FEATURE_INDETERMINATE_PROGRESS\r
73                 requestWindowFeature(Window.FEATURE_PROGRESS);\r
74                 setSupportProgressBarIndeterminate(true);\r
75 \r
76                 setTitle(rocDoc.getRocket().getName());\r
77                 getSupportActionBar().setHomeButtonEnabled(true);\r
78 \r
79                 setContentView(R.layout.openrocketviewer);\r
80                 ViewPager viewPager = (ViewPager)findViewById(R.id.pager);\r
81                 viewPagerAdapter = new OpenRocketViewerPagerAdapter( this.getSupportFragmentManager() );\r
82                 viewPager.setAdapter( viewPagerAdapter );\r
83         }\r
84 \r
85         @Override\r
86         protected void onPause() {\r
87                 handler.unregister(this);\r
88                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
89                 pref.unregisterOnSharedPreferenceChangeListener(this);\r
90                 super.onPause();\r
91         }\r
92 \r
93         @Override\r
94         protected void onResume() {\r
95                 Resources resources = this.getResources();\r
96                 autoSaveEnabledKey = resources.getString(R.string.PreferenceAutoSaveOption);\r
97                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
98                 autoSaveEnabled = pref.getBoolean(autoSaveEnabledKey, false);\r
99 \r
100                 pref.registerOnSharedPreferenceChangeListener(this);\r
101 \r
102                 handler.register(this);\r
103                 super.onResume();\r
104         }\r
105 \r
106         @Override\r
107         protected void onSaveInstanceState(Bundle outState) {\r
108                 super.onSaveInstanceState(outState);\r
109                 outState.putBoolean(LOAD_AFTER_SAVE, loadAfterSave);\r
110         }\r
111 \r
112         @Override\r
113         public boolean onCreateOptionsMenu(Menu menu) {\r
114                 MenuInflater inflater = getSupportMenuInflater();\r
115                 inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
116                 MenuItem saveAction = menu.findItem(R.id.menu_save);\r
117                 if ( CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
118                         saveAction.setVisible(true);\r
119                         saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS );\r
120                 } else {\r
121                         saveAction.setVisible(false);\r
122                         saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER );\r
123                 }\r
124                 return true;\r
125         }\r
126 \r
127         @Override\r
128         public boolean onMenuItemSelected(int featureId, MenuItem item) {\r
129                 AndroidLogWrapper.d(OpenRocketViewer.class,"onMenuItemSelected" + item.getItemId());\r
130                 switch(item.getItemId()) {\r
131                 case R.id.menu_load:\r
132                         if ( CurrentRocketHolder.getCurrentRocket().isModified() ) {\r
133                                 AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
134                                 builder.setMessage(R.string.loadWarnUnsaved);\r
135                                 builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {\r
136                                         @Override\r
137                                         public void onClick(DialogInterface dialog, int which) {\r
138                                                 pickOrkFiles();\r
139                                         }\r
140                                 });\r
141                                 builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {\r
142                                         @Override\r
143                                         public void onClick(DialogInterface dialog, int which) {\r
144                                                 OpenRocketViewer.this.loadAfterSave = true;\r
145                                                 OpenRocketViewer.this.saveRocketDocument();\r
146                                         }\r
147                                 });\r
148                                 builder.create().show();\r
149                         } else {\r
150                                 pickOrkFiles();\r
151                         }\r
152                         return true;\r
153                 case R.id.menu_save:\r
154                         OpenRocketViewer.this.saveRocketDocument();\r
155                         return true;\r
156                 case android.R.id.home:\r
157                         ActivityHelpers.goHome(this);\r
158                         return true;\r
159                 case R.id.motor_list_menu_option:\r
160                         ActivityHelpers.browseMotors(this);\r
161                         return true;\r
162                 case R.id.preference_menu_option:\r
163                         ActivityHelpers.startPreferences(this);\r
164                         return true;\r
165                 case R.id.menu_about:\r
166                         ActivityHelpers.showAbout(this);\r
167                         return true;\r
168                 }\r
169                 return super.onMenuItemSelected(featureId, item);\r
170         }\r
171 \r
172         @Override\r
173         public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
174                 if ( autoSaveEnabledKey.equals(arg1) ) {\r
175                         autoSaveEnabled = arg0.getBoolean(autoSaveEnabledKey, false);\r
176                 }\r
177         }\r
178 \r
179         @Override\r
180         public void onSimulationSelected(int simulationId) {\r
181 \r
182                 Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(simulationId);\r
183                 // Check if there is data for this simulation.\r
184                 if ( sim.getSimulatedData() == null || sim.getSimulatedData().getBranchCount() == 0 ) {\r
185                         // This shouldn't happen because the Simulations list does the check.\r
186                         return;\r
187                 }\r
188 \r
189                 View sidepane = findViewById(R.id.sidepane);\r
190                 if ( /* if multi pane */ sidepane != null ) {\r
191                         SimulationChart chart = new SimulationChart(simulationId);\r
192 \r
193                         Fragment graph = SimulationViewFragment.newInstance(chart);\r
194 \r
195                         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
196                         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);\r
197                         // probably only want to update back stack for first time.\r
198                         ft.addToBackStack("simulationplot");\r
199                         ft.replace(R.id.sidepane, graph);\r
200                         ft.show(graph);\r
201                         ft.commit();\r
202 \r
203 \r
204                 } else {\r
205                         Intent i = new Intent(this, SimulationViewActivity.class);\r
206                         i.putExtra("Simulation",simulationId);\r
207                         startActivity(i);\r
208                 }\r
209         }\r
210 \r
211         private void saveRocketDocument() {\r
212                 getSupportFragmentManager().beginTransaction()\r
213                 .add( OpenRocketSaverFragment.newInstance(true), "saver")\r
214                 .commitAllowingStateLoss();\r
215         }\r
216 \r
217         @Override\r
218         public void onOpenRocketFileSaved(Boolean result) {\r
219                 invalidateOptionsMenu();\r
220                 if ( loadAfterSave ) {\r
221                         loadAfterSave = false;\r
222                         pickOrkFiles();\r
223                 }\r
224         }\r
225 \r
226         private class RocketChangedEventHandler extends ChangeEventBroadcastReceiver {\r
227 \r
228                 @Override\r
229                 protected void doSimComplete() {\r
230                         if ( autoSaveEnabled && CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
231                                 Toast.makeText(OpenRocketViewer.this, R.string.autoSaveMessage, Toast.LENGTH_SHORT).show();\r
232                                 OpenRocketViewer.this.saveRocketDocument();\r
233                         }\r
234                         doSimsChanged();\r
235                 }\r
236 \r
237                 @Override\r
238                 protected void doSimsChanged() {\r
239                         invalidateOptionsMenu();\r
240                         Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);\r
241                         if ( sims != null ) {\r
242                                 sims.refreshSimulationList();\r
243                         }\r
244                 }\r
245 \r
246                 @Override\r
247                 protected void doMotorConfigsChanged() {\r
248                         invalidateOptionsMenu();\r
249                         Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);\r
250                         if ( configs != null ) {\r
251                                 configs.refreshConfigsList();\r
252                         }\r
253                 }\r
254 \r
255         };\r
256 \r
257 \r
258         private class OpenRocketViewerPagerAdapter extends FragmentPagerAdapter {\r
259 \r
260                 public OpenRocketViewerPagerAdapter( FragmentManager fm ) {\r
261                         super(fm);\r
262                 }\r
263                 @Override\r
264                 public int getCount() {\r
265                         return TABSIZE;\r
266                 }\r
267                 @Override\r
268                 public Fragment getItem( int position ) {\r
269                         switch (position) {\r
270                         case OVERVIEW_POS:\r
271                                 return new Overview();\r
272                         case COMPONENT_POS:\r
273                                 return new Component();\r
274                         case SIMS_POS:\r
275                                 return new Simulations();\r
276                         case CONFIGS_POS:\r
277                                 return new Configurations();\r
278                         }\r
279                         return null;\r
280                 }\r
281                 @Override\r
282                 public CharSequence getPageTitle(int position) {\r
283                         switch (position) {\r
284                         case OVERVIEW_POS:\r
285                                 return "Overview";\r
286                         case COMPONENT_POS:\r
287                                 return "Components";\r
288                         case SIMS_POS:\r
289                                 return "Simulations";\r
290                         case CONFIGS_POS:\r
291                                 return "Configurations";\r
292                         }\r
293                         return null;\r
294                 }\r
295 \r
296                 public Fragment getFragmentAtPos( int pos ) {\r
297                         String tag = "android:switcher:"+R.id.pager+":"+pos;\r
298                         Fragment f = OpenRocketViewer.this.getSupportFragmentManager().findFragmentByTag(tag);\r
299                         return f;\r
300                 }\r
301         }\r
302 \r
303 }\r