package openmods.gui.component;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import openmods.gui.listener.IKeyTypedListener;
import openmods.gui.listener.IMouseDownListener;
import openmods.gui.listener.IMouseDragListener;
import openmods.gui.listener.IMouseUpListener;
import openmods.utils.TextureUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public abstract class BaseComponent extends Gui {
protected static final RenderItem ITEM_RENDERER = new RenderItem();
private static final int CRAZY_1 = 0x505000FF;
private static final int CRAZY_2 = (CRAZY_1 & 0xFEFEFE) >> 1 | CRAZY_1 & -0xFF000000;
private static final int CRAZY_3 = 0xF0100010;
public final static ResourceLocation TEXTURE_SHEET = new ResourceLocation("openmodslib", "textures/gui/components.png");
public static void bindComponentsSheet() {
TextureUtils.bindTextureToClient(TEXTURE_SHEET);
}
protected int x;
protected int y;
protected boolean enabled = true;
private IKeyTypedListener keyListener;
private IMouseDownListener mouseDownListener;
private IMouseUpListener mouseUpListener;
private IMouseDragListener mouseDragListener;
public BaseComponent(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public abstract int getWidth();
public abstract int getHeight();
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isEnabled() {
return enabled;
}
public boolean isMouseOver(int mouseX, int mouseY) {
return mouseX >= x && mouseX < x + getWidth() && mouseY >= y && mouseY < y + getHeight();
}
public void setListener(IKeyTypedListener keyListener) {
this.keyListener = keyListener;
}
public void setListener(IMouseDownListener mouseDownListener) {
this.mouseDownListener = mouseDownListener;
}
public void setListener(IMouseUpListener mouseUpListener) {
this.mouseUpListener = mouseUpListener;
}
public void setListener(IMouseDragListener mouseDragListener) {
this.mouseDragListener = mouseDragListener;
}
public abstract void render(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY);
public abstract void renderOverlay(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY);
public void keyTyped(char keyChar, int keyCode) {
if (keyListener != null) keyListener.componentKeyTyped(this, keyChar, keyCode);
}
public void mouseDown(int mouseX, int mouseY, int button) {
if (mouseDownListener != null) mouseDownListener.componentMouseDown(this, mouseX, mouseY, button);
}
public void mouseUp(int mouseX, int mouseY, int button) {
if (mouseUpListener != null) mouseUpListener.componentMouseUp(this, mouseX, mouseY, button);
}
public void mouseDrag(int mouseX, int mouseY, int button, /* love you */long time) {
if (mouseDragListener != null) mouseDragListener.componentMouseDrag(this, mouseX, mouseY, button, time);
}
public boolean isTicking() {
return false;
}
public void tick() {}
private void drawFancyBox(int width, final int left, final int top, int height) {
drawGradientRect(left - 3, top - 4, left + width + 3, top - 3, CRAZY_3, CRAZY_3);
drawGradientRect(left - 3, top + height + 3, left + width + 3, top + height + 4, CRAZY_3, CRAZY_3);
drawGradientRect(left - 3, top - 3, left + width + 3, top + height + 3, CRAZY_3, CRAZY_3);
drawGradientRect(left - 4, top - 3, left - 3, top + height + 3, CRAZY_3, CRAZY_3);
drawGradientRect(left + width + 3, top - 3, left + width + 4, top + height + 3, CRAZY_3, CRAZY_3);
drawGradientRect(left - 3, top - 3 + 1, left - 3 + 1, top + height + 3 - 1, CRAZY_1, CRAZY_2);
drawGradientRect(left + width + 2, top - 3 + 1, left + width + 3, top + height + 3 - 1, CRAZY_1, CRAZY_2);
drawGradientRect(left - 3, top - 3, left + width + 3, top - 3 + 1, CRAZY_1, CRAZY_1);
drawGradientRect(left - 3, top + height + 2, left + width + 3, top + height + 3, CRAZY_2, CRAZY_2);
}
protected void drawHoveringText(String line, int x, int y, FontRenderer font) {
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
GL11.glDisable(GL11.GL_DEPTH_TEST);
this.zLevel = 350.0F;
final int width = font.getStringWidth(line);
drawFancyBox(width, x + 12, y - 12, 8);
font.drawStringWithShadow(line, x + 12, y - 12, -1);
this.zLevel = 0.0F;
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
}
protected void drawHoveringText(List<String> lines, int x, int y, FontRenderer font) {
final int lineCount = lines.size();
if (lineCount == 0) return;
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
GL11.glDisable(GL11.GL_DEPTH_TEST);
int width = 0;
for (String s : lines) {
int l = font.getStringWidth(s);
if (l > width) width = l;
}
final int left = x + 12;
int top = y - 12;
int height = 8;
if (lineCount > 1) height += 2 + (lineCount - 1) * 10;
this.zLevel = 350.0F;
drawFancyBox(width, left, top, height);
for (int i = 0; i < lineCount; ++i) {
String line = lines.get(i);
font.drawStringWithShadow(line, left, top, -1);
if (i == 0) top += 2;
top += 10;
}
this.zLevel = 0.0F;
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
}
public void drawItemStack(ItemStack stack, int x, int y, String overlayText) {
this.zLevel = 200.0F;
ITEM_RENDERER.zLevel = 200.0F;
RenderHelper.enableGUIStandardItemLighting();
GL11.glColor3f(1f, 1f, 1f);
GL11.glEnable(GL11.GL_NORMALIZE);
FontRenderer font = null;
if (stack != null) font = stack.getItem().getFontRenderer(stack);
if (font == null) font = Minecraft.getMinecraft().fontRenderer;
ITEM_RENDERER.renderItemAndEffectIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, x, y);
ITEM_RENDERER.renderItemOverlayIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, x, y, overlayText);
this.zLevel = 0.0F;
ITEM_RENDERER.zLevel = 0.0F;
RenderHelper.disableStandardItemLighting();
}
}