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