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 }