package advancedsystemsmanager.flow.menus;
import advancedsystemsmanager.api.network.IPacketProvider;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.elements.UpdateElement;
import advancedsystemsmanager.client.gui.GuiManager;
import advancedsystemsmanager.helpers.CollisionHelper;
import advancedsystemsmanager.helpers.LocalizationHelper;
import advancedsystemsmanager.network.ASMPacket;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.registry.ThemeHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import java.util.List;
public abstract class MenuTarget extends Menu
{
public static final int DIRECTION_SIZE_W = 31;
public static final int DIRECTION_SIZE_H = 12;
public static final int DIRECTION_SRC_X = 71;
public static final int DIRECTION_SRC_Y = 234;
public static final int DIRECTION_X_LEFT = 2;
public static final int DIRECTION_X_RIGHT = 88;
public static final int DIRECTION_Y = 5;
public static final int DIRECTION_MARGIN = 10;
public static final int DIRECTION_TEXT_X = 2;
public static final int DIRECTION_TEXT_Y = 3;
public static final int BUTTON_SIZE_W = 42;
public static final int BUTTON_SIZE_H = 12;
public static final int BUTTON_SRC_X = 0;
public static final int BUTTON_SRC_Y = 106;
public static final int BUTTON_X = 39;
public static final int BUTTON_TEXT_Y = 5;
public static final String NBT_DIRECTIONS = "Directions";
public static final String NBT_ACTIVE = "Active";
public static final String NBT_ADVANCED = "Advanced";
public static ForgeDirection[] directions = ForgeDirection.VALID_DIRECTIONS;
public int selectedDirectionId;
public Button[] buttons;
public boolean[] activatedDirections = new boolean[directions.length];
public boolean[] advancedDirections = new boolean[directions.length];
public MenuTarget(FlowComponent parent)
{
super(parent);
Button first = new Button(parent, 5)
{
@Override
public String getLabel()
{
return isActive(selectedDirectionId) ? Names.DEACTIVATE : Names.ACTIVATE;
}
@Override
public boolean writeData(ASMPacket packet)
{
packet.writeByte(selectedDirectionId << 1 | (isActive(selectedDirectionId) ? 0 : 1));
activatedDirections[selectedDirectionId] = !activatedDirections[selectedDirectionId];
return true;
}
@Override
public boolean readData(ASMPacket packet)
{
int data = packet.readByte();
setDirection(data >> 1, (data & 1) == 1);
return false;
}
};
Button second = getSecondButton();
buttons = second == null ? new Button[]{first} : new Button[]{first, second};
selectedDirectionId = -1;
}
protected void setDirection(int dir, boolean val)
{
activatedDirections[dir] = val;
}
public boolean isActive(int i)
{
return activatedDirections[i];
}
public abstract Button getSecondButton();
@Override
public String getName()
{
return Names.TARGET_MENU;
}
@SideOnly(Side.CLIENT)
@Override
public void draw(GuiManager gui, int mX, int mY)
{
for (int i = 0; i < directions.length; i++)
{
int x = getDirectionX(i);
int y = getDirectionY(i);
gui.drawRectangle(x, y, x + DIRECTION_SIZE_W, y + DIRECTION_SIZE_H, ThemeHandler.theme.menus.checkboxes.getColour(isActive(i), selectedDirectionId == i));
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
int color = selectedDirectionId != -1 && selectedDirectionId != i ? 0x70404040 : 0x404040;
gui.drawString(LocalizationHelper.getDirectionString(i), x + DIRECTION_TEXT_X, y + DIRECTION_TEXT_Y, color);
GL11.glPopMatrix();
}
if (selectedDirectionId != -1)
{
for (Button button : buttons)
{
gui.drawRectangle(BUTTON_X, button.y, BUTTON_X + BUTTON_SIZE_W, button.y + BUTTON_SIZE_H, ThemeHandler.theme.menus.checkboxes.getColour(false, CollisionHelper.inBounds(BUTTON_X, button.y, BUTTON_SIZE_W, BUTTON_SIZE_H, mX, mY)));
gui.drawCenteredString(button.getLabel(), BUTTON_X, button.y + BUTTON_TEXT_Y, 0.5F, BUTTON_SIZE_W, 0x404040);
}
if (useAdvancedSetting(selectedDirectionId))
{
drawAdvancedComponent(gui, mX, mY);
}
}
}
public int getDirectionX(int i)
{
return i % 2 == 0 ? DIRECTION_X_LEFT : DIRECTION_X_RIGHT;
}
public int getDirectionY(int i)
{
return DIRECTION_Y + (DIRECTION_SIZE_H + DIRECTION_MARGIN) * (i / 2);
}
public boolean useAdvancedSetting(int i)
{
return advancedDirections[i];
}
@SideOnly(Side.CLIENT)
public abstract void drawAdvancedComponent(GuiManager gui, int mX, int mY);
@SideOnly(Side.CLIENT)
@Override
public void drawMouseOver(GuiManager gui, int mX, int mY)
{
if (selectedDirectionId != -1)
{
for (Button button : buttons)
{
if (CollisionHelper.inBounds(BUTTON_X, button.y, BUTTON_SIZE_W, BUTTON_SIZE_H, mX, mY))
{
gui.drawMouseOver(button.getMouseOverText(), mX, mY);
return;
}
}
}
}
@SideOnly(Side.CLIENT)
@Override
public void onClick(int mX, int mY, int button)
{
for (int i = 0; i < directions.length; i++)
{
if (CollisionHelper.inBounds(getDirectionX(i), getDirectionY(i), DIRECTION_SIZE_W, DIRECTION_SIZE_H, mX, mY))
{
if (selectedDirectionId == i)
{
selectedDirectionId = -1;
} else
{
selectedDirectionId = i;
refreshAdvancedComponent();
}
return;
}
}
if (selectedDirectionId != -1)
{
for (Button optionButton : buttons)
{
if (CollisionHelper.inBounds(BUTTON_X, optionButton.y, BUTTON_SIZE_W, BUTTON_SIZE_H, mX, mY))
{
optionButton.onUpdate();
return;
}
}
if (useAdvancedSetting(selectedDirectionId))
{
onAdvancedClick(mX, mY, button);
}
}
}
@Override
public void copyFrom(Menu menu)
{
MenuTarget menuTarget = (MenuTarget)menu;
for (int i = 0; i < directions.length; i++)
{
activatedDirections[i] = menuTarget.activatedDirections[i];
advancedDirections[i] = menuTarget.advancedDirections[i];
copyAdvancedSetting(menu, i);
}
}
public abstract void copyAdvancedSetting(Menu menuTarget, int i);
@Override
public void readFromNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
NBTTagList directionTagList = nbtTagCompound.getTagList(NBT_DIRECTIONS, 10);
for (int i = 0; i < directionTagList.tagCount(); i++)
{
NBTTagCompound directionTag = directionTagList.getCompoundTagAt(i);
activatedDirections[i] = directionTag.getBoolean(NBT_ACTIVE);
advancedDirections[i] = directionTag.getBoolean(NBT_ADVANCED);
loadAdvancedComponent(directionTag, i);
}
}
public abstract void loadAdvancedComponent(NBTTagCompound directionTag, int i);
@Override
public void writeToNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
NBTTagList directionTagList = new NBTTagList();
for (int i = 0; i < directions.length; i++)
{
NBTTagCompound directionTag = new NBTTagCompound();
directionTag.setBoolean(NBT_ACTIVE, isActive(i));
directionTag.setBoolean(NBT_ADVANCED, useAdvancedSetting(i));
saveAdvancedComponent(directionTag, i);
directionTagList.appendTag(directionTag);
}
nbtTagCompound.setTag(NBT_DIRECTIONS, directionTagList);
}
public abstract void saveAdvancedComponent(NBTTagCompound directionTag, int i);
@Override
public void addErrors(List<String> errors)
{
for (int i = 0; i < directions.length; i++)
{
if (isActive(i))
{
return;
}
}
errors.add(Names.NO_DIRECTION_ERROR);
}
public abstract void refreshAdvancedComponent();
public abstract void onAdvancedClick(int mX, int mY, int button);
public void setActive(int side)
{
activatedDirections[side] = true;
}
public abstract class Button extends UpdateElement
{
public int y;
public Button(IPacketProvider provider, int y)
{
super(provider);
this.y = y;
}
public String getMouseOverText()
{
return getLabel() + "Long";
}
public abstract String getLabel();
}
}