001    package net.minecraft.client.gui.inventory;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.block.Block;
006    import net.minecraft.client.gui.GuiButton;
007    import net.minecraft.client.gui.GuiScreen;
008    import net.minecraft.client.multiplayer.NetClientHandler;
009    import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
010    import net.minecraft.network.packet.Packet130UpdateSign;
011    import net.minecraft.tileentity.TileEntitySign;
012    import net.minecraft.util.ChatAllowedCharacters;
013    import org.lwjgl.input.Keyboard;
014    import org.lwjgl.opengl.GL11;
015    
016    @SideOnly(Side.CLIENT)
017    public 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    }