package codechicken.nei;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.util.ChatAllowedCharacters;
import org.lwjgl.input.Keyboard;
import static codechicken.lib.gui.GuiDraw.*;
public abstract class TextField extends Widget
{
public TextField(String ident) {
identifier = ident;
}
public int getTextColour() {
return focused() ? 0xFFE0E0E0 : 0xFF909090;
}
public void drawBox() {
drawRect(x, y, w, h, 0xffA0A0A0);
drawRect(x + 1, y + 1, w - 2, h - 2, 0xFF000000);
}
@Override
public void draw(int mousex, int mousey) {
drawBox();
String drawtext = text;
int textWidth;
while((textWidth = getStringWidth(drawtext)) > w - 14)
drawtext = drawtext.substring(1);
if (focused() && (cursorCounter / 6) % 2 == 0)
drawtext = drawtext + '_';
int textx = centered ? x + (w - textWidth) / 2 : x + 4;
int texty = y + (h + 1) / 2 - 3;
drawString(drawtext, textx, texty, getTextColour());
}
@Override
public void onGuiClick(int mousex, int mousey) {
if (!contains(mousex, mousey))
setFocus(false);
}
@Override
public boolean handleClick(int mousex, int mousey, int button) {
if (button == 1)
setText("");
setFocus(true);
return true;
}
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (!focused())
return false;
if (keyID == Keyboard.KEY_BACK) {
if (text.length() > 0) {
setText(text.substring(0, text.length() - 1));
backdowntime = System.currentTimeMillis();
}
} else if (keyID == Keyboard.KEY_RETURN || keyID == Keyboard.KEY_ESCAPE) {
setFocus(false);
onExit();
} else if (keyChar == 22)//paste
{
String pastestring = GuiScreen.getClipboardString();
if (pastestring == null)
pastestring = "";
if (isValid(text + pastestring))
setText(text + pastestring);
} else if (isValid(text + keyChar))
setText(text + keyChar);
return true;
}
public void onExit() {
}
public abstract void onTextChange(String oldText);
public boolean isValid(String string) {
// Solve the problem that Minecraft can't post Chinese characters
return ChatAllowedCharacters.isAllowedCharacter(string.charAt(string.length() - 1));
}
@Override
public void update() {
cursorCounter++;
if (backdowntime > 0) {
if (Keyboard.isKeyDown(Keyboard.KEY_BACK) && text.length() > 0) {
if (System.currentTimeMillis() - backdowntime > 200 / (1 + backs * 0.3F)) {
setText(text.substring(0, text.length() - 1));
backdowntime = System.currentTimeMillis();
backs++;
}
} else {
backdowntime = 0;
backs = 0;
}
}
}
public void setText(String s) {
String oldText = text;
text = filterText(s);
onTextChange(oldText);
}
public String filterText(String s) {
return s;
}
public void setFocus(boolean focus) {
if (focus) {
LayoutManager.setInputFocused(this);
} else if (focused()) {
LayoutManager.setInputFocused(null);
}
}
public boolean focused() {
return LayoutManager.getInputFocused() == this;
}
public String text() {
return text;
}
private String text = "";
public boolean centered;
public long backdowntime;
public int backs;
public String identifier;
public int cursorCounter;
}