package advancedsystemsmanager.client.gui;
import advancedsystemsmanager.api.network.IPacketSync;
import advancedsystemsmanager.containers.ContainerManager;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.client.gui.pong.GuiPong;
import advancedsystemsmanager.helpers.CollisionHelper;
import advancedsystemsmanager.network.MessageHandler;
import advancedsystemsmanager.network.message.SecretMessage;
import advancedsystemsmanager.reference.Mods;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.registry.ThemeHandler;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import codechicken.nei.VisiblityData;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
@SideOnly(Side.CLIENT)
public class GuiManager extends GuiBase
{
private static final ResourceLocation background = registerTexture("background");
private static final ResourceLocation COMPONENTS = registerTexture("components");
public static int GUI_HEIGHT = 256;
public static int GUI_WIDTH = 512;
public static int Z_LEVEL_COMPONENT_OPEN_DIFFERENCE = 70;
public static int Z_LEVEL_COMPONENT_CLOSED_DIFFERENCE = 1;
public static int Z_LEVEL_COMPONENT_START = 500;
public static int Z_LEVEL_OPEN_MAXIMUM = 5;
public IPacketSync selectedComponent;
private long lastTicks;
private boolean useButtons = true;
private boolean useInfo = true;
private boolean useMouseOver = true;
private boolean closeSpecialRenderer;
private TileEntityManager manager;
private List<SecretCode> codes = new ArrayList<SecretCode>();
{
// codes.add(new SecretCode("animate")
// {
// @Override
// protected void trigger()
// {
// controller = new AnimationController(manager, 2);
// }
// });
// codes.add(new SecretCode("animslow")
// {
// @Override
// protected void trigger()
// {
// controller = new AnimationController(manager, 1);
// }
// });
// codes.add(new SecretCode("animfast")
// {
// @Override
// protected void trigger()
// {
// controller = new AnimationController(manager, 5);
// }
// });
// codes.add(new SecretCode("animrapid")
// {
// @Override
// protected void trigger()
// {
// controller = new AnimationController(manager, 20);
// }
// });
// codes.add(new SecretCode("animinstant")
// {
// @Override
// protected void trigger()
// {
// controller = new AnimationController(manager, 100);
// }
// });
codes.add(new SecretCode("buttons")
{
@Override
protected void trigger()
{
useButtons = !useButtons;
}
});
codes.add(new SecretCode("info")
{
@Override
protected void trigger()
{
useInfo = !useInfo;
}
});
codes.add(new SecretCode("mouse")
{
@Override
protected void trigger()
{
useMouseOver = !useMouseOver;
}
});
codes.add(new SecretCode(new char[]{200, 200, 208, 208, 203, 205, 203, 205, 'b', 'a'})
{
@Override
protected void trigger()
{
MessageHandler.INSTANCE.sendToServer(new SecretMessage());
}
});
codes.add(new SecretCode("pong")
{
@Override
protected void trigger()
{
manager.specialRenderer = new GuiPong();
}
});
}
public GuiManager(TileEntityManager manager, InventoryPlayer player)
{
super(new ContainerManager(manager, player));
xSize = GUI_WIDTH;
ySize = GUI_HEIGHT;
this.zLevel = 0;
this.manager = manager;
Keyboard.enableRepeatEvents(true);
}
@Override
public ResourceLocation getComponentResource()
{
return COMPONENTS;
}
@Override
@Optional.Method(modid = Mods.NEI)
public VisiblityData modifyVisiblity(GuiContainer guiContainer, VisiblityData visiblityData)
{
visiblityData.showNEI = false;
return visiblityData;
}
@Override
protected void drawGuiBackground(float partialTick, int mX, int mY)
{
mX = scaleX(mX);
mY = scaleY(mY);
drawBackground();
mX -= guiLeft;
mY -= guiTop;
bindTexture(COMPONENTS);
if (closeSpecialRenderer)
{
manager.specialRenderer = null;
closeSpecialRenderer = false;
} else if (hasSpecialRenderer())
{
getSpecialRenderer().draw(this, mX, mY);
getSpecialRenderer().drawMouseOver(this, mX, mY);
return;
}
if (useButtons)
{
manager.buttons.draw(this, mX, mY, 0);
}
//update components completely independent on their visibility
long ms = Minecraft.getSystemTime();
float elapsedSeconds = (ms - this.lastTicks) / 1000F;
// if (controller != null)
// {
// controller.update(elapsedSeconds);
// }
for (FlowComponent component : manager.getFlowItems())
{
component.update(elapsedSeconds);
}
this.lastTicks = ms;
int zLevel = Z_LEVEL_COMPONENT_START;
int openCount = 0;
for (FlowComponent itemBase : manager.getZLevelRenderingList())
{
if (itemBase.isVisible())
{
if (itemBase.isOpen() && openCount == Z_LEVEL_OPEN_MAXIMUM)
{
itemBase.close();
}
if (itemBase.isOpen())
{
zLevel -= Z_LEVEL_COMPONENT_OPEN_DIFFERENCE;
openCount++;
} else
{
zLevel -= Z_LEVEL_COMPONENT_CLOSED_DIFFERENCE;
}
itemBase.draw(this, mX, mY, zLevel);
if (itemBase.isBeingMoved() || CollisionHelper.inBounds(itemBase.getX(), itemBase.getY(), itemBase.getComponentWidth(), itemBase.getComponentHeight(), mX, mY))
{
CollisionHelper.disable();
}
}
}
CollisionHelper.enable();
if (useInfo)
{
drawString(getInfo(), 5, ySize - 13, 1F, 0x606060);
}
if (useMouseOver)
{
if (useButtons)
{
manager.buttons.drawMouseOver(this, mX, mY);
}
for (FlowComponent itemBase : manager.getZLevelRenderingList())
{
if (itemBase.isVisible())
{
itemBase.drawMouseOver(this, mX, mY);
if (itemBase.isBeingMoved() || CollisionHelper.inBounds(itemBase.getX(), itemBase.getY(), itemBase.getComponentWidth(), itemBase.getComponentHeight(), mX, mY))
{
CollisionHelper.disable();
}
}
}
}
CollisionHelper.enable();
}
private void drawBackground()
{
bindTexture(background);
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawing(GL11.GL_QUAD_STRIP);
int[] colour = ThemeHandler.theme.managerBackground.getColour();
tessellator.setColorRGBA(colour[0], colour[1], colour[2], colour[3]);
tessellator.addVertexWithUV(0, 0, zLevel, 0.0f, 0.0f);
tessellator.addVertexWithUV(0, 256, zLevel, 0.0f, 1.0f);
tessellator.addVertexWithUV(256, 0, zLevel, 1.0f, 0.0f);
tessellator.addVertexWithUV(256, 256, zLevel, 1.0f, 1.0f);
tessellator.addVertexWithUV(512, 0, zLevel, 0.0f, 0f);
tessellator.addVertexWithUV(512, 256, zLevel, 0.0f, 1.0f);
tessellator.draw();
}
private boolean hasSpecialRenderer()
{
return getSpecialRenderer() != null;
}
private IInterfaceRenderer getSpecialRenderer()
{
return manager.specialRenderer;
}
private String getInfo()
{
String ret = StatCollector.translateToLocalFormatted(Names.COMMANDS, manager.getFlowItems().size());
String path = "";
FlowComponent component = manager.getSelectedGroup();
if (component != null)
{
ret += "|";
}
while (component != null)
{
String nextPath = "> " + component.getName() + " " + path;
if (getStringWidth(ret + nextPath) > xSize - 15)
{
path = "... " + path;
break;
}
path = nextPath;
component = component.getParent();
}
ret += path;
return ret;
}
@Override
protected void mouseClicked(int x, int y, int button)
{
x = scaleX(x);
y = scaleY(y);
super.mouseClicked(x, y, button);
x -= guiLeft;
y -= guiTop;
if (hasSpecialRenderer())
{
getSpecialRenderer().onClick(this, x, y, button);
return;
}
for (ListIterator<FlowComponent> itr = manager.getZLevelRenderingList().listIterator(); itr.hasNext(); )
{
FlowComponent itemBase = itr.next();
if (itemBase.isVisible() && itemBase.onClick(x, y, button))
{
itr.remove();
manager.getZLevelRenderingList().add(0, itemBase);
setSelected(itemBase);
return;
}
}
if (useButtons)
{
manager.buttons.onClick(x, y, button);
}
}
@Override
protected void mouseClickMove(int x, int y, int button, long ticks)
{
x = scaleX(x);
y = scaleY(y);
super.mouseClickMove(x, y, button, ticks);
x -= guiLeft;
y -= guiTop;
if (hasSpecialRenderer())
{
getSpecialRenderer().onDrag(this, x, y);
return;
}
if (selectedComponent instanceof FlowComponent)
{
FlowComponent dragged = (FlowComponent)selectedComponent;
dragged.onDrag(x, y, button);
}
}
@Override
protected void mouseMovedOrUp(int x, int y, int button)
{
x = scaleX(x);
y = scaleY(y);
super.mouseMovedOrUp(x, y, button);
x -= guiLeft;
y -= guiTop;
if (hasSpecialRenderer())
{
getSpecialRenderer().onRelease(this, x, y, button);
return;
}
if (useButtons)
{
manager.buttons.onClick(x, y, button, true);
}
if (selectedComponent instanceof FlowComponent)
{
FlowComponent released = (FlowComponent)selectedComponent;
if (!manager.serverPacket)
{
for (FlowComponent itemBase : manager.getZLevelRenderingList())
{
if (itemBase.isVisible())
{
itemBase.onRelease(x, y, button);
}
}
}
released.postRelease();
}
}
@Override
protected void keyTyped(char c, int k)
{
if (hasSpecialRenderer())
{
if (c == 1)
{
closeSpecialRenderer = true;
return;
}
if (getSpecialRenderer().onKeyTyped(this, c, k))
{
return;
}
} else
{
if (selectedComponent instanceof FlowComponent)
{
if (((FlowComponent)selectedComponent).onKeyStroke(this, c, k) && k != 1) return;
}
boolean recognized = false;
for (SecretCode code : codes)
{
if (code.keyTyped(c, k))
{
recognized = true;
}
}
if (recognized)
{
return;
}
}
super.keyTyped(c, k);
}
@Override
public void onGuiClosed()
{
Keyboard.enableRepeatEvents(false);
for (FlowComponent flowComponent : manager.getFlowItems())
{
flowComponent.onGuiClosed();
}
manager.specialRenderer = null;
super.onGuiClosed();
}
public void setSelected(IPacketSync selected)
{
this.selectedComponent = selected;
}
public void handleMouseInput()
{
super.handleMouseInput();
int scroll = Mouse.getEventDWheel();
if (scroll != 0)
{
if (hasSpecialRenderer())
{
getSpecialRenderer().onScroll(scroll);
return;
}
for (FlowComponent component : manager.getZLevelRenderingList())
{
if (component.isVisible())
{
component.doScroll(scroll);
return;
}
}
}
}
public TileEntityManager getManager()
{
return manager;
}
private abstract class SecretCode
{
private final char[] code;
private int triggerNumber;
private SecretCode(String code)
{
this(code.toCharArray());
}
private SecretCode(char[] code)
{
this.code = code;
}
public boolean keyTyped(char c, int k)
{
if (Character.isAlphabetic(c))
{
if (code[triggerNumber] == c)
{
triggerNumber++;
if (triggerNumber == code.length)
{
triggerNumber = 0;
trigger();
}
return true;
} else if (triggerNumber != 0)
{
triggerNumber = 0;
keyTyped(c, k);
}
} else if (code[triggerNumber] == k)
{
triggerNumber++;
if (triggerNumber == code.length)
{
triggerNumber = 0;
trigger();
}
return true;
}
return false;
}
protected abstract void trigger();
}
}