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