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