summaryrefslogtreecommitdiffstats
path: root/kjsembed/jsobjecteventproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kjsembed/jsobjecteventproxy.cpp')
-rw-r--r--kjsembed/jsobjecteventproxy.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/kjsembed/jsobjecteventproxy.cpp b/kjsembed/jsobjecteventproxy.cpp
new file mode 100644
index 00000000..ad29608f
--- /dev/null
+++ b/kjsembed/jsobjecteventproxy.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2003-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.
+ */
+
+#include <qvariant.h>
+#include "global.h"
+
+#include "jsfactory.h"
+#include "jseventmapper.h"
+#include "jsobjectproxy.h"
+#include "kjsembedpart.h"
+#include "jsbinding.h"
+
+#include "jsobjecteventproxy.h"
+#ifndef QT_ONLY
+#include "jsobjecteventproxy.moc"
+#endif // QT_ONLY
+
+namespace KJSEmbed {
+
+// We'll need to increase this if we need to support any custom events
+static const QEvent::Type QEVENT_TYPE_MAX = QEvent::TabletRelease;
+
+JSObjectEventProxy::JSObjectEventProxy( JSObjectProxy *parent, const char *name )
+ : QObject( parent->object(), name ? name : "jsobjecteventproxy" ),
+ proxy( parent ), eventMask( QEVENT_TYPE_MAX ), refcount(0)
+{
+ eventMask.fill( false );
+}
+
+JSObjectEventProxy::~JSObjectEventProxy()
+{
+}
+
+bool JSObjectEventProxy::isFiltered( QEvent::Type t ) const
+{
+ return eventMask.testBit( t );
+}
+
+void JSObjectEventProxy::addFilter( QEvent::Type t )
+{
+ if ( !refcount )
+ proxy->object()->installEventFilter( this );
+
+ if ( !eventMask.testBit(t) ) {
+ refcount++;
+ eventMask.setBit( t );
+ }
+
+ kdDebug(80001) << "JSObjectEventProxy::addFilter done" << endl;
+}
+
+void JSObjectEventProxy::removeFilter( QEvent::Type t )
+{
+ eventMask.clearBit( t );
+ refcount--;
+ if ( !refcount ) {
+ proxy->object()->removeEventFilter( this );
+ deleteLater();
+ }
+
+ kdDebug(80001) << "JSObjectEventProxy::removeFilter done" << endl;
+}
+
+bool JSObjectEventProxy::eventFilter( QObject * /*watched*/, QEvent *e )
+{
+ if ( isFiltered(e->type()) )
+ callHandler( e );
+
+ return false;
+}
+
+KJS::Value JSObjectEventProxy::callHandler( QEvent *e )
+{
+// Be careful enabling this as if there are a lot of events then the event loop times
+// out and the app crashes with 'Alarm Clock'.
+// kdDebug(80001) << "JSObjectEventProxy::callHandler() event type " << e->type() << endl;
+
+ KJS::ExecState *exec = proxy->interpreter()->globalExec();
+ KJS::Identifier *id = proxy->part()->factory()->eventMapper()->findEventHandler( e->type() );
+
+ KJS::Object jsobj( proxy );
+ KJS::Object fun = jsobj.get(exec, *id ).toObject( exec );
+
+ if ( !fun.implementsCall() ) {
+ QString msg = i18n( "Bad event handler: Object %1 Identifier %2 Method %3 Type: %4." )
+ .arg(jsobj.className().ascii()).arg(id->ascii()).arg(fun.className().ascii()).arg(e->type());
+ return throwError(exec, msg, KJS::TypeError );
+ }
+
+ // Process args
+ KJS::List args;
+ KJS::Object obj = proxy->part()->factory()->createProxy( exec, e, proxy );
+ args.append( obj );
+
+ // Call handler
+ KJS::Value result = fun.call( exec, jsobj, args );
+
+ if ( exec->hadException() ) {
+ kdWarning( 80001 ) << "Exception in event handler '" << id->qstring() << "', "
+ << exec->exception().toString(exec).qstring() << endl;
+
+ exec->clearException();
+ }
+
+ return result;
+}
+
+} // KJSEmbed
+
+