added the dom events API to the kotlin standard library and get it compiling as JS too (not unit tested yet mind you ;)

This commit is contained in:
James Strachan
2012-07-24 14:32:27 +01:00
parent 0ccc0de2fe
commit 7d0b03de76
5 changed files with 66 additions and 32 deletions
+1 -5
View File
@@ -38,12 +38,8 @@ native public trait Event {
}
}
native public trait EventListener {
public fun handleEvent(arg1: Event): Unit = js.noImpl
}
native public trait EventTarget {
public fun dispatchEvent(arg1: Event): Boolean = js.noImpl
public fun dispatchEvent(arg1: Event?): Boolean = js.noImpl
public fun addEventListener(arg1: String?, arg2: EventListener, arg3: Boolean): Unit = js.noImpl
public fun removeEventListener(arg1: String?, arg2: EventListener, arg3: Boolean): Unit = js.noImpl
}
+15
View File
@@ -0,0 +1,15 @@
package org.w3c.dom.events
import org.w3c.dom.*
import org.w3c.dom.views.*
/*
TODO we should maybe update GeneratedJavaScriptStubs.kt to auto-create this file
too so that we can have the implementation code generated for JS
See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
*/
public trait EventListener {
public fun handleEvent(arg1: Event?): Unit = js.noImpl
}
+44 -22
View File
@@ -1,17 +1,33 @@
package kotlin.dom
import org.w3c.dom.Document
import java.io.Closeable
import org.w3c.dom.Node
import org.w3c.dom.events.*
import java.io.Closeable
/**
* Turns an event handler function into an [EventListener]
*/
fun eventHandler(handler: (Event) -> Unit): EventListener {
return EventListenerHandler(handler)
}
fun <T: Event> eventHandler(eventType: Class<T>, handler: (T) -> Unit): EventListener {
return object : EventListener {
public override fun handleEvent(e: Event?) {
if (e != null && eventType.isInstance(e)) {
handler(e as T)
}
private class EventListenerHandler(val handler: (Event) -> Unit): EventListener {
public override fun handleEvent(e: Event?) {
if (e != null) {
handler(e)
}
}
/*
TODO: needs KT-2507 fixed
public override fun toString(): String? = "EventListenerHandler($handler)"
*/
}
fun mouseEventHandler(handler: (MouseEvent) -> Unit): EventListener {
return eventHandler { e ->
if (e is MouseEvent) {
handler(e)
}
}
}
@@ -20,31 +36,37 @@ fun <T: Event> eventHandler(eventType: Class<T>, handler: (T) -> Unit): EventLis
* Registers a handler on the named event
*/
public fun Node?.on(name: String, capture: Boolean, handler: (Event) -> Unit): Closeable? {
return on(name, capture, javaClass<Event>(), handler)
return on(name, capture, eventHandler(handler))
}
public fun <T: Event> Node?.on(name: String, capture: Boolean, eventType: Class<T>, handler: (T) -> Unit): Closeable? {
/**
* Registers an [EventListener] on the named event
*/
public fun Node?.on(name: String, capture: Boolean, listener: EventListener): Closeable? {
return if (this is EventTarget) {
val target: EventTarget = this
val listener = eventHandler(eventType, handler)
target.addEventListener(name, listener, capture)
object: Closeable {
public override fun close() {
target.removeEventListener(name, listener, capture)
}
public override fun toString(): String? = "CloseableEventListener($target, $name)"
}
addEventListener(name, listener, capture)
CloseableEventListener(this, listener, name, capture)
} else {
null
}
}
private class CloseableEventListener(val target: EventTarget, val listener: EventListener, val name: String, val capture: Boolean): Closeable {
public override fun close() {
target.removeEventListener(name, listener, capture)
}
/*
TODO: needs KT-2507 fixed
public override fun toString(): String? = "CloseableEventListener($target, $name)"
*/
}
public fun Node?.onClick(capture: Boolean = false, handler: (MouseEvent) -> Unit): Closeable? {
return on("click", capture, javaClass<MouseEvent>(), handler)
return on("click", capture, mouseEventHandler(handler))
}
public fun Node?.onDoubleClick(capture: Boolean = false, handler: (MouseEvent) -> Unit): Closeable? {
return on("dblclick", capture, javaClass<MouseEvent>(), handler)
return on("dblclick", capture, mouseEventHandler(handler))
}
@@ -43,7 +43,11 @@ fun generateDomEventsAPI(file: File): Unit {
val classes: List<Class<*>> = arrayList(javaClass<DocumentEvent>(), javaClass<Event>(),
javaClass<EventListener>(), javaClass<EventTarget>(),
// TODO see domEventsCode.kt we manually hand craft this for now
// to get the implementation in JS
//
// javaClass<EventListener>(),
javaClass<EventTarget>(),
javaClass<MouseEvent>(), javaClass<MutationEvent>(),
javaClass<UIEvent>())
@@ -77,7 +81,7 @@ import js.noImpl
fun parameterTypeName(klass: Class<out Any?>?): String {
val answer = simpleTypeName(klass)
return if (answer == "String" || answer.endsWith("DocumentType")) {
return if (answer == "String" || answer == "Event" || answer.endsWith("DocumentType")) {
answer + "?"
} else answer
}
@@ -44,9 +44,6 @@
<fileset dir="${basedir}/../../stdlib/src/kotlin/dom">
<include name="**/*.kt"/>
<exclude name="**/*JVM.kt"/>
<!-- TODO get compiling ASAP when we can use Class<T> in JavaScript -->
<exclude name="**/DomEvents.kt"/>
</fileset>
<fileset dir="${basedir}/../../stdlib/src/kotlin/support">
<include name="**/*.kt"/>