/* * 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.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.*; import ca.cmput301f13t03.adventure_datetime.R; import ca.cmput301f13t03.adventure_datetime.model.Choice; import ca.cmput301f13t03.adventure_datetime.model.StoryFragment; import ca.cmput301f13t03.adventure_datetime.view.treeView.TreeView; import java.util.ArrayList; import java.util.List; /** * Fragment controlled by AuthorEdit view * * Contains editing fields for a custom FragmentView * * @author James Finlay * */ public class AuthorEdit_Edit extends Fragment implements OnClickListener, IFragmentSelected, TextWatcher { private static final String TAG = "AuthorEdit_Edit"; private Activity m_activity = null; private ChoiceAdapter m_adapter = null; private View _rootView; private StoryFragment _fragment; private Button _addChoiceBtn; private Button _mediaBtn; private EditText _content; private ListView _choiceList = null; private TreeView m_treeview = null; private ActionBar m_actionBar = null; // data used for editing and creating choices private boolean m_isEditingChoice = false; private Choice m_selectedChoice = null; private String m_choiceTxt = null; private IFragmentSelected m_oldListener = null; public void SetTreeView(TreeView treeView) { m_treeview = treeView; } public void SetActionBar(ActionBar actionBar) { m_actionBar = actionBar; } public void setFragment(StoryFragment sf) { _fragment = sf; setUpView(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _rootView = inflater.inflate(R.layout.fragment_edit, container, false); setUpView(); return _rootView; } public void CancelPendingActions() { if(m_isEditingChoice) { RestoreTreeView(); m_selectedChoice = null; m_choiceTxt = null; } } private void setUpView() { if (_rootView == null) return; if (_fragment == null) return; if (m_activity == null && (m_activity = this.getActivity()) == null) return; /** Layout items **/ _addChoiceBtn = (Button) _rootView.findViewById(R.id.addChoice_btn); _choiceList = (ListView) _rootView.findViewById(R.id.choicesList); _content = (EditText) _rootView.findViewById(R.id.content); _mediaBtn = (Button) _rootView.findViewById(R.id.btn_addMedia); _content.setText(_fragment.getStoryText()); _content.addTextChangedListener(this); _addChoiceBtn.setOnClickListener(this); _mediaBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), FullScreen_Image.class); intent.putExtra(FullScreen_Image.TAG_AUTHOR, true); startActivity(intent); } }); _choiceList.setClickable(false); m_adapter = new ChoiceAdapter( m_activity, R.layout.choice_item, _fragment.getChoices()); _choiceList.setAdapter(m_adapter); } @Override public void onAttach(Activity activity) { super.onAttach(activity); m_activity = activity; setUpView(); } public void onClick(View v) { AlertDialog.Builder alert = new AlertDialog.Builder(this.getActivity()); alert.setTitle("Title"); alert.setMessage("Message"); // Set an EditText view to get user input final EditText input = new EditText(this.getActivity()); alert.setView(input); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { m_choiceTxt = input.getText().toString(); if(m_choiceTxt != null && m_choiceTxt.length() > 0) { m_isEditingChoice = true; LaunchTreeView(); } } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { m_isEditingChoice = false; } }); alert.show(); } private void LaunchTreeView() { m_oldListener = m_treeview.GetFragmentCallback(); m_treeview.SetFragmentCallback(this); m_actionBar.setSelectedNavigationItem(AuthorEdit.OVERVIEW_INDEX); Toast.makeText(m_activity, "Select a fragment to connect the choice to", Toast.LENGTH_LONG).show(); } private void RestoreTreeView() { m_treeview.SetFragmentCallback(m_oldListener); m_oldListener = null; m_actionBar.setSelectedNavigationItem(AuthorEdit.EDIT_INDEX); } private void RefreshTreeView() { m_treeview.RefreshView(); } public void OnFragmentSelected(StoryFragment selectedFragment) { if(m_isEditingChoice) { m_isEditingChoice = false; if(m_selectedChoice == null) { // then we are making a new choice Choice newChoice = new Choice(m_choiceTxt, selectedFragment.getFragmentID()); _fragment.addChoice(newChoice); m_treeview.AddChoice(_fragment, newChoice); } else { m_selectedChoice.setTarget(selectedFragment.getFragmentID()); } RefreshTreeView(); m_adapter.notifyDataSetChanged(); } // we should get this callback exactly once and no more RestoreTreeView(); m_selectedChoice = null; m_choiceTxt = null; } public void afterTextChanged(Editable s) { _fragment.setStoryText(s.toString()); m_treeview.RefreshView(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } // Dont' care @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } // Don't care private class ChoiceAdapter extends ArrayAdapter<Choice> { private Context m_context; private List<Choice> m_values; private List<ChoiceButtonCallback> m_callbacks = new ArrayList<ChoiceButtonCallback>(); public ChoiceAdapter(Context context, int resource, List<Choice> choices) { super(context, resource, choices); m_context = context; m_values = choices; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) m_context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(R.layout.choice_item, parent, false); Choice item = m_values.get(position); /** Layout Items **/ ImageButton deleteBtn = (ImageButton)rowView.findViewById(R.id.choice_remove_btn); ImageButton choiceBtn = (ImageButton)rowView.findViewById(R.id.choices_edit_btn); EditText txt = (EditText)rowView.findViewById(R.id.choice_txt); ChoiceButtonCallback callback = new ChoiceButtonCallback(_fragment, item); m_callbacks.add(callback); txt.setText(item.getText()); txt.addTextChangedListener(callback); deleteBtn.setOnClickListener(callback); choiceBtn.setOnClickListener(callback); return rowView; } private class ChoiceButtonCallback implements OnClickListener, TextWatcher { private StoryFragment m_origin = null; private Choice m_choice = null; public ChoiceButtonCallback(StoryFragment frag, Choice choice) { m_origin = frag; m_choice = choice; } public void onClick(View btn) { if(btn.getId() == R.id.choice_remove_btn) { m_origin.removeChoice(m_choice); RefreshTreeView(); m_adapter.notifyDataSetChanged(); m_treeview.RemoveChoice(m_origin, m_choice); } else if(btn.getId() == R.id.choices_edit_btn) { m_isEditingChoice = true; m_selectedChoice = m_choice; LaunchTreeView(); } else { Log.e(TAG, "Somehow clicked on a button that shouldn't exist...?"); } } @Override public void afterTextChanged(Editable s) { m_choice.setText(s.toString()); } @Override public void beforeTextChanged( CharSequence s, int start, int count, int after) { // Do nothing, don't care } @Override public void onTextChanged( CharSequence s, int start, int before, int count) { // Do nothing, don't care } } } }