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 }