package org.ultramine.gui; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.ChatAllowedCharacters; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class ElementTextField implements IGuiElement { private final FontRenderer fontRenderer; protected final int id; private final int xRel; private final int yRel; private final int width; private final int height; private int xPos; private int yPos; private String text = ""; private int maxStringLength = 48; private int cursorCounter; private boolean enableBackgroundDrawing = true; private boolean canLoseFocus = true; private boolean isFocused = false; private boolean isEnabled = true; private int textSelectionStartPoint = 0; private int cursorPoint = 0; private int textSelectionEndPoint = 0; private int enabledColor = 14737632; private int disabledColor = 7368816; private IActionListener actionListener; private String filter = null; public ElementTextField(int id, int x, int y, int w, int h) { this.fontRenderer = Minecraft.getMinecraft().fontRenderer; this.id = id; this.xRel = x; this.yRel = y; this.width = w; this.height = h; } @Override public void init(IActionListener container, int guiWidth, int guiHeight, int guiLeft, int guiTop) { this.actionListener = container; this.xPos = xRel + guiLeft; this.yPos = yRel + guiTop; } @Override public void draw(Minecraft minecraft, int mx, int my) { drawTextBox(); } @Override public void update() { ++this.cursorCounter; } public void setFilterString(String str) { filter = str; } public String filerAllowedCharacters(String par0Str) { if(filter == null) return par0Str; StringBuilder var1 = new StringBuilder(); char[] var2 = par0Str.toCharArray(); int var3 = var2.length; for (int var4 = 0; var4 < var3; ++var4) { char var5 = var2[var4]; if (filter.indexOf((int)var5) != -1) { var1.append(var5); } } return var1.toString(); } public void setText(String par1Str) { if (par1Str.length() > this.maxStringLength) { this.text = par1Str.substring(0, this.maxStringLength); } else { this.text = par1Str; } this.cursorToEnd(); } public String getText() { return this.text; } public int getAsIntegerOr(int deflt) { try { if(text.length() != 0) return Integer.parseInt(text); else return deflt; } catch(NumberFormatException e) { return deflt; } } public double getAsDoubleOr(double deflt) { try { if(text.length() != 0) return Double.parseDouble(text); else return deflt; } catch(NumberFormatException e) { return deflt; } } public String getSelectedText() { int var1 = this.cursorPoint < this.textSelectionEndPoint ? this.cursorPoint : this.textSelectionEndPoint; int var2 = this.cursorPoint < this.textSelectionEndPoint ? this.textSelectionEndPoint : this.cursorPoint; return this.text.substring(var1, var2); } public void addStr(String str) { str = filerAllowedCharacters(str); String var2 = ""; int var4 = this.cursorPoint < this.textSelectionEndPoint ? this.cursorPoint : this.textSelectionEndPoint; int var5 = this.cursorPoint < this.textSelectionEndPoint ? this.textSelectionEndPoint : this.cursorPoint; int var6 = this.maxStringLength - this.text.length() - (var4 - this.textSelectionEndPoint); if (this.text.length() > 0) { var2 = var2 + this.text.substring(0, var4); } int var8; if (var6 < str.length()) { var2 = var2 + str.substring(0, var6); var8 = var6; } else { var2 = var2 + str; var8 = str.length(); } if (this.text.length() > 0 && var5 < this.text.length()) { var2 = var2 + this.text.substring(var5); } this.text = var2; this.moveCursor(var4 - this.textSelectionEndPoint + var8); if(id >= 0) { actionListener.actionPerformed(id, this, text); } } public void deleteWordAtCursor(int par1) { if (this.text.length() != 0) { if (this.textSelectionEndPoint != this.cursorPoint) { this.addStr(""); } else { this.deleteCharAtCursor(this.findSpaseNextCursor(par1) - this.cursorPoint); } } } public void deleteCharAtCursor(int par1) { if (this.text.length() != 0) { if (this.textSelectionEndPoint != this.cursorPoint) { this.addStr(""); } else { boolean var2 = par1 < 0; int var3 = var2 ? this.cursorPoint + par1 : this.cursorPoint; int var4 = var2 ? this.cursorPoint : this.cursorPoint + par1; String var5 = ""; if (var3 >= 0) { var5 = this.text.substring(0, var3); } if (var4 < this.text.length()) { var5 = var5 + this.text.substring(var4); } this.text = var5; if (var2) { this.moveCursor(par1); } if(id >= 0) { actionListener.actionPerformed(id, this, text); } } } } public int findSpaseNextCursor(int par1) { return findSpace(par1, this.getCursorPoint()); } public int findSpace(int par1, int par2) { int var3 = par2; boolean var4 = par1 < 0; int var5 = Math.abs(par1); for (int var6 = 0; var6 < var5; ++var6) { if (var4) { while (var3 > 0 && this.text.charAt(var3 - 1) == 32) { --var3; } while (var3 > 0 && this.text.charAt(var3 - 1) != 32) { --var3; } } else { int var7 = this.text.length(); var3 = this.text.indexOf(32, var3); if (var3 == -1) { var3 = var7; } else { while (var3 < var7 && this.text.charAt(var3) == 32) { ++var3; } } } } return var3; } public void moveCursor(int par1) { this.setCursorPos(this.textSelectionEndPoint + par1); } public void setCursorPos(int par1) { this.cursorPoint = par1; int var2 = this.text.length(); if (this.cursorPoint < 0) { this.cursorPoint = 0; } if (this.cursorPoint > var2) { this.cursorPoint = var2; } this.setTextSelection(this.cursorPoint); } public void cursorToHome() { this.setCursorPos(0); } public void cursorToEnd() { this.setCursorPos(this.text.length()); } @Override public void keyTyped(char c, int code) { keyTypedTB(c, code); } public boolean keyTypedTB(char c, int code) { if (this.isEnabled && this.isFocused) { switch (c) { case 1: this.cursorToEnd(); this.setTextSelection(0); return true; case 3: GuiScreen.setClipboardString(this.getSelectedText()); return true; case 22: this.addStr(GuiScreen.getClipboardString()); return true; case 24: GuiScreen.setClipboardString(this.getSelectedText()); this.addStr(""); return true; default: switch (code) { case 14: if (GuiScreen.isCtrlKeyDown()) { this.deleteWordAtCursor(-1); } else { this.deleteCharAtCursor(-1); } return true; case 199: if (GuiScreen.isShiftKeyDown()) { this.setTextSelection(0); } else { this.cursorToHome(); } return true; case 203: if (GuiScreen.isShiftKeyDown()) { if (GuiScreen.isCtrlKeyDown()) { this.setTextSelection(this.findSpace(-1, this.getSelectionEndPoint())); } else { this.setTextSelection(this.getSelectionEndPoint() - 1); } } else if (GuiScreen.isCtrlKeyDown()) { this.setCursorPos(this.findSpaseNextCursor(-1)); } else { this.moveCursor(-1); } return true; case 205: if (GuiScreen.isShiftKeyDown()) { if (GuiScreen.isCtrlKeyDown()) { this.setTextSelection(this.findSpace(1, this.getSelectionEndPoint())); } else { this.setTextSelection(this.getSelectionEndPoint() + 1); } } else if (GuiScreen.isCtrlKeyDown()) { this.setCursorPos(this.findSpaseNextCursor(1)); } else { this.moveCursor(1); } return true; case 207: if (GuiScreen.isShiftKeyDown()) { this.setTextSelection(this.text.length()); } else { this.cursorToEnd(); } return true; case 211: //delele key if (GuiScreen.isCtrlKeyDown()) { this.deleteWordAtCursor(1); } else { this.deleteCharAtCursor(1); } return true; default: if (ChatAllowedCharacters.isAllowedCharacter(c)) { this.addStr(Character.toString(c)); return true; } else { return false; } } } } else { return false; } } @Override public void mouseClicked(int par1, int par2, int par3) { boolean var4 = par1 >= this.xPos && par1 < this.xPos + this.width && par2 >= this.yPos && par2 < this.yPos + this.height; if (this.canLoseFocus) { this.setFocused(this.isEnabled && var4); } if (this.isFocused && par3 == 0) { int var5 = par1 - this.xPos; if (this.enableBackgroundDrawing) { var5 -= 4; } String var6 = this.fontRenderer.trimStringToWidth(this.text.substring(this.textSelectionStartPoint), this.width()); this.setCursorPos(this.fontRenderer.trimStringToWidth(var6, var5).length() + this.textSelectionStartPoint); } } public void drawTextBox() { if (this.getEnableBackgroundDrawing()) { GuiUtils.drawRect(this.xPos - 1, this.yPos - 1, this.xPos + this.width + 1, this.yPos + this.height + 1, -6250336); GuiUtils.drawRect(this.xPos, this.yPos, this.xPos + this.width, this.yPos + this.height, -16777216); } int var1 = this.isEnabled ? this.enabledColor : this.disabledColor; int var2 = this.cursorPoint - this.textSelectionStartPoint; int var3 = this.textSelectionEndPoint - this.textSelectionStartPoint; String var4 = this.fontRenderer.trimStringToWidth(this.text.substring(this.textSelectionStartPoint), this.width()); boolean var5 = var2 >= 0 && var2 <= var4.length(); boolean var6 = this.isFocused && this.cursorCounter / 6 % 2 == 0 && var5; int var7 = this.enableBackgroundDrawing ? this.xPos + 4 : this.xPos; int var8 = this.enableBackgroundDrawing ? this.yPos + (this.height - 8) / 2 : this.yPos; int var9 = var7; if (var3 > var4.length()) { var3 = var4.length(); } if (var4.length() > 0) { String var10 = var5 ? var4.substring(0, var2) : var4; var9 = this.fontRenderer.drawStringWithShadow(var10, var7, var8, var1); } boolean var13 = this.cursorPoint < this.text.length() || this.text.length() >= this.getMaxStrLength(); int var11 = var9; if (!var5) { var11 = var2 > 0 ? var7 + this.width : var7; } else if (var13) { var11 = var9 - 1; --var9; } if (var4.length() > 0 && var5 && var2 < var4.length()) { this.fontRenderer.drawStringWithShadow(var4.substring(var2), var9, var8, var1); } if (var6) { if (var13) { Gui.drawRect(var11, var8 - 1, var11 + 1, var8 + 1 + this.fontRenderer.FONT_HEIGHT, -3092272); } else { this.fontRenderer.drawStringWithShadow("_", var11, var8, var1); } } if (var3 != var2) { int var12 = var7 + this.fontRenderer.getStringWidth(var4.substring(0, var3)); this.drawTextSelection(var11, var8 - 1, var12 - 1, var8 + 1 + this.fontRenderer.FONT_HEIGHT); } } private void drawTextSelection(int par1, int par2, int par3, int par4) { int var5; if (par1 < par3) { var5 = par1; par1 = par3; par3 = var5; } if (par2 < par4) { var5 = par2; par2 = par4; par4 = var5; } Tessellator var6 = Tessellator.instance; GL11.glColor4f(0.0F, 0.0F, 255.0F, 255.0F); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_COLOR_LOGIC_OP); GL11.glLogicOp(GL11.GL_OR_REVERSE); var6.startDrawingQuads(); var6.addVertex((double)par1, (double)par4, 0.0D); var6.addVertex((double)par3, (double)par4, 0.0D); var6.addVertex((double)par3, (double)par2, 0.0D); var6.addVertex((double)par1, (double)par2, 0.0D); var6.draw(); GL11.glDisable(GL11.GL_COLOR_LOGIC_OP); GL11.glEnable(GL11.GL_TEXTURE_2D); } public void setMaxStringLength(int par1) { this.maxStringLength = par1; if (this.text.length() > par1) { this.text = this.text.substring(0, par1); } } public int getMaxStrLength() { return this.maxStringLength; } public int getCursorPoint() { return this.cursorPoint; } /** * get enable drawing background and outline */ public boolean getEnableBackgroundDrawing() { return this.enableBackgroundDrawing; } /** * enable drawing background and outline */ public void setEnableBackgroundDrawing(boolean par1) { this.enableBackgroundDrawing = par1; } /** * setter for the focused field */ public void setFocused(boolean par1) { if (par1 && !this.isFocused) { this.cursorCounter = 0; } this.isFocused = par1; } /** * getter for the focused field */ public boolean getIsFocused() { return this.isFocused; } public int getSelectionEndPoint() { return textSelectionEndPoint; } public int width() { return this.getEnableBackgroundDrawing() ? this.width - 8 : this.width; } public void setTextSelection(int par1) { int strlen = this.text.length(); if (par1 > strlen) { par1 = strlen; } if (par1 < 0) { par1 = 0; } this.textSelectionEndPoint = par1; if (this.fontRenderer != null) { if (this.textSelectionStartPoint > strlen) { this.textSelectionStartPoint = strlen; } int var3 = width(); String var4 = fontRenderer.trimStringToWidth(text.substring(textSelectionStartPoint), var3); int var5 = var4.length() + this.textSelectionStartPoint; if (par1 == this.textSelectionStartPoint) { this.textSelectionStartPoint -= this.fontRenderer.trimStringToWidth(text, var3, true).length(); } if (par1 > var5) { this.textSelectionStartPoint += par1 - var5; } else if (par1 <= this.textSelectionStartPoint) { this.textSelectionStartPoint -= this.textSelectionStartPoint - par1; } if (this.textSelectionStartPoint < 0) { this.textSelectionStartPoint = 0; } if (this.textSelectionStartPoint > strlen) { this.textSelectionStartPoint = strlen; } } } /** * if true the textbox can lose focus by clicking elsewhere on the screen */ public void setCanLoseFocus(boolean par1) { this.canLoseFocus = par1; } }