rubyjs 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +128 -0
- data/Rakefile +9 -0
- data/bin/rubyjs +140 -0
- data/examples/ex1/Rakefile +7 -0
- data/examples/ex1/ex1.js +771 -0
- data/examples/ex1/ex1.rb +42 -0
- data/examples/ex1/index.html +7 -0
- data/examples/hw/Rakefile +9 -0
- data/examples/hw/hw.js +635 -0
- data/examples/hw/hw.rb +7 -0
- data/examples/hw/index.html +7 -0
- data/patches/parse_tree.rb.diff +34 -0
- data/rubyjs.gemspec +24 -0
- data/src/rubyjs.rb +4 -0
- data/src/rubyjs/code_generator.rb +474 -0
- data/src/rubyjs/compiler.rb +2007 -0
- data/src/rubyjs/debug_name_generator.rb +75 -0
- data/src/rubyjs/encoder.rb +171 -0
- data/src/rubyjs/eval_into.rb +59 -0
- data/src/rubyjs/lib/core.rb +1008 -0
- data/src/rubyjs/lib/json.rb +101 -0
- data/src/rubyjs/model.rb +287 -0
- data/src/rubyjs/name_generator.rb +71 -0
- data/src/rwt/AbsolutePanel.rb +161 -0
- data/src/rwt/DOM.Konqueror.rb +89 -0
- data/src/rwt/DOM.Opera.rb +65 -0
- data/src/rwt/DOM.rb +1044 -0
- data/src/rwt/Event.Opera.rb +35 -0
- data/src/rwt/Event.rb +429 -0
- data/src/rwt/HTTPRequest.IE6.rb +5 -0
- data/src/rwt/HTTPRequest.rb +74 -0
- data/src/rwt/Label.rb +164 -0
- data/src/rwt/Panel.rb +90 -0
- data/src/rwt/RootPanel.rb +16 -0
- data/src/rwt/UIObject.rb +495 -0
- data/src/rwt/Widget.rb +193 -0
- data/src/rwt/ported-from/AbsolutePanel.java +158 -0
- data/src/rwt/ported-from/DOM.java +571 -0
- data/src/rwt/ported-from/DOMImpl.java +426 -0
- data/src/rwt/ported-from/DOMImplOpera.java +82 -0
- data/src/rwt/ported-from/DOMImplStandard.java +234 -0
- data/src/rwt/ported-from/HTTPRequest.java +81 -0
- data/src/rwt/ported-from/HTTPRequestImpl.java +103 -0
- data/src/rwt/ported-from/Label.java +163 -0
- data/src/rwt/ported-from/Panel.java +99 -0
- data/src/rwt/ported-from/UIObject.java +614 -0
- data/src/rwt/ported-from/Widget.java +221 -0
- data/test/benchmark/bm_call_conv1.js +16 -0
- data/test/benchmark/bm_call_conv2.js +14 -0
- data/test/benchmark/bm_var_acc1.js +13 -0
- data/test/benchmark/bm_var_acc2.js +11 -0
- data/test/benchmark/bm_vm1_block.js +15 -0
- data/test/benchmark/bm_vm1_block.rb +15 -0
- data/test/benchmark/bm_vm1_const.js +13 -0
- data/test/benchmark/bm_vm1_const.rb +13 -0
- data/test/benchmark/bm_vm1_ensure.js +17 -0
- data/test/benchmark/bm_vm1_ensure.rb +15 -0
- data/test/benchmark/common.js +4 -0
- data/test/benchmark/common.rb +5 -0
- data/test/benchmark/params.yaml +7 -0
- data/test/browser.test.html +4059 -0
- data/test/browser.test.js +3225 -0
- data/test/common.Browser.rb +13 -0
- data/test/common.rb +8 -0
- data/test/gen_browser_test_suite.rb +129 -0
- data/test/gen_test_suite.rb +41 -0
- data/test/run_benchs.rb +58 -0
- data/test/run_tests.rb +22 -0
- data/test/test_args.rb +24 -0
- data/test/test_array.rb +26 -0
- data/test/test_case.rb +35 -0
- data/test/test_class.rb +55 -0
- data/test/test_eql.rb +9 -0
- data/test/test_exception.rb +61 -0
- data/test/test_expr.rb +12 -0
- data/test/test_hash.rb +29 -0
- data/test/test_if.rb +28 -0
- data/test/test_inspect.rb +10 -0
- data/test/test_lebewesen.rb +39 -0
- data/test/test_massign.rb +66 -0
- data/test/test_new.rb +12 -0
- data/test/test_range.rb +53 -0
- data/test/test_regexp.rb +22 -0
- data/test/test_send.rb +65 -0
- data/test/test_simple_output.rb +5 -0
- data/test/test_splat.rb +21 -0
- data/test/test_string.rb +51 -0
- data/test/test_yield.rb +152 -0
- data/utils/js/Makefile +9 -0
- data/utils/js/RunScript.class +0 -0
- data/utils/js/RunScript.java +73 -0
- data/utils/js/js.jar +0 -0
- data/utils/js/run.sh +3 -0
- data/utils/jsc/Makefile +7 -0
- data/utils/jsc/README +3 -0
- data/utils/jsc/RunScript.c +93 -0
- data/utils/jsc/run.sh +15 -0
- data/utils/yuicompressor/README +1 -0
- data/utils/yuicompressor/yuicompressor-2.2.5.jar +0 -0
- data/vendor/ParseTree-1.7.1-patched/History.txt +217 -0
- data/vendor/ParseTree-1.7.1-patched/Manifest.txt +22 -0
- data/vendor/ParseTree-1.7.1-patched/README.txt +110 -0
- data/vendor/ParseTree-1.7.1-patched/Rakefile +41 -0
- data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_abc +89 -0
- data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_audit +28 -0
- data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_deps +62 -0
- data/vendor/ParseTree-1.7.1-patched/bin/parse_tree_show +49 -0
- data/vendor/ParseTree-1.7.1-patched/demo/printer.rb +20 -0
- data/vendor/ParseTree-1.7.1-patched/lib/composite_sexp_processor.rb +49 -0
- data/vendor/ParseTree-1.7.1-patched/lib/parse_tree.rb +1013 -0
- data/vendor/ParseTree-1.7.1-patched/lib/sexp.rb +235 -0
- data/vendor/ParseTree-1.7.1-patched/lib/sexp_processor.rb +330 -0
- data/vendor/ParseTree-1.7.1-patched/lib/unique.rb +15 -0
- data/vendor/ParseTree-1.7.1-patched/test/pt_testcase.rb +1221 -0
- data/vendor/ParseTree-1.7.1-patched/test/something.rb +53 -0
- data/vendor/ParseTree-1.7.1-patched/test/test_all.rb +13 -0
- data/vendor/ParseTree-1.7.1-patched/test/test_composite_sexp_processor.rb +69 -0
- data/vendor/ParseTree-1.7.1-patched/test/test_parse_tree.rb +216 -0
- data/vendor/ParseTree-1.7.1-patched/test/test_sexp.rb +291 -0
- data/vendor/ParseTree-1.7.1-patched/test/test_sexp_processor.rb +244 -0
- data/vendor/ParseTree-1.7.1-patched/validate.sh +31 -0
- data/vendor/ParseTree-1.7.1/History.txt +217 -0
- data/vendor/ParseTree-1.7.1/Manifest.txt +22 -0
- data/vendor/ParseTree-1.7.1/README.txt +110 -0
- data/vendor/ParseTree-1.7.1/Rakefile +41 -0
- data/vendor/ParseTree-1.7.1/bin/parse_tree_abc +89 -0
- data/vendor/ParseTree-1.7.1/bin/parse_tree_audit +28 -0
- data/vendor/ParseTree-1.7.1/bin/parse_tree_deps +62 -0
- data/vendor/ParseTree-1.7.1/bin/parse_tree_show +49 -0
- data/vendor/ParseTree-1.7.1/demo/printer.rb +20 -0
- data/vendor/ParseTree-1.7.1/lib/composite_sexp_processor.rb +49 -0
- data/vendor/ParseTree-1.7.1/lib/parse_tree.rb +1004 -0
- data/vendor/ParseTree-1.7.1/lib/sexp.rb +235 -0
- data/vendor/ParseTree-1.7.1/lib/sexp_processor.rb +330 -0
- data/vendor/ParseTree-1.7.1/lib/unique.rb +15 -0
- data/vendor/ParseTree-1.7.1/test/pt_testcase.rb +1221 -0
- data/vendor/ParseTree-1.7.1/test/something.rb +53 -0
- data/vendor/ParseTree-1.7.1/test/test_all.rb +13 -0
- data/vendor/ParseTree-1.7.1/test/test_composite_sexp_processor.rb +69 -0
- data/vendor/ParseTree-1.7.1/test/test_parse_tree.rb +216 -0
- data/vendor/ParseTree-1.7.1/test/test_sexp.rb +291 -0
- data/vendor/ParseTree-1.7.1/test/test_sexp_processor.rb +244 -0
- data/vendor/ParseTree-1.7.1/validate.sh +31 -0
- metadata +230 -0
data/src/rwt/Widget.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2007 by Michael Neumann (mneumann@ntecs.de)
|
3
|
+
#
|
4
|
+
# Copyright 2007 Google Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
7
|
+
# use this file except in compliance with the License. You may obtain a copy of
|
8
|
+
# the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15
|
+
# License for the specific language governing permissions and limitations under
|
16
|
+
# the License.
|
17
|
+
#++
|
18
|
+
|
19
|
+
#
|
20
|
+
# The base class for the majority of user-interface objects. Widget adds
|
21
|
+
# support for receiving events from the browser and being added directly to
|
22
|
+
# panels (class +Panel+).
|
23
|
+
#
|
24
|
+
class Widget < UIObject
|
25
|
+
|
26
|
+
#
|
27
|
+
# Gets this widget's parent panel.
|
28
|
+
#
|
29
|
+
# return:: the widget's parent panel
|
30
|
+
#
|
31
|
+
def getParent
|
32
|
+
@parent
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Sets this widget's parent. This method should only be called by
|
37
|
+
# +Panel+ and +Composite+.
|
38
|
+
#
|
39
|
+
# parent:: the widget's new parent
|
40
|
+
#
|
41
|
+
def setParent(parent)
|
42
|
+
oldParent = @parent
|
43
|
+
@parent = parent
|
44
|
+
|
45
|
+
if parent.nil?
|
46
|
+
# Remove from parent
|
47
|
+
onDetach() if oldParent and oldParent.isAttached
|
48
|
+
elsif parent.isAttached
|
49
|
+
onAttach()
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Determines whether this widget is currently attached to the browser's
|
55
|
+
# document (i.e., there is an unbroken chain of widgets between this widget
|
56
|
+
# and the underlying browser document).
|
57
|
+
#
|
58
|
+
# return:: +true+ if the widget is attached
|
59
|
+
#
|
60
|
+
def isAttached
|
61
|
+
@attached
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Sets this object's browser element. Widget subclasses must call this method
|
66
|
+
# before attempting to call any other methods.
|
67
|
+
#
|
68
|
+
# If a browser element has already been attached, then it is replaced with
|
69
|
+
# the new element. The old event listeners are removed from the old browser
|
70
|
+
# element, and the event listeners are set up on the new browser element.
|
71
|
+
#
|
72
|
+
# elem:: the object's new element
|
73
|
+
#
|
74
|
+
def setElement(elem)
|
75
|
+
if @attached
|
76
|
+
# Remove old event listener to avoid leaking. onDetach will not do this
|
77
|
+
# for us, because it is only called when the widget itself is detached from
|
78
|
+
# the document.
|
79
|
+
DOM.removeEventListener(getElement())
|
80
|
+
end
|
81
|
+
|
82
|
+
super(elem)
|
83
|
+
|
84
|
+
if @attached
|
85
|
+
# Hook the event listener back up on the new element. onAttach will not
|
86
|
+
# do this for us, because it is only called when the widget itself is
|
87
|
+
# attached to the document.
|
88
|
+
DOM.setEventListener(elem, self)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Removes this widget from its parent widget. If it has no parent, this
|
94
|
+
# method does nothing.
|
95
|
+
#
|
96
|
+
def removeFromParent
|
97
|
+
@parent.remove(self) if @parent
|
98
|
+
end
|
99
|
+
|
100
|
+
#-------------------------------------------------------------------
|
101
|
+
# Event handlers
|
102
|
+
#-------------------------------------------------------------------
|
103
|
+
|
104
|
+
def onBrowserEvent(event)
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# This method is called when a widget is attached to the browser's document.
|
109
|
+
# To receive notification after a Widget has been added to the
|
110
|
+
# document, override the +onLoad+ method.
|
111
|
+
#
|
112
|
+
# Subclasses that override this method must call <tt>super()</tt> to ensure
|
113
|
+
# that the Widget has been attached to the underlying Element.
|
114
|
+
#
|
115
|
+
def onAttach
|
116
|
+
raise "already attached" if @attached
|
117
|
+
|
118
|
+
@attached = true
|
119
|
+
|
120
|
+
# Set the main element's event listener. This should only be set
|
121
|
+
# while the widget is attached, because it creates a circular
|
122
|
+
# reference between JavaScript and the DOM.
|
123
|
+
DOM.setEventListener(getElement(), self)
|
124
|
+
|
125
|
+
# Now that the widget is attached, call onLoad().
|
126
|
+
onLoad()
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# This method is called when a widget is detached from the browser's
|
131
|
+
# document. To receive notification before a Widget is removed from the
|
132
|
+
# document, override the +onUnload+ method.
|
133
|
+
#
|
134
|
+
# Subclasses that override this method must call <tt>super()</tt>
|
135
|
+
# to ensure that the Widget has been detached from the underlying Element.
|
136
|
+
# Failure to do so will result in application memory leaks due to circular
|
137
|
+
# references between DOM Elements and JavaScript objects.
|
138
|
+
#
|
139
|
+
def onDetach
|
140
|
+
raise "cannot detached unattached widget" unless @attached
|
141
|
+
|
142
|
+
# Give the user a chance to clean up, but don't trust the code to not throw
|
143
|
+
# TODO: begin onUnload ensure xxx end
|
144
|
+
onUnload()
|
145
|
+
@attached = false
|
146
|
+
|
147
|
+
# Clear out the element's event listener (breaking the circular
|
148
|
+
# reference between it and the widget).
|
149
|
+
DOM.removeEventListener(getElement())
|
150
|
+
end
|
151
|
+
|
152
|
+
#
|
153
|
+
# This method is called immediately after a widget becomes attached to the
|
154
|
+
# browser's document.
|
155
|
+
#
|
156
|
+
def onLoad
|
157
|
+
end
|
158
|
+
|
159
|
+
#
|
160
|
+
# This method is called immediately before a widget will be detached from the
|
161
|
+
# browser's document.
|
162
|
+
#
|
163
|
+
def onUnload
|
164
|
+
end
|
165
|
+
|
166
|
+
#-------------------------------------------------------------------
|
167
|
+
# Layout data
|
168
|
+
#-------------------------------------------------------------------
|
169
|
+
|
170
|
+
#
|
171
|
+
# Gets the panel-defined layout data associated with this widget.
|
172
|
+
#
|
173
|
+
# return:: the widget's layout data
|
174
|
+
#
|
175
|
+
# See #setLayoutData.
|
176
|
+
#
|
177
|
+
def getLayoutData
|
178
|
+
@layoutData
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
# Sets the panel-defined layout data associated with this widget. Only the
|
183
|
+
# panel that currently contains a widget should ever set this value. It
|
184
|
+
# serves as a place to store layout bookkeeping data associated with a
|
185
|
+
# widget.
|
186
|
+
#
|
187
|
+
# layoutData:: the widget's layout data
|
188
|
+
#
|
189
|
+
def setLayoutData(layoutData)
|
190
|
+
@layoutData = layoutData
|
191
|
+
end
|
192
|
+
|
193
|
+
end # class Widget
|
@@ -0,0 +1,158 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2007 Google Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
5
|
+
* use this file except in compliance with the License. You may obtain a copy of
|
6
|
+
* the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
* License for the specific language governing permissions and limitations under
|
14
|
+
* the License.
|
15
|
+
*/
|
16
|
+
package com.google.gwt.user.client.ui;
|
17
|
+
|
18
|
+
import com.google.gwt.user.client.DOM;
|
19
|
+
import com.google.gwt.user.client.Element;
|
20
|
+
|
21
|
+
/**
|
22
|
+
* An absolute panel positions all of its children absolutely, allowing them to
|
23
|
+
* overlap.
|
24
|
+
*
|
25
|
+
* <p>
|
26
|
+
* Note that this panel will not automatically resize itself to allow enough
|
27
|
+
* room for its absolutely-positioned children. It must be explicitly sized in
|
28
|
+
* order to make room for them.
|
29
|
+
* </p>
|
30
|
+
*
|
31
|
+
* <p>
|
32
|
+
* Once a widget has been added to an absolute panel, the panel effectively
|
33
|
+
* "owns" the positioning of the widget. Any existing positioning attributes
|
34
|
+
* on the widget may be modified by the panel.
|
35
|
+
* </p>
|
36
|
+
*/
|
37
|
+
public class AbsolutePanel extends ComplexPanel {
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Changes a DOM element's positioning to static.
|
41
|
+
*
|
42
|
+
* @param elem the DOM element
|
43
|
+
*/
|
44
|
+
private static void changeToStaticPositioning(Element elem) {
|
45
|
+
DOM.setStyleAttribute(elem, "left", "");
|
46
|
+
DOM.setStyleAttribute(elem, "top", "");
|
47
|
+
DOM.setStyleAttribute(elem, "position", "static");
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Creates an empty absolute panel.
|
52
|
+
*/
|
53
|
+
public AbsolutePanel() {
|
54
|
+
setElement(DOM.createDiv());
|
55
|
+
|
56
|
+
// Setting the panel's position style to 'relative' causes it to be treated
|
57
|
+
// as a new positioning context for its children.
|
58
|
+
DOM.setStyleAttribute(getElement(), "position", "relative");
|
59
|
+
DOM.setStyleAttribute(getElement(), "overflow", "hidden");
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Adds a child widget to this panel.
|
64
|
+
*
|
65
|
+
* @param w the child widget to be added
|
66
|
+
*/
|
67
|
+
public void add(Widget w) {
|
68
|
+
super.add(w, getElement());
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Adds a widget to the panel at the specified position. Setting a position
|
73
|
+
* of <code>(-1, -1)</code> will cause the child widget to be positioned
|
74
|
+
* statically.
|
75
|
+
*
|
76
|
+
* @param w the widget to be added
|
77
|
+
* @param left the widget's left position
|
78
|
+
* @param top the widget's top position
|
79
|
+
*/
|
80
|
+
public void add(Widget w, int left, int top) {
|
81
|
+
// In order to avoid the potential for a flicker effect, it is necessary
|
82
|
+
// to set the position of the widget before adding it to the AbsolutePanel.
|
83
|
+
// The Widget should be removed from its parent before any positional
|
84
|
+
// changes are made to prevent flickering.
|
85
|
+
w.removeFromParent();
|
86
|
+
setWidgetPositionImpl(w, left, top);
|
87
|
+
add(w);
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Gets the position of the left outer border edge of the widget relative to
|
92
|
+
* the left outer border edge of the panel.
|
93
|
+
*
|
94
|
+
* @param w the widget whose position is to be retrieved
|
95
|
+
* @return the widget's left position
|
96
|
+
*/
|
97
|
+
public int getWidgetLeft(Widget w) {
|
98
|
+
checkWidgetParent(w);
|
99
|
+
return DOM.getAbsoluteLeft(w.getElement()) - DOM.getAbsoluteLeft(getElement());
|
100
|
+
}
|
101
|
+
|
102
|
+
/**
|
103
|
+
* Gets the position of the top outer border edge of the widget relative to
|
104
|
+
* the top outer border edge of the panel.
|
105
|
+
*
|
106
|
+
* @param w the widget whose position is to be retrieved
|
107
|
+
* @return the widget's top position
|
108
|
+
*/
|
109
|
+
public int getWidgetTop(Widget w) {
|
110
|
+
checkWidgetParent(w);
|
111
|
+
return DOM.getAbsoluteTop(w.getElement()) - DOM.getAbsoluteTop(getElement());
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Sets the position of the specified child widget. Setting a position of
|
116
|
+
* <code>(-1, -1)</code> will cause the child widget to be positioned
|
117
|
+
* statically.
|
118
|
+
*
|
119
|
+
* @param w the child widget to be positioned
|
120
|
+
* @param left the widget's left position
|
121
|
+
* @param top the widget's top position
|
122
|
+
*/
|
123
|
+
public void setWidgetPosition(Widget w, int left, int top) {
|
124
|
+
checkWidgetParent(w);
|
125
|
+
setWidgetPositionImpl(w, left, top);
|
126
|
+
}
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Calls the superclass' <code>disown(Widget)</code> method, and sets the
|
130
|
+
* the positioning of the widget to static. This is done so that any
|
131
|
+
* positioning changes to the widget that were done by the panel are undone
|
132
|
+
* when the widget is disowned from the panel.
|
133
|
+
*
|
134
|
+
* @param w the widget to be disowned
|
135
|
+
*/
|
136
|
+
protected void disown(Widget w) {
|
137
|
+
super.disown(w);
|
138
|
+
changeToStaticPositioning(w.getElement());
|
139
|
+
}
|
140
|
+
|
141
|
+
private void checkWidgetParent(Widget w) {
|
142
|
+
if (w.getParent() != this) {
|
143
|
+
throw new IllegalArgumentException(
|
144
|
+
"Widget must be a child of this panel.");
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
private void setWidgetPositionImpl(Widget w, int left, int top) {
|
149
|
+
Element h = w.getElement();
|
150
|
+
if ((left == -1) && (top == -1)) {
|
151
|
+
changeToStaticPositioning(h);
|
152
|
+
} else {
|
153
|
+
DOM.setStyleAttribute(h, "position", "absolute");
|
154
|
+
DOM.setStyleAttribute(h, "left", left + "px");
|
155
|
+
DOM.setStyleAttribute(h, "top", top + "px");
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
@@ -0,0 +1,571 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2007 Google Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
5
|
+
* use this file except in compliance with the License. You may obtain a copy of
|
6
|
+
* the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
* License for the specific language governing permissions and limitations under
|
14
|
+
* the License.
|
15
|
+
*/
|
16
|
+
package com.google.gwt.user.client;
|
17
|
+
|
18
|
+
import com.google.gwt.core.client.GWT;
|
19
|
+
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
|
20
|
+
import com.google.gwt.user.client.impl.DOMImpl;
|
21
|
+
|
22
|
+
import java.util.ArrayList;
|
23
|
+
|
24
|
+
/**
|
25
|
+
* This class provides a set of static methods that allow you to manipulate the
|
26
|
+
* browser's Document Object Model (DOM). It contains methods for manipulating
|
27
|
+
* both {@link com.google.gwt.user.client.Element elements} and
|
28
|
+
* {@link com.google.gwt.user.client.Event events}.
|
29
|
+
*/
|
30
|
+
public class DOM {
|
31
|
+
|
32
|
+
// The current event being fired
|
33
|
+
private static Event currentEvent = null;
|
34
|
+
private static DOMImpl impl;
|
35
|
+
private static Element sCaptureElem;
|
36
|
+
|
37
|
+
//<BrowserEventPreview>
|
38
|
+
private static ArrayList sEventPreviewStack = new ArrayList();
|
39
|
+
|
40
|
+
static {
|
41
|
+
impl = (DOMImpl) GWT.create(DOMImpl.class);
|
42
|
+
impl.init();
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Adds an event preview to the preview stack. As long as this preview remains
|
47
|
+
* on the top of the stack, it will receive all events before they are fired
|
48
|
+
* to their listeners. Note that the event preview will receive <u>all </u>
|
49
|
+
* events, including those received due to bubbling, whereas normal event
|
50
|
+
* handlers only receive explicitly sunk events.
|
51
|
+
*
|
52
|
+
* @param preview the event preview to be added to the stack.
|
53
|
+
*/
|
54
|
+
public static void addEventPreview(EventPreview preview) {
|
55
|
+
// Add the event preview to the stack. It will automatically
|
56
|
+
// begin receiving events.
|
57
|
+
sEventPreviewStack.add(preview);
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Cancels bubbling for the given event. This will stop the event from being
|
62
|
+
* propagated to parent elements.
|
63
|
+
*
|
64
|
+
* @param evt the event on which to cancel bubbling
|
65
|
+
* @param cancel <code>true</code> to cancel bubbling
|
66
|
+
*/
|
67
|
+
public static void eventCancelBubble(Event evt, boolean cancel) {
|
68
|
+
impl.eventCancelBubble(evt, cancel);
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Gets whether the ALT key was depressed when the given event occurred.
|
73
|
+
*
|
74
|
+
* @param evt the event to be tested
|
75
|
+
* @return <code>true</code> if ALT was depressed when the event occurred
|
76
|
+
*/
|
77
|
+
public static boolean eventGetAltKey(Event evt) {
|
78
|
+
return impl.eventGetAltKey(evt);
|
79
|
+
}
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Gets the mouse buttons that were depressed when the given event occurred.
|
83
|
+
*
|
84
|
+
* @param evt the event to be tested
|
85
|
+
* @return a bit-field, defined by {@link Event#BUTTON_LEFT},
|
86
|
+
* {@link Event#BUTTON_MIDDLE}, and {@link Event#BUTTON_RIGHT}
|
87
|
+
*/
|
88
|
+
public static int eventGetButton(Event evt) {
|
89
|
+
return impl.eventGetButton(evt);
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Gets the mouse x-position within the browser window's client area.
|
94
|
+
*
|
95
|
+
* @param evt the event to be tested
|
96
|
+
* @return the mouse x-position
|
97
|
+
*/
|
98
|
+
public static int eventGetClientX(Event evt) {
|
99
|
+
return impl.eventGetClientX(evt);
|
100
|
+
}
|
101
|
+
|
102
|
+
/**
|
103
|
+
* Gets the mouse y-position within the browser window's client area.
|
104
|
+
*
|
105
|
+
* @param evt the event to be tested
|
106
|
+
* @return the mouse y-position
|
107
|
+
*/
|
108
|
+
public static int eventGetClientY(Event evt) {
|
109
|
+
return impl.eventGetClientY(evt);
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Gets whether the CTRL key was depressed when the given event occurred.
|
114
|
+
*
|
115
|
+
* @param evt the event to be tested
|
116
|
+
* @return <code>true</code> if CTRL was depressed when the event occurred
|
117
|
+
*/
|
118
|
+
public static boolean eventGetCtrlKey(Event evt) {
|
119
|
+
return impl.eventGetCtrlKey(evt);
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* Gets the current event that is being fired. The current event
|
124
|
+
* is only available within the lifetime of the onBrowserEvent function.
|
125
|
+
* Once the onBrowserEvent method returns, the current event is reset
|
126
|
+
* to null.
|
127
|
+
*
|
128
|
+
* @return the current event
|
129
|
+
*/
|
130
|
+
public static Event eventGetCurrentEvent() {
|
131
|
+
return currentEvent;
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Gets the current target element of the given event. This is the element
|
136
|
+
* whose listener fired last, not the element which fired the event
|
137
|
+
* initially.
|
138
|
+
*
|
139
|
+
* @param evt the event
|
140
|
+
* @return the event's current target element
|
141
|
+
* @see DOM#eventGetTarget(Event)
|
142
|
+
*/
|
143
|
+
public static Element eventGetCurrentTarget(Event evt) {
|
144
|
+
return impl.eventGetCurrentTarget(evt);
|
145
|
+
}
|
146
|
+
|
147
|
+
/**
|
148
|
+
* Gets the element from which the mouse pointer was moved (only valid for
|
149
|
+
* {@link Event#ONMOUSEOVER}).
|
150
|
+
*
|
151
|
+
* @param evt the event to be tested
|
152
|
+
* @return the element from which the mouse pointer was moved
|
153
|
+
*/
|
154
|
+
public static Element eventGetFromElement(Event evt) {
|
155
|
+
return impl.eventGetFromElement(evt);
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
* Gets the key code associated with this event.
|
160
|
+
*
|
161
|
+
* <p>
|
162
|
+
* For {@link Event#ONKEYPRESS}, this method returns the Unicode value of the
|
163
|
+
* character generated. For {@link Event#ONKEYDOWN} and {@link Event#ONKEYUP},
|
164
|
+
* it returns the code associated with the physical key.
|
165
|
+
* </p>
|
166
|
+
*
|
167
|
+
* @param evt the event to be tested
|
168
|
+
* @return the Unicode character or key code.
|
169
|
+
* @see com.google.gwt.user.client.ui.KeyboardListener
|
170
|
+
*/
|
171
|
+
public static int eventGetKeyCode(Event evt) {
|
172
|
+
return impl.eventGetKeyCode(evt);
|
173
|
+
}
|
174
|
+
|
175
|
+
/**
|
176
|
+
* Gets whether the META key was depressed when the given event occurred.
|
177
|
+
*
|
178
|
+
* @param evt the event to be tested
|
179
|
+
* @return <code>true</code> if META was depressed when the event occurred
|
180
|
+
*/
|
181
|
+
public static boolean eventGetMetaKey(Event evt) {
|
182
|
+
return impl.eventGetMetaKey(evt);
|
183
|
+
}
|
184
|
+
|
185
|
+
/**
|
186
|
+
* Gets the velocity of the mouse wheel associated with the event along the
|
187
|
+
* Y axis.
|
188
|
+
* <p>
|
189
|
+
* The velocity of the event is an artifical measurement for relative
|
190
|
+
* comparisons of wheel activity. It is affected by some non-browser
|
191
|
+
* factors, including choice of input hardware and mouse acceleration
|
192
|
+
* settings. The sign of the velocity measurement agrees with the screen
|
193
|
+
* coordinate system; negative values are towards the origin and positive
|
194
|
+
* values are away from the origin. Standard scrolling speed is approximately
|
195
|
+
* ten units per event.
|
196
|
+
* </p>
|
197
|
+
*
|
198
|
+
* @param evt the event to be examined.
|
199
|
+
* @return The velocity of the mouse wheel.
|
200
|
+
*/
|
201
|
+
public static int eventGetMouseWheelVelocityY(Event evt) {
|
202
|
+
return impl.eventGetMouseWheelVelocityY(evt);
|
203
|
+
}
|
204
|
+
|
205
|
+
/**
|
206
|
+
* Gets the key-repeat state of this event.
|
207
|
+
*
|
208
|
+
* @param evt the event to be tested
|
209
|
+
* @return <code>true</code> if this key event was an auto-repeat
|
210
|
+
*/
|
211
|
+
public static boolean eventGetRepeat(Event evt) {
|
212
|
+
return impl.eventGetRepeat(evt);
|
213
|
+
}
|
214
|
+
|
215
|
+
/**
|
216
|
+
* Gets the mouse x-position on the user's display.
|
217
|
+
*
|
218
|
+
* @param evt the event to be tested
|
219
|
+
* @return the mouse x-position
|
220
|
+
*/
|
221
|
+
public static int eventGetScreenX(Event evt) {
|
222
|
+
return impl.eventGetScreenX(evt);
|
223
|
+
}
|
224
|
+
|
225
|
+
/**
|
226
|
+
* Gets the mouse y-position on the user's display.
|
227
|
+
*
|
228
|
+
* @param evt the event to be tested
|
229
|
+
* @return the mouse y-position
|
230
|
+
*/
|
231
|
+
public static int eventGetScreenY(Event evt) {
|
232
|
+
return impl.eventGetScreenY(evt);
|
233
|
+
}
|
234
|
+
|
235
|
+
/**
|
236
|
+
* Gets whether the shift key was depressed when the given event occurred.
|
237
|
+
*
|
238
|
+
* @param evt the event to be tested
|
239
|
+
* @return <code>true</code> if shift was depressed when the event occurred
|
240
|
+
*/
|
241
|
+
public static boolean eventGetShiftKey(Event evt) {
|
242
|
+
return impl.eventGetShiftKey(evt);
|
243
|
+
}
|
244
|
+
|
245
|
+
/**
|
246
|
+
* Returns the element that was the actual target of the given event.
|
247
|
+
*
|
248
|
+
* @param evt the event to be tested
|
249
|
+
* @return the target element
|
250
|
+
*/
|
251
|
+
public static Element eventGetTarget(Event evt) {
|
252
|
+
return impl.eventGetTarget(evt);
|
253
|
+
}
|
254
|
+
|
255
|
+
/**
|
256
|
+
* Gets the element to which the mouse pointer was moved (only valid for
|
257
|
+
* {@link Event#ONMOUSEOUT}).
|
258
|
+
*
|
259
|
+
* @param evt the event to be tested
|
260
|
+
* @return the element to which the mouse pointer was moved
|
261
|
+
*/
|
262
|
+
public static Element eventGetToElement(Event evt) {
|
263
|
+
return impl.eventGetToElement(evt);
|
264
|
+
}
|
265
|
+
|
266
|
+
/**
|
267
|
+
* Gets the enumerated type of this event (as defined in {@link Event}).
|
268
|
+
*
|
269
|
+
* @param evt the event to be tested
|
270
|
+
* @return the event's enumerated type
|
271
|
+
*/
|
272
|
+
public static int eventGetType(Event evt) {
|
273
|
+
return impl.eventGetTypeInt(evt);
|
274
|
+
}
|
275
|
+
|
276
|
+
/**
|
277
|
+
* Gets the type of the given event as a string.
|
278
|
+
*
|
279
|
+
* @param evt the event to be tested
|
280
|
+
* @return the event's type name
|
281
|
+
*/
|
282
|
+
public static String eventGetTypeString(Event evt) {
|
283
|
+
return impl.eventGetType(evt);
|
284
|
+
}
|
285
|
+
|
286
|
+
/**
|
287
|
+
* Prevents the browser from taking its default action for the given event.
|
288
|
+
*
|
289
|
+
* @param evt the event whose default action is to be prevented
|
290
|
+
*/
|
291
|
+
public static void eventPreventDefault(Event evt) {
|
292
|
+
impl.eventPreventDefault(evt);
|
293
|
+
}
|
294
|
+
|
295
|
+
/**
|
296
|
+
* Sets the key code associated with the given keyboard event.
|
297
|
+
*
|
298
|
+
* @param evt the event whose key code is to be set
|
299
|
+
* @param key the new key code
|
300
|
+
*/
|
301
|
+
public static void eventSetKeyCode(Event evt, char key) {
|
302
|
+
impl.eventSetKeyCode(evt, key);
|
303
|
+
}
|
304
|
+
|
305
|
+
/**
|
306
|
+
* Returns a stringized version of the event. This string is for debugging
|
307
|
+
* purposes and will NOT be consistent on different browsers.
|
308
|
+
*
|
309
|
+
* @param evt the event to stringize
|
310
|
+
* @return a string form of the event
|
311
|
+
*/
|
312
|
+
public static String eventToString(Event evt) {
|
313
|
+
return impl.eventToString(evt);
|
314
|
+
}
|
315
|
+
|
316
|
+
/**
|
317
|
+
* Gets an integer attribute on a given element.
|
318
|
+
*
|
319
|
+
* @param elem the element whose attribute is to be retrieved
|
320
|
+
* @param attr the name of the attribute to be retrieved
|
321
|
+
* @return the attribute's value as an integer
|
322
|
+
* @deprecated Use the more appropriately named
|
323
|
+
* {@link #getElementPropertyInt(Element, String)} instead.
|
324
|
+
*/
|
325
|
+
public static int getIntAttribute(Element elem, String attr) {
|
326
|
+
return getElementPropertyInt(elem, attr);
|
327
|
+
}
|
328
|
+
|
329
|
+
/**
|
330
|
+
* Gets an integer attribute on a given element's style.
|
331
|
+
*
|
332
|
+
* @param elem the element whose style attribute is to be retrieved
|
333
|
+
* @param attr the name of the attribute to be retrieved
|
334
|
+
* @return the style attribute's value as an integer
|
335
|
+
*/
|
336
|
+
public static int getIntStyleAttribute(Element elem, String attr) {
|
337
|
+
return impl.getIntStyleAttribute(elem, attr);
|
338
|
+
}
|
339
|
+
|
340
|
+
/**
|
341
|
+
* Creates an <code><option></code> element and inserts it as a child
|
342
|
+
* of the specified <code><select></code> element. If the index is
|
343
|
+
* less than zero, or greater than or equal to the length of the list, then
|
344
|
+
* the option element will be appended to the end of the list.
|
345
|
+
*
|
346
|
+
* @param select the <code><select></code> element
|
347
|
+
* @param item the text of the new item; cannot be <code>null</code>
|
348
|
+
* @param value the <code>value</code> attribute for the new
|
349
|
+
* <code><option></code>; cannot be <code>null</code>
|
350
|
+
* @param index the index at which to insert the child
|
351
|
+
*/
|
352
|
+
public static void insertListItem(Element select, String item, String value,
|
353
|
+
int index) {
|
354
|
+
impl.insertListItem(select, item, value, index);
|
355
|
+
}
|
356
|
+
|
357
|
+
/**
|
358
|
+
* Releases mouse capture on the given element. Calling this method has no
|
359
|
+
* effect if the element does not currently have mouse capture.
|
360
|
+
*
|
361
|
+
* @param elem the element to release capture
|
362
|
+
* @see #setCapture(Element)
|
363
|
+
*/
|
364
|
+
public static void releaseCapture(Element elem) {
|
365
|
+
if ((sCaptureElem != null) && compare(elem, sCaptureElem)) {
|
366
|
+
sCaptureElem = null;
|
367
|
+
}
|
368
|
+
impl.releaseCapture(elem);
|
369
|
+
}
|
370
|
+
|
371
|
+
/**
|
372
|
+
* Removes an element from the preview stack. This element will no longer
|
373
|
+
* capture events, though any preview underneath it will begin to do so.
|
374
|
+
*
|
375
|
+
* @param preview the event preview to be removed from the stack
|
376
|
+
*/
|
377
|
+
public static void removeEventPreview(EventPreview preview) {
|
378
|
+
// Remove the event preview from the stack. If it was on top,
|
379
|
+
// any preview underneath it will automatically begin to
|
380
|
+
// receive events.
|
381
|
+
sEventPreviewStack.remove(preview);
|
382
|
+
}
|
383
|
+
|
384
|
+
/**
|
385
|
+
* Scrolls the given element into view.
|
386
|
+
*
|
387
|
+
* <p>
|
388
|
+
* This method crawls up the DOM hierarchy, adjusting the scrollLeft and
|
389
|
+
* scrollTop properties of each scrollable element to ensure that the
|
390
|
+
* specified element is completely in view. It adjusts each scroll position by
|
391
|
+
* the minimum amount necessary.
|
392
|
+
* </p>
|
393
|
+
*
|
394
|
+
* @param elem the element to be made visible
|
395
|
+
*/
|
396
|
+
public static void scrollIntoView(Element elem) {
|
397
|
+
impl.scrollIntoView(elem);
|
398
|
+
}
|
399
|
+
|
400
|
+
}
|
401
|
+
|
402
|
+
/**
|
403
|
+
* Sets mouse-capture on the given element. This element will directly receive
|
404
|
+
* all mouse events until {@link #releaseCapture(Element)} is called on it.
|
405
|
+
*
|
406
|
+
* @param elem the element on which to set mouse capture
|
407
|
+
*/
|
408
|
+
public static void setCapture(Element elem) {
|
409
|
+
sCaptureElem = elem;
|
410
|
+
impl.setCapture(elem);
|
411
|
+
}
|
412
|
+
|
413
|
+
|
414
|
+
|
415
|
+
/**
|
416
|
+
* Sets the src attribute of an img element. This method ensures that imgs
|
417
|
+
* only ever have their contents requested one single time from the server.
|
418
|
+
*
|
419
|
+
* @param img a non-null img whose src attribute will be set.
|
420
|
+
* @param src a non-null url for the img
|
421
|
+
*/
|
422
|
+
public static void setImgSrc(Element img, String src) {
|
423
|
+
impl.setImgSrc(img, src);
|
424
|
+
}
|
425
|
+
|
426
|
+
/**
|
427
|
+
* Sets the HTML contained within an element.
|
428
|
+
*
|
429
|
+
* @param elem the element whose inner HTML is to be set
|
430
|
+
* @param html the new html
|
431
|
+
*/
|
432
|
+
public static void setInnerHTML(Element elem, String html) {
|
433
|
+
impl.setInnerHTML(elem, html);
|
434
|
+
}
|
435
|
+
|
436
|
+
/**
|
437
|
+
* Sets the text contained within an element. If the element already has
|
438
|
+
* children, they will be destroyed.
|
439
|
+
*
|
440
|
+
* @param elem the element whose inner text is to be set
|
441
|
+
* @param text the new text
|
442
|
+
*/
|
443
|
+
public static void setInnerText(Element elem, String text) {
|
444
|
+
impl.setInnerText(elem, text);
|
445
|
+
}
|
446
|
+
|
447
|
+
/**
|
448
|
+
* Sets an integer attribute on the given element's style.
|
449
|
+
*
|
450
|
+
* @param elem the element whose style attribute is to be set
|
451
|
+
* @param attr the name of the style attribute to be set
|
452
|
+
* @param value the style attribute's new integer value
|
453
|
+
*/
|
454
|
+
public static void setIntStyleAttribute(Element elem, String attr,
|
455
|
+
int value) {
|
456
|
+
impl.setIntStyleAttribute(elem, attr, value);
|
457
|
+
}
|
458
|
+
|
459
|
+
/**
|
460
|
+
* Sets the option text of the given select object.
|
461
|
+
*
|
462
|
+
* @param select the select object whose option text is being set
|
463
|
+
* @param text the text to set
|
464
|
+
* @param index the index of the option whose text should be set
|
465
|
+
*/
|
466
|
+
public static void setOptionText(Element select, String text, int index) {
|
467
|
+
impl.setOptionText(select, text, index);
|
468
|
+
}
|
469
|
+
|
470
|
+
/**
|
471
|
+
* Returns a stringized version of the element. This string is for debugging
|
472
|
+
* purposes and will NOT be consistent on different browsers.
|
473
|
+
*
|
474
|
+
* @param elem the element to stringize
|
475
|
+
* @return a string form of the element
|
476
|
+
*/
|
477
|
+
public static String toString(Element elem) {
|
478
|
+
return impl.toString(elem);
|
479
|
+
}
|
480
|
+
|
481
|
+
/**
|
482
|
+
* Gets the height of the browser window's client area excluding the
|
483
|
+
* scroll bar.
|
484
|
+
*
|
485
|
+
* @return the window's client height
|
486
|
+
*/
|
487
|
+
public static int windowGetClientHeight() {
|
488
|
+
return impl.windowGetClientHeight();
|
489
|
+
}
|
490
|
+
|
491
|
+
/**
|
492
|
+
* Gets the width of the browser window's client area excluding the
|
493
|
+
* vertical scroll bar.
|
494
|
+
*
|
495
|
+
* @return the window's client width
|
496
|
+
*/
|
497
|
+
public static int windowGetClientWidth() {
|
498
|
+
return impl.windowGetClientWidth();
|
499
|
+
}
|
500
|
+
|
501
|
+
/**
|
502
|
+
* This method is called directly by native code when any event is fired.
|
503
|
+
*
|
504
|
+
* @param evt the handle to the event being fired.
|
505
|
+
* @param elem the handle to the element that received the event.
|
506
|
+
* @param listener the listener associated with the element that received the
|
507
|
+
* event.
|
508
|
+
*/
|
509
|
+
static void dispatchEvent(Event evt, Element elem, EventListener listener) {
|
510
|
+
UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler();
|
511
|
+
if (handler != null) {
|
512
|
+
dispatchEventAndCatch(evt, elem, listener, handler);
|
513
|
+
} else {
|
514
|
+
dispatchEventImpl(evt, elem, listener);
|
515
|
+
}
|
516
|
+
}
|
517
|
+
|
518
|
+
/**
|
519
|
+
* This method is called directly by native code when event preview is being
|
520
|
+
* used.
|
521
|
+
*
|
522
|
+
* @param evt a handle to the event being previewed
|
523
|
+
* @return <code>false</code> to cancel the event
|
524
|
+
*/
|
525
|
+
static boolean previewEvent(Event evt) {
|
526
|
+
// If event previews are present, redirect events to the topmost of them.
|
527
|
+
boolean ret = true;
|
528
|
+
if (sEventPreviewStack.size() > 0) {
|
529
|
+
EventPreview preview =
|
530
|
+
(EventPreview) sEventPreviewStack.get(sEventPreviewStack.size() - 1);
|
531
|
+
if (!(ret = preview.onEventPreview(evt))) {
|
532
|
+
// If the preview cancels the event, stop it from bubbling and
|
533
|
+
// performing its default action.
|
534
|
+
eventCancelBubble(evt, true);
|
535
|
+
eventPreventDefault(evt);
|
536
|
+
}
|
537
|
+
}
|
538
|
+
|
539
|
+
return ret;
|
540
|
+
}
|
541
|
+
|
542
|
+
private static void dispatchEventAndCatch(Event evt, Element elem,
|
543
|
+
EventListener listener, UncaughtExceptionHandler handler) {
|
544
|
+
try {
|
545
|
+
dispatchEventImpl(evt, elem, listener);
|
546
|
+
} catch (Throwable e) {
|
547
|
+
handler.onUncaughtException(e);
|
548
|
+
}
|
549
|
+
}
|
550
|
+
|
551
|
+
private static void dispatchEventImpl(Event evt, Element elem,
|
552
|
+
EventListener listener) {
|
553
|
+
// If this element has capture...
|
554
|
+
if (elem == sCaptureElem) {
|
555
|
+
// ... and it's losing capture, clear sCaptureElem.
|
556
|
+
if (eventGetType(evt) == Event.ONLOSECAPTURE) {
|
557
|
+
sCaptureElem = null;
|
558
|
+
}
|
559
|
+
}
|
560
|
+
|
561
|
+
// Preserve the current event in case we are in a reentrant event dispatch.
|
562
|
+
Event prevCurrentEvent = currentEvent;
|
563
|
+
currentEvent = evt;
|
564
|
+
try {
|
565
|
+
// Pass the event to the listener.
|
566
|
+
listener.onBrowserEvent(evt);
|
567
|
+
} finally {
|
568
|
+
currentEvent = prevCurrentEvent;
|
569
|
+
}
|
570
|
+
}
|
571
|
+
}
|