package com.lateensoft.pathfinder.toolkit.views; import android.content.Context; import android.widget.*; import com.google.common.collect.Lists; import com.lateensoft.pathfinder.toolkit.R; import com.lateensoft.pathfinder.toolkit.util.DiceSet; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import java.util.List; public class DiceRollerFragment extends BasePageFragment { private static final int MAX_ROLL_SUM = 9999; private int rollSum = 0; private RollMode rollMode; private DiceSet diceSet; private RadioGroup rollTypeRadioGroup; private Spinner dieTypeSpinner, dieQuantitySpinner; private Button rollButton, resetButton; private TextView dieQuantityLabel, rollResultLabel, rollSumLabel; private ListView rollResultList; private static enum RollMode {SINGLE, XDY, CUMULATIVE} @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diceSet = new DiceSet(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setRootView(inflater.inflate(R.layout.fragment_dice_roller, container, false)); setupContent(); setRollMode(RollMode.SINGLE); return getRootView(); } @Override public void updateTitle() { setTitle(R.string.title_activity_ptdice_roller); setSubtitle(null); } private void setupContent() { rollTypeRadioGroup = (RadioGroup) getRootView().findViewById(R.id.toggleGroupRollType); RollTypeClickListener rollTypeClickListener = new RollTypeClickListener(); for (int i = 0; i < rollTypeRadioGroup.getChildCount(); i++) { rollTypeRadioGroup.getChildAt(i).setOnClickListener(rollTypeClickListener); } dieTypeSpinner = (Spinner) getRootView().findViewById(R.id.spinnerDieType); setupSpinner(dieTypeSpinner, R.array.roller_die_types, 0); dieQuantityLabel = (TextView) getRootView().findViewById(R.id.tvDieQuantity); dieQuantitySpinner = (Spinner) getRootView().findViewById(R.id.spinnerDieQuantity); setupSpinner(dieQuantitySpinner, R.array.roller_die_quantities, 0); rollButton = (Button) getRootView().findViewById(R.id.buttonRoll); rollButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { rollDice(); } }); resetButton = (Button) getRootView().findViewById(R.id.buttonReset); resetButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { resetRolls(); } }); rollResultLabel = (TextView) getRootView().findViewById(R.id.textViewRollResult); rollSumLabel = (TextView) getRootView().findViewById(R.id.textViewRollSum); rollResultList = (ListView) getRootView().findViewById(R.id.rollResultListView); resetRolls(); } public void setRollMode(RollMode rollMode) { switch (rollMode) { case SINGLE: this.rollMode = RollMode.SINGLE; resetButton.setEnabled(false); dieQuantitySpinner.setEnabled(false); dieQuantityLabel.setEnabled(false); rollSumLabel.setVisibility(View.INVISIBLE); rollResultList.setVisibility(View.GONE); break; case XDY: this.rollMode = RollMode.XDY; resetButton.setEnabled(true); dieQuantitySpinner.setEnabled(true); dieQuantityLabel.setEnabled(true); rollSumLabel.setVisibility(View.INVISIBLE); rollResultList.setVisibility(View.VISIBLE); break; case CUMULATIVE: this.rollMode = RollMode.CUMULATIVE; resetButton.setEnabled(true); dieQuantitySpinner.setEnabled(true); dieQuantityLabel.setEnabled(true); rollSumLabel.setVisibility(View.VISIBLE); rollResultList.setVisibility(View.VISIBLE); break; } } public void resetRolls() { rollSum = 0; rollSumLabel.setText(getString(R.string.roller_sum_label) + " " + rollSum); dieQuantitySpinner.setSelection(0); refreshRollsListView(null); } public void rollDice() { int rollResult; List<Integer> rolls; switch (rollMode) { case SINGLE: rollResultLabel.setText(Integer.toString(diceSet.roll(getDieType()))); break; case XDY: rolls = diceSet.rollMultiple(getDieType(), getDieQuantity()); rollResult = sumInts(rolls); rollResultLabel.setText(Integer.toString(rollResult)); refreshRollsListView(rolls); break; case CUMULATIVE: rolls = diceSet.rollMultiple(getDieType(), getDieQuantity()); rollResult = sumInts(rolls); rollSum += rollResult; if (rollSum > MAX_ROLL_SUM) rollSum = MAX_ROLL_SUM; rollSumLabel.setText(getString(R.string.roller_sum_label) + " " + rollSum); rollResultLabel.setText(Integer.toString(rollResult)); refreshRollsListView(rolls); break; default: throw new IllegalStateException("Invalid roll mode: "+ rollMode); } } private int getDieQuantity() { return dieQuantitySpinner.getSelectedItemPosition() + 1; } private DiceSet.Die getDieType() { int position = dieTypeSpinner.getSelectedItemPosition(); DiceSet.Die[] dice = DiceSet.Die.values(); if (position < dice.length) { return dice[position]; } else { throw new IllegalStateException("Illegal die selected at spinner position "+position); } } private int sumInts(Iterable<Integer> rollResults){ int rollSum = 0; if(rollResults != null){ for(int i : rollResults){ rollSum += i; } } return rollSum; } private void refreshRollsListView(List<Integer> rollResults){ if(rollResults == null) { rollResults = Lists.newArrayList(); } ArrayAdapter adapter = new ArrayAdapter<Integer>(getContext(), android.R.layout.simple_list_item_1, rollResults); rollResultList.setAdapter(adapter); } private class RollTypeClickListener implements OnClickListener { @Override public void onClick(View view) { ToggleButton toggleButton; for (int i = 0; i < rollTypeRadioGroup.getChildCount(); i++) { toggleButton = (ToggleButton) rollTypeRadioGroup.getChildAt(i); toggleButton.setChecked(toggleButton.getId() == view.getId()); } switch (view.getId()) { case R.id.radiotoggleSingleRoll: setRollMode(RollMode.SINGLE); break; case R.id.radiotoggleMultiRoll: setRollMode(RollMode.XDY); break; case R.id.radiotoggleSumRoll: setRollMode(RollMode.CUMULATIVE); break; } } } private void setupSpinner(Spinner spinner, int optionResourceId, int defaultSelection) { Context context = getContext(); if (context != null) { ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, optionResourceId, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(R.layout.spinner_centered_wrapped); spinner.setGravity(Gravity.CENTER); spinner.setAdapter(adapter); spinner.setSelection(defaultSelection); } } }