/* * Copyright (c) 2013 Andrew Fontaine, James Finlay, Jesse Tucker, Jacob Viau, and * Evan DeGraff * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package ca.cmput301f13t03.adventure_datetime.view; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.AlertDialog; import android.app.FragmentTransaction; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import ca.cmput301f13t03.adventure_datetime.R; import ca.cmput301f13t03.adventure_datetime.model.Interfaces.ICurrentFragmentListener; import ca.cmput301f13t03.adventure_datetime.model.Interfaces.ICurrentStoryListener; import ca.cmput301f13t03.adventure_datetime.model.Story; import ca.cmput301f13t03.adventure_datetime.model.StoryFragment; import ca.cmput301f13t03.adventure_datetime.serviceLocator.Locator; import ca.cmput301f13t03.adventure_datetime.view.treeView.TreeView; /** * * View containing three fragments/tabs: * - AuthorEdit_Preview * - AuthorEdit_Overview * - AuthorEdit_Edit * * @author James Finlay * */ public class AuthorEdit extends FragmentActivity implements ICurrentFragmentListener, ICurrentStoryListener, IFragmentSelected { public static final int OVERVIEW_INDEX = 0; public static final int EDIT_INDEX = 1; public static final int PREVIEW_INDEX = 2; // make sure to update this if we add a tab! public static final int INDEX_COUNT = 3; private static final String TAG = "AuthorEdit"; private ViewPager _viewPager; private ViewPagerAdapter _adapter; private Story _story; private StoryFragment _fragment; private boolean _deletingFragment = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.viewpager); /* Set up View Pager */ _adapter = new ViewPagerAdapter(getSupportFragmentManager(), this); _viewPager = (ViewPager) findViewById(R.id.pager); _viewPager.setAdapter(_adapter); if(_fragment != null) { _adapter.setFragment(_fragment); } /* Set up Tabs */ final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.TabListener tabListener = new ActionBar.TabListener() { @Override public void onTabReselected(Tab tab, FragmentTransaction ft) {} @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { int index = tab.getPosition(); if(index != OVERVIEW_INDEX) { _adapter.CancelActions(); } invalidateOptionsMenu(); _viewPager.setCurrentItem(index); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) {} }; actionBar.addTab(actionBar.newTab() .setText("Overview") .setTabListener(tabListener)); actionBar.addTab(actionBar.newTab() .setText("Edit") .setTabListener(tabListener)); actionBar.addTab(actionBar.newTab() .setText("Preview") .setTabListener(tabListener)); /* Change tabs when View Pager swiped */ _viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { getActionBar().setSelectedNavigationItem(position); invalidateOptionsMenu(); _deletingFragment = false; if(_viewPager.getCurrentItem() != OVERVIEW_INDEX) { _adapter.CancelActions(); } } }); // Select 'Overview' at start getActionBar().setSelectedNavigationItem(OVERVIEW_INDEX); } @Override public void onResume() { Locator.getPresenter().Subscribe((ICurrentFragmentListener)this); Locator.getPresenter().Subscribe((ICurrentStoryListener)this); super.onResume(); } @Override public void onPause() { Locator.getPresenter().Unsubscribe((ICurrentFragmentListener)this); Locator.getPresenter().Unsubscribe((ICurrentStoryListener)this); super.onPause(); } @Override public void OnCurrentFragmentChange(StoryFragment newFragment) { _fragment = newFragment; _adapter.setFragment(newFragment); } @Override public void OnCurrentStoryChange(Story newStory) { _story = newStory; } @Override public boolean onCreateOptionsMenu(Menu menu) { if(_viewPager.getCurrentItem() == OVERVIEW_INDEX) { getMenuInflater().inflate(R.menu.authoroverview, menu); } else { getMenuInflater().inflate(R.menu.authoredit, menu); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_back: finish(); break; case R.id.action_save: Locator.getAuthorController().saveStory(); Toast.makeText(getApplicationContext(), "Saved Fragment!", Toast.LENGTH_SHORT).show(); break; case R.id.action_discard: DoDeleteFragment(); break; case R.id.action_addFragment: StoryFragment newFrag = Locator.getAuthorController().CreateFragment(); Locator.getAuthorController().selectFragment(newFrag.getFragmentID()); _viewPager.setCurrentItem(EDIT_INDEX); break; default: } return super.onOptionsItemSelected(item); } private void DoDeleteFragment() { if(_viewPager.getCurrentItem() == OVERVIEW_INDEX) { _deletingFragment = true; Toast.makeText(getApplicationContext(), "Select a Fragment to delete...", Toast.LENGTH_SHORT).show(); } else { DeleteFragment(_fragment); } } private void DeleteFragment(final StoryFragment frag) { final int TXT_LIMIT = 10; String fragText = frag.getStoryText(); if(fragText.length() > TXT_LIMIT) { fragText = fragText.substring(0, TXT_LIMIT) + "..."; } /* Ensure user is not retarded and actually wants to do this */ new AlertDialog.Builder(this) .setTitle("Delete Story Fragment") .setMessage("This will delete \"" + fragText + "\"\nYou cannot undo.") .setCancelable(true) .setPositiveButton("Delete", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (_story.getHeadFragmentId().equals(frag.getFragmentID())) { Toast.makeText(getApplicationContext(), "Cannot delete Head Fragment", Toast.LENGTH_LONG).show(); } else { Locator.getAuthorController().deleteFragment(frag.getFragmentID()); Locator.getAuthorController().selectFragment(_story.getHeadFragmentId()); } } }) .setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }) .create().show(); } public void OnFragmentSelected(StoryFragment selectedFragment) { if(_deletingFragment) { _deletingFragment = false; DeleteFragment(selectedFragment); } else { getActionBar().setSelectedNavigationItem(EDIT_INDEX); Locator.getAuthorController().selectFragment(selectedFragment.getFragmentID()); } } // fuck this is ugly public interface OnCreatedCallback { public void OnCreated(TreeView newTreeView); } public class ViewPagerAdapter extends FragmentPagerAdapter implements OnCreatedCallback { private AuthorEdit_Edit _edit; private AuthorEdit_Overview _overview; private FragmentView _preview; public ViewPagerAdapter(FragmentManager fm, IFragmentSelected callback) { super(fm); _overview = new AuthorEdit_Overview(); _overview.SetFragmentSelectionCallback(callback); _overview.SetOnCreatedCallback(this); _edit = new AuthorEdit_Edit(); _edit.SetActionBar(getActionBar()); _preview = new FragmentView(); _preview.SetIsEditing(true); } @Override public Fragment getItem(int i) { switch (i) { case OVERVIEW_INDEX: return _overview; case EDIT_INDEX: return _edit; case PREVIEW_INDEX: return _preview; default: Log.e(TAG, "invalid item #"); return null; } } public void setFragment(StoryFragment sf) { _edit.setFragment(sf); } public void CancelActions() { _edit.CancelPendingActions(); } @Override public int getCount() { return INDEX_COUNT; } @Override public CharSequence getPageTitle(int position) { switch (position) { case EDIT_INDEX: return "Edit"; case OVERVIEW_INDEX: return "Overview"; case PREVIEW_INDEX: return "Preview"; default: return "It be a Pirate!"; } } public void OnCreated(TreeView newTreeView) { _edit.SetTreeView(newTreeView); } } }