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