/* * Copyright (C) 2001-2004, Richard J. Moore * * 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. */ #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #ifndef QT_ONLY #include #include #include #include #include #include #include #include #include #include #include #include #include #endif // QT_ONLY #include #include #include #include "jsbinding.h" #include "jsbindingbase.h" #include "jsobjectproxy.h" #include "jsopaqueproxy.h" #include "jsvalueproxy.h" #include "jsconsolewidget.h" #include "jseventmapper.h" #include "jseventutils.h" #include "kjsembedpart.h" #include "customobject_imp.h" #include "builtins/stddialog_imp.h" #include "builtins/textstream_imp.h" #include "builtins/qdir_imp.h" #include "qtbindings/qcombobox_imp.h" #include "qtbindings/qpopupmenu_imp.h" #include "qtbindings/qlistviewitem_imp.h" #include "qtbindings/qchecklistitem_imp.h" #include "qtbindings/qcanvasellipse_imp.h" #include "qtbindings/qcanvas_imp.h" #include "qtbindings/qcanvasitem_imp.h" #include "qtbindings/qcanvasitemlist_imp.h" #include "qtbindings/qcanvasline_imp.h" #include "qtbindings/qcanvaspixmaparray_imp.h" #include "qtbindings/qcanvaspixmap_imp.h" #include "qtbindings/qcanvaspolygonalitem_imp.h" #include "qtbindings/qcanvaspolygon_imp.h" #include "qtbindings/qcanvasrectangle_imp.h" #include "qtbindings/qcanvasspline_imp.h" #include "qtbindings/qcanvassprite_imp.h" #include "qtbindings/qcanvastext_imp.h" #include "qtbindings/qcanvasview_imp.h" #ifndef QT_ONLY #include "builtins/stdaction_imp.h" #include "bindings/dcop_imp.h" #include "bindings/netaccess_imp.h" #endif // QT_ONLY #include "bindings/image_imp.h" #include "bindings/pen_imp.h" #include "bindings/pixmap_imp.h" #include "bindings/painter_imp.h" #include "bindings/movie_imp.h" #include "bindings/sql_imp.h" #include "bindings/kconfig_imp.h" #include "bindings/brush_imp.h" #include "bindings/size_imp.h" #include "bindings/rect_imp.h" #include "bindings/point_imp.h" #include "global.h" #include "jsbindingplugin.h" #include "jsfactory_imp.h" #include "jsfactory.h" // // KPart Implementation // namespace KJSEmbed { typedef Bindings::JSFactoryImp JSFactoryImp; typedef Bindings::CustomObjectImp CustomObjectImp; typedef BuiltIns::StdDialogImp StdDialogImp; typedef BuiltIns::TextStreamImp TextStreamImp; class JSFactoryPrivate { public: TTQDict plugins; TTQDict opaqueTypes; TTQDict objectTypes; }; JSFactory::JSFactory( KJSEmbedPart *part ) : jspart( part ) { evmapper = new JSEventMapper(); d = new JSFactoryPrivate; registerOpaqueType("TTQDir", new Bindings::TQDirLoader()); registerOpaqueType("TTQCheckListItem", new Bindings::TQCheckListItemLoader()); registerOpaqueType("TTQListViewItem", new Bindings::TQListViewItemLoader()); registerOpaqueType("Painter", new Bindings::PainterLoader()); #ifndef QT_ONLY registerOpaqueType("DCOPClient", new Bindings::JSDCOPClientLoader()); registerObjectType("DCOPInterface", new Bindings::JSDCOPInterfacerLoader()); registerOpaqueType("DCOPRef", new Bindings::JSDCOPRefLoader()); #endif } JSFactory::~JSFactory() { delete evmapper; } void JSFactory::addBindingPluginTypes( KJS::ExecState *exec, KJS::Object &parent ) { #ifndef QT_ONLY // Get list of valid plugin types KTrader::OfferList offers = KTrader::self() ->query( "JSBindingPlugin/Binding" ); if ( !offers.count() ) return ; KTrader::OfferListIterator itr = offers.begin(); while ( itr != offers.end() ) { TTQString classname = ( *itr ) ->name(); JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, classname ); parent.put( exec, KJS::Identifier( cons->parameter() ), KJS::Object( cons ) ); addType( classname, TypePlugin ); ++itr; } #else Q_UNUSED( exec ); Q_UNUSED( parent ); #endif // QT_ONLY } bool JSFactory::isBindingPlugin( const TTQString &classname ) const { if ( !isSupported( classname ) ) return false; return ( objtypes[ classname ] & TypePlugin ); } KJS::Object JSFactory::createBindingPlugin( KJS::ExecState *exec, const TTQString &classname, const KJS::List &args ) { #ifndef QT_ONLY Bindings::JSBindingPlugin * plugin = d->plugins[ classname ]; if ( plugin == 0L ) { TTQString query = "JSBindingPlugin/Binding"; TTQString constraint = "[Name] == '" + classname + "'"; plugin = KParts::ComponentFactory::createInstanceFromQuery( query, constraint ); if ( plugin != 0L ) d->plugins.insert( classname, plugin ); } if ( plugin != 0L ) return plugin->createBinding( jspart, exec, args ); #else Q_UNUSED( exec ); Q_UNUSED( args ); #endif // QT_ONLY kdWarning( 80001 ) << "Unable to load binding " << classname << "." << endl; return KJS::Object(); } KJS::Object JSFactory::create( KJS::ExecState *exec, const TTQString &classname, const KJS::List &args ) { KJS::Object returnObject; if ( !isSupported( classname ) ) { TTQString msg = i18n( "Object of type '%1' is not supported." ).arg( classname ); return throwError(exec, msg,KJS::TypeError); } if ( isTQObject( classname ) ) { // create via widget factory... Bindings::JSBindingBase *factory = d->objectTypes.find(classname); if( factory ) { returnObject = factory->createBinding( jspart, exec, args ); JSProxy::toProxy( returnObject.imp() ) ->setOwner( JSProxy::JavaScript ); } else { TTQObject *parent = extractTQObject(exec, args, 0); TTQString name = extractTQString(exec, args, 1); TTQObject *obj = create( classname, parent, name.latin1() ); if ( obj ) { returnObject = createProxy( exec, obj ); JSProxy::toProxy( returnObject.imp() ) ->setOwner( JSProxy::JavaScript ); } else { TTQString msg = i18n( "TTQObject of type '%1' could not be created." ).arg( classname ); returnObject = throwError(exec, msg,KJS::TypeError); } } } else if ( isOpaque( classname ) ) { // Try to create from the registry Bindings::JSBindingBase *factory = d->opaqueTypes.find(classname); if( factory ) returnObject = factory->createBinding( jspart, exec, args ); else returnObject = createOpaque( exec, classname, args ); if ( !returnObject.isValid() ) { TTQString msg = i18n( "Opaque object of type '%1' could not be created." ).arg( classname ); returnObject = throwError(exec, msg,KJS::TypeError); } } else if ( isValue( classname ) ) { returnObject = createValue( exec, classname, args ); if ( !returnObject.isValid() ) { TTQString msg = i18n( "Value object of type '%1' could not be created." ).arg( classname ); returnObject = throwError(exec, msg,KJS::TypeError); } } else if ( isBindingPlugin( classname ) ) { returnObject = createBindingPlugin( exec, classname, args ); if ( !returnObject.isValid() ) { TTQString msg = i18n( "Plugin object of type '%1' could not be created." ).arg( classname ); returnObject = throwError(exec, msg,KJS::TypeError); } else JSProxy::toProxy( returnObject.imp() ) ->setOwner( JSProxy::JavaScript ); } else { TTQString msg = i18n( "Could not create object of type '%1'." ).arg( classname ); returnObject = throwError(exec, msg,KJS::TypeError); } return returnObject; } KJS::Object JSFactory::createProxy( KJS::ExecState *exec, TTQObject *target, const JSObjectProxy *ctx ) const { kdDebug( 80001 ) << "JSFactory::createProxy: Target '" << target->name() << "' type " << target->className() << endl; JSObjectProxy *prx; if ( ctx ) prx = new JSObjectProxy( jspart, target, ctx->rootObject(), ctx->securityPolicy() ); else { prx = new JSObjectProxy( jspart, target ); } kdDebug( 80001 ) << "Proxy created" << endl; KJS::Object proxyObj( prx ); prx->addBindings( exec, proxyObj ); extendProxy( exec, proxyObj ); prx->setOwner(JSProxy::Native); kdDebug( 80001 ) << "Returning object" << endl; return proxyObj; } KJS::Object JSFactory::createProxy( KJS::ExecState *exec, TTQTextStream *target, const JSObjectProxy *context ) const { Q_UNUSED( context ) kdDebug( 80001 ) << "TextStream proxy created" << endl; JSOpaqueProxy *prx = new JSOpaqueProxy( target ); KJS::Object proxyObj( prx ); prx->addBindings( exec, proxyObj ); TextStreamImp::addBindings( exec, proxyObj ); return proxyObj; } KJS::Object JSFactory::createProxy( KJS::ExecState *exec, TTQEvent *target, const JSObjectProxy *context ) const { switch ( target->type() ) { case TTQEvent::MouseButtonPress: case TTQEvent::MouseButtonRelease: case TTQEvent::MouseMove: case TTQEvent::MouseButtonDblClick: return JSEventUtils::convertEvent( exec, ( TTQMouseEvent * ) target, context ); break; case TTQEvent::KeyPress: case TTQEvent::KeyRelease: case TTQEvent::Accel: case TTQEvent::AccelOverride: return JSEventUtils::convertEvent( exec, ( TTQKeyEvent * ) target, context ); break; case TTQEvent::IMStart: case TTQEvent::IMCompose: case TTQEvent::IMEnd: return JSEventUtils::convertEvent( exec, ( TTQIMEvent * ) target, context ); break; case TTQEvent::Paint: return JSEventUtils::convertEvent( exec, ( TTQPaintEvent * ) target, context ); break; case TTQEvent::Resize: return JSEventUtils::convertEvent( exec, ( TTQResizeEvent * ) target, context ); break; case TTQEvent::FocusIn: case TTQEvent::FocusOut: return JSEventUtils::convertEvent( exec, ( TTQFocusEvent * ) target, context ); break; case TTQEvent::Close: return JSEventUtils::convertEvent( exec, ( TTQCloseEvent * ) target, context ); break; case TTQEvent::ChildInserted: case TTQEvent::ChildRemoved: return JSEventUtils::convertEvent( exec, ( TTQChildEvent * ) target, context ); break; case TTQEvent::Move: return JSEventUtils::convertEvent( exec, ( TTQMoveEvent * ) target, context ); break; case TTQEvent::Wheel: return JSEventUtils::convertEvent( exec, ( TTQWheelEvent * ) target, context ); break; case TTQEvent::Timer: return JSEventUtils::convertEvent( exec, ( TTQTimerEvent * ) target, context ); break; case TTQEvent::ContextMenu: return JSEventUtils::convertEvent( exec, ( TTQContextMenuEvent * ) target, context ); break; case TTQEvent::DragMove: case TTQEvent::DragEnter: return JSEventUtils::convertEvent( exec, ( TTQDragMoveEvent * ) target, context ); break; case TTQEvent::Drop: return JSEventUtils::convertEvent( exec, ( TTQDropEvent * ) target, context ); break; case TTQEvent::Enter: case TTQEvent::Leave: case TTQEvent::Clipboard: case TTQEvent::DragLeave: case TTQEvent::Show: case TTQEvent::Hide: return JSEventUtils::convertEvent( exec, ( TTQEvent * ) target, context ); break; default: break; } return JSEventUtils::convertEvent( exec, ( TTQEvent * ) target, context ); } KJS::Object JSFactory::extendProxy( KJS::ExecState *exec, KJS::Object &target ) const { CustomObjectImp::addBindings( exec, target ); addBindingsPlugin( exec, target ); return target; } void JSFactory::addBindingsPlugin( KJS::ExecState *exec, KJS::Object &target ) const { kdDebug( 800001 ) << "JSFactory::addBindingsPlugin" << endl; JSObjectProxy *proxy = JSProxy::toObjectProxy( target.imp() ); if ( !proxy ) return ; if ( !isBindingPlugin( proxy->object() ->className() ) ) return ; #ifndef QT_ONLY Bindings::JSBindingPlugin *plugin = d->plugins[ proxy->object() ->className() ]; if ( plugin == 0L ) { TTQString query = "JSBindingPlugin/Binding"; TTQString constraint = "[Name] == '" + TTQString::fromUtf8( proxy->object() ->className() ) + "'"; plugin = KParts::ComponentFactory::createInstanceFromQuery( query, constraint ); if ( plugin != 0L ) d->plugins.insert( proxy->object() ->className(), plugin ); } if ( plugin != 0L ) { kdDebug( 800001 ) << "JSFactory::addBindingsPlugin: calling plugin function" << endl; plugin->addBindings( exec, target ); return ; } #else Q_UNUSED( exec ); #endif // QT_ONLY kdWarning( 80001 ) << "Unable to add bindings to " << proxy->object() ->className() << "." << endl; return ; } TTQObject *JSFactory::createBinding( const TTQString &cname, TTQObject *parent, const char *name ) { #ifndef QT_ONLY // Bindings /*if ( cname == "DCOPInterface" ) return new Bindings::JSDCOPInterface( jspart->interpreter(), parent, name ); else */if ( cname == "NetAccess" ) return new Bindings::NetAccess( parent, name ); else #endif // QT_ONLY if ( cname == "Movie" ) return new Bindings::Movie( parent, name ); else if ( cname == "SqlDatabase" ) return new Bindings::SqlDatabase( parent, name ); else if ( cname == "SqlQuery" ) return new Bindings::SqlQuery( parent, name ); else if ( cname == "Config" ) return new Bindings::Config( parent, name ); return 0; } TTQObject *JSFactory::createObject( const TTQString &cname, TTQObject *parent, const char *name ) { // TQObjects defined by Qt if ( cname == "TTQObject" ) return new TTQObject( parent, name ); else if ( cname == "TTQTimer" ) return new TTQTimer( parent, name ); else if ( cname == "TTQCanvas" ) return new TTQCanvas( parent, name ); #ifndef QT_ONLY // TQObjects defined by KDE else if ( cname == "KAction" ) return new KAction( parent, name ); else if ( cname == "KToggleAction" ) return new KToggleAction( parent, name ); #endif // QT_ONLY TTQWidget *w = dynamic_cast( parent ); if ( !w ) return 0; if ( cname == "TTQHBoxLayout" ) return new TTQHBoxLayout( w, 0, -1, name ); else if ( cname == "TTQVBoxLayout" ) return new TTQVBoxLayout( w, 0, -1, name ); return 0; } KJS::Object JSFactory::createOpaque( KJS::ExecState *exec, const TTQString &cname, const KJS::List &args ) { if ( cname == "TTQCanvasText" ) { kdDebug( 80001 ) << "Creating canvas item, type is " << cname << endl; JSOpaqueProxy *prx = 0; if ( args.size() == 0 ) { // FALL THRU } else if ( args.size() == 1 ) { JSObjectProxy * arg0 = JSProxy::toObjectProxy( args[ 0 ].imp() ); if ( arg0 ) { TTQObject * obj0 = arg0->object(); if ( obj0->inherits( "TTQCanvas" ) ) { TTQCanvas * parent = ( TTQCanvas * ) ( obj0 ); prx = new JSOpaqueProxy( new TTQCanvasText( parent ), "TTQCanvasText" ); KJS::Object proxyObj( prx ); TQCanvasItemImp::addBindings( exec, proxyObj ); TQCanvasTextImp::addBindings( exec, proxyObj ); return proxyObj; } else { kdDebug( 80001 ) << " canvas item create failed, arg0 is " << obj0->className() << endl; return KJS::Object(); } } else { kdDebug( 80001 ) << " canvas item create failed, arg0 is not an object" << endl; return KJS::Object(); } } else if ( args.size() == 2 ) { TTQString arg0 = args[ 0 ].toString( exec ).qstring(); JSObjectProxy *arg1 = JSProxy::toObjectProxy( args[ 1 ].imp() ); if ( arg1 ) { TTQString arg0 = args[ 0 ].toString( exec ).qstring(); TTQObject *obj1 = arg1->object(); if ( obj1->inherits( "TTQCanvas" ) ) { TTQCanvas * parent = ( TTQCanvas * ) ( obj1 ); prx = new JSOpaqueProxy( new TTQCanvasText( parent ), "TTQCanvasText" ); KJS::Object proxyObj( prx ); TQCanvasItemImp::addBindings( exec, proxyObj ); TQCanvasTextImp::addBindings( exec, proxyObj ); return proxyObj; } else { kdDebug( 80001 ) << " canvas item create failed, arg0 is " << obj1->className() << endl; return KJS::Object(); } } else { kdDebug( 80001 ) << " canvas item create failed, arg1 is not an object" << endl; return KJS::Object(); } } } return KJS::Object(); } KJS::Object JSFactory::createValue( KJS::ExecState *exec, const TTQString &cname, const KJS::List & args ) { if ( cname == "Image" ) { TTQImage img = TTQImage(); JSValueProxy *prx = new JSValueProxy( ); prx->setValue( img ); KJS::Object proxyObj( prx ); Bindings::ImageImp::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Pixmap" ) { TTQPixmap pix = TTQPixmap(); JSValueProxy *prx = new JSValueProxy( ); prx->setValue( pix ); KJS::Object proxyObj( prx ); Bindings::Pixmap::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Brush" ) { TTQBrush brsh; JSValueProxy *prx = new JSValueProxy( ); prx->setValue( brsh ); KJS::Object proxyObj( prx ); Bindings::BrushImp::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Pen" ) { TTQPen pen; JSValueProxy *prx = new JSValueProxy( ); prx->setValue( pen ); KJS::Object proxyObj( prx ); Bindings::Pen::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Rect" ) { TTQRect rect; if ( args.size() == 4 ) { rect.setX( extractInt( exec, args, 0 ) ); rect.setY( extractInt( exec, args, 1 ) ); rect.setWidth( extractInt( exec, args, 2 ) ); rect.setHeight( extractInt( exec, args, 3 ) ); } JSValueProxy *prx = new JSValueProxy( ); prx->setValue( rect ); KJS::Object proxyObj( prx ); Bindings::Rect::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Point" ) { TTQPoint point; if ( args.size() == 2 ) { point.setX( extractInt( exec, args, 0 ) ); point.setY( extractInt( exec, args, 1 ) ); } JSValueProxy *prx = new JSValueProxy( ); prx->setValue( point ); KJS::Object proxyObj( prx ); Bindings::Point::addBindings( exec, proxyObj ); return proxyObj; } if ( cname == "Size" ) { TTQSize size; if ( args.size() == 2 ) { size.setWidth( extractInt( exec, args, 0 ) ); size.setHeight( extractInt( exec, args, 1 ) ); } JSValueProxy *prx = new JSValueProxy( ); prx->setValue( size ); KJS::Object proxyObj( prx ); Bindings::Size::addBindings( exec, proxyObj ); return proxyObj; } return KJS::Object(); } TTQWidget *JSFactory::createWidget( const TTQString &cname, TTQWidget *pw, const char *name ) { if ( cname == "TTQSplitter" ) return new TTQSplitter( pw, name ); else if ( cname == "TTQMainWindow" ) return new TTQMainWindow( pw, name ); else if ( cname == "TTQProgressDialog" ) return new TTQProgressDialog( pw, name ); else if ( cname == "TTQScrollView" ) return new TTQScrollView( pw, name ); else if ( cname == "TTQCanvasView" ) return new TTQCanvasView( pw, name ); else if ( cname == "TTQSplashScreen" ) { TTQPixmap pix( 16, 16 ); pix.fill(); return new TTQSplashScreen( pix ); } #ifndef QT_ONLY else if ( cname == "KMainWindow" ) return new KMainWindow( pw, name ); else if ( cname == "KParts_MainWindow" ) return new KParts::MainWindow( pw, name ); else if ( cname == "KSystemTray" ) return new KSystemTray( pw, name ); #endif // QT_ONLY return 0; } TTQObject *JSFactory::create( const TTQString &cname, TTQObject *parent, const char *name ) { kdDebug( 80001 ) << "KJSEmbedPart::create() name " << name << " class " << cname << endl; // Factory widgets TTQWidgetFactory wf; TTQWidget *pw = ( parent && parent->isWidgetType() ) ? static_cast( parent ) : 0; TTQWidget *w = wf.createWidget( cname, pw, name ); if ( w ) { kdDebug( 80001 ) << "Created from factory" << endl; return w; } // Custom widgets TTQObject *obj; obj = createWidget( cname, pw, name ); if ( obj ) { if ( !isTQObject( obj->className() ) ) addType( obj->className() ); kdDebug( 80001 ) << "Created from createWidget" << endl; return obj; } // Custom objects obj = JSFactory::createObject( cname, parent, name ); if ( obj ) { if ( !isTQObject( obj->className() ) ) addType( obj->className() ); kdDebug( 80001 ) << "Created from createObject" << endl; return obj; } // Binding objects obj = JSFactory::createBinding( cname, parent, name ); if ( obj ) { if ( !isTQObject( obj->className() ) ) addType( obj->className() ); kdDebug( 80001 ) << "Created from bindings" << endl; return obj; } kdDebug( 80001 ) << "Found nothing in :" << cname << ":" << endl; return 0; } KParts::ReadOnlyPart *JSFactory::createROPart( const TTQString &svc, TTQObject *parent, const char *name ) { kdDebug( 80001 ) << "JSFactory::createROPart svc " << svc << " parent " << ( long ) parent << endl; return createROPart( svc, "'KParts/ReadOnlyPart' in ServiceTypes", parent, name ); } KParts::ReadOnlyPart *JSFactory::createROPart( const TTQString &svc, const TTQString &con, TTQObject *parent, const char *name ) { kdDebug( 80001 ) << "JSFactory::createROPart svc " << svc << " constraint " << con << " parent " << ( long ) parent << endl; return createROPart( svc, con, parent, name, TTQStringList() ); } KParts::ReadOnlyPart *JSFactory::createROPart( const TTQString &svc, const TTQString &con, TTQObject *parent, const char *name, const TTQStringList &args ) { #ifndef QT_ONLY kdDebug( 80001 ) << "JSFactory::createROPart svc " << svc << " constraint " << con << " parent " << ( long ) parent << " args: " << args << endl; KTrader::OfferList offers = KTrader::self() ->query( svc, con ); if ( !offers.count() ) return 0; KService::Ptr ptr = offers.first(); KLibFactory *fact = KLibLoader::self() ->factory( ptr->library().ascii() ); if ( !fact ) { kdDebug( 80001 ) << "Unable to find a matching part" << endl; return 0; } TTQObject *obj = fact->create( parent, name, "KParts::ReadOnlyPart", args ); addType( obj->className() ); return static_cast( obj ); #else // QT_ONLY Q_UNUSED( svc ); Q_UNUSED( con ); Q_UNUSED( parent ); Q_UNUSED( name ); Q_UNUSED( args ); return 0; #endif // QT_ONLY } KParts::ReadWritePart *JSFactory::createRWPart( const TTQString &svc, TTQObject *parent, const char *name ) { kdDebug( 80001 ) << "JSFactory::createRWPart svc " << svc << " parent " << ( long ) parent << endl; return createRWPart( svc, "'KParts/ReadWritePart' in ServiceTypes", parent, name ); } KParts::ReadWritePart *JSFactory::createRWPart( const TTQString &svc, const TTQString &con, TTQObject *parent, const char *name ) { kdDebug( 80001 ) << "JSFactory::createRWPart svc " << svc << " constraint " << con << " parent " << ( long ) parent << endl; return createRWPart( svc, con, parent, name, TTQStringList() ); } KParts::ReadWritePart *JSFactory::createRWPart( const TTQString &svc, const TTQString &con, TTQObject *parent, const char *name, const TTQStringList &args ) { #ifndef QT_ONLY kdDebug( 80001 ) << "JSFactory::createRWPart svc " << svc << " constraint " << con << " parent " << ( long ) parent << " args: " << args << endl; KTrader::OfferList offers = KTrader::self() ->query( svc, con ); if ( !offers.count() ) return 0; KService::Ptr ptr = offers.first(); KLibFactory *fact = KLibLoader::self() ->factory( ptr->library().ascii() ); if ( !fact ) { kdDebug( 80001 ) << "Unable to find a matching part" << endl; return 0; } TTQObject *obj = fact->create( parent, name, "KParts::ReadWritePart", args ); addType( obj->className() ); return static_cast( obj ); #else // QT_ONLY Q_UNUSED( svc ); Q_UNUSED( con ); Q_UNUSED( parent ); Q_UNUSED( name ); Q_UNUSED( args ); return 0; #endif // QT_ONLY } TTQWidget *JSFactory::loadUI( const TTQString &uiFile, TTQObject *connector, TTQWidget *parent, const char *name ) { return TTQWidgetFactory::create( uiFile, connector, parent, name ); } TTQStringList JSFactory::listBindingPlugins( KJS::ExecState *exec, KJS::Object &self ) { Q_UNUSED( exec ) Q_UNUSED( self ) TTQStringList pluginList; TTQStringList allTypes = objtypes.keys(); for ( uint idx = 0; idx < allTypes.count(); ++idx ) { if ( objtypes[ allTypes[ idx ] ] & TypePlugin ) pluginList.append( allTypes[ idx ] ); } return pluginList; } bool JSFactory::isTQObject( const TTQString &clazz ) const { if ( !isSupported( clazz ) ) return false; return ( objtypes[ clazz ] & TypeTQObject ); } bool JSFactory::isValue( const TTQString &clazz ) const { if ( !isSupported( clazz ) ) return false; return objtypes[ clazz ] == TypeValue; } bool JSFactory::isOpaque( const TTQString &clazz ) const { if ( !isSupported( clazz ) ) return false; return objtypes[ clazz ] == TypeOpaque; } void JSFactory::addTQObjectPlugin( const TTQString &classname, KJSEmbed::Bindings::JSBindingPlugin* plugin ) { if ( plugin ) { addType( classname, TypeTQObjectPlugin ); d->plugins.insert( classname, plugin ); } } void JSFactory::addType( const TTQString &clazz, uint prxtype ) { if ( prxtype == TypeInvalid ) { objtypes.remove( clazz ); return ; } kdDebug() << "Add type " << clazz << endl; objtypes[ clazz ] = prxtype; } bool JSFactory::isSupported( const TTQString &clazz ) const { kdDebug() << "Checking " << clazz << endl; return objtypes.contains( clazz ); } uint JSFactory::proxyType( const TTQString &clazz ) const { if ( !isSupported( clazz ) ) return TypeInvalid; return objtypes[ clazz ]; } void JSFactory::addTypes( KJS::ExecState *exec, KJS::Object &parent ) { addWidgetFactoryTypes( exec, parent ); addCustomTypes( exec, parent ); addBindingTypes( exec, parent ); addObjectTypes( exec, parent ); addOpaqueTypes( exec, parent ); addValueTypes( exec, parent ); addBindingPluginTypes( exec, parent ); } TTQStringList JSFactory::types() const { return objtypes.keys(); } void JSFactory::addWidgetFactoryTypes( KJS::ExecState *exec, KJS::Object &parent ) { TTQStringList sl = TTQWidgetFactory::widgets(); for ( TTQStringList::Iterator it = sl.begin(); it != sl.end(); ++it ) { JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, *it ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( *it ); } } void JSFactory::addCustomTypes( KJS::ExecState *exec, KJS::Object &parent ) { const char * classes[] = { "TTQSplitter", "TTQScrollView", "TTQCanvasView", "TTQCanvas", "TTQObject", "TTQTimer", "TTQSplashScreen", "TTQProgressDialog", "TTQLayout", "TTQBoxLayout", "TTQHBoxLayout", "TTQVBoxLayout", #ifndef QT_ONLY "KMainWindow", "KXMLGUIClient", "KSystemTray", "KAction", "KToggleAction", "KParts_MainWindow", #endif // QT_ONLY 0 }; for ( int i = 0 ; classes[ i ] ; i++ ) { JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, classes[ i ] ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( classes[ i ] ); } } void JSFactory::addBindingTypes( KJS::ExecState *exec, KJS::Object &parent ) { const char * bindings[] = { "Pixmap", "KJSEmbed::Bindings::Pixmap", "SqlDatabase", "KJSEmbed::Bindings::SqlDatabase", "Movie", "KJSEmbed::Bindings::Movie", "SqlQuery", "KJSEmbed::Bindings::SqlQuery", #ifndef QT_ONLY "NetAccess", "KJSEmbed::Bindings::NetAccess", /*"DCOPInterface", "KJSEmbed::Bindings::JSDCOPInterface",*/ #endif "Config", "KJSEmbed::Bindings::Config", 0, 0 }; for ( int i = 0 ; bindings[ i ] ; i += 2 ) { JSFactoryImp * cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, bindings[ i ] ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( bindings[ i ] ); addType( bindings[ i + 1 ] ); } } void JSFactory::addOpaqueTypes( KJS::ExecState *exec, KJS::Object &parent ) { const char * classes[] = { "TTQTextStream", "TextStream", "TTQCanvasItem", "TTQCanvasText", 0 }; for ( int i = 0 ; classes[ i ] ; i++ ) { JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, classes[ i ] ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( classes[ i ], TypeOpaque ); } // Create the custom added types. TTQDictIterator idx( d->opaqueTypes ); for( ; idx.current(); ++idx){ JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, idx.currentKey() ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( idx.currentKey(), TypeOpaque ); } } void JSFactory::addValueTypes( KJS::ExecState *exec, KJS::Object &parent ) { const char * classes[] = { "Image", "Brush", "Pixmap", "Pen", "Rect", "Size", "Point", 0 }; for ( int i = 0 ; classes[ i ] ; i++ ) { JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, classes[ i ] ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( classes[ i ], TypeValue ); } } void JSFactory::addObjectTypes( KJS::ExecState *exec, KJS::Object & parent ) { const char * classes[] = { "TTQAccel", "TTQAccessibleObject", "TTQAction", "TTQActionGroup", "TTQApplication", "TQAquaStyle", "TQAssistantClient", "TQAxObject", "TQAxWidget", "TTQButton", "TQCDEStyle", "TQClipboard", "TQColorDialog", "TTQColorDrag", "TTQComboBox", "TTQCommonStyle", "TQCopChannel", "TTQDataPump", "TTQDateTimeEditBase", "TTQDesktopWidget", "TTQDns", "TTQDockArea", "TTQDockWindow", "TTQDoubleValidator", "TTQDragObject", "TTQEditorFactory", "TTQErrorMessage", "TTQEventLoop", "TTQFileDialog", "TTQFileIconProvider", "TQFontDialog", "TTQFtp", "TQGLWidget", "TTQGridLayout", "TTQGridView", "TTQHButtonGroup", "TTQHGroupBox", "TTQHeader", "TTQHttp", "TTQIconDrag", "TTQImageDrag", "TQInputDialog", "TTQIntValidator", "TTQLocalFs", "TQMacStyle", "TTQMenuBar", "TTQMessageBox", "TQMotif", "TQMotifDialog", "TTQMotifPlusStyle", "TTQMotifStyle", "TQMotifWidget", "TQNPInstance", "TQNPWidget", "TTQNetworkOperation", "TTQNetworkProtocol", "TTQObjectCleanupHandler", "TTQPlatinumStyle", "TTQProcess", "TTQPopupMenu", "TTQProgressDialog", "TTQRegExpValidator", "TQSGIStyle", "TTQServerSocket", "TQSessionManager", "TTQSignal", "TTQSignalMapper", "TTQSizeGrip", "TTQSocket", "TTQSocketNotifier", "TTQSound", "TTQSqlDatabase", "TTQSqlDriver", "TTQSqlEditorFactory", "TTQSqlForm", "TTQStatusBar", "TTQStoredDrag", "TTQStyle", "TTQStyleSheet", "TTQTabBar", "TTQTabDialog", "TTQTextDrag", "TTQToolBar", "TTQToolTipGroup", "TQTranslator", "TTQUriDrag", "TTQUrlOperator", "TTQVButtonGroup", "TTQVGroupBox", "TTQValidator", "TQWSKeyboardHandler", "TTQWindowsStyle", "TQWindowsXPStyle", "TTQWorkspace", "TQXtWidget", 0 }; for ( int i = 0 ; classes[ i ] ; i++ ) { if ( !isSupported( classes[ i ] ) ) addType( classes[ i ] ); } // Create the custom added types. TTQDictIterator idx( d->objectTypes ); for( ; idx.current(); ++idx){ JSFactoryImp *cons = new JSFactoryImp( exec, this, JSFactoryImp::NewInstance, idx.currentKey() ); parent.put( exec, KJS::Identifier( KJS::UString( cons->parameter() ) ), KJS::Object( cons ) ); addType( idx.currentKey(), TypeTQObject ); } } void JSFactory::registerOpaqueType( const TTQString & className, KJSEmbed::Bindings::JSBindingBase * bindingFactory ) { d->opaqueTypes.insert(className,bindingFactory); } void JSFactory::unregisterOpaqueType( const TTQString & className ) { d->opaqueTypes.remove(className); } void JSFactory::extendOpaqueProxy( KJS::ExecState * exec, KJS::Object &proxy ) const { JSOpaqueProxy *prx = JSProxy::toOpaqueProxy( proxy.imp() ); if( prx ) { kdDebug() << "Looking for " << prx->typeName() << endl; Bindings::JSBindingBase *bindingFactory = d->opaqueTypes.find( prx->typeName() ); if( bindingFactory ) { kdDebug() << "Extending proxy" << endl; bindingFactory->addBindings(jspart, exec, proxy ); } } } void JSFactory::registerObjectType( const TTQString & className, KJSEmbed::Bindings::JSBindingBase * bindingFactory ) { d->objectTypes.insert(className,bindingFactory); } void JSFactory::unregisterObjectType( const TTQString & className ) { d->objectTypes.remove(className); } void JSFactory::extendObjectProxy( KJS::ExecState * exec, KJS::Object &proxy ) const { JSObjectProxy *prx = JSProxy::toObjectProxy( proxy.imp() ); if( prx ) { kdDebug() << "Looking for " << prx->typeName() << endl; Bindings::JSBindingBase *bindingFactory = d->objectTypes.find( prx->typeName() ); if( bindingFactory ) { kdDebug() << "Extending proxy" << endl; bindingFactory->addBindings(jspart, exec, proxy ); } } } }// namespace KJSEmbed // Local Variables: // c-basic-offset: 4 // End: