package codechicken.nei.config; import codechicken.nei.NEIClientConfig; import codechicken.nei.config.GuiOptionList.OptionScrollSlot; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import java.util.ArrayList; import java.util.HashMap; public class OptionList extends OptionButton { public static final OptionList root = new RootOptionList(); private static class RootOptionList extends OptionList { public RootOptionList() { super(null); } @Override public ConfigSet globalConfigSet() { return null; } @Override public ConfigSet worldConfigSet() { return null; } @Override public OptionList configBase() { return null; } @Override public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) { return new GuiOptionList(parent, list, world); } } public static OptionList getOptionList(String fullName) { Option o = root.getOption(fullName); if (o == null) { root.addOption(o = new OptionList(fullName)); } return (OptionList) o; } public static void setOptionList(OptionList list) { OptionList prev = (OptionList) root.getOption(list.fullName()); if (prev == null) { root.addOption(list); } else { list.parent = prev.parent; list.options = prev.options; list.optionList = prev.optionList; for (Option o : list.optionList) { o.parent = list; } list.parent.options.put(list.fullName(), list); list.parent.optionList.remove(prev); list.parent.addSorted(list); } } public static String parent(String fullName) { int i = fullName.indexOf('.'); if (i < 0) { return fullName; } return fullName.substring(0, i); } public static String child(String fullName) { int i = fullName.indexOf('.'); return fullName.substring(i + 1); } public ArrayList<Option> optionList = new ArrayList<Option>(); public HashMap<String, Option> options = new HashMap<String, Option>(); public OptionList(String name) { super(name); } private OptionList subList(String fullName) { OptionList o = (OptionList) getOption(fullName); if (o == null) { addOption(o = new OptionList(fullName)); } return o; } public Option getOption(String fullName) { if (fullName.contains(".")) { return subList(parent(fullName)).getOption(child(fullName)); } return options.get(fullName); } public void addOption(Option o) { o.namespace = fullName(); addOption(o, o.fullName(), o.name); } private void addOption(Option o, String fullName, String subName) { if (subName.contains(".")) { subList(parent(subName)).addOption(o, fullName, child(subName)); return; } if (options.containsKey(subName)) { NEIClientConfig.logger.warn("Replacing option: " + fullName); } options.put(subName, o); addSorted(o); o.onAdded(this); } public void addSorted(Option o) { optionList.add(o); } /** * Create an instance of a GuiOptionList subclass for the given parameter list * * @param parent The parent screen for the back button * @param list The option list to be displayed in the gui * @param world true if in world config mode, false for global */ public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) { return this.parent.getGui(parent, list, world); } public void openGui(GuiScreen parent, boolean world) { Minecraft.getMinecraft().displayGuiScreen(getGui(parent, this, world)); } /** * Adds this option to a temporary slot and gui for internal setting manipulation. */ public void synthesizeEnvironment(boolean world) { getGui(null, this, world).addWidgets(); } @Override public boolean onClick(int button) { openGui(slot.getGui(), slot.getGui().worldConfig()); return true; } @Override public boolean showWorldSelector() { return false; } @Override public void onAdded(OptionScrollSlot slot) { super.onAdded(slot); globalConfigSet().config.getTag(configName()).useBraces(); worldConfigSet().config.getTag(configName()).useBraces(); } }