
/*
 *******************************************************************************
 * Copyright (C) 2002-2003, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/util/Tabber.java,v $
 * $Date: 2003/12/20 03:06:53 $
 * $Revision: 1.2 $
 *
 *****************************************************************************************
 */
package com.ibm.icu.dev.test.util;

public abstract class Tabber {
    static final byte LEFT = 0, CENTER = 1, RIGHT = 2;
    
    /**
     * Repeats a string n times
     * @param source
     * @param times
     * @return
     */
    // TODO - optimize repeats using doubling?
    public static String repeat(String source, int times) {
        if (times <= 0) return "";
        if (times == 1) return source;
        StringBuffer result = new StringBuffer();
        for (; times > 0; --times) {
            result.append(source);
        }
        return result.toString();
    }
    
    public String process(String source) {
        StringBuffer result = new StringBuffer();
        int lastPos = 0;
        int count = 0;
        while (lastPos < source.length()) {
            int pos = source.indexOf('\t', lastPos);
            if (pos < 0) pos = source.length();
            process_field(count, source, lastPos, pos, result);
            lastPos = pos+1;
            ++count; // skip type
        }
        if (lastPos < source.length()) {
            result.append(source.substring(lastPos));
        }
        return result.toString();
    }
    
    public abstract void process_field(int count, String source, int start, int limit, StringBuffer output);

    public static class MonoTabber extends Tabber {
    
        private int[] tabs;
    
        public MonoTabber(int[] tabs) {
            this.tabs = (int[]) tabs.clone();
        }
    
        public String process(String source) {
            StringBuffer result = new StringBuffer();
            int lastPos = 0;
            int count = 0;
            while (lastPos < source.length() && count < tabs.length) {
                int pos = source.indexOf('\t', lastPos);
                if (pos < 0) pos = source.length();
                String piece = source.substring(lastPos, pos);
                if (result.length() < tabs[count]) {
                    result.append(repeat(" ", tabs[count] - result.length()));
                    // TODO fix type
                }
                result.append(piece);
                lastPos = pos+1;
                count += 2; // skip type
            }
            if (lastPos < source.length()) {
                result.append(source.substring(lastPos));
            }
            return result.toString();
        }
    
        public void process_field(int count, String source, int start, int limit, StringBuffer output) {
            String piece = source.substring(start, limit);
            if (output.length() < tabs[count*2]) {
                output.append(repeat(" ", tabs[count*2] - output.length()));
                // TODO fix type
            } else {
                output.append(" ");
            }
            output.append(piece);
        }
    }
}