Bug #: none
[WebKit-https.git] / WebCore / ksvg2 / KSVGFactory.cpp
1 /*
2     Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2005 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20     Boston, MA 02111-1307, USA.
21 */
22
23 #include <assert.h>
24
25 #include <qregexp.h>
26 //Added by qt3to4:
27 #include <Q3PtrList>
28
29 #include <kdebug.h>
30 #include <kaboutdata.h>
31
32 #include <kdom/cache/KDOMCache.h>
33
34 #include "KSVGPart.h"
35 #include "KSVGFactory.h"
36 #include "KSVGSettings.h"
37 #include "SVGRenderStyle.h"
38 #include "SVGCSSStyleSelector.h"
39
40 using namespace KSVG;
41
42 extern "C" void *init_libksvg2()
43 {
44     // See comment in init_libkhtml2()
45     return new KSVGFactory(true);
46 }
47
48 KSVGFactory *KSVGFactory::s_self = 0;
49 unsigned long int KSVGFactory::s_refcnt = 0;
50 KInstance *KSVGFactory::s_instance = 0;
51 KAboutData *KSVGFactory::s_about = 0;
52 KSVGSettings *KSVGFactory::s_settings = 0;
53 Q3PtrList<KSVGPart> *KSVGFactory::s_parts = 0;
54
55 KSVGFactory::KSVGFactory(bool clone)
56 {
57     if(clone)
58         ref();
59 }
60
61 KSVGFactory::~KSVGFactory()
62 {
63     if(s_self == this)
64     {
65         assert(!s_refcnt);
66
67         delete s_instance;
68         delete s_about;
69         delete s_settings;
70         
71         if(s_parts)
72         {
73             assert(s_parts->isEmpty());
74             delete s_parts;
75         }
76
77         s_instance = 0;
78         s_about = 0;
79         s_settings = 0;
80         s_parts = 0;
81
82         // clean up static data
83         SVGCSSStyleSelector::clear();
84         SVGRenderStyle::cleanup();
85         KDOM::Cache::clear();
86     }
87     else
88         deref();
89 }
90
91 KParts::Part *KSVGFactory::createPartObject(QWidget *parentWidget, const char *widgetName, QObject *parent, const char *name, const char *, const QStringList &args)
92 {
93     // Get the width and height of the <embed> (<object> is TODO)
94     unsigned int width = 0, height = 0;
95     
96     bool dummy;
97     QRegExp r1(QString::fromLatin1("(WIDTH)(\\s*=\\s*\")(\\d+)(\\w*)(\")"));
98     QRegExp r2(QString::fromLatin1("(HEIGHT)(\\s*=\\s*\")(\\d+)(\\w*)(\")"));
99     for(QStringList::ConstIterator it = args.begin(); it != args.end(); ++it) 
100     {
101         if(r1.search(*it) > -1)
102             width = r1.cap(3).toUInt(&dummy);
103         if(r2.search(*it) > -1)
104             height = r2.cap(3).toUInt(&dummy);
105     }
106     
107     return new KSVGPart(parentWidget, widgetName, parent, name, width, height);
108 }
109
110 void KSVGFactory::ref()
111 {
112     if(!s_refcnt && !s_self)
113     {
114         // we can't use a staticdeleter here, because that would mean
115         // that the factory gets deleted from within a qPostRoutine, called
116         // from the QApplication destructor. That however is too late, because
117         // we want to destruct a KInstance object, which involves destructing
118         // a KConfig object, which might call KGlobal::dirs() (in sync()) which
119         // probably is not going to work ;-)
120         // well, perhaps I'm wrong here, but as I'm unsure I try to stay on the
121         // safe side ;-) -> let's use a simple reference counting scheme
122         // (Simon)
123         s_self = new KSVGFactory();
124         KDOM::Cache::init();
125     }
126
127     s_refcnt++;
128 }
129
130 void KSVGFactory::deref()
131 {
132     if(!--s_refcnt && s_self)
133     {
134         delete s_self;
135         s_self = 0;
136     }
137 }
138
139 void KSVGFactory::registerPart(KSVGPart *part)
140 {
141     if(!s_parts)
142         s_parts = new Q3PtrList<KSVGPart>();
143
144     if(!s_parts->containsRef(part))
145     {
146         s_parts->append(part);
147         ref();
148     }
149 }
150
151 void KSVGFactory::deregisterPart(KSVGPart *part)
152 {
153     assert(s_parts);
154
155     if(s_parts->removeRef(part))
156     {
157         if(s_parts->isEmpty())
158         {
159             delete s_parts;
160             s_parts = 0;
161         }
162         
163         deref();
164     }
165 }
166
167 KInstance *KSVGFactory::instance()
168 {
169     assert(s_self);
170
171     if(!s_instance)
172     {
173         s_about = new KAboutData("ksvg2", I18N_NOOP("KSVG"), "4.0",
174                                  I18N_NOOP( "Embeddable SVG component" ),
175                                  KAboutData::License_LGPL,
176                                  "(c) 2001 - 2005, The KSVG Team", 0,
177                                  "http://svg.kde.org");
178     
179         s_about->addAuthor("Rob Buis", 0, "buis@kde.org");
180         s_about->addAuthor("Nikolas Zimmermann", 0, "wildfox@kde.org");
181         
182         s_about->addCredit("Adrian Page", 0);
183         s_about->addCredit("Jim Ley", 0, "jim@jibbering.com");
184         s_about->addCredit("Andreas Streichardt", 0, "mop@spaceregents.de");
185
186         s_instance = new KInstance(s_about);
187     }
188
189     return s_instance;
190 }
191
192 KSVGSettings *KSVGFactory::defaultSVGSettings()
193 {
194     assert(s_self);
195     if(!s_settings)
196         s_settings = new KSVGSettings();
197
198     return s_settings;
199 }
200
201 // vim:ts=4:noet
202