001package net.minecraft.client.gui;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.awt.Toolkit;
006import java.awt.datatransfer.ClipboardOwner;
007import java.awt.datatransfer.DataFlavor;
008import java.awt.datatransfer.StringSelection;
009import java.awt.datatransfer.Transferable;
010import java.util.ArrayList;
011import java.util.List;
012import net.minecraft.client.Minecraft;
013import net.minecraft.client.renderer.Tessellator;
014import net.minecraft.util.EnumOS;
015import org.lwjgl.input.Keyboard;
016import org.lwjgl.input.Mouse;
017import org.lwjgl.opengl.GL11;
018
019@SideOnly(Side.CLIENT)
020public 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}