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