- /**
- * Convenience method used by TWindowLoggerOutput.
- *
- * @param line new line to add
- */
- public void addLine(final String line) {
- if (text.length() == 0) {
- text = line;
- } else {
- text += "\n\n";
- text += line;
- }
- reflow();
- }
-
- /**
- * Recompute the bounds for the scrollbars.
- */
- private void computeBounds() {
- maxLineWidth = 0;
- for (String line: lines) {
- if (line.length() > maxLineWidth) {
- maxLineWidth = line.length();
- }
- }
-
- vScroller.setBottomValue(lines.size() - getHeight() + 1);
- if (vScroller.getBottomValue() < 0) {
- vScroller.setBottomValue(0);
- }
- if (vScroller.getValue() > vScroller.getBottomValue()) {
- vScroller.setValue(vScroller.getBottomValue());
- }
-
- hScroller.setRightValue(maxLineWidth - getWidth() + 1);
- if (hScroller.getRightValue() < 0) {
- hScroller.setRightValue(0);
- }
- if (hScroller.getValue() > hScroller.getRightValue()) {
- hScroller.setValue(hScroller.getRightValue());
- }
- }
-
- /**
- * Insert newlines into a string to wrap it to a maximum column.
- * Terminate the final string with a newline. Note that interior
- * newlines are converted to spaces.
- *
- * @param str the string
- * @param n the maximum number of characters in a line
- * @return the wrapped string
- */
- private String wrap(final String str, final int n) {
- assert (n > 0);
-
- StringBuilder sb = new StringBuilder();
- StringBuilder word = new StringBuilder();
- int col = 0;
- for (int i = 0; i < str.length(); i++) {
- char ch = str.charAt(i);
- if (ch == '\n') {
- ch = ' ';
- }
- if (ch == ' ') {
- sb.append(word.toString());
- sb.append(ch);
- if (word.length() >= n - 1) {
- sb.append('\n');
- col = 0;
- }
- word = new StringBuilder();
- } else {
- word.append(ch);
- }
-
- col++;
- if (col >= n - 1) {
- sb.append('\n');
- col = 0;
- }
- }
- sb.append(word.toString());
- sb.append('\n');
- return sb.toString();
- }
-
-
- /**
- * Resize text and scrollbars for a new width/height.
- */
- public void reflow() {
- // Reset the lines
- lines.clear();
-
- // Break up text into paragraphs
- String [] paragraphs = text.split("\n\n");
- for (String p: paragraphs) {
- String paragraph = wrap(p, getWidth() - 1);
- for (String line: paragraph.split("\n")) {
- lines.add(line);
- }
- for (int i = 0; i < lineSpacing; i++) {
- lines.add("");
- }
- }
-
- // Start at the top
- if (vScroller == null) {
- vScroller = new TVScroller(this, getWidth() - 1, 0,
- getHeight() - 1);
- vScroller.setTopValue(0);
- vScroller.setValue(0);
- } else {
- vScroller.setX(getWidth() - 1);
- vScroller.setHeight(getHeight() - 1);
- }
- vScroller.setBigChange(getHeight() - 1);
-
- // Start at the left
- if (hScroller == null) {
- hScroller = new THScroller(this, 0, getHeight() - 1,
- getWidth() - 1);
- hScroller.setLeftValue(0);
- hScroller.setValue(0);
- } else {
- hScroller.setY(getHeight() - 1);
- hScroller.setWidth(getWidth() - 1);
- }
- hScroller.setBigChange(getWidth() - 1);
-
- computeBounds();
- }