/*
 * Copyright (c) 2000 World Wide Web Consortium,
 * (Massachusetts Institute of Technology, Institut National de
 * Recherche en Informatique et en Automatique, Keio University). All
 * Rights Reserved. This program is distributed under the W3C's Software
 * Intellectual Property License. This program is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.
 * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
 */

package org.w3c.dom.css;

import org.w3c.dom.DOMException;

/**
 *  The <code>CSSPrimitiveValue</code> interface represents a single CSS value
 * . This interface may be used to determine the value of a specific style 
 * property currently set in a block or to set a specific style property 
 * explicitly within the block. An instance of this interface might be 
 * obtained from the <code>getPropertyCSSValue</code> method of the 
 * <code>CSSStyleDeclaration</code> interface. A 
 * <code>CSSPrimitiveValue</code> object only occurs in a context of a CSS 
 * property. 
 * <p> Conversions are allowed between absolute values (from millimeters to 
 * centimeters, from degrees to radians, and so on) but not between relative 
 * values. (For example, a pixel value cannot be converted to a centimeter 
 * value.) Percentage values can't be converted since they are relative to 
 * the parent value (or another property value). There is one exception for 
 * color percentage values: since a color percentage value is relative to 
 * the range 0-255, a color percentage value can be converted to a number; 
 * (see also the <code>RGBColor</code> interface). 
 * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
 * @since DOM Level 2
 */
public interface CSSPrimitiveValue extends CSSValue {
    // UnitTypes
    /**
     * The value is not a recognized CSS2 value. The value can only be 
     * obtained by using the <code>cssText</code> attribute.
     */
    public static final short CSS_UNKNOWN               = 0;
    /**
     * The value is a simple number. The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_NUMBER                = 1;
    /**
     * The value is a percentage. The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_PERCENTAGE            = 2;
    /**
     * The value is a length (ems). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_EMS                   = 3;
    /**
     * The value is a length (exs). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_EXS                   = 4;
    /**
     * The value is a length (px). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_PX                    = 5;
    /**
     * The value is a length (cm). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_CM                    = 6;
    /**
     * The value is a length (mm). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_MM                    = 7;
    /**
     * The value is a length (in). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_IN                    = 8;
    /**
     * The value is a length (pt). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_PT                    = 9;
    /**
     * The value is a length (pc). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_PC                    = 10;
    /**
     * The value is an angle (deg). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_DEG                   = 11;
    /**
     * The value is an angle (rad). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_RAD                   = 12;
    /**
     * The value is an angle (grad). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_GRAD                  = 13;
    /**
     * The value is a time (ms). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_MS                    = 14;
    /**
     * The value is a time (s). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_S                     = 15;
    /**
     * The value is a frequency (Hz). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_HZ                    = 16;
    /**
     * The value is a frequency (kHz). The value can be obtained by using the 
     * <code>getFloatValue</code> method.
     */
    public static final short CSS_KHZ                   = 17;
    /**
     * The value is a number with an unknown dimension. The value can be 
     * obtained by using the <code>getFloatValue</code> method.
     */
    public static final short CSS_DIMENSION             = 18;
    /**
     * The value is a STRING. The value can be obtained by using the 
     * <code>getStringValue</code> method.
     */
    public static final short CSS_STRING                = 19;
    /**
     * The value is a URI. The value can be obtained by using the 
     * <code>getStringValue</code> method.
     */
    public static final short CSS_URI                   = 20;
    /**
     * The value is an identifier. The value can be obtained by using the 
     * <code>getStringValue</code> method.
     */
    public static final short CSS_IDENT                 = 21;
    /**
     * The value is a attribute function. The value can be obtained by using 
     * the <code>getStringValue</code> method.
     */
    public static final short CSS_ATTR                  = 22;
    /**
     * The value is a counter or counters function. The value can be obtained 
     * by using the <code>getCounterValue</code> method.
     */
    public static final short CSS_COUNTER               = 23;
    /**
     * The value is a rect function. The value can be obtained by using the 
     * <code>getRectValue</code> method.
     */
    public static final short CSS_RECT                  = 24;
    /**
     * The value is a RGB color. The value can be obtained by using the 
     * <code>getRGBColorValue</code> method.
     */
    public static final short CSS_RGBCOLOR              = 25;

    /**
     * The type of the value as defined by the constants specified above.
     */
    public short getPrimitiveType();

    /**
     *  A method to set the float value with a specified unit. If the property 
     * attached with this value can not accept the specified unit or the 
     * float value, the value will be unchanged and a 
     * <code>DOMException</code> will be raised. 
     * @param unitType  A unit code as defined above. The unit code can only 
     *   be a float unit type (i.e. <code>CSS_NUMBER</code>, 
     *   <code>CSS_PERCENTAGE</code>, <code>CSS_EMS</code>, 
     *   <code>CSS_EXS</code>, <code>CSS_PX</code>, <code>CSS_CM</code>, 
     *   <code>CSS_MM</code>, <code>CSS_IN</code>, <code>CSS_PT</code>, 
     *   <code>CSS_PC</code>, <code>CSS_DEG</code>, <code>CSS_RAD</code>, 
     *   <code>CSS_GRAD</code>, <code>CSS_MS</code>, <code>CSS_S</code>, 
     *   <code>CSS_HZ</code>, <code>CSS_KHZ</code>, 
     *   <code>CSS_DIMENSION</code>). 
     * @param floatValue  The new float value. 
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the attached property doesn't support 
     *   the float value or the unit type.
     *   <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
     */
    public void setFloatValue(short unitType, 
                              float floatValue)
                              throws DOMException;

    /**
     *  This method is used to get a float value in a specified unit. If this 
     * CSS value doesn't contain a float value or can't be converted into 
     * the specified unit, a <code>DOMException</code> is raised. 
     * @param unitType  A unit code to get the float value. The unit code can 
     *   only be a float unit type (i.e. <code>CSS_NUMBER</code>, 
     *   <code>CSS_PERCENTAGE</code>, <code>CSS_EMS</code>, 
     *   <code>CSS_EXS</code>, <code>CSS_PX</code>, <code>CSS_CM</code>, 
     *   <code>CSS_MM</code>, <code>CSS_IN</code>, <code>CSS_PT</code>, 
     *   <code>CSS_PC</code>, <code>CSS_DEG</code>, <code>CSS_RAD</code>, 
     *   <code>CSS_GRAD</code>, <code>CSS_MS</code>, <code>CSS_S</code>, 
     *   <code>CSS_HZ</code>, <code>CSS_KHZ</code>, 
     *   <code>CSS_DIMENSION</code>). 
     * @return  The float value in the specified unit. 
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a float 
     *   value or if the float value can't be converted into the specified 
     *   unit. 
     */
    public float getFloatValue(short unitType)
                               throws DOMException;

    /**
     *  A method to set the string value with the specified unit. If the 
     * property attached to this value can't accept the specified unit or 
     * the string value, the value will be unchanged and a 
     * <code>DOMException</code> will be raised. 
     * @param stringType  A string code as defined above. The string code can 
     *   only be a string unit type (i.e. <code>CSS_STRING</code>, 
     *   <code>CSS_URI</code>, <code>CSS_IDENT</code>, and 
     *   <code>CSS_ATTR</code>). 
     * @param stringValue  The new string value. 
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a string 
     *   value or if the string value can't be converted into the specified 
     *   unit.
     *   <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this property is readonly.
     */
    public void setStringValue(short stringType, 
                               String stringValue)
                               throws DOMException;

    /**
     *  This method is used to get the string value. If the CSS value doesn't 
     * contain a string value, a <code>DOMException</code> is raised.  Some 
     * properties (like 'font-family' or 'voice-family') convert a 
     * whitespace separated list of idents to a string. 
     * @return  The string value in the current unit. The current 
     *   <code>primitiveType</code> can only be a string unit type (i.e. 
     *   <code>CSS_STRING</code>, <code>CSS_URI</code>, 
     *   <code>CSS_IDENT</code> and <code>CSS_ATTR</code>). 
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a string 
     *   value. 
     */
    public String getStringValue()
                                 throws DOMException;

    /**
     *  This method is used to get the Counter value. If this CSS value 
     * doesn't contain a counter value, a <code>DOMException</code> is 
     * raised. Modification to the corresponding style property can be 
     * achieved using the <code>Counter</code> interface. 
     * @return The Counter value.
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a 
     *   Counter value (e.g. this is not <code>CSS_COUNTER</code>). 
     */
    public Counter getCounterValue()
                                   throws DOMException;

    /**
     *  This method is used to get the Rect value. If this CSS value doesn't 
     * contain a rect value, a <code>DOMException</code> is raised. 
     * Modification to the corresponding style property can be achieved 
     * using the <code>Rect</code> interface. 
     * @return The Rect value.
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the CSS value doesn't contain a Rect 
     *   value. (e.g. this is not <code>CSS_RECT</code>). 
     */
    public Rect getRectValue()
                             throws DOMException;

    /**
     *  This method is used to get the RGB color. If this CSS value doesn't 
     * contain a RGB color value, a <code>DOMException</code> is raised. 
     * Modification to the corresponding style property can be achieved 
     * using the <code>RGBColor</code> interface. 
     * @return the RGB color value.
     * @exception DOMException
     *    INVALID_ACCESS_ERR: Raised if the attached property can't return a 
     *   RGB color value (e.g. this is not <code>CSS_RGBCOLOR</code>). 
     */
    public RGBColor getRGBColorValue()
                                     throws DOMException;

}
