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