/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under a
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
*
* File Created @ [Jan 14, 2014, 6:48:05 PM (GMT)]
*/
package pixlepix.auracascade.lexicon;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.translation.I18n;
import org.lwjgl.opengl.GL11;
import pixlepix.auracascade.lexicon.button.GuiButtonBookmark;
import pixlepix.auracascade.lexicon.button.GuiButtonCategory;
import pixlepix.auracascade.lexicon.button.GuiButtonInvisible;
import java.io.IOException;
import java.util.*;
public class GuiLexicon extends GuiScreen {
public static final int BOOKMARK_START = 1337;
public static final ResourceLocation texture = new ResourceLocation(LibResources.GUI_LEXICON);
private static final int TUTORIAL_ARROW_WIDTH = 10;
private static final int TUTORIAL_ARROW_HEIGHT = 12;
public static GuiLexicon currentOpenLexicon = new GuiLexicon();
public static ItemStack stackUsed;
public static List<GuiLexicon> bookmarks = new ArrayList<GuiLexicon>();
public static Queue<LexiconEntry> tutorial = new ArrayDeque<LexiconEntry>();
public static ArrayList<LexiconEntry> tutorialMaster = new ArrayList<LexiconEntry>();
public float lastTime = 0F;
public float partialTicks = 0F;
public float timeDelta = 0F;
boolean bookmarksNeedPopulation = false;
List<LexiconCategory> allCategories;
boolean hasTutorialArrow;
int tutorialArrowX, tutorialArrowY;
String title;
int guiWidth = 146;
int guiHeight = 180;
int left, top;
public static void startTutorial() {
tutorial.clear();
for (LexiconEntry entry : tutorialMaster) {
tutorial.add(entry);
}
}
@Override
public void initGui() {
super.initGui();
allCategories = new ArrayList<LexiconCategory>(CategoryManager.getAllCategories());
Collections.sort(allCategories);
lastTime = ClientTickHandler.ticksInGame;
currentOpenLexicon = this;
title = stackUsed.getDisplayName();
left = width / 2 - guiWidth / 2;
top = height / 2 - guiHeight / 2;
buttonList.clear();
if (isIndex()) {
int x = 18;
for (int i = 0; i < 12; i++) {
int y = 16 + i * 12;
buttonList.add(new GuiButtonInvisible(i, left + x, top + y, 110, 10, ""));
}
populateIndex();
} else if (isCategoryIndex()) {
int categories = allCategories.size();
for (int i = 0; i < categories + 1; i++) {
LexiconCategory category;
category = i >= categories ? null : allCategories.get(i);
int x = i % 4;
int y = i / 4;
int size = 27;
GuiButtonCategory button = new GuiButtonCategory(i, left + 18 + x * size, top + 35 + y * size, this, category);
buttonList.add(button);
}
}
populateBookmarks();
putTutorialArrow();
}
@Override
public void drawScreen(int par1, int par2, float par3) {
float time = ClientTickHandler.ticksInGame + par3;
timeDelta = time - lastTime;
lastTime = time;
partialTicks = par3;
GlStateManager.color(1F, 1F, 1F, 1F);
mc.renderEngine.bindTexture(texture);
drawTexturedModalRect(left, top, 0, 0, guiWidth, guiHeight);
drawBookmark(left + guiWidth / 2, top - getTitleHeight(), getTitle(), true);
String subtitle = getSubtitle();
if (subtitle != null) {
GlStateManager.scale(0.5F, 0.5F, 1F);
drawCenteredString(fontRendererObj, subtitle, left * 2 + guiWidth, (top - getTitleHeight() + 11) * 2, 0x00FF00);
GlStateManager.scale(2F, 2F, 1F);
}
drawHeader();
if (bookmarksNeedPopulation) {
populateBookmarks();
bookmarksNeedPopulation = false;
}
super.drawScreen(par1, par2, par3);
if (hasTutorialArrow) {
mc.renderEngine.bindTexture(texture);
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.color(1F, 1F, 1F, 0.7F + (float) (Math.sin((ClientTickHandler.ticksInGame + par3) * 0.3F) + 1) * 0.15F);
drawTexturedModalRect(tutorialArrowX, tutorialArrowY, 20, 200, TUTORIAL_ARROW_WIDTH, TUTORIAL_ARROW_HEIGHT);
GlStateManager.disableBlend();
}
}
public void drawBookmark(int x, int y, String s, boolean drawLeft) {
// This function is called from the buttons so I can't use fontRendererObj
FontRenderer font = Minecraft.getMinecraft().fontRendererObj;
boolean unicode = font.getUnicodeFlag();
font.setUnicodeFlag(true);
int l = font.getStringWidth(s);
int fontOff = 0;
if (!drawLeft) {
x += l / 2;
fontOff = 2;
}
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
GlStateManager.color(1F, 1F, 1F, 1F);
drawTexturedModalRect(x + l / 2 + 3, y - 1, 54, 180, 6, 11);
if (drawLeft)
drawTexturedModalRect(x - l / 2 - 9, y - 1, 61, 180, 6, 11);
for (int i = 0; i < l + 6; i++)
drawTexturedModalRect(x - l / 2 - 3 + i, y - 1, 60, 180, 1, 11);
font.drawString(s, x - l / 2 + fontOff, y, 0x111111, false);
font.setUnicodeFlag(unicode);
}
void drawHeader() {
boolean unicode = fontRendererObj.getUnicodeFlag();
fontRendererObj.setUnicodeFlag(true);
fontRendererObj.drawSplitString(I18n.translateToLocal("aura.gui.lexicon.header"), left + 18, top + 12, 110, 0);
fontRendererObj.setUnicodeFlag(unicode);
}
@Override
protected void actionPerformed(GuiButton par1GuiButton) {
if (par1GuiButton.id >= BOOKMARK_START)
handleBookmark(par1GuiButton);
else if (par1GuiButton instanceof GuiButtonCategory) {
LexiconCategory category = ((GuiButtonCategory) par1GuiButton).getCategory();
mc.displayGuiScreen(new GuiLexiconIndex(category));
ClientTickHandler.notifyPageChange();
}
}
public void handleBookmark(GuiButton par1GuiButton) {
int i = par1GuiButton.id - BOOKMARK_START;
if (i == bookmarks.size()) {
if (!bookmarks.contains(this))
bookmarks.add(this);
} else {
if (isShiftKeyDown())
bookmarks.remove(i);
else {
GuiLexicon bookmark = bookmarks.get(i);
Minecraft.getMinecraft().displayGuiScreen(bookmark);
if (!bookmark.getTitle().equals(getTitle())) {
if (bookmark instanceof IParented)
((IParented) bookmark).setParent(this);
ClientTickHandler.notifyPageChange();
}
}
}
bookmarksNeedPopulation = true;
}
@Override
public boolean doesGuiPauseGame() {
return false;
}
public int bookmarkWidth(String b) {
boolean unicode = fontRendererObj.getUnicodeFlag();
fontRendererObj.setUnicodeFlag(true);
int width = fontRendererObj.getStringWidth(b) + 15;
fontRendererObj.setUnicodeFlag(unicode);
return width;
}
String getTitle() {
return title;
}
String getSubtitle() {
return null;
}
int getTitleHeight() {
return getSubtitle() == null ? 12 : 16;
}
boolean isIndex() {
return false;
}
boolean isCategoryIndex() {
return true;
}
void populateIndex() {
List<LexiconCategory> categoryList = CategoryManager.getAllCategories();
int shift = 2;
for (int i = shift; i < 12; i++) {
int i_ = i - shift;
GuiButtonInvisible button = (GuiButtonInvisible) buttonList.get(i);
LexiconCategory category = i_ >= categoryList.size() ? null : categoryList.get(i_);
if (category != null)
button.displayString = I18n.translateToLocal(category.getUnlocalizedName());
else {
button.displayString = I18n.translateToLocal("auramisc.lexiconIndex");
break;
}
}
}
void populateBookmarks() {
List<GuiButton> remove = new ArrayList<GuiButton>();
List<GuiButton> buttons = buttonList;
for (GuiButton button : buttons)
if (button.id >= BOOKMARK_START)
remove.add(button);
buttonList.removeAll(remove);
int len = bookmarks.size();
boolean thisExists = false;
for (GuiLexicon lex : bookmarks)
if (lex.getTitle().equals(getTitle()))
thisExists = true;
boolean addEnabled = len < 8 && this instanceof IParented && !thisExists;
for (int i = 0; i < len + (addEnabled ? 1 : 0); i++) {
boolean isAdd = i == bookmarks.size();
GuiLexicon gui = isAdd ? null : bookmarks.get(i);
buttonList.add(new GuiButtonBookmark(BOOKMARK_START + i, left + 138, top + 18 + 14 * i, gui == null ? this : gui, gui == null ? "+" : gui.getTitle()));
}
}
boolean closeScreenOnInvKey() {
return true;
}
@Override
protected void keyTyped(char par1, int par2) throws IOException {
if (closeScreenOnInvKey() && mc.gameSettings.keyBindInventory.getKeyCode() == par2) {
mc.displayGuiScreen(null);
mc.setIngameFocus();
}
super.keyTyped(par1, par2);
}
public final void putTutorialArrow() {
hasTutorialArrow = !tutorial.isEmpty();
if (hasTutorialArrow)
positionTutorialArrow();
}
public void positionTutorialArrow() {
LexiconEntry entry = tutorial.peek();
LexiconCategory category = entry.category;
List<GuiButton> buttons = buttonList;
for (GuiButton button : buttons)
if (button instanceof GuiButtonCategory) {
GuiButtonCategory catButton = (GuiButtonCategory) button;
if (catButton.getCategory() == category) {
orientTutorialArrowWithButton(button);
break;
}
}
}
public void orientTutorialArrowWithButton(GuiButton button) {
if (button != null) {
tutorialArrowX = button.xPosition - TUTORIAL_ARROW_WIDTH;
tutorialArrowY = button.yPosition - TUTORIAL_ARROW_HEIGHT;
}
}
}