/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/DerivedPropertyLister.java,v $
* $Date: 2006/06/09 21:21:20 $
* $Revision: 1.13 $
*
*******************************************************************************
*/

package com.ibm.text.UCD;
import java.io.*;
import java.util.*;

import com.ibm.text.utility.*;

final class DerivedPropertyLister extends PropertyLister {
    static final boolean BRIDGE = false;

    //static int enum = 0;

    //private int propMask;
    //private DerivedProperty dprop;
    private UCDProperty uprop;
    int width;
    boolean varies;

    public DerivedPropertyLister(UCD ucd, int propMask, PrintWriter output) {
        //this.propMask = propMask;
        this.output = output;
        this.ucdData = ucd;
        // this.dprop = new DerivedProperty(ucd);
        uprop = DerivedProperty.make(propMask, ucd);
        varies = uprop.getValueType() < BINARY_PROP;

        width = super.minPropertyWidth();
        switch (propMask) {
          case DerivedProperty.GenNFD: case DerivedProperty.GenNFC: case DerivedProperty.GenNFKD: case DerivedProperty.GenNFKC:
            alwaysBreaks = true;
            break;
          case DerivedProperty.FC_NFKC_Closure:
            alwaysBreaks = true;
            width = 21;
            break;
          case DerivedProperty.QuickNFC: case DerivedProperty.QuickNFKC:
            width = 11;
            break;
        }
    }
    
    public String headerString() {
        return uprop.getHeader();
    }

    public String valueName(int cp) {
    	return uprop.getListingValue(cp);
    }

    //public String optionalComment(int cp) {
    //    return super.optionalComment(cp) + " [" + ucdData.getCodeAndName(computedValue) + "]";
    //}


    public int minPropertyWidth() {
        return width;
    }


    /*
    public String optionalComment(int cp) {
        String id = ucdData.getCategoryID(cp);
        if (UCD.mainCategoryMask(ucdData.getCategory(cp)) == LETTER_MASK) return id.substring(0,1) + "*";
        return id;
    }
    */
    /*
    public String optionalName(int cp) {
        if ((propMask & 0xFF00) == DECOMPOSITION_TYPE) {
            return Utility.hex(ucdData.getDecompositionMapping(cp));
        } else {
            return "";
        }
    }
    */

    String last;

    public byte status(int cp) {
        if (!uprop.hasUnassigned() && !ucdData.isAssigned(cp)) return EXCLUDE;
        if (!varies) {
            return uprop.hasValue(cp) ? INCLUDE : EXCLUDE;
        }
        String prop = uprop.getValue(cp);
        if (prop.length() == 0) return EXCLUDE;
        if (prop.equals(last)) return INCLUDE;
        last = prop;
        return BREAK;
    }

    /*
    static Map computedValue = new HashMap();
    static String getComputedValue(int cp) {
        return (String) computedValue.get(new Integer(cp));
    }
    static void setComputedValue(int cp, String value) {
        computedValue.put(new Integer(cp), value);
    }
    static String lastValue = "";
    static String currentValue = "";

    StringBuffer foldBuffer = new StringBuffer();

    */
}

