package codechicken.nei.config; import codechicken.lib.vec.Rectangle4i; import codechicken.nei.LayoutManager; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import java.util.*; import static codechicken.lib.gui.GuiDraw.drawString; public abstract class OptionStringSet extends Option { public LinkedList<String> options = new LinkedList<String>(); public Multimap<String, String> dependants = ArrayListMultimap.create(); public Map<String, String> dependancies = new HashMap<String, String>(); public Multimap<String, String> groups = ArrayListMultimap.create(); public OptionStringSet(String name) { super(name); } public void addDep(String base, String dep) { dependants.put(dep, base); dependancies.put(base, dep); } @Override public void draw(int mousex, int mousey, float frame) { drawPrefix(); drawButtons(); drawIcons(); } public void drawPrefix() { drawString(translateN(name), 10, 6, -1); } public void drawButtons() { int x = buttonX(); List<String> values = values(); for (String option : options) { LayoutManager.drawButtonBackground(x, 0, 20, 20, true, values.contains(option) ? 1 : 0); x += 24; } } public abstract void drawIcons(); @Override public List<String> handleTooltip(int mousex, int mousey, List<String> currenttip) { if (new Rectangle4i(4, 4, 50, 20).contains(mousex, mousey)) { currenttip.add(translateN(name + ".tip")); } int x = buttonX(); for (String option : options) { if (new Rectangle4i(x, 0, 20, 20).contains(mousex, mousey)) { currenttip.add(translateN(name + "." + option)); } x += 24; } return currenttip; } @Override public void mouseClicked(int x, int y, int button) { if (clickButton(x, y, button)) { playClickSound(); } } public boolean clickButton(int mousex, int mousey, int button) { int x = buttonX(); List<String> values = values(); for (int i = 0; i < options.size(); i++) { if (new Rectangle4i(x, 0, 20, 20).contains(mousex, mousey)) { String s = options.get(i); boolean set = values.contains(s); if (button == 0 && !set) { setValue(s); return true; } if (button == 1 && set) { remValue(s); return true; } return false; } x += 24; } return false; } public void setValue(String s) { if (values().contains(s)) { return; } String dep = dependancies.get(s); if (dep != null) { setValue(dep); } if (groups.containsKey(s)) { for (String grp : groups.get(s)) { setValue(grp); } } else { List<String> setUtils = new LinkedList<String>(values()); setUtils.add(s); setValues(setUtils); } } public void remValue(String s) { for (String dep : dependants.get(s)) { remValue(dep); } if (groups.containsKey(s)) { for (String grp : groups.get(s)) { remValue(grp); } } else { List<String> values = new LinkedList<String>(values()); values.remove(s); setValues(values); } } public void setValues(List<String> values) { StringBuilder sb = new StringBuilder(); for (String s : values) { if (sb.length() > 0) { sb.append(", "); } sb.append(s); } getTag().setValue(sb.toString()); } public List<String> values() { return Arrays.asList(renderTag().getValue().replace(" ", "").split(",")); } public int buttonX() { return slot.slotWidth() - (24 * options.size() - 4); } }