Newer
Older
ultramine_private_regions / src / main / java / org / ultramine / gui / ElementTextField.java
@vlad20012 vlad20012 on 29 Mar 2016 14 KB Initial commit
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;
	}
}