00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GLUON_CORE_GLUONOBJECTFACTORY_H
00020 #define GLUON_CORE_GLUONOBJECTFACTORY_H
00021
00022 #include "singleton.h"
00023 #include "gluon_core_export.h"
00024 #include "debughelper.h"
00025
00026 #include <QtCore/QSharedData>
00027 #include <QtCore/QHash>
00028 #include <QtCore/QMetaType>
00029
00030 namespace GluonCore
00031 {
00032 class GluonObject;
00033 class GluonObjectFactory;
00034
00042 class GLUON_CORE_EXPORT GluonObjectFactory : public Singleton<GluonObjectFactory>
00043 {
00044 Q_OBJECT
00045
00046 public:
00047 template<class T>
00048 void registerObjectType()
00049 {
00050 DEBUG_BLOCK
00051
00052 int typeID = qRegisterMetaType<T*>( T::staticMetaObject.className() + '*' );
00053 DEBUG_TEXT( QString( "Registering object type %1 with typeID %2" ).arg( T::staticMetaObject.className() ).arg( typeID ) );
00054
00055 m_objectTypes[T::staticMetaObject.className()] = &( T::staticMetaObject );
00056 m_objectTypeIDs[T::staticMetaObject.className()] = typeID;
00057
00058
00059 T object;
00060 QString mimetypenames;
00061 foreach( const QString & mimetype, object.supportedMimeTypes() )
00062 {
00063 mimetypenames.append( ' ' + mimetype );
00064 m_mimeTypes[mimetype] = T::staticMetaObject.className();
00065 }
00066 if( mimetypenames.length() > 0 )
00067 {
00068 DEBUG_TEXT( QString( "Added mimetypes %1 to the index" ).arg( mimetypenames ) );
00069 }
00070 };
00071
00078 GluonObject* instantiateObjectByName( const QString& objectTypeName );
00085 GluonObject* instantiateObjectByMimetype( const QString& objectMimeType );
00086
00096 QVariant wrapObject( const QVariant& original, GluonObject* newValue );
00106 QVariant wrapObject( const QString& type, GluonObject* newValue );
00113 GluonObject* wrappedObject( const QVariant& wrappedObject );
00114
00118 void loadPlugins();
00119
00125 QStringList objectTypeNames() const;
00131 QStringList objectMimeTypes() const;
00138 QHash<QString, const QMetaObject*> objectTypes() const;
00145 const QHash<QString, int> objectTypeIDs() const;
00146
00147 private:
00148 QHash<QString, const QMetaObject*> m_objectTypes;
00149 QHash<QString, QString> m_mimeTypes;
00150 QHash<QString, int> m_objectTypeIDs;
00151 };
00152 }
00153
00158 template<class T>
00159 class GluonObjectRegistration
00160 {
00161 public:
00162 GluonObjectRegistration()
00163 {
00164 GluonCore::GluonObjectFactory::instance()->registerObjectType<T>();
00165 }
00166 };
00167
00189 #define REGISTER_OBJECTTYPE(NAMESPACE,NEWOBJECTTYPE) \
00190 GluonObjectRegistration<NAMESPACE :: NEWOBJECTTYPE> NAMESPACE ## NEWOBJECTTYPE ## _GluonObjectRegistration;\
00191 GluonCore::GluonObject * \
00192 NAMESPACE::NEWOBJECTTYPE::instantiate()\
00193 {\
00194 return new NAMESPACE :: NEWOBJECTTYPE();\
00195 }\
00196 GluonCore::GluonObject * \
00197 NAMESPACE::NEWOBJECTTYPE::fromVariant(const QVariant &wrappedObject) \
00198 {\
00199 return wrappedObject.value< NAMESPACE :: NEWOBJECTTYPE* >();\
00200 }\
00201 QVariant \
00202 NAMESPACE::NEWOBJECTTYPE::toVariant(GluonCore::GluonObject *wrapThis)\
00203 {\
00204 return QVariant::fromValue<NAMESPACE :: NEWOBJECTTYPE *>(qobject_cast<NAMESPACE :: NEWOBJECTTYPE*>(wrapThis));\
00205 }\
00206
00207
00208
00209 #endif // GLUON_CORE_GLUONOBJECTFACTORY_H