package advancedsystemsmanager.client.gui;
import advancedsystemsmanager.items.ItemLabeler;
import advancedsystemsmanager.network.MessageHandler;
import advancedsystemsmanager.network.message.LabelSyncMessage;
import advancedsystemsmanager.reference.Mods;
import advancedsystemsmanager.reference.Reference;
import codechicken.nei.VisiblityData;
import codechicken.nei.api.INEIGuiHandler;
import codechicken.nei.api.TaggedInventoryArea;
import cpw.mods.fml.common.Optional;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;
@Optional.Interface(iface = "codechicken.nei.api.INEIGuiHandler", modid = Mods.NEI)
public class GuiLabeler extends GuiScreen implements IVerticalScrollContainer, INEIGuiHandler
{
public static final ResourceLocation TEXTURE = new ResourceLocation(Reference.RESOURCE_LOCATION, "textures/gui/GuiLabeler.png");
public static final int SCROLL_X = 9;
private static final int GUI_WIDTH = 140;
private static final int GUI_HEIGHT = 200;
private static final int SCROLL_Y = 25;
private static final int SCROLL_Y_MAX = 169;
private static final int SCROLL_X_MAX = 103;
private static final int ENTRY_HEIGHT = 16;
private static Comparator<GuiTextEntry> ALPHABETICAL_ORDER = new Comparator<GuiTextEntry>()
{
@Override
public int compare(GuiTextEntry o1, GuiTextEntry o2)
{
if (o1.isEditing) return 1;
int res = String.CASE_INSENSITIVE_ORDER.compare(o1.getText(), o2.getText());
return res == 0 ? o1.getText().compareTo(o2.getText()) : res;
}
};
public int mouseX = 0;
public int mouseY = 0;
private List<GuiTextEntry> strings = new ArrayList<GuiTextEntry>();
private List<GuiTextEntry> displayStrings;
private GuiTextEntry selected = null;
private ItemStack stack;
private GuiTextField searchBar;
private GuiVerticalScrollBar scrollBar;
private EntityPlayer player;
private int xSize, ySize, guiLeft, guiTop;
public GuiLabeler(ItemStack stack, EntityPlayer player)
{
this.stack = stack;
for (String string : ItemLabeler.getSavedStrings(stack))
{
strings.add(getGuiTextEntry(string));
}
this.xSize = GUI_WIDTH;
this.ySize = GUI_HEIGHT;
scrollBar = new GuiVerticalScrollBar(this, SCROLL_X_MAX + 4, SCROLL_Y, SCROLL_Y_MAX - SCROLL_Y);
searchBar = new GuiTextField(110, 12, 9, 10)
{
@Override
public boolean isSelected()
{
return true;
}
};
searchBar.setText(ItemLabeler.getLabel(stack));
searchBar.fixCursorPos();
displayStrings = getSearchedStrings();
this.player = player;
}
public static GuiTextEntry getGuiTextEntry(String string)
{
return new GuiTextEntry(string, ENTRY_HEIGHT, SCROLL_X_MAX - SCROLL_X);
}
public List<GuiTextEntry> getSearchedStrings()
{
List<GuiTextEntry> result = new ArrayList<GuiTextEntry>();
Pattern pattern = Pattern.compile(Pattern.quote(searchBar.getText()), Pattern.CASE_INSENSITIVE);
for (GuiTextEntry entry : strings)
{
if (pattern.matcher(entry.getText()).find()) result.add(entry);
}
return result;
}
@Override
public void drawScreen(int p_73863_1_, int p_73863_2_, float p_73863_3_)
{
this.drawDefaultBackground();
this.drawGuiContainerBackgroundLayer(p_73863_3_, p_73863_1_, p_73863_2_);
}
protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_)
{
GL11.glPushMatrix();
int x = this.guiLeft;
int y = this.guiTop;
GL11.glTranslatef(x, y, 0);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
bindTexture(TEXTURE);
drawTexturedModalRect(0, 0, 0, 0, GUI_WIDTH, GUI_HEIGHT);
scrollBar.draw();
searchBar.draw();
drawRect(SCROLL_X - 1, SCROLL_Y - 1, SCROLL_X_MAX + 1, SCROLL_Y_MAX + 1, 0xff676767);
drawRect(SCROLL_X, SCROLL_Y, SCROLL_X_MAX, SCROLL_Y_MAX, 0xff9d9d9d);
drawDisplayStrings();
GL11.glPopMatrix();
}
public static void bindTexture(ResourceLocation resource)
{
Minecraft.getMinecraft().getTextureManager().bindTexture(resource);
}
private void drawDisplayStrings()
{
int i = 0;
int startIndex = Math.round((displayStrings.size() - getListViewSize()) * scrollBar.getScrollValue());
for (GuiTextEntry entry : displayStrings)
{
entry.setY(SCROLL_Y + (i - startIndex) * ENTRY_HEIGHT);
entry.isVisible = !(entry.y < SCROLL_Y || entry.y + entry.height > SCROLL_Y_MAX);
entry.draw();
i++;
}
}
private int getListViewSize()
{
return (SCROLL_Y_MAX - SCROLL_Y) / ENTRY_HEIGHT;
}
@Override
protected void keyTyped(char character, int keyCode)
{
boolean reset = false;
if (keyCode == 1)
{
this.mc.thePlayer.closeScreen();
} else if (keyCode == 28)
{
if (!isEditing() && isNewEntry(searchBar.getText()))
{
strings.add(getGuiTextEntry(searchBar.getText()));
Collections.sort(strings, ALPHABETICAL_ORDER);
}
reset = true;
}
searchBar.keyTyped(character, keyCode);
if (isEditing()) this.selected.setText(searchBar.getText());
if (reset)
{
searchBar.setText("");
searchBar.fixCursorPos();
if (this.selected != null)
{
if (this.selected.getText().isEmpty())
{
strings.remove(selected);
} else
{
this.selected.isEditing = false;
this.selected.isSelected = false;
}
this.selected = null;
}
}
displayStrings = getSearchedStrings();
scrollBar.setYPos(0);
}
@Override
public void initGui()
{
super.initGui();
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
}
@Override
public void handleMouseInput()
{
super.handleMouseInput();
int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
mouseX = i - (width - xSize) / 2;
mouseY = j - (height - ySize) / 2;
if (isScrollBarActive())
{
scrollBar.handleMouseInput();
}
if (Mouse.getEventButtonState() && !(mouseX < SCROLL_X || mouseX > SCROLL_X_MAX || mouseY < SCROLL_Y || mouseY > SCROLL_Y_MAX))
{
for (GuiTextEntry entry : displayStrings)
{
entry.handleMouseInput(mouseX, mouseY);
if (entry.isSelected)
{
selected = entry;
searchBar.setText(entry.getText());
searchBar.fixCursorPos();
}
}
displayStrings = getSearchedStrings();
}
}
@Override
public void onGuiClosed()
{
List<String> save = new ArrayList<String>();
for (GuiTextEntry entry : strings) if (!save.contains(entry.getText())) save.add(entry.getText());
searchBar.close();
ItemLabeler.saveStrings(stack, save);
ItemLabeler.setLabel(stack, searchBar.getText());
MessageHandler.INSTANCE.sendToServer(new LabelSyncMessage(stack, player));
}
@Override
public boolean isScrollBarActive()
{
return displayStrings.size() > getListViewSize();
}
@Override
public int getScreenWidth()
{
return width;
}
@Override
public int getScreenHeight()
{
return height;
}
@Override
public int getGuiWidth()
{
return xSize;
}
@Override
public int getGuiHeight()
{
return ySize;
}
@Override
public int getScrollAmount()
{
return 5;
}
private boolean isEditing()
{
return this.selected != null && this.selected.isEditing;
}
private boolean isNewEntry(String string)
{
if (string.isEmpty()) return false;
for (GuiTextEntry entry : displayStrings)
{
if (string.equals(entry.getText())) return false;
}
return true;
}
@Override
@Optional.Method(modid = Mods.NEI)
public VisiblityData modifyVisiblity(GuiContainer guiContainer, VisiblityData visiblityData)
{
return visiblityData;
}
@Override
@Optional.Method(modid = Mods.NEI)
public Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item)
{
return null;
}
@Override
@Optional.Method(modid = Mods.NEI)
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui)
{
return null;
}
@Override
@Optional.Method(modid = Mods.NEI)
public boolean handleDragNDrop(GuiContainer gui, int mouseX, int mouseY, ItemStack draggedStack, int button)
{
return false;
}
@Override
@Optional.Method(modid = Mods.NEI)
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h)
{
return !(x + w < this.guiLeft || x > this.guiLeft + this.width || y + h < this.guiTop || y > this.guiTop + this.height);
}
}