• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html#License
3 /*
4  *******************************************************************************
5  * Copyright (C) 1997-2010, International Business Machines Corporation and    *
6  * others. All Rights Reserved.                                                *
7  *******************************************************************************
8  */
9 package com.ibm.icu.dev.demo.impl;
10 
11 
12 import java.awt.FontMetrics;
13 import java.awt.Graphics;
14 import java.text.BreakIterator;
15 
16 public class DemoTextBox {
17 
DemoTextBox(Graphics g, String text, int width)18     public DemoTextBox(Graphics g, String text, int width)
19     {
20         this.text = text;
21         this.chars = new char[text.length()];
22         text.getChars(0, text.length(), chars, 0);
23 
24         this.width = width;
25 //        this.port = g;
26         this.metrics = g.getFontMetrics();
27 
28         breakText();
29     }
30 
getHeight()31     public  int getHeight() {
32         return (nbreaks + 1) * metrics.getHeight();
33     }
34 
draw(Graphics g, int x, int y)35     public  void draw(Graphics g, int x, int y)
36     {
37         int index = 0;
38 
39         y += metrics.getAscent();
40 
41         for (int i = 0; i < nbreaks; i++)
42         {
43             g.drawChars(chars, index, breakPos[i] - index, x, y);
44             index = breakPos[i];
45             y += metrics.getHeight();
46         }
47 
48         g.drawChars(chars, index, chars.length - index, x, y);
49     }
50 
51 
breakText()52     private void breakText()
53     {
54         if (metrics.charsWidth(chars, 0, chars.length) > width)
55         {
56             BreakIterator iter = BreakIterator.getWordInstance();
57             iter.setText(text);
58 
59             int start = iter.first();
60             int end = start;
61             int pos;
62 
63             while ( (pos = iter.next()) != BreakIterator.DONE )
64             {
65                 int w = metrics.charsWidth(chars, start, pos - start);
66                 if (w > width)
67                 {
68                     // We've gone past the maximum width, so break the line
69                     if (end > start) {
70                         // There was at least one break position before this point
71                         breakPos[nbreaks++] = end;
72                         start = end;
73                         end = pos;
74                     } else {
75                         // There weren't any break positions before this one, so
76                         // let this word overflow the margin (yuck)
77                         breakPos[nbreaks++] = pos;
78                         start = end = pos;
79                     }
80                 } else {
81                     // the current position still fits on the line; it's the best
82                     // tentative break position we have so far.
83                     end = pos;
84                 }
85 
86             }
87         }
88     }
89 
90     private String          text;
91     private char[]          chars;
92 //    private Graphics        port;
93     private FontMetrics     metrics;
94     private int             width;
95 
96     private int[]           breakPos = new int[10]; // TODO: get real
97     private int             nbreaks = 0;
98 }