/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id: AFMCharMetrics.java 1564017 2014-02-03 19:29:24Z vhennebert $ */

package org.apache.fop.fonts.type1;

import java.awt.Rectangle;

import org.apache.fop.fonts.NamedCharacter;


/**
 * Holds the metrics of a single character from an AFM file.
 */
public class AFMCharMetrics {

    private int charCode = -1;
    private NamedCharacter character;
    private double widthX;
    private double widthY;
    private Rectangle bBox;

    /**
     * Returns the character code.
     * @return the charCode (-1 if not part of the encoding)
     */
    public int getCharCode() {
        return charCode;
    }

    /**
     * Indicates whether the character has a character code, i.e. is part of the default encoding.
     * @return true if there is a character code.
     */
    public boolean hasCharCode() {
        return charCode >= 0;
    }

    /**
     * Sets the character code.
     * @param charCode the charCode to set
     */
    public void setCharCode(int charCode) {
        this.charCode = charCode;
    }

    /**
     * Returns the named character represented by this instance.
     * @return the named character (or null if no named character is associated)
     */
    public NamedCharacter getCharacter() {
        return this.character;
    }

    /**
     * Sets the named character represented by this instance.
     * @param ch the named character
     */
    public void setCharacter(NamedCharacter ch) {
        this.character = ch;
    }

    /**
     * Sets the named character represented by this instance.
     * @param charName the character name (as defined in the Adobe glyph list)
     * @param unicodeSequence the Unicode sequence
     */
    public void setCharacter(String charName, String unicodeSequence) {
        setCharacter(new NamedCharacter(charName, unicodeSequence));
    }

    /**
     * Returns the Unicode sequence for this character.
     * @return the Unicode characters
     *                  (or null if no such Unicode sequence exists for this character)
     */
    public String getUnicodeSequence() {
        return (getCharacter() != null ? getCharacter().getUnicodeSequence() : null);
    }

    /**
     * Returns the PostScript character name.
     * @return the charName (or null if no character name is associated)
     */
    public String getCharName() {
        return (getCharacter() != null ? getCharacter().getName() : null);
    }

    /**
     * Returns the progression dimension in x-direction.
     * @return the widthX
     */
    public double getWidthX() {
        return widthX;
    }

    /**
     * Sets the progression dimension in x-direction
     * @param widthX the widthX to set
     */
    public void setWidthX(double widthX) {
        this.widthX = widthX;
    }

    /**
     * Returns the progression dimension in y-direction.
     * @return the widthY
     */
    public double getWidthY() {
        return widthY;
    }

    /**
     * Sets the progression dimension in y-direction
     * @param widthY the widthY to set
     */
    public void setWidthY(double widthY) {
        this.widthY = widthY;
    }

    /**
     * Returns the character's bounding box.
     * @return the bounding box (or null if it isn't available)
     */
    public Rectangle getBBox() {
        return bBox;
    }

    /**
     * Sets the character's bounding box.
     * @param box the bounding box
     */
    public void setBBox(Rectangle box) {
        bBox = box;
    }

    /** {@inheritDoc} */
    public String toString() {
        StringBuffer sb = new StringBuffer("AFM Char: ");
        sb.append(getCharCode());
        sb.append(" (");
        if (getUnicodeSequence() != null) {
            for (int i = 0, c = getUnicodeSequence().length(); i < c; i++) {
                sb.append("0x").append(Integer.toHexString(getUnicodeSequence().charAt(i)));
                sb.append(", ");
            }
        }
        sb.append(getCharName()).append(')');
        return sb.toString();
    }

}
