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