You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebindings/kjsembed/jsfactory.h

343 lines
11 KiB

// -*- c++ -*-
/*
* Copyright (C) 2001-2004, Richard J. Moore <rich@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 KJSEMBEDFACTORY_H
#define KJSEMBEDFACTORY_H
#include "global.h"
#include <qmap.h>
#include <qdict.h>
#include <qstringlist.h>
#include <kjs/interpreter.h>
#include <kjs/object.h>
class QEvent;
class QObject;
class QWidget;
class QTextStream;
namespace KParts {
class ReadOnlyPart;
class ReadWritePart;
}
/**
* Namespace containing the KJSEmbed library.
*/
namespace KJSEmbed {
namespace Bindings {
class JSFactoryImp;
class JSBindingPlugin;
class JSBindingBase;
}
class KJSEmbedPart;
class JSEventMapper;
class JSOpaqueProxy;
class JSObjectProxy;
/**
* Factory class for KJSEmbed.
*
* @author Richard Moore, rich@kde.org
*/
class KJSEMBED_EXPORT JSFactory
{
public:
/**
* The types of proxy that can be associated with a class name. These are
* used when decoding the return values of slots.
*/
enum ProxyTypes {
TypeInvalid=0,
TypeQObject=1,
TypeValue=2,
TypeOpaque=4,
TypePlugin=8,
TypeQObjectPlugin=9 /*TypeObject|TypePlugin*/
};
/** Creates a factory object for the specified part. */
JSFactory( KJSEmbedPart *part );
/** Cleans up. */
virtual ~JSFactory();
/**
* Returns the mapper that translates between event types and the names of
* the handler methods.
*/
JSEventMapper *eventMapper() const { return evmapper; }
/** Returns the part that the factory is attached to. */
KJSEmbedPart *part() const { return jspart; }
//
// Methods for creating objects and wrappers.
//
/** Creates an object of the specified class, then returns a proxy. */
KJS::Object create( KJS::ExecState *exec, const QString &classname, const KJS::List &args );
/** Creates a proxy object for the specified target with the specified context. */
KJS::Object createProxy( KJS::ExecState *exec, QObject *target,
const JSObjectProxy *context=0 ) const;
/** Creates a proxy object for the specified target with the specified context. */
KJS::Object createProxy( KJS::ExecState *exec, QTextStream *target,
const JSObjectProxy *context=0 ) const;
/** Creates a proxy object for the specified target with the specified context. */
KJS::Object createProxy( KJS::ExecState *exec, QEvent *target,
const JSObjectProxy *context ) const;
/**
* Registers an opaque proxy factory with the with the factory.
* To add an opaque type to the system you need to provide a factory based off of @ref KJSEmbed::Bindings::JSBindingBase
*/
void registerOpaqueType( const QString &className, KJSEmbed::Bindings::JSBindingBase *bindingFactory);
/**
* Remove an opaque type from the system.
*/
void unregisterOpaqueType( const QString &className );
/**
* When passed an object for a type handled by an Opaque proxy this method
* will add the bindings for that opaque object to the proxy. If the object
* is not supported it is unmodified.
*/
void extendOpaqueProxy( KJS::ExecState *exec, KJS::Object &proxy) const;
/**
* Registers a QObject proxy factory with the with the factory.
* To add an opaque type to the system you need to provide a factory based off of @ref KJSEmbed::Bindings::JSBindingBase
*/
void registerObjectType( const QString &className, KJSEmbed::Bindings::JSBindingBase *bindingFactory);
/**
* Remove an opaque type from the system.
*/
void unregisterObjectType( const QString &className );
/**
* When passed an object for a type handled by an Opaque proxy this method
* will add the bindings for that opaque object to the proxy. If the object
* is not supported it is unmodified.
*/
void extendObjectProxy( KJS::ExecState *exec, KJS::Object &proxy) const;
//
// Methods for creating custom objects.
//
/**
* Creates a ReadOnlyPart that views the specified service type. The
* service type will often be a MIME type like 'text/html'. The part
* created is the first offer returned by the trader, and will have the
* specified parent and name.
*/
KParts::ReadOnlyPart *createROPart( const QString &svc, QObject *parent=0, const char *name=0 );
/**
* Creates a ReadOnlyPart that views the specified service type and matches
* the specified constraint.
*/
KParts::ReadOnlyPart *createROPart( const QString &svc, const QString &constraint,
QObject *parent=0, const char *name=0 );
/**
* Creates a ReadOnlyPart that views the specified service type and matches
* the specified constraint.
*/
KParts::ReadOnlyPart *createROPart( const QString &svc, const QString &constraint,
QObject *parent, const char *name,
const QStringList &args );
/**
* Creates a ReadWritePart that edits the specified service type. The
* service type will often be a MIME type like 'text/plain'. The part
* created is the first offer returned by the trader, and will have the
* specified parent and name.
*/
KParts::ReadWritePart *createRWPart( const QString &svc, QObject *parent=0, const char *name=0 );
/**
* Creates a ReadWritePart that edits the specified service type and matches
* the specified constraint.
*/
KParts::ReadWritePart *createRWPart( const QString &svc, const QString &constraint,
QObject *parent=0, const char *name=0 );
/**
* Creates a ReadWritePart that edits the specified service type and matches
* the specified constraint.
*/
KParts::ReadWritePart *createRWPart( const QString &svc, const QString &constraint,
QObject *parent, const char *name,
const QStringList &args );
/**
* Loads the widget defined in the specified .ui file. If the widget
* cannot be created then 0 is returned.
*/
QWidget *loadUI( const QString &uiFile, QObject *connector=0, QWidget *parent=0, const char *name=0 );
/**
* Queries KTrader for a plugin that provides the asked for object binding.
*If the binding was added the object is returned, otherwise a KJS::Null is.
*/
QStringList listBindingPlugins( KJS::ExecState *exec, KJS::Object &self);
//
// Methods that tell the factory how to handle different classes.
//
/**
* Adds a binding plugin type to the list of available types the factory can create.
*/
void addBindingPluginTypes(KJS::ExecState *exec, KJS::Object &parent);
bool isBindingPlugin(const QString &classname) const;
/**
* Creates the actual object from the binding plugin.
*/
KJS::Object createBindingPlugin(KJS::ExecState *exec, const QString &classname, const KJS::List &args );
/**
* Returns true iff the factory knows the type of proxy to use for the
* class with the name specified.
*/
bool isSupported( const QString &clazz ) const;
/**
* Returns true iff the class with the specified name is handled with the
* QObject proxy type.
*/
bool isQObject( const QString &clazz ) const;
/**
* Returns true iff the class with the specified name is handled with the
* value proxy type.
*/
bool isValue( const QString &clazz ) const;
/**
* Returns true iff the class with the specified name is handled with the
* opaque proxy type.
*/
bool isOpaque( const QString &clazz ) const;
/**
* Returns the ProxyType of the class with the specified name. If the
* named class is not known to the interpreter then TypeInvalid is
* returned.
*/
uint proxyType( const QString &clazz ) const;
/**
*Allows adding of an already loaded binding plugin for a certain class type
*
*/
void addQObjectPlugin(const QString &classname, KJSEmbed::Bindings::JSBindingPlugin* plugin);
void addBindingsPlugin(KJS::ExecState *exec, KJS::Object &target) const;
/**
* Tells the factory the specified type of proxy to use for the named
* class. Note that you can remove support for a type by using this method
* with TypeInvalid.
*/
void addType( const QString &clazz, uint proxytype=JSFactory::TypeQObject );
/** Adds the types defined by the factory to the specified parent. */
void addTypes( KJS::ExecState *exec, KJS::Object &parent );
QStringList types() const;
protected:
/** Adds custom bindings to the specified proxy object. */
KJS::Object extendProxy( KJS::ExecState *exec, KJS::Object &target ) const;
/** Creates an instance of the named class and returns it in a JSValueProxy. */
KJS::Object createValue( KJS::ExecState *exec, const QString &cname, const KJS::List &args );
/**
* Creates an instance of a QObject subclass. If the instance cannot be
* created then 0 is returned.
*/
QObject *create( const QString &classname, QObject *parent=0, const char *name=0 );
/** Creates an instance of the named class and returns it in a JSOpaqueProxy. */
KJS::Object createOpaque( KJS::ExecState *exec, const QString &cname, const KJS::List &args );
/** Creates an instance of the named binding QObject. */
QObject *createBinding( const QString &cname, QObject *parent, const char *name );
/**
* Creates an instance of the named QObject. This method is only used for
* non-widget objects.
*/
QObject *createObject( const QString &cname, QObject *parent, const char *name );
/**
* Creates an instance of the named QWidget. Note that this method is only
* used to create widgets that are not supported by QWidgetFactory.
*/
QWidget *createWidget( const QString &cname, QWidget *parent, const char *name );
private:
/** Adds the types defined by QWidgetFactory to the specified parent. */
void addWidgetFactoryTypes( KJS::ExecState *exec, KJS::Object &parent );
/** Adds support for custom QObject types to the specified parent. */
void addCustomTypes( KJS::ExecState *exec, KJS::Object &parent );
/** Adds support for QObject binding types to the specified parent. */
void addBindingTypes( KJS::ExecState *exec, KJS::Object &parent );
/**
* Adds support for any QObject types that are known about, but have no
* custom support (and no constructor).
*/
void addObjectTypes( KJS::ExecState *exec, KJS::Object &parent );
void addOpaqueTypes( KJS::ExecState *exec, KJS::Object &parent );
void addValueTypes( KJS::ExecState *exec, KJS::Object &parent );
private:
KJSEmbedPart *jspart;
JSEventMapper *evmapper;
QMap<QString,uint> objtypes;
class JSFactoryPrivate *d;
};
} // namespace KJSEmbed
#endif // KJSEMBEDFACTORY_H
// Local Variables:
// c-basic-offset: 4
// End: