package net.minecraft.client.gui;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
@SideOnly(Side.CLIENT)
public abstract class GuiSlot
{
private final Minecraft mc;
/**
* The width of the GuiScreen. Affects the container rendering, but not the overlays.
*/
private int width;
/**
* The height of the GuiScreen. Affects the container rendering, but not the overlays or the scrolling.
*/
private int height;
/** The top of the slot container. Affects the overlays and scrolling. */
protected int top;
/** The bottom of the slot container. Affects the overlays and scrolling. */
protected int bottom;
private int right;
private int left;
/** The height of a slot. */
protected final int slotHeight;
/** button id of the button used to scroll up */
private int scrollUpButtonID;
/** the buttonID of the button used to scroll down */
private int scrollDownButtonID;
/** X axis position of the mouse */
protected int mouseX;
/** Y axis position of the mouse */
protected int mouseY;
/** where the mouse was in the window when you first clicked to scroll */
private float initialClickY = -2.0F;
/**
* what to multiply the amount you moved your mouse by(used for slowing down scrolling when over the items and no on
* scroll bar)
*/
private float scrollMultiplier;
/** how far down this slot has been scrolled */
private float amountScrolled;
/** the element in the list that was selected */
private int selectedElement = -1;
/** the time when this button was last clicked. */
private long lastClicked = 0L;
/** true if a selected element in this gui will show an outline box */
private boolean showSelectionBox = true;
private boolean field_77243_s;
private int field_77242_t;
public String BACKGROUND_IMAGE = "/gui/background.png";
public GuiSlot(Minecraft par1Minecraft, int par2, int par3, int par4, int par5, int par6)
{
this.mc = par1Minecraft;
this.width = par2;
this.height = par3;
this.top = par4;
this.bottom = par5;
this.slotHeight = par6;
this.left = 0;
this.right = par2;
}
public void func_77207_a(int par1, int par2, int par3, int par4)
{
this.width = par1;
this.height = par2;
this.top = par3;
this.bottom = par4;
this.left = 0;
this.right = par1;
}
public void setShowSelectionBox(boolean par1)
{
this.showSelectionBox = par1;
}
protected void func_77223_a(boolean par1, int par2)
{
this.field_77243_s = par1;
this.field_77242_t = par2;
if (!par1)
{
this.field_77242_t = 0;
}
}
/**
* Gets the size of the current slot list.
*/
protected abstract int getSize();
/**
* the element in the slot that was clicked, boolean for wether it was double clicked or not
*/
protected abstract void elementClicked(int var1, boolean var2);
/**
* returns true if the element passed in is currently selected
*/
protected abstract boolean isSelected(int var1);
/**
* return the height of the content being scrolled
*/
protected int getContentHeight()
{
return this.getSize() * this.slotHeight + this.field_77242_t;
}
protected abstract void drawBackground();
protected abstract void drawSlot(int var1, int var2, int var3, int var4, Tessellator var5);
protected void func_77222_a(int par1, int par2, Tessellator par3Tessellator) {}
protected void func_77224_a(int par1, int par2) {}
protected void func_77215_b(int par1, int par2) {}
public int func_77210_c(int par1, int par2)
{
int var3 = this.width / 2 - 110;
int var4 = this.width / 2 + 110;
int var5 = par2 - this.top - this.field_77242_t + (int)this.amountScrolled - 4;
int var6 = var5 / this.slotHeight;
return par1 >= var3 && par1 <= var4 && var6 >= 0 && var5 >= 0 && var6 < this.getSize() ? var6 : -1;
}
/**
* Registers the IDs that can be used for the scrollbar's buttons.
*/
public void registerScrollButtons(List par1List, int par2, int par3)
{
this.scrollUpButtonID = par2;
this.scrollDownButtonID = par3;
}
/**
* stop the thing from scrolling out of bounds
*/
private void bindAmountScrolled()
{
int var1 = this.func_77209_d();
if (var1 < 0)
{
var1 /= 2;
}
if (this.amountScrolled < 0.0F)
{
this.amountScrolled = 0.0F;
}
if (this.amountScrolled > (float)var1)
{
this.amountScrolled = (float)var1;
}
}
public int func_77209_d()
{
return this.getContentHeight() - (this.bottom - this.top - 4);
}
public void func_77208_b(int par1)
{
this.amountScrolled += (float)par1;
this.bindAmountScrolled();
this.initialClickY = -2.0F;
}
public void actionPerformed(GuiButton par1GuiButton)
{
if (par1GuiButton.enabled)
{
if (par1GuiButton.id == this.scrollUpButtonID)
{
this.amountScrolled -= (float)(this.slotHeight * 2 / 3);
this.initialClickY = -2.0F;
this.bindAmountScrolled();
}
else if (par1GuiButton.id == this.scrollDownButtonID)
{
this.amountScrolled += (float)(this.slotHeight * 2 / 3);
this.initialClickY = -2.0F;
this.bindAmountScrolled();
}
}
}
/**
* draws the slot to the screen, pass in mouse's current x and y and partial ticks
*/
public void drawScreen(int par1, int par2, float par3)
{
this.mouseX = par1;
this.mouseY = par2;
this.drawBackground();
int var4 = this.getSize();
int var5 = this.getScrollBarX();
int var6 = var5 + 6;
int var9;
int var10;
int var11;
int var13;
int var19;
if (Mouse.isButtonDown(0))
{
if (this.initialClickY == -1.0F)
{
boolean var7 = true;
if (par2 >= this.top && par2 <= this.bottom)
{
int var8 = this.width / 2 - 110;
var9 = this.width / 2 + 110;
var10 = par2 - this.top - this.field_77242_t + (int)this.amountScrolled - 4;
var11 = var10 / this.slotHeight;
if (par1 >= var8 && par1 <= var9 && var11 >= 0 && var10 >= 0 && var11 < var4)
{
boolean var12 = var11 == this.selectedElement && Minecraft.getSystemTime() - this.lastClicked < 250L;
this.elementClicked(var11, var12);
this.selectedElement = var11;
this.lastClicked = Minecraft.getSystemTime();
}
else if (par1 >= var8 && par1 <= var9 && var10 < 0)
{
this.func_77224_a(par1 - var8, par2 - this.top + (int)this.amountScrolled - 4);
var7 = false;
}
if (par1 >= var5 && par1 <= var6)
{
this.scrollMultiplier = -1.0F;
var19 = this.func_77209_d();
if (var19 < 1)
{
var19 = 1;
}
var13 = (int)((float)((this.bottom - this.top) * (this.bottom - this.top)) / (float)this.getContentHeight());
if (var13 < 32)
{
var13 = 32;
}
if (var13 > this.bottom - this.top - 8)
{
var13 = this.bottom - this.top - 8;
}
this.scrollMultiplier /= (float)(this.bottom - this.top - var13) / (float)var19;
}
else
{
this.scrollMultiplier = 1.0F;
}
if (var7)
{
this.initialClickY = (float)par2;
}
else
{
this.initialClickY = -2.0F;
}
}
else
{
this.initialClickY = -2.0F;
}
}
else if (this.initialClickY >= 0.0F)
{
this.amountScrolled -= ((float)par2 - this.initialClickY) * this.scrollMultiplier;
this.initialClickY = (float)par2;
}
}
else
{
while (!this.mc.gameSettings.touchscreen && Mouse.next())
{
int var16 = Mouse.getEventDWheel();
if (var16 != 0)
{
if (var16 > 0)
{
var16 = -1;
}
else if (var16 < 0)
{
var16 = 1;
}
this.amountScrolled += (float)(var16 * this.slotHeight / 2);
}
}
this.initialClickY = -1.0F;
}
this.bindAmountScrolled();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_FOG);
Tessellator var18 = Tessellator.instance;
drawContainerBackground(var18);
var9 = this.width / 2 - 92 - 16;
var10 = this.top + 4 - (int)this.amountScrolled;
if (this.field_77243_s)
{
this.func_77222_a(var9, var10, var18);
}
int var14;
for (var11 = 0; var11 < var4; ++var11)
{
var19 = var10 + var11 * this.slotHeight + this.field_77242_t;
var13 = this.slotHeight - 4;
if (var19 <= this.bottom && var19 + var13 >= this.top)
{
if (this.showSelectionBox && this.isSelected(var11))
{
var14 = this.width / 2 - 110;
int var15 = this.width / 2 + 110;
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glDisable(GL11.GL_TEXTURE_2D);
var18.startDrawingQuads();
var18.setColorOpaque_I(8421504);
var18.addVertexWithUV((double)var14, (double)(var19 + var13 + 2), 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)var15, (double)(var19 + var13 + 2), 0.0D, 1.0D, 1.0D);
var18.addVertexWithUV((double)var15, (double)(var19 - 2), 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)var14, (double)(var19 - 2), 0.0D, 0.0D, 0.0D);
var18.setColorOpaque_I(0);
var18.addVertexWithUV((double)(var14 + 1), (double)(var19 + var13 + 1), 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)(var15 - 1), (double)(var19 + var13 + 1), 0.0D, 1.0D, 1.0D);
var18.addVertexWithUV((double)(var15 - 1), (double)(var19 - 1), 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)(var14 + 1), (double)(var19 - 1), 0.0D, 0.0D, 0.0D);
var18.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
this.drawSlot(var11, var9, var19, var13, var18);
}
}
GL11.glDisable(GL11.GL_DEPTH_TEST);
byte var20 = 4;
this.overlayBackground(0, this.top, 255, 255);
this.overlayBackground(this.bottom, this.height, 255, 255);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glDisable(GL11.GL_TEXTURE_2D);
var18.startDrawingQuads();
var18.setColorRGBA_I(0, 0);
var18.addVertexWithUV((double)this.left, (double)(this.top + var20), 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)this.right, (double)(this.top + var20), 0.0D, 1.0D, 1.0D);
var18.setColorRGBA_I(0, 255);
var18.addVertexWithUV((double)this.right, (double)this.top, 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)this.left, (double)this.top, 0.0D, 0.0D, 0.0D);
var18.draw();
var18.startDrawingQuads();
var18.setColorRGBA_I(0, 255);
var18.addVertexWithUV((double)this.left, (double)this.bottom, 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)this.right, (double)this.bottom, 0.0D, 1.0D, 1.0D);
var18.setColorRGBA_I(0, 0);
var18.addVertexWithUV((double)this.right, (double)(this.bottom - var20), 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)this.left, (double)(this.bottom - var20), 0.0D, 0.0D, 0.0D);
var18.draw();
var19 = this.func_77209_d();
if (var19 > 0)
{
var13 = (this.bottom - this.top) * (this.bottom - this.top) / this.getContentHeight();
if (var13 < 32)
{
var13 = 32;
}
if (var13 > this.bottom - this.top - 8)
{
var13 = this.bottom - this.top - 8;
}
var14 = (int)this.amountScrolled * (this.bottom - this.top - var13) / var19 + this.top;
if (var14 < this.top)
{
var14 = this.top;
}
var18.startDrawingQuads();
var18.setColorRGBA_I(0, 255);
var18.addVertexWithUV((double)var5, (double)this.bottom, 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)var6, (double)this.bottom, 0.0D, 1.0D, 1.0D);
var18.addVertexWithUV((double)var6, (double)this.top, 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)var5, (double)this.top, 0.0D, 0.0D, 0.0D);
var18.draw();
var18.startDrawingQuads();
var18.setColorRGBA_I(8421504, 255);
var18.addVertexWithUV((double)var5, (double)(var14 + var13), 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)var6, (double)(var14 + var13), 0.0D, 1.0D, 1.0D);
var18.addVertexWithUV((double)var6, (double)var14, 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)var5, (double)var14, 0.0D, 0.0D, 0.0D);
var18.draw();
var18.startDrawingQuads();
var18.setColorRGBA_I(12632256, 255);
var18.addVertexWithUV((double)var5, (double)(var14 + var13 - 1), 0.0D, 0.0D, 1.0D);
var18.addVertexWithUV((double)(var6 - 1), (double)(var14 + var13 - 1), 0.0D, 1.0D, 1.0D);
var18.addVertexWithUV((double)(var6 - 1), (double)var14, 0.0D, 1.0D, 0.0D);
var18.addVertexWithUV((double)var5, (double)var14, 0.0D, 0.0D, 0.0D);
var18.draw();
}
this.func_77215_b(par1, par2);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glDisable(GL11.GL_BLEND);
}
protected int getScrollBarX()
{
return this.width / 2 + 124;
}
/**
* Overlays the background to hide scrolled items
*/
protected void overlayBackground(int par1, int par2, int par3, int par4)
{
Tessellator var5 = Tessellator.instance;
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(BACKGROUND_IMAGE));
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
float var6 = 32.0F;
var5.startDrawingQuads();
var5.setColorRGBA_I(4210752, par4);
var5.addVertexWithUV(0.0D, (double)par2, 0.0D, 0.0D, (double)((float)par2 / var6));
var5.addVertexWithUV((double)this.width, (double)par2, 0.0D, (double)((float)this.width / var6), (double)((float)par2 / var6));
var5.setColorRGBA_I(4210752, par3);
var5.addVertexWithUV((double)this.width, (double)par1, 0.0D, (double)((float)this.width / var6), (double)((float)par1 / var6));
var5.addVertexWithUV(0.0D, (double)par1, 0.0D, 0.0D, (double)((float)par1 / var6));
var5.draw();
}
protected void drawContainerBackground(Tessellator tess)
{
GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(BACKGROUND_IMAGE));
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
float height = 32.0F;
tess.startDrawingQuads();
tess.setColorOpaque_I(2105376);
tess.addVertexWithUV((double)left, (double)bottom, 0.0D, (double)(left / height), (double)((bottom + (int)amountScrolled) / height));
tess.addVertexWithUV((double)right, (double)bottom, 0.0D, (double)(right / height), (double)((bottom + (int)amountScrolled) / height));
tess.addVertexWithUV((double)right, (double)top, 0.0D, (double)(right / height), (double)((top + (int)amountScrolled) / height));
tess.addVertexWithUV((double)left, (double)top, 0.0D, (double)(left / height), (double)((top + (int)amountScrolled) / height));
tess.draw();
}
}