package com.lateensoft.pathfinder.toolkit.views.character; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import com.lateensoft.pathfinder.toolkit.R; import com.lateensoft.pathfinder.toolkit.dao.DataAccessException; import com.lateensoft.pathfinder.toolkit.db.dao.set.AbilitySetDAO; import com.lateensoft.pathfinder.toolkit.db.dao.table.ArmorDAO; import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilitySet; import com.lateensoft.pathfinder.toolkit.model.character.stats.AbilityType; // Untested public class CharacterAbilitiesFragment extends AbstractCharacterSheetFragment { @SuppressWarnings("unused") private static final String TAG = CharacterAbilitiesFragment.class.getSimpleName(); private final int[] baseModViewIds = {R.id.strMod, R.id.dexMod, R.id.conMod, R.id.intMod, R.id.wisMod, R.id.chaMod}; private final int[] tempBonusSpinnerIds = {R.id.strTempScore, R.id.dexTempScore, R.id.conTempScore, R.id.intTempScore, R.id.wisTempScore, R.id.chaTempScore}; private final int[] baseScoreSpinnerIds = {R.id.baseStr, R.id.baseDex, R.id.baseCon, R.id.baseInt, R.id.baseWis, R.id.baseCha}; private final int[] tempModViewIds = {R.id.strTempMod, R.id.dexTempMod, R.id.conTempMod, R.id.intTempMod, R.id.wisTempMod, R.id.chaTempMod}; // selected index - TEMP_SPINNER_INDEX_OFFSET = selected value private final int TEMP_SPINNER_INDEX_OFFSET = 20; private AbilityItemSelectedListener[] m_abilityItemSelectedListeners; private AbilityItemSelectedListener[] m_tempAbilityItemSelectedListeners; //LayoutInflater mInflater; private Spinner[] m_baseScoreSpinners; private Spinner[] m_tempScoreSpinners; private AbilitySetDAO abilitySetDao; private ArmorDAO armorDAO; private int m_maxDex = Integer.MAX_VALUE; private AbilitySet m_abilityScores; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); abilitySetDao = new AbilitySetDAO(getContext()); armorDAO = new ArmorDAO(getContext()); m_baseScoreSpinners = new Spinner[baseScoreSpinnerIds.length]; m_tempScoreSpinners = new Spinner[tempBonusSpinnerIds.length]; m_abilityItemSelectedListeners = new AbilityItemSelectedListener[baseModViewIds.length]; m_tempAbilityItemSelectedListeners = new AbilityItemSelectedListener[baseModViewIds.length]; } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRootView(inflater.inflate(R.layout.character_abilities_fragment, container, false)); setupSpinners(m_baseScoreSpinners, baseScoreSpinnerIds, m_abilityItemSelectedListeners, false); setupSpinners(m_tempScoreSpinners, tempBonusSpinnerIds, m_tempAbilityItemSelectedListeners, true); return getRootView(); } private void updateSpinners() { for(int i = 0; i < baseModViewIds.length; i++) { updateSpinnerValues(i); } } private void updateSpinnerValues(int abilityIndex) { Spinner s; TextView tv; tv = (TextView) getRootView().findViewById(baseModViewIds[abilityIndex]); tv.setText(String.valueOf(m_abilityScores.getAbilityAtIndex(abilityIndex).getAbilityModifier())); s = (Spinner) getRootView().findViewById(baseScoreSpinnerIds[abilityIndex]); s.setSelection((m_abilityScores.getAbilityAtIndex(abilityIndex).getScore())); s = (Spinner) getRootView().findViewById(tempBonusSpinnerIds[abilityIndex]); s.setSelection((m_abilityScores .getAbilityAtIndex(abilityIndex).getTempBonus() + TEMP_SPINNER_INDEX_OFFSET)); tv = (TextView) getRootView().findViewById(tempModViewIds[abilityIndex]); tv.setText(String.valueOf(m_abilityScores .getAbilityAtIndex(abilityIndex).getTempModifier())); } private void setupSpinners(Spinner[] spinners, int viewIds[], AbilityItemSelectedListener[] listeners, boolean isTemp) { ArrayAdapter<CharSequence> adapter; if (isTemp) { adapter = ArrayAdapter.createFromResource(getContext(), R.array.selectable_integer_values_strings, R.layout.spinner_centered); adapter.setDropDownViewResource(R.layout.spinner_centered); } else { adapter = ArrayAdapter.createFromResource(getContext(), R.array.selectable_whole_values_strings, R.layout.spinner_centered); adapter.setDropDownViewResource(R.layout.spinner_centered); } for(int i = 0; i < viewIds.length; i++) { listeners[i] = new AbilityItemSelectedListener(isTemp, i); spinners[i] = (Spinner) getRootView().findViewById(viewIds[i]); spinners[i].setAdapter(adapter); spinners[i].setOnItemSelectedListener(listeners[i]); } } public void updateModsViews(int viewIds[], boolean isTemp) { TextView tv; for(int i = 0; i < viewIds.length; i++) { tv = (TextView) getRootView().findViewById(viewIds[i]); if(isTemp) { if(m_abilityScores.getAbilityAtIndex(i).getType() == AbilityType.DEX && m_abilityScores.getAbilityAtIndex(i).getTempModifier() > m_maxDex) { tv.setText(Integer.toString(m_maxDex)+"\n"+getString(R.string.max_dex_warning)); } else { tv.setText(Integer.toString(m_abilityScores.getAbilityAtIndex(i) .getTempModifier())); } } else { tv.setText(Integer.toString(m_abilityScores.getAbilityAtIndex(i) .getAbilityModifier())); } } } private class AbilityItemSelectedListener implements OnItemSelectedListener { boolean _isTemp; int _abilityIndex; public AbilityItemSelectedListener(boolean isTemp, int abilityIndex) { super(); _isTemp = isTemp; _abilityIndex = abilityIndex; } public void onNothingSelected(AdapterView<?> parent) { } public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { if(_isTemp) { m_abilityScores.getAbilityAtIndex(_abilityIndex).setTempBonus(pos - TEMP_SPINNER_INDEX_OFFSET); } else { m_abilityScores.getAbilityAtIndex(_abilityIndex).setScore(pos); } updateModsViews(tempModViewIds, true); updateModsViews(baseModViewIds, false); } } @Override public void updateFragmentUI() { updateSpinners(); updateModsViews(baseModViewIds, false); updateModsViews(tempModViewIds, true); } @Override public String getFragmentTitle() { return getString(R.string.tab_character_abilities); } @Override public void updateDatabase() { if (m_abilityScores != null) { long characterid = getCurrentCharacterID(); for (int i = 0; i < m_abilityScores.size(); i++) { try { abilitySetDao.getComponentDAO().update(characterid, m_abilityScores.getAbilityAtIndex(i)); } catch (DataAccessException e) { Log.e(TAG, "Failed to update ability " + m_abilityScores.getAbilityAtIndex(i), e); } } } } @Override public void loadFromDatabase() { m_abilityScores = abilitySetDao.findSet(getCurrentCharacterID()); m_maxDex = armorDAO.getMaxDexForCharacter(getCurrentCharacterID()); } }