summaryrefslogtreecommitdiff
path: root/NET/worlds/console/TextCanvas.java
diff options
context:
space:
mode:
Diffstat (limited to 'NET/worlds/console/TextCanvas.java')
-rw-r--r--NET/worlds/console/TextCanvas.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/NET/worlds/console/TextCanvas.java b/NET/worlds/console/TextCanvas.java
new file mode 100644
index 0000000..382c69c
--- /dev/null
+++ b/NET/worlds/console/TextCanvas.java
@@ -0,0 +1,82 @@
+package NET.worlds.console;
+
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Toolkit;
+import java.util.Vector;
+
+public class TextCanvas extends Canvas {
+ private static final long serialVersionUID = 2808978760046610505L;
+ private Dimension calcSize;
+ private Font font;
+ private FontMetrics metrics;
+ private Vector<String> lines = new Vector<String>();
+
+ public TextCanvas(String text, int width) {
+ this.font = new Font(Console.message("CanvasFont"), 0, 12);
+ this.metrics = Toolkit.getDefaultToolkit().getFontMetrics(this.font);
+ char[] chars = text.toCharArray();
+ int start = 0;
+ int end = 0;
+ int prevEnd = 0;
+ int lineWidth = 0;
+ end = start;
+
+ while (end < chars.length) {
+ char c = chars[end];
+ boolean isEOL = c == '\n';
+ if (!isEOL && end == chars.length - 1) {
+ isEOL = true;
+ end++;
+ }
+
+ if (c != ' ' && !isEOL) {
+ end++;
+ } else {
+ lineWidth = this.metrics.charsWidth(chars, start, end - start);
+ if (width != -1 && lineWidth > width) {
+ end = prevEnd;
+ } else if ((width == -1 || lineWidth < width) && !isEOL) {
+ prevEnd = end++;
+ continue;
+ }
+
+ this.lines.addElement(new String(chars, start, end - start));
+ start = end + 1;
+
+ while (start < chars.length && chars[start] == ' ') {
+ start++;
+ }
+
+ end = start;
+ prevEnd = start;
+ }
+ }
+
+ this.calcSize = new Dimension(width == -1 ? lineWidth : width, this.metrics.getHeight() * this.lines.size());
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ g.setFont(this.font);
+ g.setColor(Color.black);
+ int height = this.metrics.getHeight();
+ int y = this.metrics.getAscent() + this.metrics.getLeading();
+
+ for (int i = 0; i < this.lines.size(); i++) {
+ String line = this.lines.elementAt(i);
+ g.drawString(line, 0, y);
+ y += height;
+ }
+ }
+
+ @Override
+ public Dimension preferredSize() {
+ return this.calcSize;
+ }
+}