001package net.minecraft.client.gui.inventory;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.block.Block;
006import net.minecraft.client.gui.GuiButton;
007import net.minecraft.client.gui.GuiScreen;
008import net.minecraft.client.multiplayer.NetClientHandler;
009import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
010import net.minecraft.network.packet.Packet130UpdateSign;
011import net.minecraft.tileentity.TileEntitySign;
012import net.minecraft.util.ChatAllowedCharacters;
013import org.lwjgl.input.Keyboard;
014import org.lwjgl.opengl.GL11;
015
016@SideOnly(Side.CLIENT)
017public class GuiEditSign extends GuiScreen
018{
019    /**
020     * This String is just a local copy of the characters allowed in text rendering of minecraft.
021     */
022    private static final String allowedCharacters = ChatAllowedCharacters.allowedCharacters;
023
024    /** The title string that is displayed in the top-center of the screen. */
025    protected String screenTitle = "Edit sign message:";
026
027    /** Reference to the sign object. */
028    private TileEntitySign entitySign;
029
030    /** Counts the number of screen updates. */
031    private int updateCounter;
032
033    /** The number of the line that is being edited. */
034    private int editLine = 0;
035
036    public GuiEditSign(TileEntitySign par1TileEntitySign)
037    {
038        this.entitySign = par1TileEntitySign;
039    }
040
041    /**
042     * Adds the buttons (and other controls) to the screen in question.
043     */
044    public void initGui()
045    {
046        this.controlList.clear();
047        Keyboard.enableRepeatEvents(true);
048        this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Done"));
049        this.entitySign.setEditable(false);
050    }
051
052    /**
053     * Called when the screen is unloaded. Used to disable keyboard repeat events
054     */
055    public void onGuiClosed()
056    {
057        Keyboard.enableRepeatEvents(false);
058        NetClientHandler var1 = this.mc.getSendQueue();
059
060        if (var1 != null)
061        {
062            var1.addToSendQueue(new Packet130UpdateSign(this.entitySign.xCoord, this.entitySign.yCoord, this.entitySign.zCoord, this.entitySign.signText));
063        }
064
065        this.entitySign.setEditable(true);
066    }
067
068    /**
069     * Called from the main game loop to update the screen.
070     */
071    public void updateScreen()
072    {
073        ++this.updateCounter;
074    }
075
076    /**
077     * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
078     */
079    protected void actionPerformed(GuiButton par1GuiButton)
080    {
081        if (par1GuiButton.enabled)
082        {
083            if (par1GuiButton.id == 0)
084            {
085                this.entitySign.onInventoryChanged();
086                this.mc.displayGuiScreen((GuiScreen)null);
087            }
088        }
089    }
090
091    /**
092     * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
093     */
094    protected void keyTyped(char par1, int par2)
095    {
096        if (par2 == 200)
097        {
098            this.editLine = this.editLine - 1 & 3;
099        }
100
101        if (par2 == 208 || par2 == 28)
102        {
103            this.editLine = this.editLine + 1 & 3;
104        }
105
106        if (par2 == 14 && this.entitySign.signText[this.editLine].length() > 0)
107        {
108            this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine].substring(0, this.entitySign.signText[this.editLine].length() - 1);
109        }
110
111        if (allowedCharacters.indexOf(par1) >= 0 && this.entitySign.signText[this.editLine].length() < 15)
112        {
113            this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine] + par1;
114        }
115    }
116
117    /**
118     * Draws the screen and all the components in it.
119     */
120    public void drawScreen(int par1, int par2, float par3)
121    {
122        this.drawDefaultBackground();
123        this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 40, 16777215);
124        GL11.glPushMatrix();
125        GL11.glTranslatef((float)(this.width / 2), 0.0F, 50.0F);
126        float var4 = 93.75F;
127        GL11.glScalef(-var4, -var4, -var4);
128        GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
129        Block var5 = this.entitySign.getBlockType();
130
131        if (var5 == Block.signPost)
132        {
133            float var6 = (float)(this.entitySign.getBlockMetadata() * 360) / 16.0F;
134            GL11.glRotatef(var6, 0.0F, 1.0F, 0.0F);
135            GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
136        }
137        else
138        {
139            int var8 = this.entitySign.getBlockMetadata();
140            float var7 = 0.0F;
141
142            if (var8 == 2)
143            {
144                var7 = 180.0F;
145            }
146
147            if (var8 == 4)
148            {
149                var7 = 90.0F;
150            }
151
152            if (var8 == 5)
153            {
154                var7 = -90.0F;
155            }
156
157            GL11.glRotatef(var7, 0.0F, 1.0F, 0.0F);
158            GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
159        }
160
161        if (this.updateCounter / 6 % 2 == 0)
162        {
163            this.entitySign.lineBeingEdited = this.editLine;
164        }
165
166        TileEntityRenderer.instance.renderTileEntityAt(this.entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
167        this.entitySign.lineBeingEdited = -1;
168        GL11.glPopMatrix();
169        super.drawScreen(par1, par2, par3);
170    }
171}