katefactory.cpp
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 2001-2004 Christoph Cullmann <cullmann@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License version 2 as published by the Free Software Foundation. 00007 00008 This library is distributed in the hope that it will be useful, 00009 but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 Library General Public License for more details. 00012 00013 You should have received a copy of the GNU Library General Public License 00014 along with this library; see the file COPYING.LIB. If not, write to 00015 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00016 Boston, MA 02110-1301, USA. 00017 */ 00018 00019 #include "config.h" 00020 #include "katefactory.h" 00021 00022 #include "katedocument.h" 00023 #include "kateview.h" 00024 #include "katerenderer.h" 00025 #include "katecmds.h" 00026 #include "katefiletype.h" 00027 #include "kateschema.h" 00028 #include "katesearch.h" 00029 #include "kateconfig.h" 00030 #ifndef Q_WS_WIN //todo 00031 #include "katejscript.h" 00032 #endif 00033 #include "kateluaindentscript.h" 00034 #include "../interfaces/katecmd.h" 00035 00036 #include <kvmallocator.h> 00037 #include <klocale.h> 00038 #include <kdirwatch.h> 00039 #include <kstaticdeleter.h> 00040 00041 #include <tqapplication.h> 00042 00046 class KateFactoryPublic : public KParts::Factory 00047 { 00048 public: 00059 KParts::Part *createPartObject ( TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const char *classname, const TQStringList &args ) 00060 { 00061 return KateFactory::self()->createPartObject (parentWidget, widgetName, parent, name, classname, args); 00062 } 00063 }; 00064 00065 K_EXPORT_COMPONENT_FACTORY( libkatepart, KateFactoryPublic ) 00066 00067 KateFactory *KateFactory::s_self = 0; 00068 00069 KateFactory::KateFactory () 00070 : m_aboutData ("katepart", I18N_NOOP("Kate Part"), KATEPART_VERSION, 00071 I18N_NOOP( "Embeddable editor component" ), KAboutData::License_LGPL_V2, 00072 I18N_NOOP( "(c) 2000-2004 The Kate Authors" ), 0, "http://kate-editor.org/") 00073 , m_instance (&m_aboutData) 00074 , m_plugins (KTrader::self()->query("KTextEditor/Plugin")) 00075 , m_jscript (0) 00076 { 00077 // set s_self 00078 s_self = this; 00079 00080 // 00081 // fill about data 00082 // 00083 m_aboutData.addAuthor ("Christoph Cullmann", I18N_NOOP("Maintainer"), "cullmann@kde.org", "http://www.babylon2k.de"); 00084 m_aboutData.addAuthor ("Anders Lund", I18N_NOOP("Core Developer"), "anders@alweb.dk", "http://www.alweb.dk"); 00085 m_aboutData.addAuthor ("Joseph Wenninger", I18N_NOOP("Core Developer"), "jowenn@kde.org","http://stud3.tuwien.ac.at/~e9925371"); 00086 m_aboutData.addAuthor ("Hamish Rodda",I18N_NOOP("Core Developer"), "rodda@kde.org"); 00087 m_aboutData.addAuthor ("Waldo Bastian", I18N_NOOP( "The cool buffersystem" ), "bastian@kde.org" ); 00088 m_aboutData.addAuthor ("Charles Samuels", I18N_NOOP("The Editing Commands"), "charles@kde.org"); 00089 m_aboutData.addAuthor ("Matt Newell", I18N_NOOP("Testing, ..."), "newellm@proaxis.com"); 00090 m_aboutData.addAuthor ("Michael Bartl", I18N_NOOP("Former Core Developer"), "michael.bartl1@chello.at"); 00091 m_aboutData.addAuthor ("Michael McCallum", I18N_NOOP("Core Developer"), "gholam@xtra.co.nz"); 00092 m_aboutData.addAuthor ("Jochen Wilhemly", I18N_NOOP( "KWrite Author" ), "digisnap@cs.tu-berlin.de" ); 00093 m_aboutData.addAuthor ("Michael Koch",I18N_NOOP("KWrite port to KParts"), "koch@kde.org"); 00094 m_aboutData.addAuthor ("Christian Gebauer", 0, "gebauer@kde.org" ); 00095 m_aboutData.addAuthor ("Simon Hausmann", 0, "hausmann@kde.org" ); 00096 m_aboutData.addAuthor ("Glen Parker",I18N_NOOP("KWrite Undo History, Kspell integration"), "glenebob@nwlink.com"); 00097 m_aboutData.addAuthor ("Scott Manson",I18N_NOOP("KWrite XML Syntax highlighting support"), "sdmanson@alltel.net"); 00098 m_aboutData.addAuthor ("John Firebaugh",I18N_NOOP("Patches and more"), "jfirebaugh@kde.org"); 00099 m_aboutData.addAuthor ("Dominik Haumann", I18N_NOOP("Developer & Highlight wizard"), "dhdev@gmx.de"); 00100 00101 m_aboutData.addCredit ("Matteo Merli",I18N_NOOP("Highlighting for RPM Spec-Files, Perl, Diff and more"), "merlim@libero.it"); 00102 m_aboutData.addCredit ("Rocky Scaletta",I18N_NOOP("Highlighting for VHDL"), "rocky@purdue.edu"); 00103 m_aboutData.addCredit ("Yury Lebedev",I18N_NOOP("Highlighting for SQL"),""); 00104 m_aboutData.addCredit ("Chris Ross",I18N_NOOP("Highlighting for Ferite"),""); 00105 m_aboutData.addCredit ("Nick Roux",I18N_NOOP("Highlighting for ILERPG"),""); 00106 m_aboutData.addCredit ("Carsten Niehaus", I18N_NOOP("Highlighting for LaTeX"),""); 00107 m_aboutData.addCredit ("Per Wigren", I18N_NOOP("Highlighting for Makefiles, Python"),""); 00108 m_aboutData.addCredit ("Jan Fritz", I18N_NOOP("Highlighting for Python"),""); 00109 m_aboutData.addCredit ("Daniel Naber","",""); 00110 m_aboutData.addCredit ("Roland Pabel",I18N_NOOP("Highlighting for Scheme"),""); 00111 m_aboutData.addCredit ("Cristi Dumitrescu",I18N_NOOP("PHP Keyword/Datatype list"),""); 00112 m_aboutData.addCredit ("Carsten Pfeiffer", I18N_NOOP("Very nice help"), ""); 00113 m_aboutData.addCredit (I18N_NOOP("All people who have contributed and I have forgotten to mention"),"",""); 00114 00115 m_aboutData.setTranslator(I18N_NOOP("_: NAME OF TRANSLATORS\nYour names"), I18N_NOOP("_: EMAIL OF TRANSLATORS\nYour emails")); 00116 00117 // 00118 // dir watch 00119 // 00120 m_dirWatch = new KDirWatch (); 00121 00122 // 00123 // filetype man 00124 // 00125 m_fileTypeManager = new KateFileTypeManager (); 00126 00127 // 00128 // schema man 00129 // 00130 m_schemaManager = new KateSchemaManager (); 00131 00132 // config objects 00133 m_documentConfig = new KateDocumentConfig (); 00134 m_viewConfig = new KateViewConfig (); 00135 m_rendererConfig = new KateRendererConfig (); 00136 00137 // vm allocator 00138 m_vm = new KVMAllocator (); 00139 00140 #ifndef Q_WS_WIN //todo 00141 // create script man (search scripts) + register commands 00142 m_jscriptManager = new KateJScriptManager (); 00143 KateCmd::self()->registerCommand (m_jscriptManager); 00144 m_indentScriptManagers.append(new KateIndentJScriptManager()); 00145 #else 00146 m_jscriptManager = 0; 00147 #endif 00148 #ifdef HAVE_LUA 00149 m_indentScriptManagers.append(new KateLUAIndentScriptManager()); 00150 #endif 00151 // 00152 // init the cmds 00153 // 00154 m_cmds.push_back (new KateCommands::CoreCommands()); 00155 m_cmds.push_back (new KateCommands::SedReplace ()); 00156 m_cmds.push_back (new KateCommands::Character ()); 00157 m_cmds.push_back (new KateCommands::Date ()); 00158 m_cmds.push_back (new SearchCommand()); 00159 00160 for ( TQValueList<Kate::Command *>::iterator it = m_cmds.begin(); it != m_cmds.end(); ++it ) 00161 KateCmd::self()->registerCommand (*it); 00162 } 00163 00164 KateFactory::~KateFactory() 00165 { 00166 /* ?hack? If MainApplication-Interface::quit is called by dcop the factory gets destroyed before all documents are destroyed eg in kwrite. 00167 This could happen in other apps too. Since the documents try to unregister a new factory is created (in the ::self call) and registered with a 00168 KStaticDeleter which causes a crash. That's why I ensure here that all documents are destroyed before the factory goes down (JOWENN)*/ 00169 while (KateDocument *doc=m_documents.first()) { 00170 s_self=this; /* this is needed because the KStaticDeleter sets the global reference to 0, before it deletes the object it handles. 00171 To prevent a crash again restore the factory pointer temporarily. (jowenn)*/ 00172 delete doc; 00173 s_self=0; 00174 } 00175 /*another solution would be to set a flag in the documents, and inhibit calling of the deregistering methods, but I don't see a problem 00176 if all created objects are deleted before their factory. If somebody sees a problem, let me know*/ 00177 00178 delete m_documentConfig; 00179 delete m_viewConfig; 00180 delete m_rendererConfig; 00181 00182 delete m_fileTypeManager; 00183 delete m_schemaManager; 00184 00185 delete m_dirWatch; 00186 00187 delete m_vm; 00188 00189 for ( TQValueList<Kate::Command *>::iterator it = m_cmds.begin(); it != m_cmds.end(); ++it ) 00190 delete *it; 00191 00192 // cu manager 00193 delete m_jscriptManager; 00194 m_indentScriptManagers.setAutoDelete(true); 00195 // cu jscript 00196 delete m_jscript; 00197 } 00198 00199 static KStaticDeleter<KateFactory> sdFactory; 00200 00201 KateFactory *KateFactory::self () 00202 { 00203 if (!s_self) { 00204 sdFactory.setObject(s_self, new KateFactory ()); 00205 } 00206 return s_self; 00207 } 00208 00209 KParts::Part *KateFactory::createPartObject ( TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const char *_classname, const TQStringList & ) 00210 { 00211 TQCString classname( _classname ); 00212 bool bWantSingleView = ( classname != "KTextEditor::Document" && classname != "Kate::Document" ); 00213 bool bWantBrowserView = ( classname == "Browser/View" ); 00214 bool bWantReadOnly = (bWantBrowserView || ( classname == "KParts::ReadOnlyPart" )); 00215 00216 KParts::ReadWritePart *part = new KateDocument (bWantSingleView, bWantBrowserView, bWantReadOnly, parentWidget, widgetName, parent, name); 00217 part->setReadWrite( !bWantReadOnly ); 00218 00219 return part; 00220 } 00221 00222 void KateFactory::registerDocument ( KateDocument *doc ) 00223 { 00224 m_documents.append( doc ); 00225 } 00226 00227 void KateFactory::deregisterDocument ( KateDocument *doc ) 00228 { 00229 m_documents.removeRef( doc ); 00230 } 00231 00232 void KateFactory::registerView ( KateView *view ) 00233 { 00234 m_views.append( view ); 00235 } 00236 00237 void KateFactory::deregisterView ( KateView *view ) 00238 { 00239 m_views.removeRef( view ); 00240 } 00241 00242 void KateFactory::registerRenderer ( KateRenderer *renderer ) 00243 { 00244 m_renderers.append( renderer ); 00245 } 00246 00247 void KateFactory::deregisterRenderer ( KateRenderer *renderer ) 00248 { 00249 m_renderers.removeRef( renderer ); 00250 } 00251 00252 KateJScript *KateFactory::jscript () 00253 { 00254 #ifndef Q_WS_WIN //todo 00255 if (m_jscript) 00256 return m_jscript; 00257 00258 return m_jscript = new KateJScript (); 00259 #else 00260 return 0; 00261 #endif 00262 } 00263 00264 00265 KateIndentScript KateFactory::indentScript (const TQString &scriptname) 00266 { 00267 KateIndentScript result; 00268 for(uint i=0;i<m_indentScriptManagers.count();i++) 00269 { 00270 result=m_indentScriptManagers.at(i)->script(scriptname); 00271 if (!result.isNull()) return result; 00272 } 00273 return result; 00274 } 00275 00276 // kate: space-indent on; indent-width 2; replace-tabs on;