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    private GuiButton field_100001_o;
036
037    public GuiEditSign(TileEntitySign par1TileEntitySign)
038    {
039        this.entitySign = par1TileEntitySign;
040    }
041
042    /**
043     * Adds the buttons (and other controls) to the screen in question.
044     */
045    public void initGui()
046    {
047        this.buttonList.clear();
048        Keyboard.enableRepeatEvents(true);
049        this.buttonList.add(this.field_100001_o = new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Done"));
050        this.entitySign.setEditable(false);
051    }
052
053    /**
054     * Called when the screen is unloaded. Used to disable keyboard repeat events
055     */
056    public void onGuiClosed()
057    {
058        Keyboard.enableRepeatEvents(false);
059        NetClientHandler netclienthandler = this.mc.getNetHandler();
060
061        if (netclienthandler != null)
062        {
063            netclienthandler.addToSendQueue(new Packet130UpdateSign(this.entitySign.xCoord, this.entitySign.yCoord, this.entitySign.zCoord, this.entitySign.signText));
064        }
065
066        this.entitySign.setEditable(true);
067    }
068
069    /**
070     * Called from the main game loop to update the screen.
071     */
072    public void updateScreen()
073    {
074        ++this.updateCounter;
075    }
076
077    /**
078     * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
079     */
080    protected void actionPerformed(GuiButton par1GuiButton)
081    {
082        if (par1GuiButton.enabled)
083        {
084            if (par1GuiButton.id == 0)
085            {
086                this.entitySign.onInventoryChanged();
087                this.mc.displayGuiScreen((GuiScreen)null);
088            }
089        }
090    }
091
092    /**
093     * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
094     */
095    protected void keyTyped(char par1, int par2)
096    {
097        if (par2 == 200)
098        {
099            this.editLine = this.editLine - 1 & 3;
100        }
101
102        if (par2 == 208 || par2 == 28)
103        {
104            this.editLine = this.editLine + 1 & 3;
105        }
106
107        if (par2 == 14 && this.entitySign.signText[this.editLine].length() > 0)
108        {
109            this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine].substring(0, this.entitySign.signText[this.editLine].length() - 1);
110        }
111
112        if (allowedCharacters.indexOf(par1) >= 0 && this.entitySign.signText[this.editLine].length() < 15)
113        {
114            this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine] + par1;
115        }
116
117        if (par2 == 1)
118        {
119            this.actionPerformed(this.field_100001_o);
120        }
121    }
122
123    /**
124     * Draws the screen and all the components in it.
125     */
126    public void drawScreen(int par1, int par2, float par3)
127    {
128        this.drawDefaultBackground();
129        this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 40, 16777215);
130        GL11.glPushMatrix();
131        GL11.glTranslatef((float)(this.width / 2), 0.0F, 50.0F);
132        float f1 = 93.75F;
133        GL11.glScalef(-f1, -f1, -f1);
134        GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
135        Block block = this.entitySign.getBlockType();
136
137        if (block == Block.signPost)
138        {
139            float f2 = (float)(this.entitySign.getBlockMetadata() * 360) / 16.0F;
140            GL11.glRotatef(f2, 0.0F, 1.0F, 0.0F);
141            GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
142        }
143        else
144        {
145            int k = this.entitySign.getBlockMetadata();
146            float f3 = 0.0F;
147
148            if (k == 2)
149            {
150                f3 = 180.0F;
151            }
152
153            if (k == 4)
154            {
155                f3 = 90.0F;
156            }
157
158            if (k == 5)
159            {
160                f3 = -90.0F;
161            }
162
163            GL11.glRotatef(f3, 0.0F, 1.0F, 0.0F);
164            GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
165        }
166
167        if (this.updateCounter / 6 % 2 == 0)
168        {
169            this.entitySign.lineBeingEdited = this.editLine;
170        }
171
172        TileEntityRenderer.instance.renderTileEntityAt(this.entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
173        this.entitySign.lineBeingEdited = -1;
174        GL11.glPopMatrix();
175        super.drawScreen(par1, par2, par3);
176    }
177}