@@ -5,6 +5,7 @@ import com.github.sanity.kweb.dom.element.Element
5
5
import com.github.sanity.kweb.dom.element.KWebDSL
6
6
import com.github.sanity.kweb.dom.element.modification.addEventListener
7
7
import com.github.sanity.kweb.gson
8
+ import java.util.concurrent.ConcurrentHashMap
8
9
import kotlin.reflect.KClass
9
10
import kotlin.reflect.full.memberProperties
10
11
@@ -28,34 +29,156 @@ open class ONReceiver(private val parent: Element) : Element(parent) {
28
29
val shiftKey : Boolean , val locale : String ,
29
30
val isComposing : Boolean )
30
31
32
+ data class AnimationEvent (val type : String , val detail : Long ,
33
+ val animationName : String , val elapsedTime : Int )
34
+
31
35
fun event (eventName : String , returnEventFields : Set <String > = emptySet(), callback : (String ) -> Unit ): Element {
32
36
parent.addEventListener(eventName, returnEventFields = returnEventFields, callback = callback)
33
37
return parent
34
38
}
35
39
36
40
inline fun <reified T : Any > event (eventName : String , eventType : KClass <T >, crossinline callback : (T )-> Unit ) : Element {
37
41
// TODO: Should probably cache this rather than do the reflection every time
38
- val eventPropertyNames = T :: class .memberProperties.map {it.name}.toSet( )
42
+ val eventPropertyNames = Companion .memberProperties(eventType )
39
43
return event(eventName, eventPropertyNames, {propertiesAsString ->
40
44
val props : T = gson.fromJson(propertiesAsString)
41
45
callback(props)
42
46
})
43
47
}
44
48
49
+ // Mouse Events
45
50
fun click (callback : (MouseEvent ) -> Unit ) = event(" click" , eventType = MouseEvent ::class , callback = callback)
46
- fun change (callback : (MouseEvent ) -> Unit ) = event(" change" , eventType = MouseEvent ::class , callback = callback)
51
+ fun contextmenu (callback : (MouseEvent ) -> Unit ) = event(" contextmenu" , eventType = MouseEvent ::class , callback = callback)
52
+ fun dblclick (callback : (MouseEvent ) -> Unit ) = event(" dblclick" , eventType = MouseEvent ::class , callback = callback)
53
+ fun mousedown (callback : (MouseEvent ) -> Unit ) = event(" mousedown" , eventType = MouseEvent ::class , callback = callback)
54
+ fun mouseenter (callback : (MouseEvent ) -> Unit ) = event(" mouseenter" , eventType = MouseEvent ::class , callback = callback)
55
+ fun mouseleave (callback : (MouseEvent ) -> Unit ) = event(" mouseleave" , eventType = MouseEvent ::class , callback = callback)
56
+ fun mousemove (callback : (MouseEvent ) -> Unit ) = event(" mousemove" , eventType = MouseEvent ::class , callback = callback)
47
57
fun mouseover (callback : (MouseEvent ) -> Unit ) = event(" mouseover" , eventType = MouseEvent ::class , callback = callback)
48
58
fun mouseout (callback : (MouseEvent ) -> Unit ) = event(" mouseout" , eventType = MouseEvent ::class , callback = callback)
59
+ fun mouseup (callback : (MouseEvent ) -> Unit ) = event(" mouseup" , eventType = MouseEvent ::class , callback = callback)
49
60
61
+ // Keyboard Events
50
62
fun keydown (callback : (KeyboardEvent ) -> Unit ) = event(" keydown" , eventType = KeyboardEvent ::class , callback = callback)
51
63
fun keypress (callback : (KeyboardEvent ) -> Unit ) = event(" keypress" , eventType = KeyboardEvent ::class , callback = callback)
52
64
fun keyup (callback : (KeyboardEvent ) -> Unit ) = event(" keyup" , eventType = KeyboardEvent ::class , callback = callback)
53
65
66
+ // Frame / Object Events TODO: define eventtype
67
+ fun abort (callback : (String ) -> Unit ) = event(" abort" , callback = callback)
68
+ fun beforeunload (callback : (String ) -> Unit ) = event(" beforeunload" , callback = callback)
69
+ fun error (callback : (String ) -> Unit ) = event(" error" , callback = callback)
70
+ fun hashchange (callback : (String ) -> Unit ) = event(" hashchange" , callback = callback)
54
71
fun load (callback : (String ) -> Unit ) = event(" load" , callback = callback)
72
+ fun pageshow (callback : (String ) -> Unit ) = event(" pageshow" , callback = callback)
73
+ fun pagehide (callback : (String ) -> Unit ) = event(" pagehide" , callback = callback)
74
+ fun resize (callback : (String ) -> Unit ) = event(" resize" , callback = callback)
75
+ fun scroll (callback : (String ) -> Unit ) = event(" scroll" , callback = callback)
76
+ fun unload (callback : (String ) -> Unit ) = event(" unload" , callback = callback)
55
77
78
+ // Form Events TODO: define eventtype
79
+ fun blur (callback : (String ) -> Unit ) = event(" blur" , callback = callback)
80
+ fun change (callback : (String ) -> Unit ) = event(" change" , callback = callback)
56
81
fun focus (callback : (String ) -> Unit ) = event(" focus" , callback = callback)
57
82
fun focusin (callback : (String ) -> Unit ) = event(" focusin" , callback = callback)
58
83
fun focusout (callback : (String ) -> Unit ) = event(" focusout" , callback = callback)
59
- fun blur (callback : (String ) -> Unit ) = event(" blur" , callback = callback)
60
- // TODO: Add the rest http://www.w3schools.com/jsref/dom_obj_event.asp
84
+ fun input (callback : (String ) -> Unit ) = event(" input" , callback = callback)
85
+ fun invalid (callback : (String ) -> Unit ) = event(" invalid" , callback = callback)
86
+ fun reset (callback : (String ) -> Unit ) = event(" reset" , callback = callback)
87
+ fun search (callback : (String ) -> Unit ) = event(" search" , callback = callback)
88
+ fun select (callback : (String ) -> Unit ) = event(" select" , callback = callback)
89
+ fun submit (callback : (String ) -> Unit ) = event(" submit" , callback = callback)
90
+
91
+ // Drag Events TODO: define eventtype
92
+ fun drag (callback : (String ) -> Unit ) = event(" drag" , callback = callback)
93
+ fun dragend (callback : (String ) -> Unit ) = event(" dragend" , callback = callback)
94
+ fun dragenter (callback : (String ) -> Unit ) = event(" dragenter" , callback = callback)
95
+ fun dragleave (callback : (String ) -> Unit ) = event(" dragleave" , callback = callback)
96
+ fun dragover (callback : (String ) -> Unit ) = event(" dragover" , callback = callback)
97
+ fun dragstart (callback : (String ) -> Unit ) = event(" dragstart" , callback = callback)
98
+ fun drop (callback : (String ) -> Unit ) = event(" drop" , callback = callback)
99
+
100
+ // Clipboard Events TODO: define eventtype
101
+ fun copy (callback : (String ) -> Unit ) = event(" copy" , callback = callback)
102
+ fun cut (callback : (String ) -> Unit ) = event(" cut" , callback = callback)
103
+ fun paste (callback : (String ) -> Unit ) = event(" paste" , callback = callback)
104
+
105
+ // Print Events TODO: define eventtype
106
+ fun afterprint (callback : (String ) -> Unit ) = event(" afterprint" , callback = callback)
107
+ fun beforeprint (callback : (String ) -> Unit ) = event(" beforeprint" , callback = callback)
108
+
109
+ // Media Events TODO: define eventtype
110
+ /*
111
+ /** The event occurs when the loading of a media is aborted **/
112
+ fun abort(callback: (String) -> Unit) = event("abort", callback = callback)
113
+ /** The event occurs when the browser can start playing the media (when it has buffered enough to begin) **/
114
+ fun canplay(callback: (String) -> Unit) = event("canplay", callback = callback)
115
+ /** The event occurs when the browser can play through the media without stopping for buffering **/
116
+ fun canplaythrough(callback: (String) -> Unit) = event("canplaythrough", callback = callback)
117
+ /** The event occurs when the duration of the media is changed **/
118
+ fun durationchange(callback: (String) -> Unit) = event("durationchange", callback = callback)
119
+ /** The event occurs when something bad happens and the media file is suddenly unavailable (like unexpectedly disconnects) **/
120
+ fun emptied(callback: (String) -> Unit) = event("emptied", callback = callback)
121
+ /** The event occurs when the media has reach the end (useful for messages like "thanks for listening") **/
122
+ fun ended(callback: (String) -> Unit) = event("ended", callback = callback)
123
+ /** The event occurs when an error occurred during the loading of a media file **/
124
+ fun error(callback: (String) -> Unit) = event("error", callback = callback)
125
+ /** The event occurs when media data is loaded **/
126
+ fun loadeddata(callback: (String) -> Unit) = event("loadeddata", callback = callback)
127
+ /** The event occurs when meta data (like dimensions and duration) are loaded **/
128
+ fun loadedmetadata(callback: (String) -> Unit) = event("loadedmetadata", callback = callback)
129
+ /** The event occurs when the browser starts looking for the specified media **/
130
+ fun loadstart(callback: (String) -> Unit) = event("loadstart", callback = callback)
131
+ /** The event occurs when the media is paused either by the user or programmatically **/
132
+ fun pause(callback: (String) -> Unit) = event("pause", callback = callback)
133
+ /** The event occurs when the media has been started or is no longer paused **/
134
+ fun play(callback: (String) -> Unit) = event("play", callback = callback)
135
+ /** The event occurs when the media is playing after having been paused or stopped for buffering **/
136
+ fun playing(callback: (String) -> Unit) = event("playing", callback = callback)
137
+ /** The event occurs when the browser is in the process of getting the media data (downloading the media) **/
138
+ fun progress(callback: (String) -> Unit) = event("progress", callback = callback)
139
+ /** The event occurs when the playing speed of the media is changed **/
140
+ fun ratechange(callback: (String) -> Unit) = event("ratechange", callback = callback)
141
+ /** The event occurs when the user is finished moving/skipping to a new position in the media **/
142
+ fun seeked(callback: (String) -> Unit) = event("seeked", callback = callback)
143
+ /** The event occurs when the user starts moving/skipping to a new position in the media **/
144
+ fun seeking(callback: (String) -> Unit) = event("seeking", callback = callback)
145
+ /** The event occurs when the browser is trying to get media data, but data is not available **/
146
+ fun stalled(callback: (String) -> Unit) = event("stalled", callback = callback)
147
+ /** The event occurs when the browser is intentionally not getting media data **/
148
+ fun suspend(callback: (String) -> Unit) = event("suspend", callback = callback)
149
+ /** The event occurs when the playing position has changed (like when the user fast forwards to a different point in the media) **/
150
+ fun timeupdate(callback: (String) -> Unit) = event("timeupdate", callback = callback)
151
+ /** The event occurs when the volume of the media has changed (includes setting the volume to "mute") **/
152
+ fun volumechange(callback: (String) -> Unit) = event("volumechange", callback = callback)
153
+ /** The event occurs when the media has paused but is expected to resume (like when the media pauses to buffer more data) **/
154
+ fun waiting(callback: (String) -> Unit) = event("waiting", callback = callback)
155
+ */
156
+
157
+ // Animation Events
158
+ /* * The event occurs when a CSS animation has completed **/
159
+ fun animationend (callback : (AnimationEvent ) -> Unit ) = event(" animationend" , callback = callback)
160
+ /* * The event occurs when a CSS animation is repeated **/
161
+ fun animationiteration (callback : (AnimationEvent ) -> Unit ) = event(" animationiteration" , callback = callback)
162
+ /* * The event occurs when a CSS animation has started **/
163
+ fun animationstart (callback : (AnimationEvent ) -> Unit ) = event(" animationstart" , callback = callback)
164
+
165
+ // Transition Events
166
+ /* * The event occurs when a CSS transition has completed **/
167
+ fun transitionend (callback : (String ) -> Unit ) = event(" transitionend" , callback = callback)
168
+
169
+ /* * TODO: Add more from https://www.w3schools.com/jsref/dom_obj_event.asp
170
+ * Missing:
171
+ * * Servert-Sent Events
172
+ * * Misc Events
173
+ * * Touch Events
174
+ * *
175
+ */
176
+
177
+
178
+ companion object {
179
+ val memberPropertiesCache : ConcurrentHashMap <KClass <* >, Set <String >> = ConcurrentHashMap ()
180
+ inline fun <reified T :Any > memberProperties (clazz : KClass <T >) =
181
+ memberPropertiesCache.get(clazz) ? :
182
+ T ::class .memberProperties.map {it.name}.toSet().also { memberPropertiesCache.put(clazz,it) }
183
+ }
61
184
}
0 commit comments