From 7d0b03de7625ac8d51bc200ec243701b77bb180e Mon Sep 17 00:00:00 2001 From: James Strachan Date: Tue, 24 Jul 2012 14:32:27 +0100 Subject: [PATCH] added the dom events API to the kotlin standard library and get it compiling as JS too (not unit tested yet mind you ;) --- js/js.libraries/src/core/domEvents.kt | 6 +- js/js.libraries/src/core/domEventsCode.kt | 15 +++++ libraries/stdlib/src/kotlin/dom/DomEvents.kt | 66 ++++++++++++------- .../kotlin/tools/GenerateJavaScriptStubs.kt | 8 ++- libraries/tools/kotlin-js-library/pom.xml | 3 - 5 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 js/js.libraries/src/core/domEventsCode.kt diff --git a/js/js.libraries/src/core/domEvents.kt b/js/js.libraries/src/core/domEvents.kt index 9be0e3c1725..eade339ff46 100644 --- a/js/js.libraries/src/core/domEvents.kt +++ b/js/js.libraries/src/core/domEvents.kt @@ -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 } diff --git a/js/js.libraries/src/core/domEventsCode.kt b/js/js.libraries/src/core/domEventsCode.kt new file mode 100644 index 00000000000..4fc9a9bba5d --- /dev/null +++ b/js/js.libraries/src/core/domEventsCode.kt @@ -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 +} diff --git a/libraries/stdlib/src/kotlin/dom/DomEvents.kt b/libraries/stdlib/src/kotlin/dom/DomEvents.kt index 90f977999f5..2d820cc1cb7 100644 --- a/libraries/stdlib/src/kotlin/dom/DomEvents.kt +++ b/libraries/stdlib/src/kotlin/dom/DomEvents.kt @@ -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 eventHandler(eventType: Class, 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 eventHandler(eventType: Class, 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(), handler) + return on(name, capture, eventHandler(handler)) } -public fun Node?.on(name: String, capture: Boolean, eventType: Class, 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(), handler) + return on("click", capture, mouseEventHandler(handler)) } public fun Node?.onDoubleClick(capture: Boolean = false, handler: (MouseEvent) -> Unit): Closeable? { - return on("dblclick", capture, javaClass(), handler) + return on("dblclick", capture, mouseEventHandler(handler)) } \ No newline at end of file diff --git a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt index 12dd837d0b6..693c12ad4c4 100644 --- a/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt +++ b/libraries/stdlib/test/org/jetbrains/kotlin/tools/GenerateJavaScriptStubs.kt @@ -43,7 +43,11 @@ fun generateDomEventsAPI(file: File): Unit { val classes: List> = arrayList(javaClass(), javaClass(), - javaClass(), javaClass(), + // TODO see domEventsCode.kt we manually hand craft this for now + // to get the implementation in JS + // + // javaClass(), + javaClass(), javaClass(), javaClass(), javaClass()) @@ -77,7 +81,7 @@ import js.noImpl fun parameterTypeName(klass: Class?): String { val answer = simpleTypeName(klass) - return if (answer == "String" || answer.endsWith("DocumentType")) { + return if (answer == "String" || answer == "Event" || answer.endsWith("DocumentType")) { answer + "?" } else answer } diff --git a/libraries/tools/kotlin-js-library/pom.xml b/libraries/tools/kotlin-js-library/pom.xml index 3356d82fbba..1fd4600c6d7 100644 --- a/libraries/tools/kotlin-js-library/pom.xml +++ b/libraries/tools/kotlin-js-library/pom.xml @@ -44,9 +44,6 @@ - - -