]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/util/Tabber.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / util / Tabber.java
1 \r
2 /*\r
3  *******************************************************************************\r
4  * Copyright (C) 2002-2008, International Business Machines Corporation and    *\r
5  * others. All Rights Reserved.                                                *\r
6  *******************************************************************************\r
7  */\r
8 package com.ibm.icu.dev.test.util;\r
9 \r
10 import java.util.ArrayList;\r
11 import java.util.List;\r
12 \r
13 public abstract class Tabber {\r
14     public static final byte LEFT = 0, CENTER = 1, RIGHT = 2;\r
15     private static final String[] ALIGNMENT_NAMES = {"Left", "Center", "Right"};\r
16     \r
17     /**\r
18      * Repeats a string n times\r
19      * @param source\r
20      * @param times\r
21      */\r
22     // TODO - optimize repeats using doubling?\r
23     public static String repeat(String source, int times) {\r
24         if (times <= 0) return "";\r
25         if (times == 1) return source;\r
26         StringBuffer result = new StringBuffer();\r
27         for (; times > 0; --times) {\r
28             result.append(source);\r
29         }\r
30         return result.toString();\r
31     }\r
32     \r
33     public String process(String source) {\r
34         StringBuffer result = new StringBuffer();\r
35         int lastPos = 0;\r
36         for (int count = 0; lastPos < source.length(); ++count) {\r
37             int pos = source.indexOf('\t', lastPos);\r
38             if (pos < 0) pos = source.length();\r
39             process_field(count, source, lastPos, pos, result);\r
40             lastPos = pos+1;\r
41         }\r
42         return prefix + result.toString() + postfix;\r
43     }\r
44     \r
45     private String prefix = "";\r
46     private String postfix = "";\r
47     \r
48     public abstract void process_field(int count, String source, int start, int limit, StringBuffer output);\r
49     \r
50     public Tabber clear() {\r
51         return this;\r
52     }\r
53 \r
54     public static class MonoTabber extends Tabber {\r
55         int minGap = 0;\r
56     \r
57         private List stops = new ArrayList();\r
58         private List types = new ArrayList();\r
59         \r
60         public Tabber clear() {\r
61             stops.clear();\r
62             types.clear();\r
63             minGap = 0;\r
64             return this;\r
65         }\r
66         \r
67         public String toString() {\r
68             StringBuffer buffer = new StringBuffer();\r
69             for (int i = 0; i < stops.size(); ++i) {\r
70                 if (i != 0) buffer.append("; ");\r
71                 buffer\r
72                 .append(ALIGNMENT_NAMES[((Integer)types.get(i)).intValue()])\r
73                 .append(",")\r
74                 .append(stops.get(i));\r
75             } \r
76             return buffer.toString();\r
77         }\r
78     \r
79         /**\r
80          * Adds tab stop and how to align the text UP TO that stop\r
81          * @param tabPos\r
82          * @param type\r
83          */\r
84         public MonoTabber addAbsolute(int tabPos, int type) {\r
85             stops.add(new Integer(tabPos));\r
86             types.add(new Integer(type));\r
87             return this;\r
88         }\r
89     \r
90         /**\r
91          * Adds relative tab stop and how to align the text UP TO that stop\r
92          */\r
93         public Tabber add(int fieldWidth, byte type) {\r
94             int last = getStop(stops.size()-1);\r
95             stops.add(new Integer(last + fieldWidth));\r
96             types.add(new Integer(type));\r
97             return this;\r
98         }\r
99         \r
100         public int getStop(int fieldNumber) {\r
101             if (fieldNumber < 0) return 0;\r
102             if (fieldNumber >= stops.size()) fieldNumber = stops.size() - 1;\r
103             return ((Integer)stops.get(fieldNumber)).intValue();\r
104         }\r
105         public int getType(int fieldNumber) {\r
106             if (fieldNumber < 0) return LEFT;\r
107             if (fieldNumber >= stops.size()) return LEFT;\r
108             return ((Integer)types.get(fieldNumber)).intValue();\r
109         }\r
110         /*\r
111         public String process(String source) {\r
112             StringBuffer result = new StringBuffer();\r
113             int lastPos = 0;\r
114             int count = 0;\r
115             for (count = 0; lastPos < source.length() && count < stops.size(); count++) {\r
116                 int pos = source.indexOf('\t', lastPos);\r
117                 if (pos < 0) pos = source.length();\r
118                 String piece = source.substring(lastPos, pos);\r
119                 int stopPos = getStop(count);\r
120                 if (result.length() < stopPos) {\r
121                     result.append(repeat(" ", stopPos - result.length()));\r
122                     // TODO fix type\r
123                 }\r
124                 result.append(piece);\r
125                 lastPos = pos+1;\r
126             }\r
127             if (lastPos < source.length()) {\r
128                 result.append(source.substring(lastPos));\r
129             }\r
130             return result.toString();\r
131         }\r
132         */\r
133         \r
134         public void process_field(int count, String source, int start, int limit, StringBuffer output) {\r
135             String piece = source.substring(start, limit);\r
136             int startPos = getStop(count-1);\r
137             int endPos = getStop(count) - minGap;\r
138             int type = getType(count);\r
139             switch (type) {\r
140                 case LEFT: \r
141                     break;\r
142                 case RIGHT: \r
143                     startPos = endPos - piece.length();\r
144                     break;\r
145                 case CENTER: \r
146                     startPos = (startPos + endPos - piece.length() + 1)/2;\r
147                     break;\r
148             }\r
149 \r
150             int gap = startPos - output.length();\r
151             if (count != 0 && gap < minGap) gap = minGap;\r
152             if (gap > 0) output.append(repeat(" ", gap));\r
153             output.append(piece);\r
154         }\r
155         \r
156     }\r
157     \r
158     public static Tabber NULL_TABBER = new Tabber() {\r
159         public void process_field(int count, String source, int start, int limit, StringBuffer output) {\r
160             if (count > 0) output.append( "\t");\r
161             output.append(source.substring(start, limit));\r
162         }\r
163     };\r
164     \r
165     public static class HTMLTabber extends Tabber {\r
166         private List parameters = new ArrayList();\r
167         {\r
168             setPrefix("<tr>");\r
169             setPostfix("</tr>");\r
170         }\r
171         public void setParameters(int count, String params) {\r
172             while (count >= parameters.size()) parameters.add(null);\r
173             parameters.set(count,params);\r
174         }\r
175         \r
176         public void process_field(int count, String source, int start, int limit, StringBuffer output) {\r
177             output.append("<td");\r
178             String params = null;\r
179             if (count < parameters.size()) params = (String) parameters.get(count);\r
180             if (params != null) {\r
181                 output.append(' ');\r
182                 output.append(params);\r
183             }\r
184             output.append(">");\r
185             output.append(source.substring(start, limit));\r
186             // TODO Quote string\r
187             output.append("</td>");            \r
188         }\r
189     }\r
190     /**\r
191      */\r
192     public String getPostfix() {\r
193         return postfix;\r
194     }\r
195 \r
196     /**\r
197      */\r
198     public String getPrefix() {\r
199         return prefix;\r
200     }\r
201 \r
202     /**\r
203      * @param string\r
204      */\r
205     public Tabber setPostfix(String string) {\r
206         postfix = string;\r
207         return this;\r
208     }\r
209 \r
210     /**\r
211      * @param string\r
212      */\r
213     public Tabber setPrefix(String string) {\r
214         prefix = string;\r
215         return this;\r
216     }\r
217 \r
218     public Tabber add(int i, byte left2) {\r
219         // does nothing unless overridden\r
220         return this;\r
221     }\r
222 \r
223 }\r