001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.awt.Toolkit;
006    import java.awt.datatransfer.ClipboardOwner;
007    import java.awt.datatransfer.DataFlavor;
008    import java.awt.datatransfer.StringSelection;
009    import java.awt.datatransfer.Transferable;
010    import java.util.ArrayList;
011    import java.util.List;
012    import net.minecraft.client.Minecraft;
013    import org.lwjgl.input.Keyboard;
014    import org.lwjgl.input.Mouse;
015    import org.lwjgl.opengl.GL11;
016    
017    @SideOnly(Side.CLIENT)
018    public class GuiScreen extends Gui
019    {
020        public static final boolean field_90017_e = Minecraft.getOs() == EnumOS.MACOS;
021    
022        /** Reference to the Minecraft object. */
023        protected Minecraft mc;
024    
025        /** The width of the screen object. */
026        public int width;
027    
028        /** The height of the screen object. */
029        public int height;
030    
031        /** A list of all the controls added to this container. */
032        protected List controlList = new ArrayList();
033        public boolean allowUserInput = false;
034    
035        /** The FontRenderer used by GuiScreen */
036        protected FontRenderer fontRenderer;
037        public GuiParticle guiParticles;
038    
039        /** The button that was just pressed. */
040        private GuiButton selectedButton = null;
041        private int field_85042_b = 0;
042        private long field_85043_c = 0L;
043    
044        /**
045         * Draws the screen and all the components in it.
046         */
047        public void drawScreen(int par1, int par2, float par3)
048        {
049            for (int var4 = 0; var4 < this.controlList.size(); ++var4)
050            {
051                GuiButton var5 = (GuiButton)this.controlList.get(var4);
052                var5.drawButton(this.mc, par1, par2);
053            }
054        }
055    
056        /**
057         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
058         */
059        protected void keyTyped(char par1, int par2)
060        {
061            if (par2 == 1)
062            {
063                this.mc.displayGuiScreen((GuiScreen)null);
064                this.mc.setIngameFocus();
065            }
066        }
067    
068        /**
069         * Returns a string stored in the system clipboard.
070         */
071        public static String getClipboardString()
072        {
073            try
074            {
075                Transferable var0 = Toolkit.getDefaultToolkit().getSystemClipboard().getContents((Object)null);
076    
077                if (var0 != null && var0.isDataFlavorSupported(DataFlavor.stringFlavor))
078                {
079                    return (String)var0.getTransferData(DataFlavor.stringFlavor);
080                }
081            }
082            catch (Exception var1)
083            {
084                ;
085            }
086    
087            return "";
088        }
089    
090        /**
091         * store a string in the system clipboard
092         */
093        public static void setClipboardString(String par0Str)
094        {
095            try
096            {
097                StringSelection var1 = new StringSelection(par0Str);
098                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(var1, (ClipboardOwner)null);
099            }
100            catch (Exception var2)
101            {
102                ;
103            }
104        }
105    
106        /**
107         * Called when the mouse is clicked.
108         */
109        protected void mouseClicked(int par1, int par2, int par3)
110        {
111            if (par3 == 0)
112            {
113                for (int var4 = 0; var4 < this.controlList.size(); ++var4)
114                {
115                    GuiButton var5 = (GuiButton)this.controlList.get(var4);
116    
117                    if (var5.mousePressed(this.mc, par1, par2))
118                    {
119                        this.selectedButton = var5;
120                        this.mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F);
121                        this.actionPerformed(var5);
122                    }
123                }
124            }
125        }
126    
127        /**
128         * Called when the mouse is moved or a mouse button is released.  Signature: (mouseX, mouseY, which) which==-1 is
129         * mouseMove, which==0 or which==1 is mouseUp
130         */
131        protected void mouseMovedOrUp(int par1, int par2, int par3)
132        {
133            if (this.selectedButton != null && par3 == 0)
134            {
135                this.selectedButton.mouseReleased(par1, par2);
136                this.selectedButton = null;
137            }
138        }
139    
140        protected void func_85041_a(int par1, int par2, int par3, long par4) {}
141    
142        /**
143         * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
144         */
145        protected void actionPerformed(GuiButton par1GuiButton) {}
146    
147        /**
148         * Causes the screen to lay out its subcomponents again. This is the equivalent of the Java call
149         * Container.validate()
150         */
151        public void setWorldAndResolution(Minecraft par1Minecraft, int par2, int par3)
152        {
153            this.guiParticles = new GuiParticle(par1Minecraft);
154            this.mc = par1Minecraft;
155            this.fontRenderer = par1Minecraft.fontRenderer;
156            this.width = par2;
157            this.height = par3;
158            this.controlList.clear();
159            this.initGui();
160        }
161    
162        /**
163         * Adds the buttons (and other controls) to the screen in question.
164         */
165        public void initGui() {}
166    
167        /**
168         * Delegates mouse and keyboard input.
169         */
170        public void handleInput()
171        {
172            while (Mouse.next())
173            {
174                this.handleMouseInput();
175            }
176    
177            while (Keyboard.next())
178            {
179                this.handleKeyboardInput();
180            }
181        }
182    
183        /**
184         * Handles mouse input.
185         */
186        public void handleMouseInput()
187        {
188            int var1 = Mouse.getEventX() * this.width / this.mc.displayWidth;
189            int var2 = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
190    
191            if (Mouse.getEventButtonState())
192            {
193                this.field_85042_b = Mouse.getEventButton();
194                this.field_85043_c = Minecraft.getSystemTime();
195                this.mouseClicked(var1, var2, this.field_85042_b);
196            }
197            else if (Mouse.getEventButton() != -1)
198            {
199                this.field_85042_b = -1;
200                this.mouseMovedOrUp(var1, var2, Mouse.getEventButton());
201            }
202            else if (this.mc.gameSettings.field_85185_A && this.field_85042_b != -1 && this.field_85043_c > 0L)
203            {
204                long var3 = Minecraft.getSystemTime() - this.field_85043_c;
205                this.func_85041_a(var1, var2, this.field_85042_b, var3);
206            }
207        }
208    
209        /**
210         * Handles keyboard input.
211         */
212        public void handleKeyboardInput()
213        {
214            if (Keyboard.getEventKeyState())
215            {
216                int var1 = Keyboard.getEventKey();
217                char var2 = Keyboard.getEventCharacter();
218    
219                if (var1 == 87)
220                {
221                    this.mc.toggleFullscreen();
222                    return;
223                }
224    
225                if (field_90017_e && var1 == 28 && var2 == 0)
226                {
227                    var1 = 29;
228                }
229    
230                this.keyTyped(var2, var1);
231            }
232        }
233    
234        /**
235         * Called from the main game loop to update the screen.
236         */
237        public void updateScreen() {}
238    
239        /**
240         * Called when the screen is unloaded. Used to disable keyboard repeat events
241         */
242        public void onGuiClosed() {}
243    
244        /**
245         * Draws either a gradient over the background screen (when it exists) or a flat gradient over background.png
246         */
247        public void drawDefaultBackground()
248        {
249            this.drawWorldBackground(0);
250        }
251    
252        public void drawWorldBackground(int par1)
253        {
254            if (this.mc.theWorld != null)
255            {
256                this.drawGradientRect(0, 0, this.width, this.height, -1072689136, -804253680);
257            }
258            else
259            {
260                this.drawBackground(par1);
261            }
262        }
263    
264        /**
265         * Draws the background (i is always 0 as of 1.2.2)
266         */
267        public void drawBackground(int par1)
268        {
269            GL11.glDisable(GL11.GL_LIGHTING);
270            GL11.glDisable(GL11.GL_FOG);
271            Tessellator var2 = Tessellator.instance;
272            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/background.png"));
273            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
274            float var3 = 32.0F;
275            var2.startDrawingQuads();
276            var2.setColorOpaque_I(4210752);
277            var2.addVertexWithUV(0.0D, (double)this.height, 0.0D, 0.0D, (double)((float)this.height / var3 + (float)par1));
278            var2.addVertexWithUV((double)this.width, (double)this.height, 0.0D, (double)((float)this.width / var3), (double)((float)this.height / var3 + (float)par1));
279            var2.addVertexWithUV((double)this.width, 0.0D, 0.0D, (double)((float)this.width / var3), (double)par1);
280            var2.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, (double)par1);
281            var2.draw();
282        }
283    
284        /**
285         * Returns true if this GUI should pause the game when it is displayed in single-player
286         */
287        public boolean doesGuiPauseGame()
288        {
289            return true;
290        }
291    
292        public void confirmClicked(boolean par1, int par2) {}
293    
294        public static boolean isCtrlKeyDown()
295        {
296            boolean var0 = Keyboard.isKeyDown(28) && Keyboard.getEventCharacter() == 0;
297            return Keyboard.isKeyDown(29) || Keyboard.isKeyDown(157) || field_90017_e && (var0 || Keyboard.isKeyDown(219) || Keyboard.isKeyDown(220));
298        }
299    
300        public static boolean isShiftKeyDown()
301        {
302            return Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54);
303        }
304    }