• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

KDECore

kgenericfactory.h

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002  * Copyright (C) 2001 Simon Hausmann <hausmann@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 as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public License
00015  * along with this library; see the file COPYING.LIB.  If not, write to
00016  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018  */
00019 #ifndef __kgenericfactory_h__
00020 #define __kgenericfactory_h__
00021 
00022 #include <klibloader.h>
00023 #include <ktypelist.h>
00024 #include <kinstance.h>
00025 #include <kgenericfactory.tcc>
00026 #include <kglobal.h>
00027 #include <klocale.h>
00028 #include <kdebug.h>
00029 
00030 /* @internal */
00031 template <class T>
00032 class KGenericFactoryBase
00033 {
00034 public:
00035     KGenericFactoryBase( const char *instanceName )
00036         : m_instanceName( instanceName )
00037     {
00038         m_aboutData=0L;
00039         s_self = this;
00040         m_catalogueInitialized = false;
00041     }
00042     KGenericFactoryBase( const KAboutData *data )
00043         : m_aboutData(data)
00044     {
00045         s_self = this;
00046         m_catalogueInitialized = false;
00047     }
00048 
00049     virtual ~KGenericFactoryBase()
00050     {
00051         if ( s_instance )
00052             KGlobal::locale()->removeCatalogue( QString::fromAscii( s_instance->instanceName() ) );
00053         delete s_instance;
00054         s_instance = 0;
00055         s_self = 0;
00056     }
00057 
00058     static KInstance *instance();
00059 
00060 protected:
00061     virtual KInstance *createInstance()
00062     {
00063         if ( m_aboutData )
00064             return new KInstance( m_aboutData );
00065         if ( !m_instanceName ) {
00066             kdWarning() << "KGenericFactory: instance requested but no instance name or about data passed to the constructor!" << endl;
00067             return 0;
00068         }
00069         return new KInstance( m_instanceName );
00070     }
00071 
00072     virtual void setupTranslations( void )
00073     {
00074         if ( instance() )
00075             KGlobal::locale()->insertCatalogue( QString::fromAscii( instance()->instanceName() ) );
00076     }
00077 
00078     void initializeMessageCatalogue()
00079     {
00080         if ( !m_catalogueInitialized )
00081         {
00082             m_catalogueInitialized = true;
00083             setupTranslations();
00084         }
00085     }
00086 
00087 private:
00088     QCString m_instanceName;
00089     const KAboutData *m_aboutData;
00090     bool m_catalogueInitialized;
00091 
00092     static KInstance *s_instance;
00093     static KGenericFactoryBase<T> *s_self;
00094 };
00095 
00096 /* @internal */
00097 template <class T>
00098 KInstance *KGenericFactoryBase<T>::s_instance = 0;
00099 
00100 /* @internal */
00101 template <class T>
00102 KGenericFactoryBase<T> *KGenericFactoryBase<T>::s_self = 0;
00103 
00104 /* @internal */
00105 template <class T>
00106 KInstance *KGenericFactoryBase<T>::instance()
00107 {
00108     if ( !s_instance && s_self )
00109         s_instance = s_self->createInstance();
00110     return s_instance;
00111 }
00112 
00172 template <class Product, class ParentType = QObject>
00173 class KGenericFactory : public KLibFactory, public KGenericFactoryBase<Product>
00174 {
00175 public:
00176     KGenericFactory( const char *instanceName = 0 )
00177         : KGenericFactoryBase<Product>( instanceName )
00178     {}
00179 
00183     KGenericFactory( const KAboutData *data )
00184         : KGenericFactoryBase<Product>( data )
00185     {}
00186 
00187 
00188 protected:
00189     virtual QObject *createObject( QObject *parent, const char *name,
00190                                   const char *className, const QStringList &args )
00191     {
00192         KGenericFactoryBase<Product>::initializeMessageCatalogue();
00193         return KDEPrivate::ConcreteFactory<Product, ParentType>
00194             ::create( 0, 0, parent, name, className, args );
00195     }
00196 };
00197 
00265 template <class Product, class ProductListTail>
00266 class KGenericFactory< KTypeList<Product, ProductListTail>, QObject >
00267     : public KLibFactory,
00268       public KGenericFactoryBase< KTypeList<Product, ProductListTail> >
00269 {
00270 public:
00271     KGenericFactory( const char *instanceName  = 0 )
00272         : KGenericFactoryBase< KTypeList<Product, ProductListTail> >( instanceName )
00273     {}
00274 
00278     KGenericFactory( const KAboutData *data )
00279         : KGenericFactoryBase< KTypeList<Product, ProductListTail> >( data )
00280     {}
00281 
00282 
00283 protected:
00284     virtual QObject *createObject( QObject *parent, const char *name,
00285                                    const char *className, const QStringList &args )
00286     {
00287         this->initializeMessageCatalogue();
00288         return KDEPrivate::MultiFactory< KTypeList< Product, ProductListTail > >
00289             ::create( 0, 0, parent, name, className, args );
00290     }
00291 };
00292 
00360 template <class Product, class ProductListTail,
00361           class ParentType, class ParentTypeListTail>
00362 class KGenericFactory< KTypeList<Product, ProductListTail>,
00363                        KTypeList<ParentType, ParentTypeListTail> >
00364     : public KLibFactory,
00365       public KGenericFactoryBase< KTypeList<Product, ProductListTail> >
00366 {
00367 public:
00368     KGenericFactory( const char *instanceName  = 0 )
00369         : KGenericFactoryBase< KTypeList<Product, ProductListTail> >( instanceName )
00370     {}
00374     KGenericFactory( const KAboutData *data )
00375         : KGenericFactoryBase< KTypeList<Product, ProductListTail> >( data )
00376     {}
00377 
00378 
00379 protected:
00380     virtual QObject *createObject( QObject *parent, const char *name,
00381                                    const char *className, const QStringList &args )
00382     {
00383         this->initializeMessageCatalogue();
00384         return KDEPrivate::MultiFactory< KTypeList< Product, ProductListTail >,
00385                                          KTypeList< ParentType, ParentTypeListTail > >
00386                                        ::create( 0, 0, parent, name,
00387                                                  className, args );
00388     }
00389 };
00390 
00391 
00392 /*
00393  * vim: et sw=4
00394  */
00395 
00396 #endif
00397 

KDECore

Skip menu "KDECore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal