package advancedsystemsmanager.flow.menus;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.elements.*;
import advancedsystemsmanager.client.gui.GuiManager;
import advancedsystemsmanager.network.ASMPacket;
import advancedsystemsmanager.reference.Names;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MenuListOrder extends Menu
{
public static final int RADIO_BUTTON_X = 5;
public static final int RADIO_BUTTON_Y = 20;
public static final int RADIO_SPACING_Y = 12;
public static final int CHECK_BOX_X = 5;
public static final int CHECK_BOX_AMOUNT_Y = 5;
public static final int CHECK_BOX_REVERSE_Y = 58;
public static final int TEXT_BOX_X = 60;
public static final int TEXT_BOX_Y = 3;
public static final String NBT_ALL = "All";
public static final String NBT_AMOUNT = "Amount";
public static final String NBT_REVERSED = "Reversed";
public static final String NBT_ORDER = "Order";
public TextBoxNumberList textBoxes;
public TextBoxNumber textBox;
public RadioButtonList radioButtons;
public CheckBoxList checkBoxes;
public boolean reversed;
public boolean all;
public MenuListOrder(FlowComponent parent)
{
super(parent);
radioButtons = new RadioButtonList(getParent());
for (int i = 0; i < LoopOrder.values().length; i++)
{
int x = RADIO_BUTTON_X;
int y = RADIO_BUTTON_Y + i * RADIO_SPACING_Y;
radioButtons.add(new RadioButton(x, y, LoopOrder.values()[i].toString()));
}
checkBoxes = new CheckBoxList();
checkBoxes.addCheckBox(new CheckBox(getParent(), Names.USE_ALL, CHECK_BOX_X, CHECK_BOX_AMOUNT_Y)
{
@Override
public void setValue(boolean val)
{
all = val;
}
@Override
public boolean getValue()
{
return all;
}
});
checkBoxes.addCheckBox(new CheckBox(getParent(), Names.REVERSED, CHECK_BOX_X, CHECK_BOX_REVERSE_Y)
{
@Override
public void setValue(boolean val)
{
reversed = val;
}
@Override
public boolean getValue()
{
return reversed;
}
@Override
public boolean isVisible()
{
return canReverse();
}
});
all = true;
textBoxes = new TextBoxNumberList();
textBoxes.addTextBox(textBox = new TextBoxNumber(getParent(), TEXT_BOX_X, TEXT_BOX_Y, 2, false)
{
@Override
public boolean isVisible()
{
return !all;
}
});
textBox.setNumber(1);
}
public boolean canReverse()
{
return getOrder() != LoopOrder.RANDOM;
}
public LoopOrder getOrder()
{
return LoopOrder.values()[radioButtons.getSelectedOption()];
}
public void writeData(ASMPacket dw, UpdateType type)
{
dw.writeByte(type.ordinal());
switch (type)
{
case USE_ALL:
dw.writeBoolean(all);
break;
case AMOUNT:
dw.writeVarIntToBuffer(textBox.getNumber());
break;
case TYPE:
dw.writeByte(radioButtons.getSelectedOption());
break;
case REVERSED:
dw.writeBoolean(reversed);
}
}
@Override
public String getName()
{
return Names.LOOP_ORDER_MENU;
}
@SideOnly(Side.CLIENT)
@Override
public void draw(GuiManager gui, int mX, int mY)
{
radioButtons.draw(gui, mX, mY);
checkBoxes.draw(gui, mX, mY);
textBoxes.draw(gui, mX, mY);
}
@SideOnly(Side.CLIENT)
@Override
public void drawMouseOver(GuiManager gui, int mX, int mY)
{
}
@Override
public void onClick(int mX, int mY, int button)
{
radioButtons.onClick(mX, mY, button);
checkBoxes.onClick(mX, mY);
textBoxes.onClick(mX, mY, button);
}
@SideOnly(Side.CLIENT)
@Override
public boolean onKeyStroke(GuiManager gui, char c, int k)
{
return textBoxes.onKeyStroke(gui, c, k);
}
@Override
public void copyFrom(Menu menu)
{
MenuListOrder menuOrder = ((MenuListOrder)menu);
all = menuOrder.all;
textBox.setNumber(menuOrder.textBox.getNumber());
reversed = menuOrder.reversed;
radioButtons.setSelectedOption(menuOrder.radioButtons.getSelectedOption());
}
@Override
public void readFromNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
all = nbtTagCompound.getBoolean(NBT_ALL);
textBox.setNumber(nbtTagCompound.getByte(NBT_AMOUNT));
reversed = nbtTagCompound.getBoolean(NBT_REVERSED);
radioButtons.setSelectedOption(nbtTagCompound.getByte(NBT_ORDER));
}
@Override
public void writeToNBT(NBTTagCompound nbtTagCompound, boolean pickup)
{
nbtTagCompound.setBoolean(NBT_ALL, all);
nbtTagCompound.setByte(NBT_AMOUNT, (byte)textBox.getNumber());
nbtTagCompound.setBoolean(NBT_REVERSED, reversed);
nbtTagCompound.setByte(NBT_ORDER, (byte)radioButtons.getSelectedOption());
}
public Comparator<? super Long> getComparator()
{
return getOrder().comparator;
}
public boolean isReversed()
{
return reversed;
}
public int getAmount()
{
return textBox.getNumber();
}
public boolean useAll()
{
return all;
}
public List<Long> applyOrder(List<Long> inventories)
{
return getOrder().applyOrder(inventories, this);
}
public enum LoopOrder
{
NORMAL(Names.ORDER_STANDARD, null),
CABLE(Names.ORDER_CABLE, new Comparator<Long>()
{
@Override
public int compare(Long o1, Long o2)
{
return o1 < o2 ? -1 : 1;
}
})
{
@Override
protected void sort(List<Long> inventories)
{
Collections.sort(inventories, comparator);
}
},
RANDOM(Names.ORDER_RANDOM, null)
{
@Override
protected void sort(List<Long> inventories)
{
Collections.shuffle(inventories);
}
};
public String name;
public Comparator<Long> comparator;
LoopOrder(String name, final Comparator<Long> comparator)
{
this.name = name;
this.comparator = comparator;
}
public List<Long> applyOrder(List<Long> inventories, MenuListOrder menu)
{
ArrayList<Long> ret = new ArrayList<Long>(inventories);
sort(ret);
if (menu.isReversed()) Collections.reverse(ret);
if (!menu.useAll())
{
int len = menu.getAmount();
while (ret.size() > len)
{
ret.remove(ret.size() - 1);
}
}
return ret;
}
protected void sort(List<Long> inventories)
{
}
@Override
public String toString()
{
return name;
}
}
public enum UpdateType
{
USE_ALL,
AMOUNT,
TYPE,
REVERSED
}
}