]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/translit/src/com/ibm/icu/dev/test/util/Tabber.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / translit / src / com / ibm / icu / dev / test / util / Tabber.java
1 \r
2 /*\r
3  *******************************************************************************\r
4  * Copyright (C) 2002-2009, 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<String> parameters = new ArrayList();\r
167         private String element = "td";\r
168         {\r
169             setPrefix("<tr>");\r
170             setPostfix("</tr>");\r
171         }\r
172         public HTMLTabber setParameters(int count, String params) {\r
173             // fill in\r
174             while (parameters.size() <= count) {\r
175                 parameters.add(null);\r
176             }\r
177             parameters.set(count,params);\r
178             return this;\r
179         }\r
180         \r
181         public String getElement() {\r
182             return element;\r
183         }\r
184 \r
185         public HTMLTabber setElement(String element) {\r
186             this.element = element;\r
187             return this;\r
188         }\r
189 \r
190         public void process_field(int count, String source, int start, int limit, StringBuffer output) {\r
191             output.append("<" + element);\r
192             String params = null;\r
193             if (count < parameters.size()) {\r
194                 params = parameters.get(count);\r
195             }\r
196             if (params != null) {\r
197                 output.append(' ');\r
198                 output.append(params);\r
199             }\r
200             output.append(">");\r
201             output.append(source.substring(start, limit));\r
202             // TODO Quote string\r
203             output.append("</" + element + ">");            \r
204         }\r
205     }\r
206     /**\r
207      */\r
208     public String getPostfix() {\r
209         return postfix;\r
210     }\r
211 \r
212     /**\r
213      */\r
214     public String getPrefix() {\r
215         return prefix;\r
216     }\r
217 \r
218     /**\r
219      * @param string\r
220      */\r
221     public Tabber setPostfix(String string) {\r
222         postfix = string;\r
223         return this;\r
224     }\r
225 \r
226     /**\r
227      * @param string\r
228      */\r
229     public Tabber setPrefix(String string) {\r
230         prefix = string;\r
231         return this;\r
232     }\r
233 \r
234     public Tabber add(int i, byte left2) {\r
235         // does nothing unless overridden\r
236         return this;\r
237     }\r
238 \r
239 }\r