package net.sf.openrocket.android.rocket;\r
\r
\r
-import java.io.IOException;\r
-\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.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.document.OpenRocketDocument;\r
import net.sf.openrocket.document.Simulation;\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.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.View;\r
+import android.widget.Toast;\r
\r
-import com.actionbarsherlock.app.SherlockFragmentActivity;\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 SherlockFragmentActivity\r
-implements Simulations.OnSimulationSelectedListener\r
+public class OpenRocketViewer extends OpenRocketLoaderActivity\r
+implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnOpenRocketFileSaved, SharedPreferences.OnSharedPreferenceChangeListener\r
{\r
\r
- private Application app;\r
-\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
\r
private OpenRocketViewerPagerAdapter viewPagerAdapter;\r
\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
+\r
@Override\r
protected void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
\r
- app = (Application) this.getApplication();\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
- setTitle(app.getRocketDocument().getRocket().getName());\r
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);\r
+ setTitle(rocDoc.getRocket().getName());\r
+ getSupportActionBar().setHomeButtonEnabled(true);\r
\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
- app.setHandler( new RocketChangedEventHandler( ) );\r
}\r
\r
@Override\r
protected void onPause() {\r
- app.setHandler(null);\r
+ handler.unregister(this);\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
+ pref.unregisterOnSharedPreferenceChangeListener(this);\r
super.onPause();\r
}\r
\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
+ pref.registerOnSharedPreferenceChangeListener(this);\r
+\r
+ handler.register(this);\r
+ super.onResume();\r
+ }\r
+\r
+ @Override\r
+ protected void onSaveInstanceState(Bundle outState) {\r
+ super.onSaveInstanceState(outState);\r
+ outState.putBoolean(LOAD_AFTER_SAVE, loadAfterSave);\r
+ }\r
+\r
@Override\r
public boolean onCreateOptionsMenu(Menu menu) {\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_save:\r
- // FIXME - Probably want to open a dialog here.\r
- try {\r
- ((Application)getApplication()).saveOpenRocketDocument();\r
- } catch ( IOException iex ) {\r
- AndroidLogWrapper.d(OpenRocketViewer.class, iex.getMessage());\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
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 = app.getRocketDocument().getSimulation(simulationId);\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
- AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
- builder.setMessage("The selected simulation does not have saved data.");\r
- builder.setCancelable(true);\r
- builder.show();\r
+ // This shouldn't happen because the Simulations list does the check.\r
return;\r
}\r
\r
}\r
}\r
\r
- private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {\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
- \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
@Override\r
protected void doMotorConfigsChanged() {\r
+ invalidateOptionsMenu();\r
Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);\r
if ( configs != null ) {\r
configs.refreshConfigsList();\r