package app.create.rpg; import java.util.ArrayList; import java.util.List; import java.util.Locale; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import app.create.rpg.file.CachedFile; import app.create.rpg.file.CachedFile.User; import app.create.rpg.file.CachedRMData; import com.eb.rpg.Actor; import com.eb.rpg.Armor; import com.eb.rpg.Named; public class FragmentActors extends AbstractFragmentPage implements OnItemSelectedListener, User { protected CachedRMData mFileActors, mFileClasses, mFileArmors, mFileWeapons; protected static final int[] GRAPH_IDS = new int[]{R.id.viewParamMaxHP, R.id.viewParamMaxSP, R.id.viewParamSTR, R.id.viewParamDEX, R.id.viewParamAGI, R.id.viewParamINT}; protected static final int[] GRAPH_COLORS = new int[]{0xffc83c78, 0xff3c78c8, 0xffc8783c, 0xff78c83c, 0xff3cc878, 0xff783cc8}; protected Bitmap[] mGraph = new Bitmap[GRAPH_IDS.length]; public static class MyCreator extends CustomPagerAdapter.FragmentCreator { public MyCreator() { super(); } public MyCreator(Parcel source) { super(source); } public Fragment newInstance(Context context) { return new FragmentActors(); } public String getTitle(Context context) { return context.getString(R.string.menu_actors); } public Class<?> getFragmentClass() { return FragmentActors.class; } public boolean equals(Object o) { return o instanceof MyCreator; } public static final MyCreator EMPTY = new MyCreator(); public static final Creator<MyCreator> CREATOR = new Creator<MyCreator>() { public MyCreator[] newArray(int size) { return new MyCreator[size]; } public MyCreator createFromParcel(Parcel source) { return new MyCreator(source); } }; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setName(getString(R.string.menu_actors)); View view = inflater.inflate(R.layout.page_actors, null); final Spinner spinner = (Spinner) view.findViewById(R.id.spinActors); spinner.setOnItemSelectedListener(this); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final ActivityProject act = (ActivityProject) getActivity(); // Takes too long to read; need to use multithreading.. act.require(this, "Classes"); act.require(this, "Armors"); act.require(this, "Weapons"); act.require(this, "Actors"); } @SuppressWarnings("unchecked") public void updateSpinner() { if (mFileActors == null || mFileActors.getData() == null) return; final Spinner spinner = (Spinner) getView().findViewById(R.id.spinActors); ArrayAdapter<Object> adapter = (ArrayAdapter<Object>) spinner.getAdapter(); boolean unset; if (unset = (adapter == null)) { adapter = new ArrayAdapter<Object>(getActivity(), android.R.layout.simple_spinner_item); } adapter.setNotifyOnChange(false); adapter.clear(); for (Object o : mFileActors.getData()) adapter.add(o); adapter.notifyDataSetChanged(); if (unset) spinner.setAdapter(adapter); onItemSelected(spinner, spinner.getSelectedView(), spinner.getSelectedItemPosition(), spinner.getSelectedItemId()); } @Override public void onDestroyView() { super.onDestroyView(); for (int i = 0; i < mGraph.length; i++) { if (mGraph[i] != null) mGraph[i].recycle(); mGraph[i] = null; } if (mFileClasses != null) mFileClasses.terminate(); mFileClasses = null; if (mFileArmors != null) mFileArmors.terminate(); mFileArmors = null; if (mFileWeapons != null) mFileWeapons.terminate(); mFileWeapons = null; if (mFileActors != null) mFileActors.terminate(); mFileActors = null; } protected void setSelectedById(AdapterView<?> adapterView, int id) { Adapter a = (Adapter) adapterView.getAdapter(); int c = a.getCount(), i; if (id == 0) { adapterView.setSelection(0); return; } for (i = 1; i < c; i++) { Object o = a.getItem(i); if (o instanceof Named && ((Named) o).id == id) { adapterView.setSelection(i); break; } } adapterView.setSelection(0); } @Override public void onItemSelected(AdapterView<?> adapterView, View itemView, int position, long id) { final View rv = getView(); switch (adapterView.getId()) { case R.id.spinActors: { Actor data = (Actor) ((Adapter) adapterView.getAdapter()).getItem(position); ((EditText) rv.findViewById(R.id.editName)).setText(data.name); ((Spinner) rv.findViewById(R.id.spinClass)).setSelection(data.class_id - 1); ((EditText) rv.findViewById(R.id.editInitLevel)).setText(Integer.toString(data.initial_level)); ((EditText) rv.findViewById(R.id.editFinalLevel)).setText(Integer.toString(data.final_level)); ((Button) rv.findViewById(R.id.btnExpCurve)).setText("Basis : " + data.exp_basis + ", Inflation : " + data.exp_inflation); ((ImageView) rv.findViewById(R.id.imgBtnCharacter)).setImageDrawable(mHelper.getGraphicsMaterial("Characters", data.character_name, data.character_hue)); ((ImageView) rv.findViewById(R.id.imgBtnBattler)).setImageDrawable(mHelper.getGraphicsMaterial("Battlers", data.battler_name, data.battler_hue)); ((Spinner) rv.findViewById(R.id.spinWeapon)).setSelection(data.weapon_id); ((CheckBox) rv.findViewById(R.id.chkFixWeapon)).setChecked(data.weapon_fix); setSelectedById((Spinner) rv.findViewById(R.id.spinShield), data.armor1_id); ((CheckBox) rv.findViewById(R.id.chkFixShield)).setChecked(data.armor1_fix); setSelectedById((Spinner) rv.findViewById(R.id.spinHelmet), data.armor2_id); ((CheckBox) rv.findViewById(R.id.chkFixHelmet)).setChecked(data.armor2_fix); setSelectedById((Spinner) rv.findViewById(R.id.spinBodyArmor), data.armor3_id); ((CheckBox) rv.findViewById(R.id.chkFixBodyArmor)).setChecked(data.armor3_fix); setSelectedById((Spinner) rv.findViewById(R.id.spinAccessory), data.armor4_id); ((CheckBox) rv.findViewById(R.id.chkFixAccessory)).setChecked(data.armor4_fix); int j, k; int[] colors; short[][][] param = data.parameters.getInnerArray(); for (int i = 0; i < GRAPH_IDS.length; i++) { View view = rv.findViewById(GRAPH_IDS[i]); Bitmap bmp = mGraph[i]; if (bmp == null) { colors = new int[9900]; int param_h = i > 1 ? 999 : 9999; for (j = 0; j < 99; j++) { for (k = 100 - ((param[0][j + 1][i] & 0xFFFF) * 100 / param_h); k < 100; k++) colors[(k * 99) + j] = GRAPH_COLORS[i]; } mGraph[i] = bmp = Bitmap.createBitmap(colors, 99, 100, Config.ARGB_8888); } BitmapDrawable bd = new BitmapDrawable(getResources(), bmp); try { View.class.getMethod("setBackground", Drawable.class).invoke(view, bd); } catch (Exception e) { try { View.class.getMethod("setBackgroundDrawable", Drawable.class).invoke(view, bd); } catch (Exception e1) { } } } } break; } } @Override public void onNothingSelected(AdapterView<?> arg0) { } @Override public void onOpen(CachedFile file) { Log.d("CreateRPG", "Open " + file.getName()); onUpdate(file); } @SuppressWarnings("unchecked") @Override public void onUpdate(CachedFile file) { Log.d("CreateRPG", "Update " + file.getName()); String name = file.getName().toLowerCase(Locale.US); List<Object> list; View view = getView(); // final Spinner spinActors = (Spinner) view.findViewById(R.id.spinActors); // Spinner spin1; if (name.equals("actors")) { for (int i = 0; i < mGraph.length; ++i) { if (mGraph[i] != null) mGraph[i].recycle(); mGraph[i] = null; } list = (mFileActors = (CachedRMData) file).getData(); // ArrayAdapter<Object> adapter = (ArrayAdapter<Object>) spinActors.getAdapter(); // if (adapter == null) // spinActors.setAdapter(new ArrayAdapter<Object>(getActivity(), android.R.layout.simple_spinner_item, list)); // else { // adapter.setNotifyOnChange(false); // adapter.clear(); // adapter.addAll(list); // } } else if (name.equals("classes")) { list = (mFileClasses = (CachedRMData) file).getData(); ((Spinner) view.findViewById(R.id.spinClass)) .setAdapter(new ArrayAdapter<Object>(getActivity(), android.R.layout.simple_spinner_item, list)); } else if (name.equals("weapons")) { mFileWeapons = (CachedRMData) file; list = new ArrayList<Object>(1+mFileWeapons.getData().size()); list.add(new Named()); list.addAll(mFileWeapons.getData()); ((Spinner) view.findViewById(R.id.spinWeapon)) .setAdapter(new ArrayAdapter<Object>(getActivity(), android.R.layout.simple_spinner_item, list)); } else if (name.equals("armors")) { list = (mFileArmors = (CachedRMData) file).getData(); BaseAdapter[] adapt = new BaseAdapter[4]; int i; for (i = 0; i < 4; i++) { List<Object> ln = new ArrayList<Object>(); ln.add(new Named()); adapt[i] = new ArrayAdapter<Object>(getActivity(), android.R.layout.simple_spinner_item, ln); } i = 0; for (Object o : list) { ((ArrayAdapter<Object>)adapt[((Armor)o).kind]).add(o); } for (i = 0; i < 4; i++) { ((Spinner) view.findViewById(Armor.KIND_TO_ID[i])) .setAdapter(adapt[i]); } } updateSpinner(); } @Override public void onClosed(CachedFile file) { } }