kdecore Library API Documentation

kglobal.cpp

00001 /* This file is part of the KDE libraries
00002    Copyright (C) 1999 Sirtaj Singh Kanq <taj@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., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 /*
00019 * kglobal.cpp -- Implementation of class KGlobal.
00020 * Author:       Sirtaj Singh Kang
00021 * Version:      $Id: kglobal.cpp,v 1.66 2002/01/26 12:14:35 coolo Exp $
00022 * Generated:    Sat May  1 02:08:43 EST 1999
00023 */
00024 
00025 #include <qglobal.h>
00026 #include <qdict.h>
00027 #include <qptrlist.h>
00028 #include "kglobal.h"
00029 
00030 #include <kapplication.h>
00031 
00032 #include <kconfig.h>
00033 #include <klocale.h>
00034 #include <kcharsets.h>
00035 #include <kiconloader.h>
00036 #include <kstandarddirs.h>
00037 #include <kinstance.h>
00038 #include "kstaticdeleter.h"
00039 
00040 #include <qfont.h>
00041 
00042 #ifndef NDEBUG
00043 #define MYASSERT(x) if (!x) \
00044    qFatal("Fatal error: you need to have a KInstance object before\n" \
00045          "you do anything that requires it! Examples of this are config\n" \
00046          "objects, standard directories or translations.");
00047 #else
00048 #define MYASSERT(x) /* nope */
00049 #endif
00050 
00051 static void kglobal_init();
00052 
00053 KStandardDirs *KGlobal::dirs()
00054 {
00055     MYASSERT(_instance);
00056 
00057     return _instance->dirs();
00058 }
00059 
00060 KConfig *KGlobal::config()
00061 {
00062     MYASSERT(_instance);
00063 
00064     return _instance->config();
00065 }
00066 
00067 KIconLoader *KGlobal::iconLoader()
00068 {
00069     MYASSERT(_instance);
00070 
00071     return _instance->iconLoader();
00072 }
00073 
00074 KInstance *KGlobal::instance()
00075 {
00076     MYASSERT(_instance);
00077     return _instance;
00078 }
00079 
00080 KLocale *KGlobal::locale()
00081 {
00082     if( _locale == 0 ) {
00083         if (!_instance)
00084            return 0;
00085         kglobal_init();
00086 
00087         // will set _locale if it works - otherwise 0 is returned
00088         KLocale::initInstance();
00089     }
00090 
00091     return _locale;
00092 }
00093 
00094 KCharsets *KGlobal::charsets()
00095 {
00096     if( _charsets == 0 ) {
00097         _charsets =new KCharsets();
00098         kglobal_init();
00099     }
00100 
00101     return _charsets;
00102 }
00103 
00104 void KGlobal::setActiveInstance(KInstance *i)
00105 {
00106     _activeInstance = i;
00107     if (i && _locale)
00108         _locale->setActiveCatalogue(QString::fromUtf8(i->instanceName()));
00109 }
00110 
00117 const QString &
00118 KGlobal::staticQString(const char *str)
00119 {
00120    return staticQString(QString::fromLatin1(str));
00121 }
00122 
00123 class KStringDict : public QDict<QString>
00124 {
00125 public:
00126    KStringDict() : QDict<QString>() { };
00127 };
00128 
00135 const QString &
00136 KGlobal::staticQString(const QString &str)
00137 {
00138     if (!_stringDict) {
00139       _stringDict = new KStringDict;
00140       _stringDict->setAutoDelete( true );
00141       kglobal_init();
00142     }
00143    QString *result = _stringDict->find(str);
00144    if (!result)
00145    {
00146       result = new QString(str);
00147       _stringDict->insert(str, result);
00148    }
00149    return *result;
00150 }
00151 
00152 class KStaticDeleterList: public QPtrList<KStaticDeleterBase>
00153 {
00154 public:
00155    KStaticDeleterList() { };
00156 };
00157 
00158 void
00159 KGlobal::registerStaticDeleter(KStaticDeleterBase *obj)
00160 {
00161    if (!_staticDeleters)
00162       kglobal_init();
00163    if (_staticDeleters->find(obj) == -1)
00164       _staticDeleters->append(obj);
00165 }
00166 
00167 void
00168 KGlobal::unregisterStaticDeleter(KStaticDeleterBase *obj)
00169 {
00170    if (_staticDeleters)
00171       _staticDeleters->removeRef(obj);
00172 }
00173 
00174 void
00175 KGlobal::deleteStaticDeleters()
00176 {
00177     if (!KGlobal::_staticDeleters)
00178         return;
00179 
00180     for(;_staticDeleters->count();)
00181     {
00182         _staticDeleters->take(0)->destructObject();
00183     }
00184 
00185     delete KGlobal::_staticDeleters;
00186     KGlobal::_staticDeleters = 0;
00187 }
00188 
00189 // The Variables
00190 
00191 KStringDict     *KGlobal::_stringDict   = 0;
00192 KInstance       *KGlobal::_instance     = 0;
00193 KInstance       *KGlobal::_activeInstance = 0;
00194 KLocale         *KGlobal::_locale       = 0;
00195 KCharsets       *KGlobal::_charsets     = 0;
00196 KStaticDeleterList *KGlobal::_staticDeleters = 0;
00197 
00198 static void kglobal_freeAll()
00199 {
00200     delete KGlobal::_locale;
00201     KGlobal::_locale = 0;
00202     delete KGlobal::_charsets;
00203     KGlobal::_charsets = 0;
00204     delete KGlobal::_stringDict;
00205     KGlobal::_stringDict = 0;
00206     KGlobal::deleteStaticDeleters();
00207     // so that we don't hold a reference and see memory leaks :/
00208     KGlobal::setActiveInstance(0);
00209 }
00210 
00211 static bool addedFreeAll = false;
00212 
00213 static void kglobal_init()
00214 {
00215     if (addedFreeAll)
00216         return;
00217 
00218     addedFreeAll = true;
00219     KGlobal::_staticDeleters = new KStaticDeleterList;
00220 
00221     qAddPostRoutine( kglobal_freeAll );
00222 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 12:46:30 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001