/* Copyright (C) 2001-2003 KSVG Team 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. */ #ifndef SVGDocumentImpl_H #define SVGDocumentImpl_H #include #include #include #include #include #include #include #include #include #include #include #include "ksvg_lookup.h" #include "SVGEvent.h" #include "SVGTimeScheduler.h" class KSVGEcma; class KSVGRequest; namespace KJS { class Value; class UString; class ExecState; class Identifier; } namespace KSVG { class SVGTimer; class KSVGLoader; class KSVGReader; class KSVGCanvas; class SVGImageElementImpl; class SVGSVGElementImpl; class SVGWindowImpl; class SVGScriptElementImpl; class SVGDescElementImpl; class SVGTitleElementImpl; class SVGUseElementImpl; class SVGDocumentImpl : public TQObject, public DOM::DomShared, public DOM::Document, public SVGDOMNodeBridge { Q_OBJECT TQ_OBJECT public: SVGDocumentImpl(bool anim = true, bool bFit = false, SVGImageElementImpl *parentImage = 0); virtual ~SVGDocumentImpl(); float screenPixelsPerMillimeterX() const; float screenPixelsPerMillimeterY() const; DOM::DOMString title() const; DOM::DOMString referrer() const; DOM::DOMString domain() const; DOM::DOMString URL() const; void setReferrer(const DOM::DOMString &referrer); void setRootElement(SVGSVGElementImpl *); SVGSVGElementImpl *rootElement() const; SVGImageElementImpl *parentImage() const { return m_parentImage; } SVGWindowImpl *window(); static SVGElementImpl *createElement(const DOM::DOMString &name, DOM::Element impl, SVGDocumentImpl *doc = 0); bool open(const KURL &url); void rerender(); void attach(KSVG::KSVGCanvas *p); void detach(); bool ready() { return m_finishedParsing; } KURL baseUrl() { return m_baseURL; } KSVGCanvas *canvas() const; // Ecma stuff KSVGEcma *ecmaEngine() { return m_ecmaEngine; } void parseSVG(TQXmlInputSource *inputSource, bool getURLMode = false); virtual bool implementsCall() const { return true; } void executeScriptsRecursive(DOM::Node start); bool executeScriptsRecursiveCheck(DOM::Node start); bool dispatchRecursiveEvent(SVGEvent::EventId id, DOM::Node start); SVGElementImpl *getElementByIdRecursive(SVGSVGElementImpl *start, const DOM::DOMString &elementId, bool dontSearch = false); // Event stuff SVGEventListener *createEventListener(DOM::DOMString type); void setLastTarget(SVGElementImpl *elem) { m_lastTarget = elem; } SVGElementImpl *lastTarget() { return m_lastTarget; } // Animation stuff SVGTimeScheduler *timeScheduler() const { return m_timeScheduler; } // Internal SVGElementImpl *getElementFromHandle(DOM::NodeImpl *handle) const; void addToElemDict(DOM::NodeImpl *handle, SVGElementImpl *obj); void removeFromElemDict(DOM::NodeImpl *handle); SVGDocumentImpl *getDocumentFromHandle(DOM::NodeImpl *handle) const; void addToDocumentDict(DOM::NodeImpl *handle, SVGDocumentImpl *obj); SVGElementImpl *recursiveSearch(DOM::Node start, const DOM::DOMString &id); void finishParsing(bool error, const TQString &errorDesc); void newImageJob(SVGImageElementImpl *); void notifyImageLoading(SVGImageElementImpl *image); void notifyImageLoaded(SVGImageElementImpl *image); void resortZIndicesOnFinishedLoading() { m_resortZIndicesOnFinishedLoading = true; } void addForwardReferencingUseElement(SVGUseElementImpl *use); TQValueList forwardReferencingUseElements() const { return m_forwardReferencingUseElements; } // Traverse the element hierarchy and update any cached matrices that are // no longer valid. void syncCachedMatrices(); public slots: void slotPaint(); void executeScripts(); private slots: void slotSVGContent(TQIODevice *); void slotFinishedParsing(bool error, const TQString &errorDesc); // KDE invents public signals :) #undef signals #define signals public signals: void gotDescription(const TQString &); void gotTitle(const TQString &); void gotURL(const TQString &); void finishedParsing(bool error, const TQString &errorDesc); void finishedRendering(); void finishedLoading(); private: void checkFinishedLoading(); bool m_finishedParsing; bool m_finishedLoading; bool m_animations; SVGSVGElementImpl *m_rootElement; SVGTimeScheduler *m_timeScheduler; // Set if this document is being displayed by an 'image' element reference // rather than as the main document, 0 otherwise. SVGImageElementImpl *m_parentImage; KSVGReader *m_reader; KSVGLoader *m_loader; KSVGCanvas *m_canvas; KSVGEcma *m_ecmaEngine; TQPtrDict m_elemDict; TQPtrDict m_documentDict; static uint elemDictHashSizes[]; static const int numElemDictHashSizes; int m_elemDictHashSizeIndex; SVGWindowImpl *m_window; SVGElementImpl *m_lastTarget; KURL m_baseURL; DOM::DOMString m_referrer; bool m_fit; TQTime m_t; TQValueList m_imagesLoading; bool m_resortZIndicesOnFinishedLoading; TQValueList m_forwardReferencingUseElements; public: KSVG_BASECLASS_GET KSVG_PUT enum { // Properties Title, Referrer, Domain, Url, DocType, Implementation, RootElement, DocumentElement, // Functions CreateTextNode, CreateElement, CreateElementNS, GetElementById, GetElementsByTagName, GetElementsByTagNameNS }; KJS::Value getValueProperty(KJS::ExecState *exec, int token) const; }; } KSVG_DEFINE_PROTOTYPE(SVGDocumentImplProto) KSVG_IMPLEMENT_PROTOFUNC(SVGDocumentImplProtoFunc, SVGDocumentImpl) #endif // vim:ts=4:noet