/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/MyPropertyLister.java,v $
* $Date: 2004/02/18 03:08:59 $
* $Revision: 1.12 $
*
*******************************************************************************
*/

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

import com.ibm.text.utility.*;

final class MyPropertyLister extends PropertyLister {

    static final boolean BRIDGE = false;

    private int propMask;
    
    private boolean isDefaultValue = false;
    
    private UCDProperty up;

    public MyPropertyLister(UCD ucd, int propMask, PrintWriter output) {
        this.propMask = propMask;
        this.output = output;
        this.ucdData = ucd;
        up = UnifiedBinaryProperty.make(propMask, ucd);
        if (propMask < COMBINING_CLASS) usePropertyComment = false; // skip gen cat
        isDefaultValue = up.isDefaultValue();
    }

    public String headerString() {
        int main = (propMask & 0xFF00);
        if (main == COMBINING_CLASS) {
            String s = UCD.getCombiningClassID_fromIndex((short)(propMask & 0xFF), LONG);
            if (s.charAt(0) <= '9') s = "Other Combining Class";
            return "# " + s;
        } else if (main == BINARY_PROPERTIES) {
            return "";
        } else if (main == JOINING_GROUP) {
            return "";
        } else {
            return "";
            /*
            String shortID = up.getName(SHORT);
            String longID = up.getName(LONG);
            return "# ???? " + shortID + (shortID.equals(longID) ? "" : "\t(" + longID + ")");
            */
        }
    }

    public String valueName(int cp) {
        if (up.getValueType() == BINARY_PROP) return up.getName();
        return up.getValue(cp);
    }

    public String missingValueName() {
        return up.getValue(NORMAL);
    }

    public String optionalComment(int cp) {
        if (propMask < COMBINING_CLASS) return ""; // skip gen cat
        int cat = ucdData.getCategory(cp);
        if (cat == Lt || cat == Ll || cat == Lu) return "L&";
        return ucdData.getCategoryID(cp);
    }

    /*
    public String optionalName(int cp) {
        if ((propMask & 0xFF00) == DECOMPOSITION_TYPE) {
            return Utility.hex(ucdData.getDecompositionMapping(cp));
        } else {
            return "";
        }
    }
    */

    public byte status(int cp) {
        //if (cp == 0xFFFF) {
        //    System.out.println("# " + Utility.hex(cp));
        //}
        byte cat = ucdData.getCategory(cp);
        //if (cp == 0x0385) {
        //    System.out.println(Utility.hex(firstRealCp));
        //}

        if (isDefaultValue 
            && cat == Cn
            && propMask != (BINARY_PROPERTIES | Noncharacter_Code_Point)
            && propMask != (BINARY_PROPERTIES | Other_Default_Ignorable_Code_Point)
            && propMask != (CATEGORY | Cn)) {
            if (BRIDGE) return CONTINUE;
            else return EXCLUDE;
        }
        
        boolean inSet = up.hasValue(cp);
        
        /*
        if (cp >= 0x1D400 && cp <= 0x1D7C9 && cat != Cn) {
            if (propMask == (SCRIPT | LATIN_SCRIPT)) inSet = cp <= 0x1D6A3;
            else if (propMask == (SCRIPT | GREEK_SCRIPT)) inSet = cp > 0x1D6A3;
        }
        */
/* HACK
1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
*/

        if (!inSet) return EXCLUDE;
        return INCLUDE;
    }


}

