552 lines
18 KiB
Java
552 lines
18 KiB
Java
package me.rigamortis.seppuku.api.gui.menu;
|
|
|
|
import com.google.common.base.Predicate;
|
|
import com.google.common.base.Predicates;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.gui.FontRenderer;
|
|
import net.minecraft.client.gui.Gui;
|
|
import net.minecraft.client.gui.GuiPageButtonList.GuiResponder;
|
|
import net.minecraft.client.gui.GuiScreen;
|
|
import net.minecraft.client.renderer.BufferBuilder;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.GlStateManager.LogicOp;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
|
import net.minecraft.util.ChatAllowedCharacters;
|
|
import net.minecraft.util.math.MathHelper;
|
|
|
|
/**
|
|
* @author Mojang
|
|
* @author noil
|
|
*/
|
|
public class GuiPasswordField extends Gui {
|
|
|
|
private final int id;
|
|
private final FontRenderer fontRenderer;
|
|
public int x;
|
|
public int y;
|
|
public int width;
|
|
public int height;
|
|
private String text = "";
|
|
private int maxStringLength = 32;
|
|
private int cursorCounter;
|
|
private boolean enableBackgroundDrawing = true;
|
|
private boolean canLoseFocus = true;
|
|
private boolean isFocused;
|
|
private boolean isEnabled = true;
|
|
private int lineScrollOffset;
|
|
private int cursorPosition;
|
|
private int selectionEnd;
|
|
private int enabledColor = 14737632;
|
|
private int disabledColor = 7368816;
|
|
private boolean visible = true;
|
|
private GuiResponder guiResponder;
|
|
private Predicate<String> validator = Predicates.alwaysTrue();
|
|
|
|
public GuiPasswordField(int componentId, FontRenderer fontrendererObj, int x, int y, int par5Width, int par6Height) {
|
|
this.id = componentId;
|
|
this.fontRenderer = fontrendererObj;
|
|
this.x = x;
|
|
this.y = y;
|
|
this.width = par5Width;
|
|
this.height = par6Height;
|
|
}
|
|
|
|
public void setGuiResponder(GuiResponder guiResponderIn) {
|
|
this.guiResponder = guiResponderIn;
|
|
}
|
|
|
|
public void updateCursorCounter() {
|
|
++this.cursorCounter;
|
|
}
|
|
|
|
public void setText(String textIn) {
|
|
if (this.validator.apply(textIn)) {
|
|
if (textIn.length() > this.maxStringLength) {
|
|
this.text = textIn.substring(0, this.maxStringLength);
|
|
} else {
|
|
this.text = textIn;
|
|
}
|
|
|
|
this.setCursorPositionEnd();
|
|
}
|
|
|
|
}
|
|
|
|
public String getText() {
|
|
return this.text;
|
|
}
|
|
|
|
public String getSelectedText() {
|
|
int i = Math.min(this.cursorPosition, this.selectionEnd);
|
|
int j = Math.max(this.cursorPosition, this.selectionEnd);
|
|
return this.text.substring(i, j);
|
|
}
|
|
|
|
public void setValidator(Predicate<String> theValidator) {
|
|
this.validator = theValidator;
|
|
}
|
|
|
|
public void writeText(String textToWrite) {
|
|
String s = "";
|
|
String s1 = ChatAllowedCharacters.filterAllowedCharacters(textToWrite);
|
|
int i = Math.min(this.cursorPosition, this.selectionEnd);
|
|
int j = Math.max(this.cursorPosition, this.selectionEnd);
|
|
int k = this.maxStringLength - this.text.length() - (i - j);
|
|
if (!this.text.isEmpty()) {
|
|
s = s + this.text.substring(0, i);
|
|
}
|
|
|
|
int l;
|
|
if (k < s1.length()) {
|
|
s = s + s1.substring(0, k);
|
|
l = k;
|
|
} else {
|
|
s = s + s1;
|
|
l = s1.length();
|
|
}
|
|
|
|
if (!this.text.isEmpty() && j < this.text.length()) {
|
|
s = s + this.text.substring(j);
|
|
}
|
|
|
|
if (this.validator.apply(s)) {
|
|
this.text = s;
|
|
this.moveCursorBy(i - this.selectionEnd + l);
|
|
this.setResponderEntryValue(this.id, this.text);
|
|
}
|
|
|
|
}
|
|
|
|
public void setResponderEntryValue(int idIn, String textIn) {
|
|
if (this.guiResponder != null) {
|
|
this.guiResponder.setEntryValue(idIn, textIn);
|
|
}
|
|
|
|
}
|
|
|
|
public void deleteWords(int num) {
|
|
if (!this.text.isEmpty()) {
|
|
if (this.selectionEnd != this.cursorPosition) {
|
|
this.writeText("");
|
|
} else {
|
|
this.deleteFromCursor(this.getNthWordFromCursor(num) - this.cursorPosition);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public void deleteFromCursor(int num) {
|
|
if (!this.text.isEmpty()) {
|
|
if (this.selectionEnd != this.cursorPosition) {
|
|
this.writeText("");
|
|
} else {
|
|
boolean flag = num < 0;
|
|
int i = flag ? this.cursorPosition + num : this.cursorPosition;
|
|
int j = flag ? this.cursorPosition : this.cursorPosition + num;
|
|
String s = "";
|
|
if (i >= 0) {
|
|
s = this.text.substring(0, i);
|
|
}
|
|
|
|
if (j < this.text.length()) {
|
|
s = s + this.text.substring(j);
|
|
}
|
|
|
|
if (this.validator.apply(s)) {
|
|
this.text = s;
|
|
if (flag) {
|
|
this.moveCursorBy(num);
|
|
}
|
|
|
|
this.setResponderEntryValue(this.id, this.text);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public int getId() {
|
|
return this.id;
|
|
}
|
|
|
|
public int getNthWordFromCursor(int numWords) {
|
|
return this.getNthWordFromPos(numWords, this.getCursorPosition());
|
|
}
|
|
|
|
public int getNthWordFromPos(int n, int pos) {
|
|
return this.getNthWordFromPosWS(n, pos, true);
|
|
}
|
|
|
|
public int getNthWordFromPosWS(int n, int pos, boolean skipWs) {
|
|
int i = pos;
|
|
boolean flag = n < 0;
|
|
int j = Math.abs(n);
|
|
|
|
for (int k = 0; k < j; ++k) {
|
|
if (!flag) {
|
|
int l = this.text.length();
|
|
i = this.text.indexOf(32, i);
|
|
if (i == -1) {
|
|
i = l;
|
|
} else {
|
|
while (skipWs && i < l && this.text.charAt(i) == ' ') {
|
|
++i;
|
|
}
|
|
}
|
|
} else {
|
|
while (skipWs && i > 0 && this.text.charAt(i - 1) == ' ') {
|
|
--i;
|
|
}
|
|
|
|
while (i > 0 && this.text.charAt(i - 1) != ' ') {
|
|
--i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
public void moveCursorBy(int num) {
|
|
this.setCursorPosition(this.selectionEnd + num);
|
|
}
|
|
|
|
public void setCursorPosition(int pos) {
|
|
this.cursorPosition = pos;
|
|
int i = this.text.length();
|
|
this.cursorPosition = MathHelper.clamp(this.cursorPosition, 0, i);
|
|
this.setSelectionPos(this.cursorPosition);
|
|
}
|
|
|
|
public void setCursorPositionZero() {
|
|
this.setCursorPosition(0);
|
|
}
|
|
|
|
public void setCursorPositionEnd() {
|
|
this.setCursorPosition(this.text.length());
|
|
}
|
|
|
|
public boolean textboxKeyTyped(char typedChar, int keyCode) {
|
|
if (!this.isFocused) {
|
|
return false;
|
|
} else if (GuiScreen.isKeyComboCtrlA(keyCode)) {
|
|
this.setCursorPositionEnd();
|
|
this.setSelectionPos(0);
|
|
return true;
|
|
} else if (GuiScreen.isKeyComboCtrlC(keyCode)) {
|
|
GuiScreen.setClipboardString(this.getSelectedText());
|
|
return true;
|
|
} else if (GuiScreen.isKeyComboCtrlV(keyCode)) {
|
|
if (this.isEnabled) {
|
|
this.writeText(GuiScreen.getClipboardString());
|
|
}
|
|
|
|
return true;
|
|
} else if (GuiScreen.isKeyComboCtrlX(keyCode)) {
|
|
GuiScreen.setClipboardString(this.getSelectedText());
|
|
if (this.isEnabled) {
|
|
this.writeText("");
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
switch (keyCode) {
|
|
case 14:
|
|
if (GuiScreen.isCtrlKeyDown()) {
|
|
if (this.isEnabled) {
|
|
this.deleteWords(-1);
|
|
}
|
|
} else if (this.isEnabled) {
|
|
this.deleteFromCursor(-1);
|
|
}
|
|
|
|
return true;
|
|
case 199:
|
|
if (GuiScreen.isShiftKeyDown()) {
|
|
this.setSelectionPos(0);
|
|
} else {
|
|
this.setCursorPositionZero();
|
|
}
|
|
|
|
return true;
|
|
case 203:
|
|
if (GuiScreen.isShiftKeyDown()) {
|
|
if (GuiScreen.isCtrlKeyDown()) {
|
|
this.setSelectionPos(this.getNthWordFromPos(-1, this.getSelectionEnd()));
|
|
} else {
|
|
this.setSelectionPos(this.getSelectionEnd() - 1);
|
|
}
|
|
} else if (GuiScreen.isCtrlKeyDown()) {
|
|
this.setCursorPosition(this.getNthWordFromCursor(-1));
|
|
} else {
|
|
this.moveCursorBy(-1);
|
|
}
|
|
|
|
return true;
|
|
case 205:
|
|
if (GuiScreen.isShiftKeyDown()) {
|
|
if (GuiScreen.isCtrlKeyDown()) {
|
|
this.setSelectionPos(this.getNthWordFromPos(1, this.getSelectionEnd()));
|
|
} else {
|
|
this.setSelectionPos(this.getSelectionEnd() + 1);
|
|
}
|
|
} else if (GuiScreen.isCtrlKeyDown()) {
|
|
this.setCursorPosition(this.getNthWordFromCursor(1));
|
|
} else {
|
|
this.moveCursorBy(1);
|
|
}
|
|
|
|
return true;
|
|
case 207:
|
|
if (GuiScreen.isShiftKeyDown()) {
|
|
this.setSelectionPos(this.text.length());
|
|
} else {
|
|
this.setCursorPositionEnd();
|
|
}
|
|
|
|
return true;
|
|
case 211:
|
|
if (GuiScreen.isCtrlKeyDown()) {
|
|
if (this.isEnabled) {
|
|
this.deleteWords(1);
|
|
}
|
|
} else if (this.isEnabled) {
|
|
this.deleteFromCursor(1);
|
|
}
|
|
|
|
return true;
|
|
default:
|
|
if (ChatAllowedCharacters.isAllowedCharacter(typedChar)) {
|
|
if (this.isEnabled) {
|
|
this.writeText(Character.toString(typedChar));
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) {
|
|
boolean flag = mouseX >= this.x && mouseX < this.x + this.width && mouseY >= this.y && mouseY < this.y + this.height;
|
|
if (this.canLoseFocus) {
|
|
this.setFocused(flag);
|
|
}
|
|
|
|
if (this.isFocused && flag && mouseButton == 0) {
|
|
int i = mouseX - this.x;
|
|
if (this.enableBackgroundDrawing) {
|
|
i -= 4;
|
|
}
|
|
|
|
String s = this.fontRenderer.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
|
|
this.setCursorPosition(this.fontRenderer.trimStringToWidth(s, i).length() + this.lineScrollOffset);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void drawTextBox() {
|
|
if (this.getVisible()) {
|
|
if (this.getEnableBackgroundDrawing()) {
|
|
drawRect(this.x - 1, this.y - 1, this.x + this.width + 1, this.y + this.height + 1, -6250336);
|
|
drawRect(this.x, this.y, this.x + this.width, this.y + this.height, -16777216);
|
|
}
|
|
|
|
int i = this.isEnabled ? this.enabledColor : this.disabledColor;
|
|
int j = this.cursorPosition - this.lineScrollOffset;
|
|
int k = this.selectionEnd - this.lineScrollOffset;
|
|
String s = this.fontRenderer.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
|
|
boolean flag = j >= 0 && j <= s.length();
|
|
boolean flag1 = this.isFocused && this.cursorCounter / 6 % 2 == 0 && flag;
|
|
int l = this.enableBackgroundDrawing ? this.x + 4 : this.x;
|
|
int i1 = this.enableBackgroundDrawing ? this.y + (this.height - 8) / 2 : this.y;
|
|
int j1 = l;
|
|
if (k > s.length()) {
|
|
k = s.length();
|
|
}
|
|
|
|
if (!s.isEmpty()) {
|
|
String s1 = flag ? s.substring(0, j) : s;
|
|
j1 = this.fontRenderer.drawStringWithShadow(s1.replaceAll("(?s).", "*"), (float) l, (float) i1, i);
|
|
}
|
|
|
|
boolean flag2 = this.cursorPosition < this.text.length() || this.text.length() >= this.getMaxStringLength();
|
|
int k1 = j1;
|
|
if (!flag) {
|
|
k1 = j > 0 ? l + this.width : l;
|
|
} else if (flag2) {
|
|
k1 = j1 - 1;
|
|
--j1;
|
|
}
|
|
|
|
if (!s.isEmpty() && flag && j < s.length()) {
|
|
j1 = this.fontRenderer.drawStringWithShadow(s.substring(j), (float) j1, (float) i1, i);
|
|
}
|
|
|
|
if (flag1) {
|
|
if (flag2) {
|
|
Gui.drawRect(k1, i1 - 1, k1 + 1, i1 + 1 + this.fontRenderer.FONT_HEIGHT, -3092272);
|
|
} else {
|
|
this.fontRenderer.drawStringWithShadow("_", (float) k1, (float) i1, i);
|
|
}
|
|
}
|
|
|
|
if (k != j) {
|
|
int l1 = l + this.fontRenderer.getStringWidth(s.substring(0, k));
|
|
this.drawSelectionBox(k1, i1 - 1, l1 - 1, i1 + 1 + this.fontRenderer.FONT_HEIGHT);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void drawSelectionBox(int startX, int startY, int endX, int endY) {
|
|
int j;
|
|
if (startX < endX) {
|
|
j = startX;
|
|
startX = endX;
|
|
endX = j;
|
|
}
|
|
|
|
if (startY < endY) {
|
|
j = startY;
|
|
startY = endY;
|
|
endY = j;
|
|
}
|
|
|
|
if (endX > this.x + this.width) {
|
|
endX = this.x + this.width;
|
|
}
|
|
|
|
if (startX > this.x + this.width) {
|
|
startX = this.x + this.width;
|
|
}
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
BufferBuilder bufferbuilder = tessellator.getBuffer();
|
|
GlStateManager.color(0.0F, 0.0F, 255.0F, 255.0F);
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.enableColorLogic();
|
|
GlStateManager.colorLogicOp(LogicOp.OR_REVERSE);
|
|
bufferbuilder.begin(7, DefaultVertexFormats.POSITION);
|
|
bufferbuilder.pos((double) startX, (double) endY, 0.0D).endVertex();
|
|
bufferbuilder.pos((double) endX, (double) endY, 0.0D).endVertex();
|
|
bufferbuilder.pos((double) endX, (double) startY, 0.0D).endVertex();
|
|
bufferbuilder.pos((double) startX, (double) startY, 0.0D).endVertex();
|
|
tessellator.draw();
|
|
GlStateManager.disableColorLogic();
|
|
GlStateManager.enableTexture2D();
|
|
}
|
|
|
|
public void setMaxStringLength(int length) {
|
|
this.maxStringLength = length;
|
|
if (this.text.length() > length) {
|
|
this.text = this.text.substring(0, length);
|
|
}
|
|
|
|
}
|
|
|
|
public int getMaxStringLength() {
|
|
return this.maxStringLength;
|
|
}
|
|
|
|
public int getCursorPosition() {
|
|
return this.cursorPosition;
|
|
}
|
|
|
|
public boolean getEnableBackgroundDrawing() {
|
|
return this.enableBackgroundDrawing;
|
|
}
|
|
|
|
public void setEnableBackgroundDrawing(boolean enableBackgroundDrawingIn) {
|
|
this.enableBackgroundDrawing = enableBackgroundDrawingIn;
|
|
}
|
|
|
|
public void setTextColor(int color) {
|
|
this.enabledColor = color;
|
|
}
|
|
|
|
public void setDisabledTextColour(int color) {
|
|
this.disabledColor = color;
|
|
}
|
|
|
|
public void setFocused(boolean isFocusedIn) {
|
|
if (isFocusedIn && !this.isFocused) {
|
|
this.cursorCounter = 0;
|
|
}
|
|
|
|
this.isFocused = isFocusedIn;
|
|
if (Minecraft.getMinecraft().currentScreen != null) {
|
|
Minecraft.getMinecraft().currentScreen.setFocused(isFocusedIn);
|
|
}
|
|
|
|
}
|
|
|
|
public boolean isFocused() {
|
|
return this.isFocused;
|
|
}
|
|
|
|
public void setEnabled(boolean enabled) {
|
|
this.isEnabled = enabled;
|
|
}
|
|
|
|
public int getSelectionEnd() {
|
|
return this.selectionEnd;
|
|
}
|
|
|
|
public int getWidth() {
|
|
return this.getEnableBackgroundDrawing() ? this.width - 8 : this.width;
|
|
}
|
|
|
|
public void setSelectionPos(int position) {
|
|
int i = this.text.length();
|
|
if (position > i) {
|
|
position = i;
|
|
}
|
|
|
|
if (position < 0) {
|
|
position = 0;
|
|
}
|
|
|
|
this.selectionEnd = position;
|
|
if (this.fontRenderer != null) {
|
|
if (this.lineScrollOffset > i) {
|
|
this.lineScrollOffset = i;
|
|
}
|
|
|
|
int j = this.getWidth();
|
|
String s = this.fontRenderer.trimStringToWidth(this.text.substring(this.lineScrollOffset), j);
|
|
int k = s.length() + this.lineScrollOffset;
|
|
if (position == this.lineScrollOffset) {
|
|
this.lineScrollOffset -= this.fontRenderer.trimStringToWidth(this.text, j, true).length();
|
|
}
|
|
|
|
if (position > k) {
|
|
this.lineScrollOffset += position - k;
|
|
} else if (position <= this.lineScrollOffset) {
|
|
this.lineScrollOffset -= this.lineScrollOffset - position;
|
|
}
|
|
|
|
this.lineScrollOffset = MathHelper.clamp(this.lineScrollOffset, 0, i);
|
|
}
|
|
|
|
}
|
|
|
|
public void setCanLoseFocus(boolean canLoseFocusIn) {
|
|
this.canLoseFocus = canLoseFocusIn;
|
|
}
|
|
|
|
public boolean getVisible() {
|
|
return this.visible;
|
|
}
|
|
|
|
public void setVisible(boolean isVisible) {
|
|
this.visible = isVisible;
|
|
}
|
|
}
|
|
|