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