/**
*******************************************************************************
* Copyright (C) 2002-2002, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source:  $ 
* $Date:  $ 
* $Revision:  $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.localeconverter;
import java.io.*;
import java.util.*;
/**
 * @author ram
 *
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class ICU3LocaleWriter extends LocaleWriter {
    public ICU3LocaleWriter(PrintStream out) {
        super(out);
    }
    private ListResourceBundle bundle = null;
    protected void open(Locale locale) {
        print(locale.toString());
        println(" {");
        indent();
    }
    public ICU3LocaleWriter(PrintStream out, PrintStream err) {
        super(out, err);
    }
    public ICU3LocaleWriter(ListResourceBundle bundle,PrintStream out, PrintStream err) {
        super(out, err);
        this.bundle = bundle;
    }
    public void write(Locale locale){
        open(locale);
        Enumeration keys = bundle.getKeys();
        while(keys.hasMoreElements()){
            String key = (String) keys.nextElement();
            Object o = bundle.getObject(key);
            write(key, o);
        }
        close();
    }
    public void write(String key, Object o){
        if(key!=null) print(key);
        if(o instanceof String){
            write((String) o);
        }else if( o instanceof Integer[]){
            write((Integer[]) o);
        }else if(o instanceof byte[]){
            write((byte[]) o);
        }else if(o instanceof Integer){
            write((Integer) o);
        }else if(o instanceof Object[][]){
            write((Object[][]) o);
        }else if(o instanceof Object[]){
            write((Object[]) o);
        }
    }
    protected void write(String str){
        print("{");
        printString(str);
        println("}");
    }
    protected void write(Integer[] o){
        println(":intvector { ");
        indent();
        if(o!=null){
            for(int i=0; i< o.length; i++){
                print(o[i].toString());
                println(",");
            }
        }
        outdent();
        println(" }");   
    }
    private String toHex(byte b){
        int i =(int)((char) (b & 0xFF));
        String temp = Integer.toHexString(i);    
        if(temp.length()<2){
            return "0"+temp;
        }else{
            return temp;
        }
    }
        
    protected void write(byte[] o){
        print(":bin{ ");
        indent();
        if(o!=null){
            for(int i=0; i< o.length; i++){
                print(toHex(o[i]));
            }
        }
        outdent();
        println(" }"); 
    }
    protected void write(Integer o){
        print(":int { ");
        indent();
        if(o!=null){
            print(o.toString());
        }
        outdent();
        println(" }");
    }
    protected void write(Object[] o){
        String key = null;
        println(":array { ");
        indent();
        for(int i=0; i<o.length;i++){
            if(o[i] instanceof String){
                printString((String)o[i]);
            }else{
                write(key,o[i]);   
            }
            println(",");
        }
        outdent();
        println(" }");
    }
    protected void write(Object[][] o){
        //String key = null;
        println(":table {");
        indent();
        for(int i=0; i< o.length;i++){

            if(o[i][1] instanceof String){
                print((String) o[i][0]);
                print("{");
                printString((String) o[i][1]);
                println("}");
            }else{
                write((String) o[i][0], o[i][1]);
                println("");
            }

        }   
        outdent();
        println(" }");
    }
    ///////////////////////////////////////////////////
    /// Only for compatibility with super class 
    /// not required otherwise
    //////////////////////////////////////////////////
    
    /////// BEGIN //////////////////
    
    protected void write(String tag, String value) {
        print(tag);
        print(" { ");
        printString(value);
        println(" }");
    }
    

    protected void write(String tag, String[] value) {
        if (tag != null) {
            print(tag);
            println(" { ");
        } else {
            println("{");
        }
        indent();
            for (int i = 0; i < value.length; i++) {
                printString(value[i]);
                println(",");
            }
        outdent();
        println("}");
    }
    protected void write2D(String tag, String[][] value) {
        print(tag);
        println(" { ");
        indent();
            for (int i = 0; i < value.length; i++) {
                write(null, value[i]);
            }
        outdent();
        println("}");
    }
    protected void writeTagged(String tag, Object[][] value) {
        print(tag);
        println(" { ");
        indent();
            for (int i = 0; i < value.length; i++) {
                write((String)value[i][0], value[i][1]);
            }
        outdent();
        println("}");
    }
    protected void writeTagged(String tag, String[][] value) {
        print(tag);
        println(" { ");
        indent();
            for (int i = 0; i < value.length; i++) {
                write(value[i][0], value[i][1]);
            }
        outdent();
        println("}");
    }
    //////////////////// END //////////////////////////////////
    protected void close() {
        outdent();
        println("}");
       // super.closeFileHandle();
    }

    protected String getStringJoiningCharacter() {
        return "";
    }
    
}
