/*
    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
    Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
    Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
    Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.

    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., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

module svg {

    // TODO: no css::ViewCSS available!
    // TODO: Fix SVGSVGElement inheritance (css::DocumentCSS)! 
    // TODO: no events::DocumentEvent available!
    interface [Conditional=SVG] SVGSVGElement : SVGElement,
                                                SVGTests,
                                                SVGLangSpace,
                                                SVGExternalResourcesRequired,
                                                SVGStylable,
                                                SVGLocatable,
                                                SVGFitToViewBox,
                                                SVGZoomAndPan {
        readonly attribute SVGAnimatedLength x;
        readonly attribute SVGAnimatedLength y;
        readonly attribute SVGAnimatedLength width;
        readonly attribute SVGAnimatedLength height;
                 attribute core::DOMString contentScriptType
                     /*setter raises(DOMException)*/;
                 attribute core::DOMString contentStyleType
                     /*setter raises(DOMException)*/;
        readonly attribute SVGRect viewport;
        readonly attribute float pixelUnitToMillimeterX;
        readonly attribute float pixelUnitToMillimeterY;
        readonly attribute float screenPixelToMillimeterX;
        readonly attribute float screenPixelToMillimeterY;
                 attribute boolean useCurrentView
                     /*setter raises(DOMException)*/;
        // TODO    readonly attribute SVGViewSpec currentView;
                 attribute float currentScale
                     /*setter raises(DOMException)*/;
        readonly attribute SVGPoint currentTranslate;

        unsigned long suspendRedraw(in unsigned long maxWaitMilliseconds);
        void unsuspendRedraw(in unsigned long suspendHandleId)
            setter raises(DOMException);
        void unsuspendRedrawAll();
        void forceRedraw();
        void pauseAnimations();
        void unpauseAnimations();
        boolean animationsPaused();
        float getCurrentTime();
        void setCurrentTime(in float seconds);
        core::NodeList getIntersectionList(in SVGRect rect, 
                                           in SVGElement referenceElement);
        core::NodeList getEnclosureList(in SVGRect rect, 
                                        in SVGElement referenceElement);
        boolean checkIntersection(in SVGElement element, 
                                  in SVGRect rect);
        boolean checkEnclosure(in SVGElement element, 
                               in SVGRect rect);
        void deselectAll();

        SVGNumber createSVGNumber();
        SVGLength createSVGLength();
        SVGAngle createSVGAngle();
        SVGPoint createSVGPoint();
        SVGMatrix createSVGMatrix();
        SVGRect createSVGRect();
        SVGTransform createSVGTransform();
        SVGTransform createSVGTransformFromMatrix(in SVGMatrix matrix);
    };

}
