\r
import java.io.File;\r
import java.io.IOException;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
\r
import net.sf.openrocket.aerodynamics.WarningSet;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
private RocketChangedEventHandler handler;\r
\r
private boolean isModified = false;\r
+ private Set<Integer> runningSims = new HashSet<Integer>();\r
\r
public void setHandler( RocketChangedEventHandler handler ) {\r
this.handler = handler;\r
}\r
\r
public void notifySimsChanged() {\r
- isModified = true;\r
+ synchronized ( this ) {\r
+ isModified = true;\r
+ }\r
if ( handler != null ) {\r
handler.simsChangedMessage();\r
}\r
}\r
\r
+ public void notifySimComplete() {\r
+ synchronized ( this ) {\r
+ isModified = true;\r
+ }\r
+ if ( handler != null ) {\r
+ handler.simCompleteMessage();\r
+ }\r
+ }\r
+\r
+ public synchronized void lockSimulation( int simulationId ) {\r
+ runningSims.add(simulationId);\r
+ }\r
+ \r
+ public synchronized void unlockSimulation( int simulationId ) {\r
+ runningSims.remove(simulationId);\r
+ }\r
+ \r
+ public synchronized Set<Integer> lockedSimulations() {\r
+ return new HashSet<Integer>(runningSims);\r
+ }\r
+ \r
public void addNewSimulation() {\r
Rocket rocket = rocketDocument.getRocket();\r
// FIXME - hopefully the change to the Simulation object will be reverted soon.\r
}\r
\r
public String addNewMotorConfig() {\r
- isModified = true;\r
+ synchronized ( this ) {\r
+ isModified = true;\r
+ }\r
String configId = rocketDocument.getRocket().newMotorConfigurationID();\r
if ( handler != null ) {\r
handler.configsChangedMessage();\r
*/\r
public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
this.rocketDocument = rocketDocument;\r
- isModified = false;\r
+ synchronized ( this ) {\r
+ isModified = false;\r
+ }\r
}\r
\r
public WarningSet getWarnings() {\r
return this.isModified;\r
}\r
\r
+ public boolean canSave() {\r
+ return this.isModified && this.runningSims.isEmpty();\r
+ }\r
+ \r
public void saveOpenRocketDocument() throws IOException {\r
\r
// Translate the fileUri if it happens to be a .rkt file.\r
\r
public static final int MOTOR_CONFIGS_CHANGED = 1;\r
public static final int SIMS_CHANGED = 2;\r
+ public static final int SIM_COMPLETE = 3;\r
\r
+ public void simCompleteMessage() {\r
+ Message m = this.obtainMessage(SIM_COMPLETE);\r
+ this.sendMessage(m);\r
+ }\r
+ \r
public void simsChangedMessage() {\r
Message m = this.obtainMessage(SIMS_CHANGED);\r
this.sendMessage(m);\r
case MOTOR_CONFIGS_CHANGED:\r
doMotorConfigsChanged();\r
break;\r
+ case SIM_COMPLETE:\r
+ doSimComplete();\r
+ break;\r
default:\r
super.handleMessage(msg);\r
}\r
}\r
\r
+ protected abstract void doSimComplete();\r
+ \r
protected abstract void doSimsChanged();\r
\r
protected abstract void doMotorConfigsChanged();\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().isModified() ) {\r
+ if ( CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
saveAction.setVisible(true);\r
saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS );\r
} else {\r
\r
private void saveRocketDocument() {\r
getSupportFragmentManager().beginTransaction()\r
- .add( OpenRocketSaverFragment.newInstance(false), "saver")\r
+ .add( OpenRocketSaverFragment.newInstance(true), "saver")\r
.commitAllowingStateLoss();\r
}\r
\r
private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {\r
\r
@Override\r
- protected void doSimsChanged() {\r
+ protected void doSimComplete() {\r
if ( autoSaveEnabled ) {\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