package gamegui; import java.awt.FontMetrics; import java.awt.image.ImageObserver; import java.awt.Image; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.Font; import utils.Utils; public class Textbox extends Member { private String label; private String text; private Font font; private int textStart; private boolean selected; private int cursorState; private int blinkInterval; private long lastCursorChange; private boolean password; protected boolean noBorder; protected BufferedImage source; protected Graphics2D srcGraphics; public Textbox(final String newName, final int newX, final int newY, final int newWidth, final int newHeight, final String newLabel, final Font newFont, final boolean isPass) { super(newName, newX, newY, newWidth, newHeight); this.label = new String(newLabel); this.text = new String(); this.font = newFont; this.textStart = 0; this.selected = false; this.cursorState = 0; this.blinkInterval = 500; this.password = isPass; this.noBorder = false; this.source = Utils.gc.createCompatibleImage(this.getWidth(), this.getHeight()); this.srcGraphics = this.source.createGraphics(); } public void setBorder(final boolean b) { this.noBorder = !b; } public void handleEvent(final KeyEvent e) { if (' ' <= e.getKeyChar() && e.getKeyChar() <= '~') { this.text = String.valueOf(this.text) + Character.toString(e.getKeyChar()); } else if (e.getKeyCode() == 8 && this.text.length() > 0) { this.text = this.text.substring(0, this.text.length() - 1); } } @Override public void draw(final Graphics g) { String drawnString = new String(); final FontMetrics metrics = g.getFontMetrics(this.font); if (this.selected && System.currentTimeMillis() - this.lastCursorChange > this.blinkInterval) { if (this.cursorState == 0) { this.cursorState = 1; } else { this.cursorState = 0; } this.lastCursorChange = System.currentTimeMillis(); } if (this.password) { for (int x = 0; x < this.text.length(); ++x) { drawnString = String.valueOf(drawnString) + "*"; } } else { drawnString = this.text; } if (metrics.stringWidth(drawnString) + 9 > this.getWidth()) { this.textStart = metrics.stringWidth(drawnString) + 9 - this.getWidth(); } else { this.textStart = 0; } this.srcGraphics.setColor(Color.black); this.srcGraphics.fillRect(0, 0, this.source.getWidth(), this.source.getHeight()); g.setColor(Color.green); g.setFont(this.font); this.srcGraphics.setColor(Color.green); this.srcGraphics.setFont(this.font); this.srcGraphics.drawString(drawnString, 5 - this.textStart, (this.getHeight() + metrics.getHeight()) / 2 - 2); g.drawImage(this.source, this.getX(), this.getY(), null); g.drawString(this.label, this.getX() - metrics.stringWidth(this.label) - 10, this.getY() + (this.getHeight() + metrics.getHeight()) / 2 - 2); if (this.selected && this.cursorState == 1) { g.drawLine(this.getX() + metrics.stringWidth(drawnString) - this.textStart + 6, this.getY() + 5, this.getX() + metrics.stringWidth(drawnString) - this.textStart + 6, this.getY() + this.getHeight() - 5); } g.setColor(Color.red); if (!this.noBorder) { g.drawRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); } } @Override public boolean isClicked(final int xCoord, final int yCoord) { return xCoord >= this.getX() && this.getX() + this.getWidth() >= xCoord && yCoord >= this.getY() && this.getY() + this.getHeight() >= yCoord; } @Override public void clear() { this.text = ""; this.textStart = 0; this.selected = false; } public int getBlinkInterval() { return this.blinkInterval; } public int getCursorState() { return this.cursorState; } public Font getFont() { return this.font; } public String getLabel() { return this.label; } public long getLastCursorChange() { return this.lastCursorChange; } public boolean isSelected() { return this.selected; } public String getText() { return this.text; } public int getTextStart() { return this.textStart; } public void setText(final String newText) { this.text = newText; } public void setSelected(final boolean isSelected) { this.selected = isSelected; } public void setTextStart(final int textStart) { this.textStart = textStart; } public void setCursorState(final int cursorState) { this.cursorState = cursorState; } public void setLastCursorChange(final long lastCursorChange) { this.lastCursorChange = lastCursorChange; } }