Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / OpenRocketViewer.java
index a79beb6e316a99c071071d30d3d15c13aba730c2..635d5264349e02e4f0b3190fa94820bdd448d30b 100644 (file)
@@ -3,114 +3,301 @@ package net.sf.openrocket.android.rocket;
 \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.util.TabsAdapter;\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.rocketcomponent.Configuration;\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.FragmentActivity;\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.util.Log;\r
-import android.view.Menu;\r
-import android.view.MenuInflater;\r
-import android.view.MenuItem;\r
-import android.widget.TabHost;\r
-\r
-public class OpenRocketViewer extends FragmentActivity\r
-implements SharedPreferences.OnSharedPreferenceChangeListener\r
+import android.view.View;\r
+import android.widget.Toast;\r
+\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
-       private static final String TAG = "OpenRocketViewer";\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
-       OpenRocketDocument rocketDocument;\r
-       Configuration rocketConfiguration;\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
-               return true;\r
-       }\r
-\r
-       @Override\r
-       public boolean onOptionsItemSelected(MenuItem item) {\r
-               switch ( item.getItemId() ) {\r
-               /*              case android.R.id.home:\r
-                       Intent i = new Intent( this, Main.class );\r
-                       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\r
-                       startActivity(i);\r
-                       return true;\r
-                */\r
-               default:\r
-                       return super.onOptionsItemSelected(item);\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
        @Override\r
        public boolean onMenuItemSelected(int featureId, MenuItem item) {\r
-               Log.d(TAG,"onMenuItemSelected" + item.getItemId());\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
+                       SimulationChart chart = new SimulationChart(simulationId);\r
+\r
+                       Fragment graph = SimulationViewFragment.newInstance(chart);\r
+\r
+                       FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
+                       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);\r
+                       // probably only want to update back stack for first time.\r
+                       ft.addToBackStack("simulationplot");\r
+                       ft.replace(R.id.sidepane, graph);\r
+                       ft.show(graph);\r
+                       ft.commit();\r
+\r
+\r
+               } else {\r
+                       Intent i = new Intent(this, SimulationViewActivity.class);\r
+                       i.putExtra("Simulation",simulationId);\r
+                       startActivity(i);\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