dracocore.handbook.gui.GuiLexicon.java Source code

Java tutorial

Introduction

Here is the source code for dracocore.handbook.gui.GuiLexicon.java

Source

/**
 * 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 dracocore.handbook.gui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;

import org.lwjgl.opengl.GL11;

import dracocore.handbook.CategoryManager;
import dracocore.handbook.buttons.GuiButtonBookmark;
import dracocore.handbook.buttons.GuiButtonCategory;
import dracocore.handbook.buttons.GuiButtonInvisible;
import dracocore.handbook.core.LexiconCategory;
import dracocore.handbook.core.LexiconEntry;
import dracocore.handbook.core.LibResources;
import dracocore.handbook.interfaces.ILexicon;
import dracocore.handbook.interfaces.IParented;
import dracocore.proxies.tickhandlers.TickHandlerClient;

public class GuiLexicon extends GuiScreen {

    public static final int BOOKMARK_START = 1337;
    public static final ResourceLocation texture = new ResourceLocation(LibResources.GUI_LEXICON);
    public static GuiLexicon currentOpenLexicon = new GuiLexicon();
    public static ItemStack stackUsed;
    public static List<GuiLexicon> bookmarks = new ArrayList();
    public float lastTime = 0F;
    public float partialTicks = 0F;
    public float timeDelta = 0F;
    boolean bookmarksNeedPopulation = false;
    List<LexiconCategory> allCategories;

    String title;
    int guiWidth = 146;
    int guiHeight = 180;
    int left, top;

    @Override
    public void initGui() {
        super.initGui();

        allCategories = new ArrayList(CategoryManager.getAllCategories());
        Collections.sort(allCategories);

        lastTime = TickHandlerClient.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 = null;
                category = i >= categories ? null : allCategories.get(i);
                int x = i % 4;
                int y = i / 4;

                int size = 27;

                ILexicon lex = (ILexicon) stackUsed.getItem();
                for (LexiconCategory entry : category == null ? CategoryManager.getAllCategories()
                        : category.Categories) {
                    if (lex.isKnowledgeUnlocked(stackUsed, entry.getKnowledgeType())) {
                        GuiButtonCategory button = new GuiButtonCategory(i, left + 18 + x * size,
                                top + 35 + y * size, this, category);
                        buttonList.add(button);
                    }
                }
            }
        }
        populateBookmarks();
    }

    @Override
    public void drawScreen(int par1, int par2, float par3) {
        float time = TickHandlerClient.ticksInGame + par3;
        timeDelta = time - lastTime;
        lastTime = time;
        partialTicks = par3;

        GL11.glColor4f(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) {
            GL11.glScalef(0.5F, 0.5F, 1F);
            drawCenteredString(fontRendererObj, subtitle, left * 2 + guiWidth, (top - getTitleHeight() + 11) * 2,
                    0x00FF00);
            GL11.glScalef(2F, 2F, 1F);
        }

        drawHeader();

        if (bookmarksNeedPopulation) {
            populateBookmarks();
            bookmarksNeedPopulation = false;
        }

        super.drawScreen(par1, par2, par3);
    }

    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().fontRenderer;
        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);

        GL11.glColor4f(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(
                String.format(StatCollector.translateToLocal("dracocore.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));
            TickHandlerClient.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);
                    TickHandlerClient.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 = StatCollector.translateToLocal(category.getUnlocalizedName());
            else {
                button.displayString = StatCollector.translateToLocal("dracocoremisc.lexiconIndex");
                break;
            }
        }
    }

    void populateBookmarks() {
        List remove = new ArrayList();
        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) {
        if (closeScreenOnInvKey() && mc.gameSettings.keyBindInventory.getKeyCode() == par2) {
            mc.displayGuiScreen(null);
            mc.setIngameFocus();
        }

        super.keyTyped(par1, par2);
    }

}