package gamegui; 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.event.MouseEvent; import java.awt.Font; import java.awt.FontMetrics; import java.util.ArrayList; public class MultiTextbox extends Textbox { ArrayList lstStrings; FontMetrics metrics; boolean active; public MultiTextbox(final String newName, final int newX, final int newY, final int newWidth, final int newHeight, final String newLabel, final boolean isActive, final Font newFont, final FontMetrics newMetrics) { super(newName, newX, newY, newWidth, newHeight, newLabel, newFont, false); this.lstStrings = new ArrayList(); this.metrics = newMetrics; this.active = isActive; this.splitString(); } public void append(final String str) { if (this.getText().equals("")) { this.setText(str); } else { this.setText(String.valueOf(this.getText()) + "\n" + str); } this.splitString(); if (this.lstStrings.size() * 15 + 6 > this.getHeight()) { this.getScrollBar().setSize(this.getScrollBar().getMaxSize() * this.getHeight() / (this.lstStrings.size() * 15 + 6)); } else { this.getScrollBar().setSize(this.getScrollBar().getMaxSize()); } this.getScrollBar().setPosition(this.getScrollBar().getMaxSize() - this.getScrollBar().getSize()); } @Override public void setText(final String s) { super.setText(s); this.splitString(); } @Override public void clear() { super.clear(); this.lstStrings = new ArrayList(); } @Override public boolean handleEvent(final MouseEvent e) { if (!this.getScrollBar().handleEvent(e)) { return false; } if (e.getY() < this.getY() + this.getWidth()) { this.changeTextStart(-30); } else if (this.getY() + this.getHeight() - this.getWidth() < e.getY()) { this.changeTextStart(30); } return true; } @Override public void handleEvent(final KeyEvent e) { if (!this.active) { return; } super.handleEvent(e); this.splitString(); if (this.lstStrings.size() * 15 + 6 > this.getHeight()) { this.getScrollBar().setSize(this.getScrollBar().getMaxSize() * this.getHeight() / (this.lstStrings.size() * 15 + 6)); } else { this.getScrollBar().setSize(this.getScrollBar().getMaxSize()); } this.getScrollBar().setPosition(this.getScrollBar().getMaxSize() - this.getScrollBar().getSize()); } private void changeTextStart(final int increment) { this.setTextStart(this.getTextStart() + increment); if (this.lstStrings.size() * 15 + 6 > this.getHeight() && this.getTextStart() >= this.lstStrings.size() * 15 + 6 - this.getHeight()) { this.setTextStart(this.lstStrings.size() * 15 + 6 - this.getHeight()); this.getScrollBar().setPosition(this.getScrollBar().getMaxSize() - this.getScrollBar().getSize()); } else if (this.getTextStart() < 0 || this.lstStrings.size() * 15 + 6 <= this.getHeight()) { this.setTextStart(0); this.getScrollBar().setPosition(0); } else { this.getScrollBar().setPosition(this.getTextStart() * this.getScrollBar().getMaxSize() / (this.lstStrings.size() * 15 + 6)); } } private void splitString() { String drawnString = this.getText(); final ArrayList lstTemp = new ArrayList(); do { int x = 0; int lastSpace = -1; while (x < drawnString.length() && this.metrics.stringWidth(drawnString.substring(0, x + 1)) <= this.getWidth() - 10 && !drawnString.substring(x, x + 1).equals("\n")) { if (drawnString.charAt(x) == ' ') { lastSpace = x; } ++x; } final int xReal = x; if (lastSpace > 0 && drawnString.length() > x) { x = lastSpace + 1; } if (drawnString.length() > xReal && drawnString.substring(xReal, xReal + 1).equals("\n")) { lstTemp.add(drawnString.substring(0, xReal)); drawnString = drawnString.substring(xReal + 1); } else { lstTemp.add(drawnString.substring(0, x)); drawnString = drawnString.substring(x); } } while (this.metrics.stringWidth(drawnString) > 0); if (lstTemp.size() * 15 - this.getHeight() + 6 > 0) { this.setTextStart(lstTemp.size() * 15 - this.getHeight() + 6); } else { this.setTextStart(0); } this.lstStrings = lstTemp; } @Override public void draw(final Graphics g) { if (this.isSelected() && System.currentTimeMillis() - this.getLastCursorChange() > this.getBlinkInterval()) { if (this.getCursorState() == 0) { this.setCursorState(1); } else { this.setCursorState(0); } this.setLastCursorChange(System.currentTimeMillis()); } this.srcGraphics.setColor(new Color(0, 160, 0)); this.srcGraphics.setFont(this.getFont()); for (int x = 0; x < this.lstStrings.size(); ++x) { this.srcGraphics.drawString(this.lstStrings.get(x), 5, this.metrics.getHeight() + x * 15 - this.getTextStart()); } g.drawImage(this.source, this.getX(), this.getY(), null); g.setColor(Color.red); if (!this.noBorder) { g.drawRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); } } }