3 *******************************************************************************
\r
4 * Copyright (C) 2002-2009, International Business Machines Corporation and *
\r
5 * others. All Rights Reserved. *
\r
6 *******************************************************************************
\r
8 package com.ibm.icu.dev.test.util;
\r
10 import java.util.ArrayList;
\r
11 import java.util.List;
\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
18 * Repeats a string n times
\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
30 return result.toString();
\r
33 public String process(String source) {
\r
34 StringBuffer result = new StringBuffer();
\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
42 return prefix + result.toString() + postfix;
\r
45 private String prefix = "";
\r
46 private String postfix = "";
\r
48 public abstract void process_field(int count, String source, int start, int limit, StringBuffer output);
\r
50 public Tabber clear() {
\r
54 public static class MonoTabber extends Tabber {
\r
57 private List stops = new ArrayList();
\r
58 private List types = new ArrayList();
\r
60 public Tabber clear() {
\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
72 .append(ALIGNMENT_NAMES[((Integer)types.get(i)).intValue()])
\r
74 .append(stops.get(i));
\r
76 return buffer.toString();
\r
80 * Adds tab stop and how to align the text UP TO that stop
\r
84 public MonoTabber addAbsolute(int tabPos, int type) {
\r
85 stops.add(new Integer(tabPos));
\r
86 types.add(new Integer(type));
\r
91 * Adds relative tab stop and how to align the text UP TO that stop
\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
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
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
111 public String process(String source) {
\r
112 StringBuffer result = new StringBuffer();
\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
124 result.append(piece);
\r
127 if (lastPos < source.length()) {
\r
128 result.append(source.substring(lastPos));
\r
130 return result.toString();
\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
143 startPos = endPos - piece.length();
\r
146 startPos = (startPos + endPos - piece.length() + 1)/2;
\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
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
165 public static class HTMLTabber extends Tabber {
\r
166 private List<String> parameters = new ArrayList();
\r
167 private String element = "td";
\r
170 setPostfix("</tr>");
\r
172 public HTMLTabber setParameters(int count, String params) {
\r
174 while (parameters.size() <= count) {
\r
175 parameters.add(null);
\r
177 parameters.set(count,params);
\r
181 public String getElement() {
\r
185 public HTMLTabber setElement(String element) {
\r
186 this.element = element;
\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
196 if (params != null) {
\r
197 output.append(' ');
\r
198 output.append(params);
\r
200 output.append(">");
\r
201 output.append(source.substring(start, limit));
\r
202 // TODO Quote string
\r
203 output.append("</" + element + ">");
\r
208 public String getPostfix() {
\r
214 public String getPrefix() {
\r
221 public Tabber setPostfix(String string) {
\r
229 public Tabber setPrefix(String string) {
\r
234 public Tabber add(int i, byte left2) {
\r
235 // does nothing unless overridden
\r