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