package gminers.glasspane.component.text; import gminers.glasspane.event.KeyTypedEvent; import gminers.glasspane.listener.PaneEventHandler; import joptsimple.internal.Strings; import lombok.Getter; import org.lwjgl.input.Keyboard; /** * A variant of TextField that hides it's contents, and doesn't allow copying or cutting. * * @author Aesen Vismea * */ public class PanePasswordField extends PaneTextField { @Getter private String text; @Override protected void doRender(final int mouseX, final int mouseY, final float partialTicks) { final String pureText = text = super.text; super.text = Strings.repeat('\u00D7', text.length()); super.doRender(mouseX, mouseY, partialTicks); super.text = pureText; } @PaneEventHandler @Override public void onKeyType(final KeyTypedEvent e) { // precalc the ctrl and shift values final boolean ctrl = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); // shift is included for IBM-style shortcuts instead of Windows-style final boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); if ((ctrl && e.getKeyCode() == Keyboard.KEY_C) || (ctrl && e.getKeyCode() == Keyboard.KEY_INSERT)) { // don't allow copying in a password field blinkColor = 0xFFFFFF; blink = 0.45f; } else if ((ctrl && e.getKeyCode() == Keyboard.KEY_X) || (shift && e.getKeyCode() == Keyboard.KEY_DELETE)) { // don't allow cutting in a password field blinkColor = 0xFFFFFF; blink = 0.45f; } else { super.onKeyType(e); } } }