package advancedsystemsmanager.flow.menus;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.elements.CheckBox;
import advancedsystemsmanager.flow.elements.CheckBoxList;
import advancedsystemsmanager.flow.elements.TextBoxLogic;
import advancedsystemsmanager.client.gui.GuiManager;
import advancedsystemsmanager.helpers.CollisionHelper;
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;
public class MenuSignText extends Menu
{
public static final int TEXT_BOX_SIZE_U = 49;
public static final int TEXT_BOX_SIZE_V = 6;
public static final int TEXT_BOX_SIZE_W = 64;
public static final int TEXT_BOX_SIZE_H = 12;
public static final int TEXT_BOX_SRC_X = 113;
public static final int TEXT_BOX_SRC_Y = 72;
public static final int TEXT_BOX_X = 5;
public static final int TEXT_BOX_Y = 5;
public static final int TEXT_BOX_Y_SPACING = 15;
public static final int TEXT_BOX_TEXT_X = 3;
public static final int TEXT_BOX_TEXT_Y = 3;
public static final int CURSOR_X = 2;
public static final int CURSOR_Z = 5;
public static final int CHECK_BOX_X = 75;
public static final int CHECK_BOX_Y = 2;
public static final float IDLE_TIME = 1F;
public static final String NBT_LINES = "Lines";
public static final String NBT_UPDATE = "Update";
public static final String NBT_TEXT = "Text";
public TextBoxLogic[] textBoxes;
public CheckBoxList checkBoxes;
public boolean[] update;
public float[] hasChanged;
public int selected = -1;
public MenuSignText(FlowComponent parent)
{
super(parent);
textBoxes = new TextBoxLogic[4];
update = new boolean[textBoxes.length];
hasChanged = new float[textBoxes.length];
checkBoxes = new CheckBoxList();
for (int i = 0; i < textBoxes.length; i++)
{
final int id = i;
textBoxes[i] = new TextBoxLogic(getParent(), 15, TEXT_BOX_SIZE_W - TEXT_BOX_TEXT_X * 2)
{
@Override
public void onUpdate()
{
hasChanged[id] = IDLE_TIME;
}
};
//textBoxes[i].setMult(0.6F);
textBoxes[i].setTextAndCursor("");
checkBoxes.addCheckBox(new CheckBox(getParent(), Names.UPDATE_LINE, CHECK_BOX_X, CHECK_BOX_Y + TEXT_BOX_Y + i * TEXT_BOX_Y_SPACING)
{
@Override
public void setValue(boolean val)
{
update[id] = val;
}
@Override
public boolean getValue()
{
return update[id];
}
});
update[i] = true;
}
}
@Override
public String getName()
{
return Names.SIGN_TEXT;
}
@SideOnly(Side.CLIENT)
@Override
public void draw(GuiManager gui, int mX, int mY)
{
for (int i = 0; i < textBoxes.length; i++)
{
TextBoxLogic textBox = textBoxes[i];
int y = TEXT_BOX_Y + i * TEXT_BOX_Y_SPACING;
gui.drawTextBox(TEXT_BOX_X, y, TEXT_BOX_SIZE_W, TEXT_BOX_SIZE_H, TEXT_BOX_SRC_X, TEXT_BOX_SRC_Y, TEXT_BOX_SIZE_U, TEXT_BOX_SIZE_V, (selected == i ? ThemeHandler.theme.menus.textBoxes.selected : ThemeHandler.theme.menus.textBoxes.background).getColour(), ThemeHandler.theme.menus.textBoxes.border.getColour());
gui.drawString(textBox.getText(), TEXT_BOX_X + TEXT_BOX_TEXT_X, y + TEXT_BOX_TEXT_Y, ThemeHandler.theme.menus.textBoxes.text.getColourInt());
if (selected == i)
{
gui.drawCursor(TEXT_BOX_X + textBox.getCursorPosition(gui) + CURSOR_X, y, CURSOR_Z, ThemeHandler.theme.menus.textBoxes.text.getColourInt());
}
}
checkBoxes.draw(gui, mX, mY);
}
@SideOnly(Side.CLIENT)
@Override
public void onClick(int mX, int mY, int button)
{
for (int i = 0; i < textBoxes.length; i++)
{
if (CollisionHelper.inBounds(TEXT_BOX_X, TEXT_BOX_Y + TEXT_BOX_Y_SPACING * i, TEXT_BOX_SIZE_W, TEXT_BOX_SIZE_H, mX, mY))
{
if (i == selected)
{
selected = -1;
} else
{
selected = i;
}
onSelectedChange();
break;
}
}
checkBoxes.onClick(mX, mY);
}
@SideOnly(Side.CLIENT)
@Override
public boolean onKeyStroke(GuiManager gui, char c, int k)
{
if (k == 15)
{
selected = (selected + 1) % 4;
onSelectedChange();
return true;
} else if (selected == -1)
{
return super.onKeyStroke(gui, c, k);
} else
{
textBoxes[selected].onKeyStroke(gui, c, k);
return true;
}
}
@Override
public void copyFrom(Menu menu)
{
MenuSignText textMenu = (MenuSignText)menu;
for (int i = 0; i < textBoxes.length; i++)
{
textBoxes[i].setText(textMenu.textBoxes[i].getText());
update[i] = textMenu.update[i];
}
}
@Override
public void readFromNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
NBTTagList list = nbtTagCompound.getTagList(NBT_LINES, 10);
for (int i = 0; i < list.tagCount(); i++)
{
NBTTagCompound element = list.getCompoundTagAt(i);
update[i] = element.getBoolean(NBT_UPDATE);
setTextPostSync(i, element.getString(NBT_TEXT));
}
}
public void setTextPostSync(int id, String str)
{
if (str == null)
{
str = "";
}
textBoxes[id].setText(str);
}
@Override
public void writeToNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
NBTTagList list = new NBTTagList();
for (int i = 0; i < textBoxes.length; i++)
{
NBTTagCompound element = new NBTTagCompound();
element.setBoolean(NBT_UPDATE, update[i]);
element.setString(NBT_TEXT, textBoxes[i].getText());
list.appendTag(element);
}
nbtTagCompound.setTag(NBT_LINES, list);
}
@Override
public void update(float partial)
{
for (int i = 0; i < hasChanged.length; i++)
{
if (hasChanged[i] > 0)
{
hasChanged[i] -= partial;
if (hasChanged[i] <= 0)
{
textBoxes[i].sendSyncPacket();
}
}
}
}
@Override
public void onGuiClosed()
{
update(IDLE_TIME);
}
public void onSelectedChange()
{
update(IDLE_TIME);
}
public boolean shouldUpdate(int id)
{
return update[id];
}
public String getText(int id)
{
return textBoxes[id].getText();
}
}