package TaiGameCore;
import java.util.ArrayList;
/**
* Classes for easily creating gameDataBase editors (guis)
*/
public class GameDataEditorUtil {
/**
* An (editable?) game entry
*/
public abstract static class ViewableGameDB<E extends GameDataBase> {
public ViewableGameDB() {
// //setup the gui
this.fields = new DataFieldMembers<E>();
}
public void updateValues() {
for (DataFieldMember<? extends E> entry : fields.entries) {
try {
/** IF you did silly things, this will throw a classcastexception. **/
((DataFieldMember<E>) entry).applyValue(currentData);
} catch (Throwable e) {
//Here, we can give a nice explanation:
e.printStackTrace();
throw new RuntimeException(entry.name);
}
}
}
public String getHashedString() {
if (currentData != null) {
//Update from fields:
updateValues();
//Do it!
return currentData.hashToString();
}
return null;
}
public void cleanup() {
};
private DataFieldMembers<E> fields;
public E currentData;
public <F extends E> void setViewingObject(F found) {
currentData = found;
for (DataFieldMember<? extends E> k : fields.entries) {
/** IF you did silly things, this will throw a classcastexception. **/
((DataFieldMember<F>) k).updateFromDatabase(found);
}
}
public abstract void draw();
public DataFieldMembers<E> getFields() {
return fields;
}
public <F extends E> void addDataField(DataFieldMember<F> k) {
fields.addDataField(k);
}
}
public static class DataFieldMembers<E extends GameDataBase> {
private int numEntries = 0;
public DataFieldMembers() {
entries = new ArrayList();
}
public int getSize() {
return numEntries;
}
public <F extends E> void addDataField(DataFieldMember<F> k) {
k.myIndex = numEntries++;
entries.add(k);
}
public ArrayList<DataFieldMember<? extends E>> entries;
}
public abstract static class DataFieldMember<E extends GameDataBase> {
public String name;
public int myIndex;
public DataFieldMember(String name) {
this.name = name;
}
public static String toString(int[] arr) {
StringBuffer sb = new StringBuffer();
for (int k = 0; k < arr.length; k++) {
sb.append(arr[k]);
if (k + 1 < arr.length) {
sb.append(',');
}
}
return sb.toString();
}
public static int[] parseIntArr(String arr) {
arr = arr.trim();
if (arr.length() == 0) {
return new int[0];
}
String[] stuff = arr.split(",");
int[] toRet = new int[stuff.length];
for (int k = 0; k < stuff.length; k++) {
toRet[k] = new Integer(stuff[k]);
}
return toRet;
}
/**
* Client code: check that currentData !=null before calling!
*/
public abstract void applyValue(E gdb);
/**
* Precondish: gdb !=null
*/
public abstract String readValueFrom(E gdb);
public abstract String getValue();
public abstract void updateFromDatabase(E found);
}
}