    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    }