package shedar.mods.ic2.nuclearcontrol.gui.controls;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import shedar.mods.ic2.nuclearcontrol.tileentities.TileEntityHowlerAlarm;
import shedar.mods.ic2.nuclearcontrol.utils.NuclearNetworkHelper;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class GuiHowlerAlarmListBox extends GuiButton {
private static final String TEXTURE_FILE = "nuclearcontrol:textures/gui/GUIHowlerAlarm.png";
private static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation(TEXTURE_FILE);
private static final int BASIC_X_OFFSET = 2;
private static final int BASIC_Y_OFFSET = 2;
private static final int SCROLL_WIDTH = 10;
private static final int SCROLL_BUTTON_HEIGHT = 8;
public int fontColor;
public int selectedColor;
public int selectedFontColor;
private int scrollTop;
private List<String> items;
private TileEntityHowlerAlarm alarm;
public int lineHeight;
private int sliderHeight;
public boolean dragging;
private int sliderY;
private int dragDelta;
public GuiHowlerAlarmListBox(int id, int left, int top, int width, int height, List<String> items, TileEntityHowlerAlarm alarm) {
super(id, left, top, width, height, "");
this.items = items;
this.alarm = alarm;
fontColor = 0x404040;
selectedColor = 0xff404040;
selectedFontColor = 0xA0A0A0;
scrollTop = 0;
lineHeight = 0;
sliderHeight = 0;
dragging = false;
dragDelta = 0;
}
private void scrollTo(int pos) {
scrollTop = pos;
if (scrollTop < 0)
scrollTop = 0;
int max = lineHeight * items.size() + BASIC_Y_OFFSET - height;
if (max < 0)
max = 0;
if (scrollTop > max)
scrollTop = max;
}
public void scrollUp() {
scrollTop -= 8;
if (scrollTop < 0)
scrollTop = 0;
}
public void scrollDown() {
scrollTop += 8;
int max = lineHeight * items.size() + BASIC_Y_OFFSET - height;
if (max < 0)
max = 0;
if (scrollTop > max)
scrollTop = max;
}
@Override
public void drawButton(Minecraft minecraft, int cursorX, int cursorY) {
if (dragging) {
int pos = (cursorY - yPosition - SCROLL_BUTTON_HEIGHT - dragDelta) * (lineHeight * items.size() + BASIC_Y_OFFSET - height) /
Math.max(height - 2 * SCROLL_BUTTON_HEIGHT - sliderHeight, 1);
scrollTo(pos);
}
FontRenderer fontRenderer = minecraft.fontRenderer;
String currentItem = alarm.getSoundName();
if (lineHeight == 0) {
lineHeight = fontRenderer.FONT_HEIGHT + 2;
if (scrollTop == 0) {
int rowsPerHeight = height / lineHeight;
int currentIndex = items.indexOf(currentItem);
if (currentIndex >= rowsPerHeight)
scrollTop = (currentIndex + 1) * lineHeight + BASIC_Y_OFFSET - height;
}
float scale = height / ((float) lineHeight * items.size() + BASIC_Y_OFFSET);
if (scale > 1)
scale = 1;
sliderHeight = Math.round(scale * (height - 2 * SCROLL_BUTTON_HEIGHT));
if (sliderHeight < 4)
sliderHeight = 4;
}
int rowTop = BASIC_Y_OFFSET;
GL11.glEnable(GL11.GL_SCISSOR_TEST);
Minecraft mc = FMLClientHandler.instance().getClient();
ScaledResolution scaler = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
GL11.glScissor(xPosition * scaler.getScaleFactor(), mc.displayHeight - (yPosition + height) * scaler.getScaleFactor(), (width - SCROLL_WIDTH) * scaler.getScaleFactor(), height * scaler.getScaleFactor());
for (String row : items) {
if(row.equals(currentItem)){
drawRect(xPosition, yPosition + rowTop - scrollTop - 1, xPosition + width - SCROLL_WIDTH, yPosition + rowTop - scrollTop + lineHeight - 1, selectedColor);
fontRenderer.drawString(row, xPosition + BASIC_X_OFFSET, yPosition + rowTop - scrollTop, selectedFontColor);
}else
fontRenderer.drawString(row, xPosition + BASIC_X_OFFSET, yPosition + rowTop - scrollTop, fontColor);
rowTop += lineHeight;
}
GL11.glDisable(GL11.GL_SCISSOR_TEST);
// Slider
int sliderX = xPosition + width - SCROLL_WIDTH + 1;
sliderY = yPosition
+ SCROLL_BUTTON_HEIGHT
+ ((height - 2 * SCROLL_BUTTON_HEIGHT - sliderHeight) * scrollTop)
/ (lineHeight * items.size() + BASIC_Y_OFFSET - height);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, minecraft.renderEngine
.getTexture(TEXTURE_LOCATION).getGlTextureId());
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
drawTexturedModalRect(sliderX, sliderY, 131, 16, SCROLL_WIDTH - 1, 1);
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
tessellator.addVertexWithUV((sliderX), sliderY
+ sliderHeight - 1, zLevel,
131 / 256F, (18) / 256F);
tessellator.addVertexWithUV(sliderX + SCROLL_WIDTH - 1,
sliderY + sliderHeight - 1, zLevel,
(131 + SCROLL_WIDTH - 1) / 256F,
(18) / 256F);
tessellator.addVertexWithUV(sliderX + SCROLL_WIDTH - 1,
sliderY + 1, zLevel,
(131 + SCROLL_WIDTH - 1) / 256F,
(17) / 256F);
tessellator.addVertexWithUV((sliderX), sliderY + 1,
zLevel, 131 / 256F,
(17) / 256F);
tessellator.draw();
drawTexturedModalRect(sliderX, sliderY + sliderHeight - 1, 131, 19,
SCROLL_WIDTH - 1, 1);
}
private void setCurrent(int targetY) {
if (lineHeight == 0)
return;
int itemIndex = (targetY - BASIC_Y_OFFSET - yPosition + scrollTop) / lineHeight;
if (itemIndex >= items.size())
itemIndex = items.size() - 1;
String newSound = items.get(itemIndex);
if (!newSound.equals(alarm.getSoundName())) {
if (alarm.getWorldObj().isRemote)
NuclearNetworkHelper.setNewAlarmSound(alarm.xCoord, alarm.yCoord, alarm.zCoord, (byte) 0, newSound);
alarm.setSoundName(newSound);
}
}
@Override
public boolean mousePressed(Minecraft minecraft, int targetX, int targetY) {
if(super.mousePressed(minecraft, targetX, targetY)){
if (targetX > xPosition + width - SCROLL_WIDTH) {// scroll click
if (targetY - yPosition < SCROLL_BUTTON_HEIGHT)
scrollUp();
else if (height + yPosition - targetY < SCROLL_BUTTON_HEIGHT)
scrollDown();
else if (targetY >= sliderY && targetY <= sliderY + sliderHeight) {
dragging = true;
dragDelta = targetY - sliderY;
}
}else {
setCurrent(targetY);
return true;
}
}else {
return false;
}
return false;
}
@Override
public void mouseReleased(int i, int j) {
super.mouseReleased(i, j);
dragging = false;
}
}