00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
00097
template <
class T>
00098
KInstance *KGenericFactoryBase<T>::s_instance = 0;
00099
00100
00101
template <
class T>
00102 KGenericFactoryBase<T> *KGenericFactoryBase<T>::s_self = 0;
00103
00104
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
00394
00395
00396
#endif
00397