\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.android.ActivityHelpers;\r
-import net.sf.openrocket.android.Application;\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.events.ChangeEventBroadcastReceiver;\r
import net.sf.openrocket.android.simulation.SimulationChart;\r
-import net.sf.openrocket.android.simulation.SimulationFragment;\r
import net.sf.openrocket.android.simulation.SimulationViewActivity;\r
+import net.sf.openrocket.android.simulation.SimulationViewFragment;\r
+import net.sf.openrocket.android.simulation.Simulations;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
-import net.sf.openrocket.android.util.TabsAdapter;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.document.Simulation;\r
-import net.sf.openrocket.rocketcomponent.Configuration;\r
+import android.app.AlertDialog;\r
+import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.content.SharedPreferences;\r
+import android.content.res.Resources;\r
import android.os.Bundle;\r
import android.preference.PreferenceManager;\r
import android.support.v4.app.Fragment;\r
-import android.support.v4.app.FragmentActivity;\r
+import android.support.v4.app.FragmentManager;\r
+import android.support.v4.app.FragmentPagerAdapter;\r
import android.support.v4.app.FragmentTransaction;\r
import android.support.v4.view.ViewPager;\r
-import android.view.Menu;\r
-import android.view.MenuInflater;\r
-import android.view.MenuItem;\r
import android.view.View;\r
-import android.widget.TabHost;\r
+import android.widget.Toast;\r
\r
-public class OpenRocketViewer extends FragmentActivity\r
-implements SharedPreferences.OnSharedPreferenceChangeListener,\r
-Simulations.OnSimulationSelectedListener\r
+import com.actionbarsherlock.view.Menu;\r
+import com.actionbarsherlock.view.MenuInflater;\r
+import com.actionbarsherlock.view.MenuItem;\r
+import com.actionbarsherlock.view.Window;\r
+\r
+public class OpenRocketViewer extends OpenRocketLoaderActivity\r
+implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnOpenRocketFileSaved, SharedPreferences.OnSharedPreferenceChangeListener\r
{\r
\r
- OpenRocketDocument rocketDocument;\r
- Configuration rocketConfiguration;\r
+ private final static int OVERVIEW_POS = 0;\r
+ private final static int COMPONENT_POS = 1;\r
+ private final static int SIMS_POS = 2;\r
+ private final static int CONFIGS_POS = 3;\r
+ private final static int TABSIZE = 4;\r
+\r
+ private OpenRocketViewerPagerAdapter viewPagerAdapter;\r
\r
- private Application app;\r
+ private final static String LOAD_AFTER_SAVE = "net.sf.openrocket.android.loadAfterSave";\r
+ private boolean loadAfterSave = false;\r
+ private String autoSaveEnabledKey;\r
+ private boolean autoSaveEnabled = false;\r
+ \r
+ private RocketChangedEventHandler handler = new RocketChangedEventHandler();\r
\r
- TabHost mTabHost;\r
- ViewPager mViewPager;\r
- TabsAdapter mTabsAdapter;\r
\r
@Override\r
protected void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
\r
- app = (Application) this.getApplication();\r
-\r
- setContentView(R.layout.openrocketviewer);\r
+ // If the application sleeps for a long time, the CurrentRocketHolder might get cleaned\r
+ // up. When this happens, we cannot restore this state, so instead we just\r
+ // go home.\r
+ OpenRocketDocument rocDoc = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
+ if ( rocDoc == null ) {\r
+ AndroidLogWrapper.d(OpenRocketViewer.class, "No document - go home");\r
+ ActivityHelpers.goHome(this);\r
+ finish();\r
+ return;\r
+ }\r
+ if (savedInstanceState != null ) {\r
+ loadAfterSave = savedInstanceState.getBoolean(LOAD_AFTER_SAVE);\r
+ }\r
+ // Must use com.actionbarsherlock.view.Window.FEATURE_INDETERMINATE_PROGRESS\r
+ requestWindowFeature(Window.FEATURE_PROGRESS);\r
+ setSupportProgressBarIndeterminate(true);\r
\r
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r
- prefs.registerOnSharedPreferenceChangeListener(this);\r
+ setTitle(rocDoc.getRocket().getName());\r
+ getSupportActionBar().setHomeButtonEnabled(true);\r
\r
- mTabHost = (TabHost)findViewById(android.R.id.tabhost);\r
- mTabHost.setup();\r
+ setContentView(R.layout.openrocketviewer);\r
+ ViewPager viewPager = (ViewPager)findViewById(R.id.pager);\r
+ viewPagerAdapter = new OpenRocketViewerPagerAdapter( this.getSupportFragmentManager() );\r
+ viewPager.setAdapter( viewPagerAdapter );\r
+ }\r
\r
- mViewPager = (ViewPager)findViewById(R.id.pager);\r
+ @Override\r
+ protected void onPause() {\r
+ handler.unregister(this);\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
+ pref.unregisterOnSharedPreferenceChangeListener(this);\r
+ super.onPause();\r
+ }\r
\r
- mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);\r
+ @Override\r
+ protected void onResume() {\r
+ Resources resources = this.getResources();\r
+ autoSaveEnabledKey = resources.getString(R.string.PreferenceAutoSaveOption);\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
+ autoSaveEnabled = pref.getBoolean(autoSaveEnabledKey, false);\r
\r
- mTabsAdapter.addTab(mTabHost.newTabSpec("overview").setIndicator("Overview"),\r
- Overview.class, null);\r
- mTabsAdapter.addTab(mTabHost.newTabSpec("components").setIndicator("Components"),\r
- Component.class, null);\r
- mTabsAdapter.addTab(mTabHost.newTabSpec("simulations").setIndicator("Simulations"),\r
- Simulations.class, null);\r
+ pref.registerOnSharedPreferenceChangeListener(this);\r
\r
- if (savedInstanceState != null) {\r
- mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));\r
- }\r
+ handler.register(this);\r
+ super.onResume();\r
}\r
\r
@Override\r
protected void onSaveInstanceState(Bundle outState) {\r
super.onSaveInstanceState(outState);\r
- outState.putString("tab", mTabHost.getCurrentTabTag());\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String)\r
- */\r
- @Override\r
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\r
- // just in case the user changed the units, we redraw.\r
- // TODO = updateContents(); redraw all children..\r
+ outState.putBoolean(LOAD_AFTER_SAVE, loadAfterSave);\r
}\r
\r
@Override\r
public boolean onCreateOptionsMenu(Menu menu) {\r
- MenuInflater inflater = getMenuInflater();\r
+ MenuInflater inflater = getSupportMenuInflater();\r
inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
+ MenuItem saveAction = menu.findItem(R.id.menu_save);\r
+ if ( CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
+ saveAction.setVisible(true);\r
+ saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS );\r
+ } else {\r
+ saveAction.setVisible(false);\r
+ saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER );\r
+ }\r
return true;\r
}\r
\r
public boolean onMenuItemSelected(int featureId, MenuItem item) {\r
AndroidLogWrapper.d(OpenRocketViewer.class,"onMenuItemSelected" + item.getItemId());\r
switch(item.getItemId()) {\r
+ case R.id.menu_load:\r
+ if ( CurrentRocketHolder.getCurrentRocket().isModified() ) {\r
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
+ builder.setMessage(R.string.loadWarnUnsaved);\r
+ builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {\r
+ @Override\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ pickOrkFiles();\r
+ }\r
+ });\r
+ builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {\r
+ @Override\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ OpenRocketViewer.this.loadAfterSave = true;\r
+ OpenRocketViewer.this.saveRocketDocument();\r
+ }\r
+ });\r
+ builder.create().show();\r
+ } else {\r
+ pickOrkFiles();\r
+ }\r
+ return true;\r
+ case R.id.menu_save:\r
+ OpenRocketViewer.this.saveRocketDocument();\r
+ return true;\r
+ case android.R.id.home:\r
+ ActivityHelpers.goHome(this);\r
+ return true;\r
case R.id.motor_list_menu_option:\r
ActivityHelpers.browseMotors(this);\r
return true;\r
case R.id.preference_menu_option:\r
ActivityHelpers.startPreferences(this);\r
return true;\r
+ case R.id.menu_about:\r
+ ActivityHelpers.showAbout(this);\r
+ return true;\r
}\r
return super.onMenuItemSelected(featureId, item);\r
}\r
\r
+ @Override\r
+ public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {\r
+ if ( autoSaveEnabledKey.equals(arg1) ) {\r
+ autoSaveEnabled = arg0.getBoolean(autoSaveEnabledKey, false);\r
+ }\r
+ }\r
+\r
@Override\r
public void onSimulationSelected(int simulationId) {\r
+\r
+ Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(simulationId);\r
+ // Check if there is data for this simulation.\r
+ if ( sim.getSimulatedData() == null || sim.getSimulatedData().getBranchCount() == 0 ) {\r
+ // This shouldn't happen because the Simulations list does the check.\r
+ return;\r
+ }\r
+\r
View sidepane = findViewById(R.id.sidepane);\r
if ( /* if multi pane */ sidepane != null ) {\r
- Simulation sim = app.getRocketDocument().getSimulation(simulationId);\r
SimulationChart chart = new SimulationChart(simulationId);\r
\r
- Fragment graph = SimulationFragment.newInstance(chart);\r
+ Fragment graph = SimulationViewFragment.newInstance(chart);\r
\r
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);\r
}\r
}\r
\r
+ private void saveRocketDocument() {\r
+ getSupportFragmentManager().beginTransaction()\r
+ .add( OpenRocketSaverFragment.newInstance(true), "saver")\r
+ .commitAllowingStateLoss();\r
+ }\r
+\r
+ @Override\r
+ public void onOpenRocketFileSaved(Boolean result) {\r
+ invalidateOptionsMenu();\r
+ if ( loadAfterSave ) {\r
+ loadAfterSave = false;\r
+ pickOrkFiles();\r
+ }\r
+ }\r
+\r
+ private class RocketChangedEventHandler extends ChangeEventBroadcastReceiver {\r
+\r
+ @Override\r
+ protected void doSimComplete() {\r
+ if ( autoSaveEnabled && CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
+ Toast.makeText(OpenRocketViewer.this, R.string.autoSaveMessage, Toast.LENGTH_SHORT).show();\r
+ OpenRocketViewer.this.saveRocketDocument();\r
+ }\r
+ doSimsChanged();\r
+ }\r
+\r
+ @Override\r
+ protected void doSimsChanged() {\r
+ invalidateOptionsMenu();\r
+ Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);\r
+ if ( sims != null ) {\r
+ sims.refreshSimulationList();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void doMotorConfigsChanged() {\r
+ invalidateOptionsMenu();\r
+ Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);\r
+ if ( configs != null ) {\r
+ configs.refreshConfigsList();\r
+ }\r
+ }\r
+\r
+ };\r
+\r
+\r
+ private class OpenRocketViewerPagerAdapter extends FragmentPagerAdapter {\r
+\r
+ public OpenRocketViewerPagerAdapter( FragmentManager fm ) {\r
+ super(fm);\r
+ }\r
+ @Override\r
+ public int getCount() {\r
+ return TABSIZE;\r
+ }\r
+ @Override\r
+ public Fragment getItem( int position ) {\r
+ switch (position) {\r
+ case OVERVIEW_POS:\r
+ return new Overview();\r
+ case COMPONENT_POS:\r
+ return new Component();\r
+ case SIMS_POS:\r
+ return new Simulations();\r
+ case CONFIGS_POS:\r
+ return new Configurations();\r
+ }\r
+ return null;\r
+ }\r
+ @Override\r
+ public CharSequence getPageTitle(int position) {\r
+ switch (position) {\r
+ case OVERVIEW_POS:\r
+ return "Overview";\r
+ case COMPONENT_POS:\r
+ return "Components";\r
+ case SIMS_POS:\r
+ return "Simulations";\r
+ case CONFIGS_POS:\r
+ return "Configurations";\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public Fragment getFragmentAtPos( int pos ) {\r
+ String tag = "android:switcher:"+R.id.pager+":"+pos;\r
+ Fragment f = OpenRocketViewer.this.getSupportFragmentManager().findFragmentByTag(tag);\r
+ return f;\r
+ }\r
+ }\r
+\r
}\r