kgenericfactory.h
/* This file is part of the KDE project
* Copyright (C) 2001 Simon Hausmann <hausmann@kde.org>
*
* 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 <klibloader.h>
#include <ktypelist.h>
#include <kinstance.h>
#include <kgenericfactory.tcc>
#include <kglobal.h>
#include <klocale.h>
#include <kdebug.h>
/* @internal */
template <class T>
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<T> *s_self;
};
/* @internal */
template <class T>
KInstance *KGenericFactoryBase<T>::s_instance = 0;
/* @internal */
template <class T>
KGenericFactoryBase<T> *KGenericFactoryBase<T>::s_self = 0;
/* @internal */
template <class T>
KInstance *KGenericFactoryBase<T>::instance()
{
if ( !s_instance && s_self )
s_instance = s_self->createInstance();
return s_instance;
}
template <class Product, class ParentType = QObject>
class KGenericFactory : public KLibFactory, public KGenericFactoryBase<Product>
{
public:
KGenericFactory( const char *instanceName = 0 )
: KGenericFactoryBase<Product>( instanceName )
{}
KGenericFactory( const KAboutData *data )
: KGenericFactoryBase<Product>( data )
{}
protected:
virtual QObject *createObject( QObject *parent, const char *name,
const char *className, const QStringList &args )
{
KGenericFactoryBase<Product>::initializeMessageCatalogue();
return KDEPrivate::ConcreteFactory<Product, ParentType>
::create( 0, 0, parent, name, className, args );
}
};
template <class Product, class ProductListTail>
class KGenericFactory< KTypeList<Product, ProductListTail>, QObject >
: public KLibFactory,
public KGenericFactoryBase< KTypeList<Product, ProductListTail> >
{
public:
KGenericFactory( const char *instanceName = 0 )
: KGenericFactoryBase< KTypeList<Product, ProductListTail> >( instanceName )
{}
KGenericFactory( const KAboutData *data )
: KGenericFactoryBase< KTypeList<Product, ProductListTail> >( 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 );
}
};
template <class Product, class ProductListTail,
class ParentType, class ParentTypeListTail>
class KGenericFactory< KTypeList<Product, ProductListTail>,
KTypeList<ParentType, ParentTypeListTail> >
: public KLibFactory,
public KGenericFactoryBase< KTypeList<Product, ProductListTail> >
{
public:
KGenericFactory( const char *instanceName = 0 )
: KGenericFactoryBase< KTypeList<Product, ProductListTail> >( instanceName )
{}
KGenericFactory( const KAboutData *data )
: KGenericFactoryBase< KTypeList<Product, ProductListTail> >( 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
KLibFactory
If you develop a library that is to be loaded dynamically at runtime, then you should return a pointe...
Definition: klibloader.h:333
KGlobal::locale
static KLocale * locale()
Returns the global locale object.
Definition: kglobal.cpp:88
KGenericFactory::KGenericFactory
KGenericFactory(const KAboutData *data)
Definition: kgenericfactory.h:183
KGenericFactory< KTypeList< Product, ProductListTail >, KTypeList< ParentType, ParentTypeListTail > >::createObject
virtual QObject * createObject(QObject *parent, const char *name, const char *className, const QStringList &args)
Creates a new object.
Definition: kgenericfactory.h:380
KGenericFactory
This template provides a generic implementation of a KLibFactory , for use with shared library compon...
Definition: kgenericfactory.h:173
KLocale::removeCatalogue
void removeCatalogue(const QString &catalog)
Removes a catalog for translation lookup.
Definition: klocale.cpp:678
klocale.h
KLocale::insertCatalogue
void insertCatalogue(const QString &catalog)
Adds another catalog to search for translation lookup.
Definition: klocale.cpp:629
KTypeList
The building block of typelists of any length.
Definition: ktypelist.h:362
KInstance
Access to KDE global objects for use in shared libraries.
Definition: kinstance.h:43
KAboutData
This class is used to store information about a program.
Definition: kaboutdata.h:182
KGenericFactory< KTypeList< Product, ProductListTail >, QObject >::createObject
virtual QObject * createObject(QObject *parent, const char *name, const char *className, const QStringList &args)
Creates a new object.
Definition: kgenericfactory.h:284
KGenericFactory::createObject
virtual QObject * createObject(QObject *parent, const char *name, const char *className, const QStringList &args)
Creates a new object.
Definition: kgenericfactory.h:189
KGenericFactory< KTypeList< Product, ProductListTail >, KTypeList< ParentType, ParentTypeListTail > >::KGenericFactory
KGenericFactory(const KAboutData *data)
Definition: kgenericfactory.h:374
KNotifyClient::instance
KInstance * instance()
Shortcut to KNotifyClient::Instance::current() :)
Definition: knotifyclient.cpp:267
KLibFactory::create
QObject * create(QObject *parent=0, const char *name=0, const char *classname="QObject", const QStringList &args=QStringList())
Creates a new object.
Definition: klibloader.cpp:81
KGenericFactory< KTypeList< Product, ProductListTail >, QObject >::KGenericFactory
KGenericFactory(const KAboutData *data)
Definition: kgenericfactory.h:278
endl
kndbgstream & endl(kndbgstream &s)
Does nothing.
Definition: kdebug.h:583

KDE Home | KDE Accessibility Home | Description of Access Keys