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