/*
 *******************************************************************************
 * Copyright (C) 2002-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/localeconverter/JavaLocaleWriter.java,v $ 
 * $Date: 2002/02/16 03:05:29 $ 
 * $Revision: 1.2 $
 *
 *****************************************************************************************
 */
package com.ibm.icu.dev.tool.localeconverter;

import java.io.*;
import java.util.*;

public class JavaLocaleWriter extends LocaleWriter {
    public JavaLocaleWriter(PrintStream out) {
        super(out);
    }
    public JavaLocaleWriter(PrintStream out, PrintStream err) {
        super(out, err);
    }
    public void open(Locale locale) {
        println(HEADER);
        indent(3);
    }
    protected void write(String tag, Object o) {
        if ("CollationElements".equals(tag)) {
             writeTagged(tag,(Object[][])o);
        } else if (!(o instanceof CollationItem[])) {
            super.write(tag, o);
        } else {
            CollationItem[] items = (CollationItem[])o;
            print("{ ");
            printString("CollationElements");
            println(", ");
            for (int i = 0; i < items.length; i++) {
                if(items[i]!=null){
                    printString(items[i].toString());
                    if (items[i].comment != null) {
                        print("+");
                        tabTo(30);
                        print("//");
                        println(items[i].comment);
                    } else {
                        println("+");
                    }
                }
            }
            println("\"\"");
            println(" },");
        }
    }

    public void write(String tag, String value) {
        print("{ ");
        printString(tag);
        print(", ");
        printString(value);
        println(" },");
    }
    public void write(String tag, String[] value) {
        print("{ ");
        if (tag != null) {
            printString(tag);
            println(",");
        } else {
            println("");
        }
        indent();
            println("new String[] {");
            indent();
                for (int i = 0; i < value.length; i++) {
                    printString(value[i]);
                    println(",");
                }
            outdent();
            println("}");
        outdent();
        println("},");
    }
    public void write2D(String tag, String[][] value) {
        print("{ ");
        printString(tag);
        println(",");
        indent();
            println("new String[][] {");
            indent();
                for (int i = 0; i < value.length; i++) {
                    println("{");
                    indent();
                    for (int j = 0; j < value[i].length; j++) {
                        printString(value[i][j]);
                        println(",");
                    }
                    outdent();
                    println("},");
                }
            outdent();
            println("}");
        outdent();
        println("},");
    }
    public void writeTagged(String tag, String[][] value) {
        print("{ ");
        printString(tag);
        println(",");
        indent();
            println("new String[][] {");
            indent();
                for (int i = 0; i < value.length; i++) {
                    write(value[i][0], value[i][1]);
                }
            outdent();
            println("}");
        outdent();
        println("},");
    }
    public void writeTagged(String tag, Object[][] value) {
        print("{ ");
        printString(tag);
        println(",");
        indent();
            println("new String[][] {");
            indent();
                for (int i = 0; i < value.length; i++) {
                    write((String)value[i][0], value[i][1]);
                }
            outdent();
            println("}");
        outdent();
        println("},");
    }
    public void close() {
        outdent(3);
        print(FOOTER);
        println("");
    }

    protected void appendEscapedChar(char c, StringBuffer buffer) {
        if (c < '\u0020' || c == '"' || c == '\\') {
            buffer.append('\\');
            buffer.append(HEX_DIGIT[(c & 0700) >> 6]); // HEX_DIGIT works for octal
            buffer.append(HEX_DIGIT[(c & 0070) >> 3]);
            buffer.append(HEX_DIGIT[(c & 0007)]);
        } else {
            super.appendEscapedChar(c, buffer);
        }
    }

    protected String getStringJoiningCharacter() {
        return "+";
    }
    
    private static final String HEADER = 
        "package java.text.resources;\n"+
        "import java.util.ListResourceBundle;\n"+
        "public class TestLocaleElements extends ListResourceBundle {\n"+
        "    public Object[][] getContents() {\n"+
        "        return new Object[][] {";
        
    private static final String FOOTER = 
        "        };\n"+
        "    }\n"+
        "}";
    //{{DECLARE_CONTROLS
    //}}
}
