package advancedsystemsmanager.client.gui; import advancedsystemsmanager.api.gui.IGuiElement; import advancedsystemsmanager.api.gui.IManagerButton; import advancedsystemsmanager.helpers.CollisionHelper; import advancedsystemsmanager.network.PacketHandler; import advancedsystemsmanager.registry.ThemeHandler; import advancedsystemsmanager.tileentities.manager.TileEntityManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.ResourceLocation; import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; import static advancedsystemsmanager.api.gui.IManagerButton.BUTTON_ICON_SIZE; import static advancedsystemsmanager.api.gui.IManagerButton.BUTTON_SIZE; import static advancedsystemsmanager.reference.Textures.BUTTONS; public class ManagerButtonList extends ArrayList<IManagerButton> implements IGuiElement { private static final int BUTTON_SPACING = 0; private int x = 20, y = 20, maxHeight = 218; public ManagerButtonList() { } public ManagerButtonList(int x, int y, int maxHeight) { this.x = x; this.y = y; this.maxHeight = maxHeight - BUTTON_SIZE; } @Override @SideOnly(Side.CLIENT) public void draw(GuiManager guiManager, int mouseX, int mouseY, int zLevel) { GuiManager.bindTexture(BUTTONS); for (VisibleIterator itr = new VisibleIterator(); itr.hasNext(); ) { IManagerButton button = itr.next(); boolean selected = CollisionHelper.inBounds(itr.x, itr.y, BUTTON_SIZE, BUTTON_SIZE, mouseX, mouseY); guiManager.drawColouredTexture(itr.x, itr.y, TileEntityManager.BUTTON_SRC_X, TileEntityManager.BUTTON_SRC_Y, BUTTON_SIZE, BUTTON_SIZE, (selected ? ThemeHandler.theme.buttons.backgroundMouseover : ThemeHandler.theme.buttons.background).getColour()); guiManager.drawColouredTexture(itr.x, itr.y, TileEntityManager.BUTTON_SRC_X + BUTTON_SIZE, TileEntityManager.BUTTON_SRC_Y, BUTTON_SIZE, BUTTON_SIZE, (selected ? ThemeHandler.theme.buttons.foregroundMouseover : ThemeHandler.theme.buttons.foreground).getColour()); ResourceLocation location = button.getTexture(); if (location == BUTTONS) guiManager.drawTexture(itr.x, itr.y, button.getX(), button.getY(), BUTTON_ICON_SIZE, BUTTON_ICON_SIZE); else { GuiManager.bindTexture(location); guiManager.drawTexture(itr.x, itr.y, button.getX(), button.getY(), BUTTON_ICON_SIZE, BUTTON_ICON_SIZE); GuiManager.bindTexture(BUTTONS); } itr.nextPosition(); } } @Override @SideOnly(Side.CLIENT) public void drawMouseOver(GuiManager guiManager, int mouseX, int mouseY) { for (VisibleIterator itr = new VisibleIterator(); itr.hasNext(); ) { IManagerButton button = itr.next(); if (CollisionHelper.inBounds(itr.x, itr.y, BUTTON_SIZE, BUTTON_SIZE, mouseX, mouseY)) { guiManager.drawMouseOver(button.getMouseOver(), mouseX, mouseY); break; } itr.nextPosition(); } } @Override @SideOnly(Side.CLIENT) public boolean onKeyStroke(GuiManager guiManager, char character, int key) { return false; } @Override @SideOnly(Side.CLIENT) public boolean onClick(int mouseX, int mouseY, int button) { return onClick(mouseX, mouseY, button, false); } public boolean onClick(int mouseX, int mouseY, int button, boolean release) { for (VisibleIterator itr = new VisibleIterator(); itr.hasNext(); ) { IManagerButton managerButton = itr.next(); if (CollisionHelper.inBounds(itr.x, itr.y, BUTTON_SIZE, BUTTON_SIZE, mouseX, mouseY) && managerButton.activateOnRelease() == release) { if (managerButton.validClick()) { managerButton.setClicked(button); PacketHandler.sendButtonPacket(itr.index, managerButton); } return true; } itr.nextPosition(); } return false; } @Override public boolean isVisible() { return true; } public void setPosition(int x, int y) { this.x = x; this.y = y; } public void setMaxHeight(int height) { this.maxHeight = height; } private class VisibleIterator implements Iterator<IManagerButton> { int x, y; int index; private ListIterator<IManagerButton> itr = ManagerButtonList.this.listIterator(); private VisibleIterator() { this.x = ManagerButtonList.this.x; this.y = ManagerButtonList.this.y; } @Override public boolean hasNext() { while (itr.hasNext() && !get(itr.nextIndex()).isVisible()) itr.next(); return itr.hasNext(); } @Override public IManagerButton next() { index = itr.nextIndex(); return itr.next(); } @Override public void remove() { itr.remove(); } public void nextPosition() { y += BUTTON_SIZE + BUTTON_SPACING; if (y > maxHeight) { y = ManagerButtonList.this.y; x += BUTTON_SIZE + BUTTON_SPACING; } } } }