/*
    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
                  2004, 2005 Rob Buis <buis@kde.org>

    Based on khtml css code by:
    Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
    Copyright (C) 2003 Apple Computer, Inc.

    This file is part of the KDE project

    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., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.
*/

#ifndef KSVG_SVGCSSStyleSelector_H
#define KSVG_SVGCSSStyleSelector_H

#include <kdom/css/CSSStyleSelector.h>

namespace KDOM
{
    class RenderStyle;
    class ElementImpl;
    class DocumentImpl;
    class CSSValueImpl;
    class CSSStyleSheetImpl;
    class StyleSheetListImpl;
    class CSSOrderedProperty;
    class CSSStyleDeclarationImpl;
}

namespace KSVG
{
    /*
     * the StyleSelector implementation for SVG css props.
     */
    class SVGCSSStyleSelector : public KDOM::CSSStyleSelector
    {
    public:
        /**
         * creates a new StyleSelector for a Document.
         * goes through all StyleSheets defined in the document and
         * creates a list of rules it needs to apply to objects
         *
         * Also takes into account special cases for HTML documents,
         * including the defaultStyle (which is html only)
         */
        SVGCSSStyleSelector(KDOM::DocumentImpl *doc, const QString &userStyleSheet,
                            KDOM::StyleSheetListImpl *styleSheets,
                            const KURL &url, bool strictParsing);
        /*
         * same as above but for a single stylesheet.
         */
        SVGCSSStyleSelector(KDOM::CSSStyleSheetImpl *sheet);
        
        virtual ~SVGCSSStyleSelector();

    protected:
        static KDOM::CSSStyleSheetImpl *s_defaultSheet;
        static KDOM::CSSStyleSheetImpl *s_quirksSheet;
        static KDOM::CSSStyleSelectorList *s_defaultStyle;
        static KDOM::CSSStyleSelectorList *s_defaultPrintStyle;

    protected:
        virtual unsigned int addExtraDeclarations(KDOM::ElementImpl *e, unsigned int numProps);

        Q3MemArray<KDOM::CSSOrderedProperty> presentationAttrs;

        void loadDefaultStyle(KDOM::DocumentImpl *doc);

        virtual void applyRule(int id, KDOM::CSSValueImpl *value);
    };
}

#endif

// vim:ts=4:noet
