mods.railcraft.client.gui.GuiTicket.java Source code

Java tutorial

Introduction

Here is the source code for mods.railcraft.client.gui.GuiTicket.java

Source

/* 
 * Copyright (c) CovertJaguar, 2014 http://railcraft.info
 * 
 * This code is the property of CovertJaguar
 * and may only be used with explicit written
 * permission unless otherwise specified on the
 * license page at http://railcraft.info/wiki/info:license.
 */
package mods.railcraft.client.gui;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.List;
import mods.railcraft.client.gui.buttons.GuiBetterButton;
import mods.railcraft.common.core.Railcraft;
import mods.railcraft.common.core.RailcraftConstants;
import mods.railcraft.common.items.ItemTicket;
import mods.railcraft.common.plugins.forge.LocalizationPlugin;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.network.PacketCurrentItemNBT;
import mods.railcraft.common.util.network.PacketDispatcher;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatAllowedCharacters;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;

@SideOnly(Side.CLIENT)
public class GuiTicket extends GuiScreen {

    public static final ResourceLocation TEXTURE = new ResourceLocation(
            RailcraftConstants.GUI_TEXTURE_FOLDER + "ticket_gold.png");
    public static final int WRAP_WIDTH = 226;
    /**
     * The player editing the book
     */
    private final EntityPlayer player;
    private final ItemStack ticket;
    private boolean modified;
    private boolean readingManual;
    /**
     * Update ticks since the gui was opened
     */
    private int updateCount;
    private final int imageWidth = 256;
    private final int imageHeight = 136;
    private String dest = "";
    private GuiBetterButton buttonCancel;
    private GuiBetterButton buttonDone;
    private GuiBetterButton buttonHelp;

    public GuiTicket(EntityPlayer player, ItemStack stack) {
        this.player = player;
        this.ticket = stack;
        this.dest = ItemTicket.getDestination(ticket);
    }

    /**
     * Called from the main game loop to update the screen.
     */
    @Override
    public void updateScreen() {
        super.updateScreen();
        ++this.updateCount;
    }

    /**
     * Adds the buttons (and other controls) to the screen in question.
     */
    @Override
    public void initGui() {
        this.buttonList.clear();
        Keyboard.enableRepeatEvents(true);

        List<GuiBetterButton> buttons = new ArrayList<GuiBetterButton>();
        buttons.add(buttonDone = new GuiBetterButton(0, 0, imageHeight + 25, 65,
                StatCollector.translateToLocal("gui.done")));
        buttons.add(buttonHelp = new GuiBetterButton(1, 0, imageHeight + 25, 65,
                LocalizationPlugin.translate("railcraft.gui.help")));
        buttons.add(buttonCancel = new GuiBetterButton(2, 0, imageHeight + 25, 65,
                StatCollector.translateToLocal("gui.cancel")));
        GuiTools.newButtonRowAuto(buttonList, width / 2 - 100, 200, buttons);
        updateButtons();
    }

    /**
     * Called when the screen is unloaded. Used to disable keyboard repeat
     * events
     */
    @Override
    public void onGuiClosed() {
        Keyboard.enableRepeatEvents(false);
    }

    private void updateButtons() {
        buttonHelp.displayString = readingManual ? StatCollector.translateToLocal("gui.back")
                : LocalizationPlugin.translate("railcraft.gui.help");
    }

    private void sendToServer() {
        if (modified) {
            NBTTagCompound nbt = InvTools.getItemData(ticket);
            nbt.setString("dest", dest);
            if (!nbt.hasKey("owner")) {
                nbt.setString("owner", Railcraft.proxy.getPlayerUsername(player));
            }
            PacketCurrentItemNBT pkt = new PacketCurrentItemNBT(player, ticket);
            PacketDispatcher.sendToServer(pkt);
        }
    }

    /**
     * Fired when a control is clicked. This is the equivalent of
     * ActionListener.actionPerformed(ActionEvent e).
     */
    @Override
    protected void actionPerformed(GuiButton button) {
        if (button.enabled) {
            if (button == buttonCancel) {
                this.mc.displayGuiScreen((GuiScreen) null);
            } else if (button == buttonDone) {
                this.mc.displayGuiScreen((GuiScreen) null);
                this.sendToServer();
            } else if (button == buttonHelp) {
                readingManual = !readingManual;
            }

            this.updateButtons();
        }
    }

    /**
     * Fired when a key is typed. This is the equivalent of
     * KeyListener.keyTyped(KeyEvent e).
     */
    @Override
    protected void keyTyped(char c, int key) {
        super.keyTyped(c, key);
        switch (c) {
        case Keyboard.KEY_U:
            dest += GuiScreen.getClipboardString().replaceAll("\\s", "");
            modified = true;
            return;
        default:
            switch (key) {
            case Keyboard.KEY_BACK:
                if (dest.length() > 0) {
                    dest = dest.substring(0, dest.length() - 1);
                    modified = true;
                }
                return;
            default:
                if (!Character.isWhitespace(c) && ChatAllowedCharacters.isAllowedCharacter(c)
                        && dest.length() + 1 < ItemTicket.LINE_LENGTH) {
                    dest += c;
                    modified = true;
                }
            }
        }
    }

    /**
     * Draws the screen and all the components in it.
     */
    @Override
    public void drawScreen(int par1, int par2, float par3) {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        this.mc.renderEngine.bindTexture(TEXTURE);
        int xOffset = (this.width - this.imageWidth) / 2;
        byte yOffset = 18;
        this.drawTexturedModalRect(xOffset, yOffset, 0, 0, this.imageWidth, this.imageHeight);

        if (readingManual) {
            GuiTools.drawCenteredString(fontRendererObj,
                    LocalizationPlugin.translate("railcraft.gui.routing.ticket.manual.title"), yOffset + 14, width);

            String text = LocalizationPlugin.translate("railcraft.gui.routing.ticket.manual");
            this.fontRendererObj.drawSplitString(text, xOffset + 16, yOffset + 30, WRAP_WIDTH, 0);
        } else {
            GL11.glPushMatrix();
            GL11.glScalef(2F, 2F, 2F);
            GuiTools.drawCenteredString(fontRendererObj,
                    EnumChatFormatting.BOLD + LocalizationPlugin.translate("railcraft.gui.routing.ticket.title"),
                    yOffset - 2, width / 2, 0xFFFFFF, true);
            GL11.glPopMatrix();

            GuiTools.drawCenteredString(fontRendererObj,
                    LocalizationPlugin.translate("railcraft.gui.routing.ticket.line1"), yOffset + 50, width);
            GuiTools.drawCenteredString(fontRendererObj,
                    LocalizationPlugin.translate("railcraft.gui.routing.ticket.line2"), yOffset + 65, width);
            String text = EnumChatFormatting.BLACK + "Dest=" + dest;
            if (fontRendererObj.getBidiFlag()) {
                text = text + "_";
            } else if (updateCount / 6 % 2 == 0) {
                text = text + "" + EnumChatFormatting.BLACK + "_";
            } else {
                text = text + "" + EnumChatFormatting.GRAY + "_";
            }
            this.fontRendererObj.drawSplitString(text, xOffset + 16, yOffset + 98, WRAP_WIDTH, 0);
        }

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

}