package codechicken.nei.config;
import codechicken.core.gui.GuiCCButton;
import codechicken.core.gui.GuiScreenWidget;
import codechicken.core.gui.GuiScrollSlot;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.LayoutManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static codechicken.lib.gui.GuiDraw.*;
import static net.minecraft.util.StatCollector.translateToLocal;
public class GuiOptionList extends GuiScreenWidget
{
public class OptionScrollSlot extends GuiScrollSlot
{
public ArrayList<Option> options = new ArrayList<Option>();
public OptionScrollSlot() {
super(0, 0, 0, 0);
setMargins(0, 4, 20, 4);
}
@Override
public void onAdded(GuiScreen s) {
super.onAdded(s);
for (Option o : optionList.optionList)
options.add(o);
for (Option o : options)
o.onAdded(this);
}
@Override
public int getSlotHeight(int slot) {
return options.get(slot).getHeight() + 4;
}
public int slotWidth() {
return windowBounds().width - 24;
}
private Rectangle slotBounds(int slot) {
return new Rectangle(24, 2, slotWidth(), getSlotHeight(slot) - 4);
}
@Override
protected int getNumSlots() {
return options.size();
}
@Override
protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
Option o = options.get(slot);
GlStateManager.translate(x, y, 0);
if (o.showWorldSelector() && world)
drawWorldSelector(o, mx, my);
GlStateManager.translate(24, 2, 0);
o.draw(mx - 24, my - 2, frame);
GlStateManager.translate(-x - 24, -y - 2, 0);
}
public Rectangle4i worldButtonSize() {
return new Rectangle4i(0, 2, 20, 20);
}
private void drawWorldSelector(Option o, int mousex, int mousey) {
Rectangle4i b = worldButtonSize();
boolean set = o.hasWorldOverride();
boolean mouseover = b.contains(mousex, mousey);
GlStateManager.color(1, 1, 1, 1);
LayoutManager.drawButtonBackground(b.x, b.y, b.w, b.h, true, !set ? 0 : mouseover ? 2 : 1);
drawStringC("W", b.x, b.y, b.w, b.h, -1);
}
@Override
public void drawBackground(float frame) {
Rectangle sbar = scrollbarBounds();
drawRect(sbar.x, y, sbar.x + sbar.width, y + height, 0xFF000000);
}
@Override
public void drawOverlay(float frame) {
OptionScrollPane.drawOverlay(y, height, parentScreen.width, zLevel);
}
@Override
public int scrollbarGuideAlignment() {
return 0;
}
@Override
public Dimension scrollbarDim() {
Dimension dim = super.scrollbarDim();
dim.width = 6;
return dim;
}
@Override
public void update() {
super.update();
for (Option o : options)
o.update();
}
@Override
protected void slotClicked(int slot, int button, int mx, int my, int count) {
Option o = options.get(slot);
if (world && o.showWorldSelector() && worldButtonSize().contains(mx, my)) {
if (button == 1 && o.hasWorldOverride()) {
o.useGlobals();
Option.playClickSound();
} else if (button == 0 && !o.hasWorldOverride()) {
o.copyGlobals();
Option.playClickSound();
}
} else if (slotBounds(slot).contains(mx, my))
options.get(slot).mouseClicked(mx - 24, my - 2, button);
}
@Override
public void mouseClicked(int mx, int my, int button) {
for (Option o : options)
o.onMouseClicked(mx, my, button);
super.mouseClicked(mx, my, button);
}
@Override
public void keyTyped(char c, int keycode) {
super.keyTyped(c, keycode);
for (Option o : options)
o.keyTyped(c, keycode);
}
public void resize() {
int width = Math.min(parentScreen.width - 80, 320);
setSize((parentScreen.width - width) / 2, 20, width, parentScreen.height - 50);
}
@Override
public void mouseScrolled(int x, int y, int scroll) {
scroll(-scroll);
}
public GuiOptionList getGui() {
return ((GuiOptionList) parentScreen);
}
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
int sy = my - y + scrolledPixels();
int slot = getSlot(sy);
if (slot >= 0)
tooltip = handleTooltip(slot, mx - x, sy - getSlotY(slot), tooltip);
return tooltip;
}
private List<String> handleTooltip(int slot, int mx, int my, List<String> tooltip) {
Option o = options.get(slot);
if (world && o.showWorldSelector() && worldButtonSize().contains(mx, my))
tooltip.add(translateToLocal("nei.options.wbutton.tip." + (o.hasWorldOverride() ? "1" : "0")));
if (slotBounds(slot).contains(mx, my))
return o.handleTooltip(mx - 24, my - 2, tooltip);
return tooltip;
}
}
protected final GuiScreen parent;
protected final OptionList optionList;
protected boolean world;
protected OptionScrollSlot slot;
protected GuiCCButton backButton;
protected GuiCCButton worldButton;
public GuiOptionList(GuiScreen parent, OptionList optionList, boolean world) {
this.parent = parent;
this.optionList = optionList;
this.world = world;
}
@Override
public void initGui() {
xSize = width;
ySize = height;
super.initGui();
}
@Override
public void resize() {
slot.resize();
backButton.width = Math.min(200, width - 40);
backButton.x = (width - backButton.width) / 2;
backButton.y = height - 25;
worldButton.width = 60;
worldButton.x = width - worldButton.width - 15;
}
@Override
public void addWidgets() {
add(slot = new OptionScrollSlot());
add(backButton = new GuiCCButton(0, 0, 0, 20, translateToLocal("nei.options.back")).setActionCommand("back"));
add(worldButton = new GuiCCButton(0, 2, 0, 16, worldButtonName()).setActionCommand("world"));
}
private String worldButtonName() {
return translateToLocal("nei.options." + (world ? "world" : "global"));
}
@Override
public void actionPerformed(String ident, Object... params) {
if (ident.equals("back")) {
if (parent instanceof GuiOptionList)
((GuiOptionList) parent).world = world;
Minecraft.getMinecraft().displayGuiScreen(parent);
} else if (ident.equals("world")) {
world = !world;
worldButton.text = worldButtonName();
}
}
@Override
public void drawBackground() {
drawDefaultBackground();
}
@Override
public void drawForeground() {
drawCenteredString(fontRenderer, translateToLocal(optionList.fullName()), width / 2, 6, -1);
drawTooltip();
}
private void drawTooltip() {
List<String> tooltip = new LinkedList<String>();
Point mouse = getMousePosition();
if (worldButton.pointInside(mouse.x, mouse.y))
tooltip.addAll(Arrays.asList(translateToLocal("nei.options.global.tip." + (world ? "1" : "0")).split(":")));
tooltip = slot.handleTooltip(mouse.x, mouse.y, tooltip);
drawMultilineTip(mouse.x + 12, mouse.y - 12, tooltip);
}
@Override
public boolean doesGuiPauseGame() {
return false;
}
@Override
public void keyTyped(char c, int keycode) throws IOException {
if (keycode == 1) {//esc
GuiScreen p = parent;
while (p instanceof GuiOptionList)
p = ((GuiOptionList) p).parent;
Minecraft.getMinecraft().displayGuiScreen(p);
} else {
super.keyTyped(c, keycode);
}
}
public boolean worldConfig() {
return world;
}
}