| /* |
| ******************************************************************************* |
| * Copyright (C) 1997-2010, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.demo.impl; |
| |
| |
| import java.awt.FontMetrics; |
| import java.awt.Graphics; |
| import java.text.BreakIterator; |
| |
| public class DemoTextBox { |
| |
| public DemoTextBox(Graphics g, String text, int width) |
| { |
| this.text = text; |
| this.chars = new char[text.length()]; |
| text.getChars(0, text.length(), chars, 0); |
| |
| this.width = width; |
| // this.port = g; |
| this.metrics = g.getFontMetrics(); |
| |
| breakText(); |
| } |
| |
| public int getHeight() { |
| return (nbreaks + 1) * metrics.getHeight(); |
| } |
| |
| public void draw(Graphics g, int x, int y) |
| { |
| int index = 0; |
| |
| y += metrics.getAscent(); |
| |
| for (int i = 0; i < nbreaks; i++) |
| { |
| g.drawChars(chars, index, breakPos[i] - index, x, y); |
| index = breakPos[i]; |
| y += metrics.getHeight(); |
| } |
| |
| g.drawChars(chars, index, chars.length - index, x, y); |
| } |
| |
| |
| private void breakText() |
| { |
| if (metrics.charsWidth(chars, 0, chars.length) > width) |
| { |
| BreakIterator iter = BreakIterator.getWordInstance(); |
| iter.setText(text); |
| |
| int start = iter.first(); |
| int end = start; |
| int pos; |
| |
| while ( (pos = iter.next()) != BreakIterator.DONE ) |
| { |
| int w = metrics.charsWidth(chars, start, pos - start); |
| if (w > width) |
| { |
| // We've gone past the maximum width, so break the line |
| if (end > start) { |
| // There was at least one break position before this point |
| breakPos[nbreaks++] = end; |
| start = end; |
| end = pos; |
| } else { |
| // There weren't any break positions before this one, so |
| // let this word overflow the margin (yuck) |
| breakPos[nbreaks++] = pos; |
| start = end = pos; |
| } |
| } else { |
| // the current position still fits on the line; it's the best |
| // tentative break position we have so far. |
| end = pos; |
| } |
| |
| } |
| } |
| } |
| |
| private String text; |
| private char[] chars; |
| // private Graphics port; |
| private FontMetrics metrics; |
| private int width; |
| |
| private int[] breakPos = new int[10]; // TODO: get real |
| private int nbreaks = 0; |
| } |