/*
 * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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 the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

module css {

    interface [
        GenerateConstructor,
        InterfaceUUID=a286b0cb-4ff0-4482-aa6e-7c5fb39afaba,
        ImplementationUUID=c310c84d-480f-4bbb-9187-28e00956ac47
    ] CSSPrimitiveValue : CSSValue {

        // UnitTypes
        const unsigned short CSS_UNKNOWN    = 0;
        const unsigned short CSS_NUMBER     = 1;
        const unsigned short CSS_PERCENTAGE = 2;
        const unsigned short CSS_EMS        = 3;
        const unsigned short CSS_EXS        = 4;
        const unsigned short CSS_PX         = 5;
        const unsigned short CSS_CM         = 6;
        const unsigned short CSS_MM         = 7;
        const unsigned short CSS_IN         = 8;
        const unsigned short CSS_PT         = 9;
        const unsigned short CSS_PC         = 10;
        const unsigned short CSS_DEG        = 11;
        const unsigned short CSS_RAD        = 12;
        const unsigned short CSS_GRAD       = 13;
        const unsigned short CSS_MS         = 14;
        const unsigned short CSS_S          = 15;
        const unsigned short CSS_HZ         = 16;
        const unsigned short CSS_KHZ        = 17;
        const unsigned short CSS_DIMENSION  = 18;
        const unsigned short CSS_STRING     = 19;
        const unsigned short CSS_URI        = 20;
        const unsigned short CSS_IDENT      = 21;
        const unsigned short CSS_ATTR       = 22;
        const unsigned short CSS_COUNTER    = 23;
        const unsigned short CSS_RECT       = 24;
        const unsigned short CSS_RGBCOLOR   = 25;

        readonly attribute unsigned short primitiveType;

        [OldStyleObjC] void setFloatValue(in unsigned short unitType,
                                          in float floatValue)
            raises(DOMException);
        float getFloatValue(in unsigned short unitType)
            raises(DOMException);
        [OldStyleObjC] void setStringValue(in unsigned short stringType, 
                                           in DOMString stringValue)
            raises(DOMException);
        DOMString getStringValue()
            raises(DOMException);
        Counter getCounterValue()
            raises(DOMException);
        Rect getRectValue()
            raises(DOMException);
#if !defined(LANGUAGE_COM)
        RGBColor getRGBColorValue()
            raises(DOMException);
#endif

    };

}
