/**
* This software is provided under the terms of the Minecraft Forge Public
* License v1.0.
*/
package net.minecraftforge.common.config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import cpw.mods.fml.client.config.ConfigGuiType;
import cpw.mods.fml.client.config.GuiConfigEntries.IConfigEntry;
import cpw.mods.fml.client.config.GuiEditArrayEntries.IArrayEntry;
import cpw.mods.fml.client.config.IConfigElement;
/**
* This class bridges the gap between the FML config GUI classes and the Forge Configuration classes.
*/
public class ConfigElement<T> implements IConfigElement<T>
{
private Property prop;
private Property.Type type;
private boolean isProperty;
private ConfigCategory ctgy;
private boolean categoriesFirst = true;
public ConfigElement(ConfigCategory ctgy)
{
this.ctgy = ctgy;
isProperty = false;
}
public ConfigElement(Property prop)
{
this.prop = prop;
this.type = prop.getType();
this.isProperty = true;
}
public ConfigElement<T> listCategoriesFirst(boolean categoriesFirst)
{
this.categoriesFirst = categoriesFirst;
return this;
}
@Override
public List<IConfigElement> getChildElements()
{
if (!isProperty)
{
List<IConfigElement> elements = new ArrayList<IConfigElement>();
Iterator<ConfigCategory> ccI = ctgy.getChildren().iterator();
Iterator<Property> pI = ctgy.getOrderedValues().iterator();
int index = 0;
if (categoriesFirst)
while (ccI.hasNext())
{
ConfigElement temp = new ConfigElement(ccI.next());
if (temp.showInGui()) // don't bother adding elements that shouldn't show
elements.add(temp);
}
while (pI.hasNext())
{
ConfigElement<?> temp = getTypedElement(pI.next());
if (temp.showInGui())
elements.add(temp);
}
if (!categoriesFirst)
while (ccI.hasNext())
{
ConfigElement temp = new ConfigElement(ccI.next());
if (temp.showInGui())
elements.add(temp);
}
return elements;
}
return null;
}
public static ConfigElement<?> getTypedElement(Property prop)
{
switch (getType(prop))
{
case BOOLEAN:
return new ConfigElement<Boolean>(prop);
case DOUBLE:
return new ConfigElement<Double>(prop);
case INTEGER:
return new ConfigElement<Integer>(prop);
default:
return new ConfigElement<String>(prop);
}
}
@Override
public String getName()
{
return isProperty ? prop.getName() : ctgy.getName();
}
@Override
public boolean isProperty()
{
return isProperty;
}
@Override
public Class<? extends IConfigEntry> getConfigEntryClass()
{
return isProperty ? prop.getConfigEntryClass() : ctgy.getConfigEntryClass();
}
@Override
public Class<? extends IArrayEntry> getArrayEntryClass()
{
return isProperty ? prop.getArrayEntryClass() : null;
}
@Override
public String getQualifiedName()
{
return isProperty ? prop.getName() : ctgy.getQualifiedName();
}
@Override
public ConfigGuiType getType()
{
return isProperty ? getType(this.prop) : ConfigGuiType.CONFIG_CATEGORY;
}
public static ConfigGuiType getType(Property prop)
{
return prop.getType() == Property.Type.BOOLEAN ? ConfigGuiType.BOOLEAN : prop.getType() == Property.Type.DOUBLE ? ConfigGuiType.DOUBLE :
prop.getType() == Property.Type.INTEGER ? ConfigGuiType.INTEGER : prop.getType() == Property.Type.COLOR ? ConfigGuiType.COLOR :
prop.getType() == Property.Type.MOD_ID ? ConfigGuiType.MOD_ID : ConfigGuiType.STRING;
}
@Override
public boolean isList()
{
return isProperty && prop.isList();
}
@Override
public boolean isListLengthFixed()
{
return isProperty && prop.isListLengthFixed();
}
@Override
public int getMaxListLength()
{
return isProperty ? prop.getMaxListLength() : -1;
}
@Override
public String getComment()
{
return isProperty ? prop.comment : ctgy.getComment();
}
@Override
public boolean isDefault()
{
return !isProperty || prop.isDefault();
}
@Override
public void setToDefault()
{
if (isProperty)
prop.setToDefault();
}
@Override
public boolean requiresWorldRestart()
{
return isProperty ? prop.requiresWorldRestart() : ctgy.requiresWorldRestart();
}
@Override
public boolean showInGui()
{
return isProperty ? prop.showInGui() : ctgy.showInGui();
}
@Override
public boolean requiresMcRestart()
{
return isProperty ? prop.requiresMcRestart() : ctgy.requiresMcRestart();
}
@Override
public String[] getValidValues()
{
return isProperty ? prop.getValidValues() : null;
}
@Override
public String getLanguageKey()
{
return isProperty ? prop.getLanguageKey() : ctgy.getLanguagekey();
}
@Override
public Object getDefault()
{
return isProperty ? (T) prop.getDefault() : null;
}
@Override
public Object[] getDefaults()
{
if (isProperty)
{
String[] aVal = prop.getDefaults();
if (type == Property.Type.BOOLEAN)
{
Boolean[] ba = new Boolean[aVal.length];
for(int i = 0; i < aVal.length; i++)
ba[i] = Boolean.valueOf(aVal[i]);
return ba;
}
else if (type == Property.Type.DOUBLE)
{
Double[] da = new Double[aVal.length];
for(int i = 0; i < aVal.length; i++)
da[i] = Double.valueOf(aVal[i].toString());
return da;
}
else if (type == Property.Type.INTEGER)
{
Integer[] ia = new Integer[aVal.length];
for(int i = 0; i < aVal.length; i++)
ia[i] = Integer.valueOf(aVal[i].toString());
return ia;
}
else
return aVal;
}
return null;
}
@Override
public Pattern getValidationPattern()
{
return isProperty ? prop.getValidationPattern() : null;
}
@Override
public Object get()
{
return isProperty ? (T) prop.getString() : null;
}
@Override
public Object[] getList()
{
if (isProperty)
{
String[] aVal = prop.getStringList();
if (type == Property.Type.BOOLEAN)
{
Boolean[] ba = new Boolean[aVal.length];
for(int i = 0; i < aVal.length; i++)
ba[i] = Boolean.valueOf(aVal[i]);
return ba;
}
else if (type == Property.Type.DOUBLE)
{
Double[] da = new Double[aVal.length];
for(int i = 0; i < aVal.length; i++)
da[i] = Double.valueOf(aVal[i].toString());
return da;
}
else if (type == Property.Type.INTEGER)
{
Integer[] ia = new Integer[aVal.length];
for(int i = 0; i < aVal.length; i++)
ia[i] = Integer.valueOf(aVal[i].toString());
return ia;
}
else
return aVal;
}
return null;
}
@Override
public void set(T value)
{
if (isProperty)
{
if (type == Property.Type.BOOLEAN)
prop.set(Boolean.parseBoolean(value.toString()));
else if (type == Property.Type.DOUBLE)
prop.set(Double.parseDouble(value.toString()));
else if (type == Property.Type.INTEGER)
prop.set(Integer.parseInt(value.toString()));
else
prop.set(value.toString());
}
}
@Override
public void set(T[] aVal)
{
if (isProperty)
{
if (type == Property.Type.BOOLEAN)
{
boolean[] ba = new boolean[aVal.length];
for(int i = 0; i < aVal.length; i++)
ba[i] = Boolean.valueOf(aVal[i].toString());
prop.set(ba);
}
else if (type == Property.Type.DOUBLE)
{
double[] da = new double[aVal.length];
for(int i = 0; i < aVal.length; i++)
da[i] = Double.valueOf(aVal[i].toString());
prop.set(da);
}
else if (type == Property.Type.INTEGER)
{
int[] ia = new int[aVal.length];
for(int i = 0; i < aVal.length; i++)
ia[i] = Integer.valueOf(aVal[i].toString());
prop.set(ia);
}
else
{
String[] is = new String[aVal.length];
for(int i = 0; i < aVal.length; i++)
is[i] = aVal[i].toString();
prop.set(is);
}
}
}
@Override
public T getMinValue()
{
return isProperty ? (T) prop.getMinValue() : null;
}
@Override
public T getMaxValue()
{
return isProperty ? (T) prop.getMaxValue() : null;
}
}