khtml Library API Documentation

khtml_factory.cpp

00001 /* This file is part of the KDE project 00002 * 00003 * Copyright (C) 2000 Simon Hausmann <hausmann@kde.org> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #include "khtml_factory.h" 00022 #include "khtml_part.h" 00023 #include "khtml_settings.h" 00024 00025 #include "css/cssstyleselector.h" 00026 #include "html/html_imageimpl.h" 00027 #include "rendering/render_style.h" 00028 #include "rendering/break_lines.h" 00029 #include "misc/loader.h" 00030 #include "misc/arena.h" 00031 00032 #include <kinstance.h> 00033 #include <kaboutdata.h> 00034 #include <klocale.h> 00035 00036 #include <assert.h> 00037 00038 #include <kdebug.h> 00039 00040 template class QPtrList<KHTMLPart>; 00041 00042 extern "C" KDE_EXPORT void *init_libkhtml() 00043 { 00044 // We can't use a plain self() here, because that would 00045 // return the global factory, which might already exist 00046 // at the time init_libkhtml is called! As soon as someone 00047 // does new KHTMLPart() in his application and loads up 00048 // an html document into that part which either embeds 00049 // embeds another KHTMLPart instance via <object> or 00050 // as html frame, then we cannot return self(), as 00051 // what we return here is what the KLibLoader deletes 00052 // in the end, and we don't want the libloader to 00053 // delete our global instance. Anyway, the new 00054 // KHTMLFactory we create here is very cheap :) 00055 // (Simon) 00056 return new KHTMLFactory( true ); 00057 } 00058 00059 KHTMLFactory *KHTMLFactory::s_self = 0; 00060 unsigned long int KHTMLFactory::s_refcnt = 0; 00061 KInstance *KHTMLFactory::s_instance = 0; 00062 KAboutData *KHTMLFactory::s_about = 0; 00063 KHTMLSettings *KHTMLFactory::s_settings = 0; 00064 QPtrList<KHTMLPart> *KHTMLFactory::s_parts = 0; 00065 QString *KHTMLSettings::avFamilies = 0; 00066 00067 KHTMLFactory::KHTMLFactory( bool clone ) 00068 { 00069 if ( clone ) 00070 ref(); 00071 } 00072 00073 KHTMLFactory::~KHTMLFactory() 00074 { 00075 if ( s_self == this ) 00076 { 00077 assert( !s_refcnt ); 00078 00079 delete s_instance; 00080 delete s_about; 00081 delete s_settings; 00082 delete KHTMLSettings::avFamilies; 00083 if ( s_parts ) 00084 { 00085 assert( s_parts->isEmpty() ); 00086 delete s_parts; 00087 } 00088 00089 s_instance = 0; 00090 s_about = 0; 00091 s_settings = 0; 00092 s_parts = 0; 00093 KHTMLSettings::avFamilies = 0; 00094 00095 // clean up static data 00096 khtml::CSSStyleSelector::clear(); 00097 khtml::RenderStyle::cleanup(); 00098 khtml::Cache::clear(); 00099 khtml::cleanup_thaibreaks(); 00100 khtml::ArenaFinish(); 00101 } 00102 else 00103 deref(); 00104 } 00105 00106 KParts::Part *KHTMLFactory::createPartObject( QWidget *parentWidget, const char *widgetName, QObject *parent, const char *name, const char *className, const QStringList & ) 00107 { 00108 KHTMLPart::GUIProfile prof = KHTMLPart::DefaultGUI; 00109 if ( strcmp( className, "Browser/View" ) == 0 ) 00110 prof = KHTMLPart::BrowserViewGUI; 00111 00112 return new KHTMLPart( parentWidget, widgetName, parent, name, prof ); 00113 } 00114 00115 void KHTMLFactory::ref() 00116 { 00117 if ( !s_refcnt && !s_self ) 00118 { 00119 // we can't use a staticdeleter here, because that would mean 00120 // that the factory gets deleted from within a qPostRoutine, called 00121 // from the QApplication destructor. That however is too late, because 00122 // we want to destruct a KInstance object, which involves destructing 00123 // a KConfig object, which might call KGlobal::dirs() (in sync()) which 00124 // probably is not going to work ;-) 00125 // well, perhaps I'm wrong here, but as I'm unsure I try to stay on the 00126 // safe side ;-) -> let's use a simple reference counting scheme 00127 // (Simon) 00128 s_self = new KHTMLFactory; 00129 khtml::Cache::init(); 00130 } 00131 00132 s_refcnt++; 00133 } 00134 00135 void KHTMLFactory::deref() 00136 { 00137 if ( !--s_refcnt && s_self ) 00138 { 00139 delete s_self; 00140 s_self = 0; 00141 } 00142 } 00143 00144 void KHTMLFactory::registerPart( KHTMLPart *part ) 00145 { 00146 if ( !s_parts ) 00147 s_parts = new QPtrList<KHTMLPart>; 00148 00149 if ( !s_parts->containsRef( part ) ) 00150 { 00151 s_parts->append( part ); 00152 ref(); 00153 } 00154 } 00155 00156 void KHTMLFactory::deregisterPart( KHTMLPart *part ) 00157 { 00158 assert( s_parts ); 00159 00160 if ( s_parts->removeRef( part ) ) 00161 { 00162 if ( s_parts->isEmpty() ) 00163 { 00164 delete s_parts; 00165 s_parts = 0; 00166 } 00167 deref(); 00168 } 00169 } 00170 00171 KInstance *KHTMLFactory::instance() 00172 { 00173 assert( s_self ); 00174 00175 if ( !s_instance ) 00176 { 00177 s_about = new KAboutData( "khtml", I18N_NOOP( "KHTML" ), "4.0", 00178 I18N_NOOP( "Embeddable HTML component" ), 00179 KAboutData::License_LGPL ); 00180 s_about->addAuthor( "Lars Knoll", 0, "knoll@kde.org" ); 00181 s_about->addAuthor( "Antti Koivisto", 0, "koivisto@kde.org" ); 00182 s_about->addAuthor( "Waldo Bastian", 0, "bastian@kde.org" ); 00183 s_about->addAuthor( "Dirk Mueller", 0, "mueller@kde.org" ); 00184 s_about->addAuthor( "Peter Kelly", 0, "pmk@kde.org" ); 00185 s_about->addAuthor( "Torben Weis", 0, "weis@kde.org" ); 00186 s_about->addAuthor( "Martin Jones", 0, "mjones@kde.org" ); 00187 s_about->addAuthor( "Simon Hausmann", 0, "hausmann@kde.org" ); 00188 s_about->addAuthor( "Tobias Anton", 0, "anton@stud.fbi.fh-darmstadt.de" ); 00189 00190 s_instance = new KInstance( s_about ); 00191 } 00192 00193 return s_instance; 00194 } 00195 00196 KHTMLSettings *KHTMLFactory::defaultHTMLSettings() 00197 { 00198 assert( s_self ); 00199 if ( !s_settings ) 00200 s_settings = new KHTMLSettings(); 00201 00202 return s_settings; 00203 } 00204 00205 using namespace KParts; 00206 #include "khtml_factory.moc" 00207
KDE Logo
This file is part of the documentation for khtml Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Apr 14 00:38:29 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003