/* This file is part of the KDE project * Copyright (C) 2001 Simon Hausmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __kgenericfactory_h__ #define __kgenericfactory_h__ #include #include #include #include #include #include #include /* @internal */ template class KGenericFactoryBase { public: KGenericFactoryBase( const char *instanceName ) : m_instanceName( instanceName ) { m_aboutData=0L; s_self = this; m_catalogueInitialized = false; } KGenericFactoryBase( const KAboutData *data ) : m_aboutData(data) { s_self = this; m_catalogueInitialized = false; } virtual ~KGenericFactoryBase() { if ( s_instance ) KGlobal::locale()->removeCatalogue( QString::fromAscii( s_instance->instanceName() ) ); delete s_instance; s_instance = 0; s_self = 0; } static KInstance *instance(); protected: virtual KInstance *createInstance() { if ( m_aboutData ) return new KInstance( m_aboutData ); if ( !m_instanceName ) { kdWarning() << "KGenericFactory: instance requested but no instance name or about data passed to the constructor!" << endl; return 0; } return new KInstance( m_instanceName ); } virtual void setupTranslations( void ) { if ( instance() ) KGlobal::locale()->insertCatalogue( QString::fromAscii( instance()->instanceName() ) ); } void initializeMessageCatalogue() { if ( !m_catalogueInitialized ) { m_catalogueInitialized = true; setupTranslations(); } } private: QCString m_instanceName; const KAboutData *m_aboutData; bool m_catalogueInitialized; static KInstance *s_instance; static KGenericFactoryBase *s_self; }; /* @internal */ template KInstance *KGenericFactoryBase::s_instance = 0; /* @internal */ template KGenericFactoryBase *KGenericFactoryBase::s_self = 0; /* @internal */ template KInstance *KGenericFactoryBase::instance() { if ( !s_instance && s_self ) s_instance = s_self->createInstance(); return s_instance; } /** * This template provides a generic implementation of a KLibFactory , * for use with shared library components. It implements the pure virtual * createObject method of KLibFactory and instantiates objects of the * specified class (template argument) when the class name argument of * createObject matches a class name in the given hierarchy. * * In case you are developing a KParts component, skip this file and * go directly to KParts::GenericFactory . * * Note that the class specified as template argument needs to provide * a certain constructor: *
    *
  • If the class is derived from QObject then it needs to have * a constructor like: * MyClass( QObject *parent, const char *name, * const QStringList &args ); *
  • If the class is derived from QWidget then it needs to have * a constructor like: * MyWidget( QWidget *parent, const char *name, * const QStringList &args); *
  • If the class is derived from KParts::Part then it needs to have * a constructor like: * MyPart( QWidget *parentWidget, const char *widgetName, * QObject *parent, const char *name, * const QStringList &args ); *
* The args QStringList passed to the constructor is the args string list * that the caller passed to KLibFactory's create method. * * In addition upon instantiation this template provides a central * KInstance object for your component, accessible through the * static instance() method. The instanceName argument of the * KGenericFactory constructor is passed to the KInstance object. * * The creation of the KInstance object can be customized by inheriting * from this template class and re-implementing the virtual createInstance * method. For example it could look like this: * \code * KInstance *MyFactory::createInstance() * { * return new KInstance( myAboutData ); * } * \endcode * * Example of usage of the whole template: * \code * class MyPlugin : public KParts::Plugin * { * Q_ OBJECT * public: * MyPlugin( QObject *parent, const char *name, * const QStringList &args ); * ... * }; * * K_EXPORT_COMPONENT_FACTORY( libmyplugin, KGenericFactory<MyPlugin> ) * \endcode */ template class KGenericFactory : public KLibFactory, public KGenericFactoryBase { public: KGenericFactory( const char *instanceName = 0 ) : KGenericFactoryBase( instanceName ) {} /** * @since 3.3 */ KGenericFactory( const KAboutData *data ) : KGenericFactoryBase( data ) {} protected: virtual QObject *createObject( QObject *parent, const char *name, const char *className, const QStringList &args ) { KGenericFactoryBase::initializeMessageCatalogue(); return KDEPrivate::ConcreteFactory ::create( 0, 0, parent, name, className, args ); } }; /** * This template provides a generic implementation of a KLibFactory , * for use with shared library components. It implements the pure virtual * createObject method of KLibFactory and instantiates objects of the * specified classes in the given typelist template argument when the class * name argument of createObject matches a class names in the given hierarchy * of classes. * * Note that each class in the specified in the typelist template argument * needs to provide a certain constructor: *
    *
  • If the class is derived from QObject then it needs to have * a constructor like: * MyClass( QObject *parent, const char *name, * const QStringList &args ); *
  • If the class is derived from QWidget then it needs to have * a constructor like: * MyWidget( QWidget *parent, const char *name, * const QStringList &args); *
  • If the class is derived from KParts::Part then it needs to have * a constructor like: * MyPart( QWidget *parentWidget, const char *widgetName, * QObject *parent, const char *name, * const QStringList &args ); *
* The args QStringList passed to the constructor is the args string list * that the caller passed to KLibFactory's create method. * * In addition upon instantiation this template provides a central * KInstance object for your component, accessible through the * static instance() method. The instanceName argument of the * KGenericFactory constructor is passed to the KInstance object. * * The creation of the KInstance object can be customized by inheriting * from this template class and re-implementing the virtual createInstance * method. For example it could look like this: * \code * KInstance *MyFactory::createInstance() * { * return new KInstance( myAboutData ); * } * \endcode * * Example of usage of the whole template: * \code * class MyPlugin : public KParts::Plugin * { * Q_ OBJECT * public: * MyPlugin( QObject *parent, const char *name, * const QStringList &args ); * ... * }; * * class MyDialogComponent : public KDialogBase * { * Q_ OBJECT * public: * MyDialogComponent( QWidget *parentWidget, const char *name, * const QStringList &args ); * ... * }; * * typedef K_TYPELIST_2( MyPlugin, MyDialogComponent ) Products; * K_EXPORT_COMPONENT_FACTORY( libmyplugin, KGenericFactory<Products> ) * \endcode */ template class KGenericFactory< KTypeList, QObject > : public KLibFactory, public KGenericFactoryBase< KTypeList > { public: KGenericFactory( const char *instanceName = 0 ) : KGenericFactoryBase< KTypeList >( instanceName ) {} /** * @since 3.3 */ KGenericFactory( const KAboutData *data ) : KGenericFactoryBase< KTypeList >( data ) {} protected: virtual QObject *createObject( QObject *parent, const char *name, const char *className, const QStringList &args ) { this->initializeMessageCatalogue(); return KDEPrivate::MultiFactory< KTypeList< Product, ProductListTail > > ::create( 0, 0, parent, name, className, args ); } }; /** * This template provides a generic implementation of a KLibFactory , * for use with shared library components. It implements the pure virtual * createObject method of KLibFactory and instantiates objects of the * specified classes in the given typelist template argument when the class * name argument of createObject matches a class names in the given hierarchy * of classes. * * Note that each class in the specified in the typelist template argument * needs to provide a certain constructor: *
    *
  • If the class is derived from QObject then it needs to have * a constructor like: * MyClass( QObject *parent, const char *name, * const QStringList &args ); *
  • If the class is derived from QWidget then it needs to have * a constructor like: * MyWidget( QWidget *parent, const char *name, * const QStringList &args); *
  • If the class is derived from KParts::Part then it needs to have * a constructor like: * MyPart( QWidget *parentWidget, const char *widgetName, * QObject *parent, const char *name, * const QStringList &args ); *
* The args QStringList passed to the constructor is the args string list * that the caller passed to KLibFactory's create method. * * In addition upon instantiation this template provides a central * KInstance object for your component, accessible through the * static instance() method. The instanceName argument of the * KGenericFactory constructor is passed to the KInstance object. * * The creation of the KInstance object can be customized by inheriting * from this template class and re-implementing the virtual createInstance * method. For example it could look like this: * \code * KInstance *MyFactory::createInstance() * { * return new KInstance( myAboutData ); * } * \endcode * * Example of usage of the whole template: * \code * class MyPlugin : public KParts::Plugin * { * Q_ OBJECT * public: * MyPlugin( QObject *parent, const char *name, * const QStringList &args ); * ... * }; * * class MyDialogComponent : public KDialogBase * { * Q_ OBJECT * public: * MyDialogComponent( QWidget *parentWidget, const char *name, * const QStringList &args ); * ... * }; * * typedef K_TYPELIST_2( MyPlugin, MyDialogComponent ) Products; * K_EXPORT_COMPONENT_FACTORY( libmyplugin, KGenericFactory<Products> ) * \endcode */ template class KGenericFactory< KTypeList, KTypeList > : public KLibFactory, public KGenericFactoryBase< KTypeList > { public: KGenericFactory( const char *instanceName = 0 ) : KGenericFactoryBase< KTypeList >( instanceName ) {} /** * @since 3.3 */ KGenericFactory( const KAboutData *data ) : KGenericFactoryBase< KTypeList >( data ) {} protected: virtual QObject *createObject( QObject *parent, const char *name, const char *className, const QStringList &args ) { this->initializeMessageCatalogue(); return KDEPrivate::MultiFactory< KTypeList< Product, ProductListTail >, KTypeList< ParentType, ParentTypeListTail > > ::create( 0, 0, parent, name, className, args ); } }; /* * vim: et sw=4 */ #endif