Adding NativeEvent to gwt 1.6
Desk review:jlabanca

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4515 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
index eeba505..4642cdd 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
@@ -25,13 +25,10 @@
 import com.google.gwt.user.client.ui.VerticalPanel;
 
 /**
- * Helper class to create visual tests.
- * 
- * @param <V> value type
- * @param <T> target type
+ * Simple logging class.
  */
 @SuppressWarnings("deprecation")
-public class SimpleLogger<V, T> extends Composite {
+public class SimpleLogger extends Composite {
 
   private VerticalPanel panel = new VerticalPanel();
 
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java
index e51c222..4a13b2f 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue1932.java
@@ -16,6 +16,7 @@
 package com.google.gwt.museum.client.defaultmuseum;
 
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.museum.client.common.AbstractIssue;
@@ -120,15 +121,15 @@
     Event.addNativePreviewHandler(new NativePreviewHandler() {
       public void onPreviewNativeEvent(NativePreviewEvent event) {
         // Ignore events outside of the sandbox
-        Event nativeEvent = event.getNativeEvent();
+        NativeEvent nativeEvent = event.getNativeEvent();
         Element target = nativeEvent.getTarget();
         if (!sandbox.getElement().isOrHasChild(target)
             && !positioner.getElement().isOrHasChild(target)) {
           positioner.removeFromParent();
           return;
         }
-
-        switch (nativeEvent.getTypeInt()) {
+                
+        switch (Event.as(nativeEvent).getTypeInt()) {
           case Event.ONMOUSEMOVE:
             int absX = nativeEvent.getClientX() + Window.getScrollLeft();
             int absY = nativeEvent.getClientY() + Window.getScrollTop();
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
index 07efe27..fe1c5c3 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForEventsFiring.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.museum.client.defaultmuseum;
 
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.BlurEvent;
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ChangeEvent;
@@ -134,7 +135,7 @@
 
     prepMouseEvents();
     prepKeyboardEvents();
-    prepSrollAndMouseWheelEvents();
+    prepScrollAndMouseWheelEvents();
     prepLoadEvents();
     prepWindowEvents();
 
@@ -213,8 +214,8 @@
    * 
    * @param event the event that was triggered
    */
-  private void passTest(Event event) {
-    passTest(event.getTypeInt());
+  private void passTest(NativeEvent event) {
+    passTest(Event.as(event).getTypeInt()));
   }
 
   /**
@@ -247,7 +248,7 @@
     // Add event handlers
     textBox.addKeyDownHandler(new KeyDownHandler() {
       public void onKeyDown(KeyDownEvent event) {
-        event.isAutoRepeat();
+
         event.isAltKeyDown();
         event.isControlKeyDown();
         event.isShiftKeyDown();
@@ -332,7 +333,7 @@
 
   private void prepMouseEvents() {
     // Create a button to trigger events
-    Button button = new Button("Click me") {
+    final Button button = new Button("Click me, move over me") {
       @Override
       public void onBrowserEvent(Event event) {
         super.onBrowserEvent(event);
@@ -386,19 +387,28 @@
       public void onMouseOut(MouseOutEvent event) {
         assert event.getFromElement() != null;
         assert event.getToElement() != null;
-        passTest(event.getNativeEvent());
+        if (button.getElement().equals(event.getFromElement())
+            && button.getElement().getParentElement().equals(
+                event.getToElement())) {
+          passTest(event.getNativeEvent());
+        }
       }
     });
     button.addMouseOverHandler(new MouseOverHandler() {
       public void onMouseOver(MouseOverEvent event) {
         assert event.getFromElement() != null;
         assert event.getToElement() != null;
-        passTest(event.getNativeEvent());
+
+        if (button.getElement().equals(event.getToElement())
+            && button.getElement().getParentElement().equals(
+                event.getFromElement())) {
+          passTest(event.getNativeEvent());
+        }
       }
     });
   }
 
-  private void prepSrollAndMouseWheelEvents() {
+  private void prepScrollAndMouseWheelEvents() {
     // Create a widget to trigger events
     String scrollableMessage = "Scroll to the bottom<br>(using mouse wheel<br>"
         + "if supported)";
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
index 8a280c1..c317aa2 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
@@ -76,9 +76,11 @@
     TreeItem d = new TreeItem(new RadioButton("myradio",
         "I should line up nicely"));
     TreeItem e = new TreeItem(new CheckBox("I should line up nicely"));
+    TreeItem f = new TreeItem(new CheckBox("I should also line up nicely"));
+    f.addItem(new CheckBox("me to"));
     SimplePanel panel = new SimplePanel();
     panel.setWidget(new Label("There should not be any space above me"));
-    TreeItem f = new TreeItem(panel);
+    TreeItem g = new TreeItem(panel);
 
     tree.setSelectedItem(b);
     tree.addItem(a);
@@ -87,6 +89,7 @@
     tree.addItem(d);
     tree.addItem(e);
     tree.addItem(f);
+    tree.addItem(g);
     b.addItem(ba);
     b.addItem(bb);
     bb.addItem(bba);
diff --git a/user/src/com/google/gwt/dom/client/DOMImpl.java b/user/src/com/google/gwt/dom/client/DOMImpl.java
index c4a10d1..d5d86af 100644
--- a/user/src/com/google/gwt/dom/client/DOMImpl.java
+++ b/user/src/com/google/gwt/dom/client/DOMImpl.java
@@ -47,6 +47,71 @@
     return select;
   }
 
+  public native boolean eventGetAltKey(NativeEvent evt) /*-{
+    return !!evt.altKey;
+  }-*/;
+  
+  public native int eventGetButton(NativeEvent evt) /*-{
+    return evt.button || 0;
+  }-*/;
+
+  public native int eventGetClientX(NativeEvent evt) /*-{
+    return evt.clientX || 0;
+  }-*/;
+
+  public native int eventGetClientY(NativeEvent evt) /*-{
+    return evt.clientY || 0;
+  }-*/;
+
+  public native boolean eventGetCtrlKey(NativeEvent evt) /*-{
+    return !!evt.ctrlKey;
+  }-*/;
+
+  public final native int eventGetKeyCode(NativeEvent evt) /*-{
+    // 'which' gives the right key value, except when it doesn't -- in which
+    // case, keyCode gives the right value on all browsers.
+    // If all else fails, return an error code
+    return evt.which || evt.keyCode || 0;
+  }-*/;
+
+  public native boolean eventGetMetaKey(NativeEvent evt) /*-{
+    return !!evt.metaKey;
+  }-*/;
+
+  public abstract int eventGetMouseWheelVelocityY(NativeEvent evt);
+
+  public abstract Element eventGetRelatedTarget(NativeEvent nativeEvent);
+
+  public native int eventGetScreenX(NativeEvent evt) /*-{
+    return evt.screenX || 0;
+  }-*/;
+
+  public native int eventGetScreenY(NativeEvent evt) /*-{
+    return evt.screenY || 0;
+  }-*/;
+
+  public native boolean eventGetShiftKey(NativeEvent evt) /*-{
+    return !!evt.shiftKey;
+  }-*/;
+
+  public abstract Element eventGetTarget(NativeEvent evt);
+
+  public final native String eventGetType(NativeEvent evt) /*-{
+    return evt.type;
+  }-*/;
+
+  public abstract void eventPreventDefault(NativeEvent evt);
+
+  public native void eventSetKeyCode(NativeEvent evt, char key) /*-{
+    evt.keyCode = key;
+  }-*/;
+
+  public native void eventStopPropagation(NativeEvent evt) /*-{
+    evt.cancelBubble = cancel;
+  }-*/;
+
+  public abstract String eventToString(NativeEvent evt);
+
   public native int getAbsoluteLeft(Element elem) /*-{
     var left = 0;
     var curr = elem;
@@ -210,4 +275,4 @@
   public native String toString(Element elem) /*-{
     return elem.outerHTML;
   }-*/;
-}
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE6.java b/user/src/com/google/gwt/dom/client/DOMImplIE6.java
index ba1dfaa..f95a5f0 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplIE6.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplIE6.java
@@ -37,6 +37,32 @@
   public native SelectElement createSelectElement(boolean multiple) /*-{
     var html = multiple ? "<SELECT MULTIPLE>" : "<SELECT>"; 
     return $doc.createElement(html);
+  }-*/; 
+
+  @Override
+  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
+    return Math.round(-evt.wheelDelta / 40) || 0;
+  }-*/;
+
+  @Override
+  public native Element eventGetRelatedTarget(NativeEvent evt) /*-{
+    return evt.type == "mouseout"? evt.toElement:evt.fromElement;
+  }-*/;
+
+  @Override
+  public native Element eventGetTarget(NativeEvent evt) /*-{
+    return evt.srcElement;
+  }-*/;
+
+  @Override
+  public native void eventPreventDefault(NativeEvent evt) /*-{
+    evt.returnValue = false;
+  }-*/;
+
+  @Override
+  public native String eventToString(NativeEvent evt) /*-{
+    if (evt.toString) return evt.toString();
+      return "[event" + evt.type + "]";
   }-*/;
 
   @Override
@@ -128,8 +154,8 @@
   }-*/;
 
   /**
-   * Get the zoom multiple based on the current IE zoom level.  A multiple of
-   * 2.0 means that the user has zoomed in to 200%.
+   * Get the zoom multiple based on the current IE zoom level. A multiple of 2.0
+   * means that the user has zoomed in to 200%.
    * 
    * @return the zoom multiple
    */
@@ -137,4 +163,5 @@
   private native double getZoomMultiple() /*-{
     return $doc.body.parentElement.offsetWidth / $doc.body.offsetWidth;
   }-*/;
+
 }
diff --git a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
index 0d1d36b..49519e0 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,6 +21,11 @@
 class DOMImplMozilla extends DOMImplStandard {
 
   @Override
+  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
+    return evt.detail || 0;
+  }-*/;
+
+  @Override
   public native int getAbsoluteLeft(Element elem) /*-{
     // Firefox 3 is actively throwing errors when getBoxObjectFor() is called,
     // so we use getBoundingClientRect() whenever possible (but it's not
@@ -67,13 +72,13 @@
     var style = $wnd.getComputedStyle($doc.documentElement, '');
     return parseInt(style.marginLeft) + parseInt(style.borderLeftWidth);
   }-*/;
-  
+
   @Override
   public native int getBodyOffsetTop() /*-{
     var style = $wnd.getComputedStyle($doc.documentElement, '');
     return parseInt(style.marginTop) + parseInt(style.borderTopWidth);
   }-*/;
-  
+
   @Override
   public native String getInnerText(Element elem) /*-{
     return elem.textContent;
@@ -83,9 +88,9 @@
   public native boolean isOrHasChild(Element parent, Element child) /*-{
     // For more information about compareDocumentPosition, see:
     // http://www.quirksmode.org/blog/archives/2006/01/contains_for_mo.html
-    return (parent === child) || !!(parent.compareDocumentPosition(child) & 16);  
+    return (parent === child) || !!(parent.compareDocumentPosition(child) & 16);
   }-*/;
-  
+
   @Override
   public native void setInnerText(Element elem, String text) /*-{
     elem.textContent = text || '';
diff --git a/user/src/com/google/gwt/dom/client/DOMImplOpera.java b/user/src/com/google/gwt/dom/client/DOMImplOpera.java
index e8c27e4..58f1d69 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplOpera.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplOpera.java
@@ -21,6 +21,11 @@
 class DOMImplOpera extends DOMImplStandard {
 
   @Override
+  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
+    return evt.detail * 4 || 0;
+  }-*/;
+
+  @Override
   public native int getAbsoluteLeft(Element elem) /*-{
     var left = 0;
 
@@ -63,7 +68,7 @@
     }
     return top;
   }-*/;
-  
+
   @Override
   public native void scrollIntoView(Element elem) /*-{
     elem.scrollIntoView();
diff --git a/user/src/com/google/gwt/dom/client/DOMImplSafari.java b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
index 2265d48..6a34c1e 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplSafari.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
@@ -14,6 +14,7 @@
  * the License.
  */
 package com.google.gwt.dom.client;
+ 
 
 /**
  * Safari implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
@@ -30,6 +31,43 @@
   }
 
   @Override
+  public native int eventGetClientX(NativeEvent evt) /*-{
+    // In Safari2: clientX is wrong and pageX is returned instead.
+    // $wnd.devicePixelRatio identifies Safari 3 from Safari 2
+    if ($wnd.devicePixelRatio) {
+      return evt.clientX || 0;
+    } else {
+      // Subtract the margin and border of the HTML element in Safari 2 
+      // TODO: Remove this code when we drop Safari 2 support
+      var style = document.defaultView.getComputedStyle($doc.getElementsByTagName('html')[0], '');
+      return evt.pageX - $doc.body.scrollLeft
+          - parseInt(style.getPropertyValue('margin-left'))
+          - parseInt(style.getPropertyValue('border-left-width')) || 0;
+    }
+  }-*/;
+
+  @Override
+  public native int eventGetClientY(NativeEvent evt) /*-{
+    // In Safari2: clientY is wrong and pageY is returned instead.
+    // $wnd.devicePixelRatio identifies Safari 3 from Safari 2
+    if ($wnd.devicePixelRatio) {
+      return evt.clientY || 0;
+    } else {
+      // Subtract the margin and border of the HTML element in Safari 2 
+      // TODO: Remove this code when we drop Safari 2 support
+      var style = document.defaultView.getComputedStyle($doc.getElementsByTagName('html')[0], '');
+      return evt.pageY - $doc.body.scrollTop
+          - parseInt(style.getPropertyValue('margin-top'))
+          - parseInt(style.getPropertyValue('border-top-width')) || 0;
+    }
+  }-*/;
+
+  @Override
+  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
+    return Math.round(-evt.wheelDelta / 40) || 0;
+  }-*/;
+
+  @Override
   public native int getAbsoluteLeft(Element elem) /*-{
     // Unattached elements and elements (or their ancestors) with style
     // 'display: none' have no offsetLeft.
@@ -68,7 +106,7 @@
     }
     return left;
   }-*/;
-
+  
   @Override
   public native int getAbsoluteTop(Element elem) /*-{
     // Unattached elements and elements (or their ancestors) with style
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandard.java b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
index 847b7d3..7f2767f 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplStandard.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
@@ -31,7 +31,40 @@
   }-*/;
 
   @Override
+  public native int eventGetButton(NativeEvent evt) /*-{
+    // Standard browsers and IE disagree on what the button codes for buttons
+    // should be.  Translating to match IE standard.
+    var button = evt.which;
+    if(button == 2) {
+      return 4;
+    } else if (button == 3) {
+      return 2;
+    }
+    return button || 0;
+  }-*/;
+   
+  @Override
+  public native Element eventGetRelatedTarget(NativeEvent evt) /*-{
+    return evt.relatedTarget;
+  }-*/;
+
+  @Override
+  public native Element eventGetTarget(NativeEvent evt) /*-{
+    return evt.target;
+  }-*/;
+ 
+  @Override
+  public native void eventPreventDefault(NativeEvent evt) /*-{
+    evt.preventDefault();
+  }-*/;
+
+  @Override
+  public native String eventToString(NativeEvent evt) /*-{
+    return evt.toString();
+  }-*/;
+
+  @Override
   public native boolean isOrHasChild(Element parent, Element child) /*-{
-    return parent.contains(child);  
+    return parent.contains(child);
   }-*/;
 }
diff --git a/user/src/com/google/gwt/dom/client/NativeEvent.java b/user/src/com/google/gwt/dom/client/NativeEvent.java
new file mode 100644
index 0000000..217f067
--- /dev/null
+++ b/user/src/com/google/gwt/dom/client/NativeEvent.java
@@ -0,0 +1,214 @@
+/*

+ * Copyright 2009 Google Inc.

+ * 

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not

+ * use this file except in compliance with the License. You may obtain a copy of

+ * the License at

+ * 

+ * http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

+ * License for the specific language governing permissions and limitations under

+ * the License.

+ */

+package com.google.gwt.dom.client;

+

+import com.google.gwt.core.client.JavaScriptObject;

+

+/**

+ * The native dom event.

+ */

+public class NativeEvent extends JavaScriptObject {

+

+  /**

+   * The left mouse button. 

+   */

+  public static final int BUTTON_LEFT = 1;

+  /**

+   * The middle mouse button.

+   */

+  public static final int BUTTON_MIDDLE = 4;

+

+  /**

+   * The right mouse button.

+   */

+  public static final int BUTTON_RIGHT = 2;

+

+  /**

+   * Required constructor for GWT compiler to function.

+   */

+  protected NativeEvent() {

+  }

+

+  /**

+   * Gets whether the ALT key was depressed when the given event occurred.

+   * 

+   * @return <code>true</code> if ALT was depressed when the event occurred

+   */

+  public final boolean getAltKey() {

+    return DOMImpl.impl.eventGetAltKey(this);

+  }

+

+  /**

+   * Gets the mouse buttons that were depressed when the given event occurred.

+   * 

+   * @return a bit-field, defined by {@link NativeEvent#BUTTON_LEFT},

+   *         {@link NativeEvent#BUTTON_MIDDLE}, and

+   *         {@link NativeEvent#BUTTON_RIGHT}

+   */

+  public final int getButton() {

+    return DOMImpl.impl.eventGetButton(this);

+  }

+

+  /**

+   * Gets the mouse x-position within the browser window's client area.

+   * 

+   * @return the mouse x-position

+   */

+  public final int getClientX() {

+    return DOMImpl.impl.eventGetClientX(this);

+  }

+

+  /**

+   * Gets the mouse y-position within the browser window's client area.

+   * 

+   * @return the mouse y-position

+   */

+  public final int getClientY() {

+    return DOMImpl.impl.eventGetClientY(this);

+  }

+

+  /**

+   * Gets whether the CTRL key was depressed when the given event occurred.

+   * 

+   * @return <code>true</code> if CTRL was depressed when the event occurred

+   */

+  public final boolean getCtrlKey() {

+    return DOMImpl.impl.eventGetCtrlKey(this);

+  }

+

+  /**

+   * Gets the key code associated with this event.

+   * 

+   * <p>

+   * For key press events, this method returns the Unicode value of the

+   * character generated. For key down and key up events, it returns the code

+   * associated with the physical key.

+   * </p>

+   * 

+   * @return the Unicode character or key code.

+   * @see com.google.gwt.event.dom.client.KeyCodes

+   */

+  public final int getKeyCode() {

+    return DOMImpl.impl.eventGetKeyCode(this);

+  }

+

+  /**

+   * Gets whether the META key was depressed when the given event occurred.

+   * 

+   * @return <code>true</code> if META was depressed when the event occurred

+   */

+  public final boolean getMetaKey() {

+    return DOMImpl.impl.eventGetMetaKey(this);

+  }

+

+  /**

+   * Gets the velocity of the mouse wheel associated with the event along the Y

+   * axis.

+   * <p>

+   * The velocity of the event is an artifical measurement for relative

+   * comparisons of wheel activity. It is affected by some non-browser factors,

+   * including choice of input hardware and mouse acceleration settings. The

+   * sign of the velocity measurement agrees with the screen coordinate system;

+   * negative values are towards the origin and positive values are away from

+   * the origin. Standard scrolling speed is approximately ten units per event.

+   * </p>

+   * 

+   * @return The velocity of the mouse wheel.

+   */

+  public final int getMouseWheelVelocityY() {

+    return DOMImpl.impl.eventGetMouseWheelVelocityY(this);

+  }

+

+  /**

+   * Gets the related target for this event.

+   * @return the related target

+   */

+  public final Element getRelatedTarget() {

+    return DOMImpl.impl.eventGetRelatedTarget(this);

+  }

+

+  /**

+   * Gets the mouse x-position on the user's display.

+   * 

+   * @return the mouse x-position

+   */

+  public final int getScreenX() {

+    return DOMImpl.impl.eventGetScreenX(this);

+  }

+

+  /**

+   * Gets the mouse y-position on the user's display.

+   * 

+   * @return the mouse y-position

+   */

+  public final int getScreenY() {

+    return DOMImpl.impl.eventGetScreenY(this);

+  }

+

+  /**

+   * Gets whether the shift key was depressed when the given event occurred.

+   * 

+   * @return <code>true</code> if shift was depressed when the event occurred

+   */

+  public final boolean getShiftKey() {

+    return DOMImpl.impl.eventGetShiftKey(this);

+  }

+

+  /**

+   * Gets a string representation of this event.

+   * 

+   * We do not override {@link #toString()} because it is final in

+   * {@link com.google.gwt.core.client.JavaScriptObject }.

+   * 

+   * @return the string representation of this event

+   */

+  public final String getString() {

+    return DOMImpl.impl.eventToString(this);

+  }

+

+  /**

+   * Returns the element that was the actual target of the given event.

+   * 

+   * @return the target element

+   */

+  public final Element getTarget() {

+    return DOMImpl.impl.eventGetTarget(this);

+  }

+

+  /**

+   * Gets the enumerated type of this event.

+   * 

+   * @return the event's enumerated type

+   */

+  public final String getType() {

+    return DOMImpl.impl.eventGetType(this);

+  }

+

+  /**

+   * Prevents the browser from taking its default action for the given event.

+   */

+  public final void preventDefault() {

+    DOMImpl.impl.eventPreventDefault(this);

+  }

+

+  /**

+   * Stops the event from being propagated to parent elements.

+   */

+  public final void stopPropagation() {

+    DOMImpl.impl.eventStopPropagation(this);

+  }

+

+}

diff --git a/user/src/com/google/gwt/event/dom/DomEvent.gwt.xml b/user/src/com/google/gwt/event/dom/DomEvent.gwt.xml
index c5434ae..1e761c5 100644
--- a/user/src/com/google/gwt/event/dom/DomEvent.gwt.xml
+++ b/user/src/com/google/gwt/event/dom/DomEvent.gwt.xml
@@ -1,6 +1,5 @@
 <module>
 	<inherits name="com.google.gwt.event.EventBase" />
-	<inherits name="com.google.gwt.user.DOM" />
-
+	<inherits name="com.google.gwt.dom.DOM" />
   <source path="client"/>
 </module>
diff --git a/user/src/com/google/gwt/event/dom/client/BlurEvent.java b/user/src/com/google/gwt/event/dom/client/BlurEvent.java
index acbd82c..db0d326 100644
--- a/user/src/com/google/gwt/event/dom/client/BlurEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/BlurEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native blur event.

  */

@@ -26,8 +24,8 @@
    * Event type for blur events. Represents the meta-data associated with this

    * event.

    */

-  private static final Type<BlurHandler> TYPE = new Type<BlurHandler>(

-      Event.ONBLUR, "blur", new BlurEvent());

+  private static final Type<BlurHandler> TYPE = new Type<BlurHandler>("blur",

+      new BlurEvent());

 

   /**

    * Gets the event type associated with blur events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire blur events.

    */

   protected BlurEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/ChangeEvent.java b/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
index f66f3cd..7a2ec49 100644
--- a/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ChangeEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native change event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<ChangeHandler> TYPE = new Type<ChangeHandler>(

-      Event.ONCHANGE, "change", new ChangeEvent());

+      "change", new ChangeEvent());

 

   /**

    * Gets the event type associated with change events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire change events.

    */

   protected ChangeEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/ClickEvent.java b/user/src/com/google/gwt/event/dom/client/ClickEvent.java
index 805c956..74fc74e 100644
--- a/user/src/com/google/gwt/event/dom/client/ClickEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ClickEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native click event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<ClickHandler> TYPE = new Type<ClickHandler>(

-      Event.ONCLICK, "click", new ClickEvent());

+      "click", new ClickEvent());

 

   /**

    * Gets the event type associated with click events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire click events.

    */

   protected ClickEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java b/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
index 513fd2b..ff801d3 100644
--- a/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ContextMenuEvent.java
@@ -15,8 +15,6 @@
  */
 package com.google.gwt.event.dom.client;
 
-import com.google.gwt.user.client.Event;
-
 /**
  * Represents a native context menu event.
  */
@@ -27,7 +25,7 @@
    * with this event.
    */
   private static final Type<ContextMenuHandler> TYPE = new Type<ContextMenuHandler>(
-      Event.ONCONTEXTMENU, "contextmenu", new ContextMenuEvent());
+      "contextmenu", new ContextMenuEvent());
 
   /**
    * Gets the event type associated with context menu events.
@@ -40,7 +38,7 @@
 
   /**
    * Protected constructor, use
-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}
+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}
    * to fire context menu events.
    */
   protected ContextMenuEvent() {
diff --git a/user/src/com/google/gwt/event/dom/client/DomEvent.java b/user/src/com/google/gwt/event/dom/client/DomEvent.java
index c4ff6f4..bf279db 100644
--- a/user/src/com/google/gwt/event/dom/client/DomEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/DomEvent.java
@@ -15,14 +15,13 @@
  */
 package com.google.gwt.event.dom.client;
 
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.event.shared.HasHandlers;
-import com.google.gwt.user.client.Event;
 
 /**
  * {@link DomEvent} is a subclass of {@link GwtEvent} that provides events that
- * map to DOM Level 2 Events. It provides an additional method to access the
  * underlying native browser event object as well as a subclass of {@link Type}
  * that understands GWT event bits used by sinkEvents().
  * 
@@ -39,38 +38,25 @@
    * @param <H> handler type
    */
   public static class Type<H extends EventHandler> extends GwtEvent.Type<H> {
-    private final int eventToSink;
     private DomEvent<H> flyweight;
-
-    /**
-     * Constructor.
-     * 
-     * @param eventToSink the native event type to sink
-     * 
-     */
-    public Type(int eventToSink) {
-      this.eventToSink = eventToSink;
-    }
+    private String name;
 
     /**
      * This constructor allows dom event types to be triggered by the
-     * {@link DomEvent#fireNativeEvent(Event, HasHandlers)} method. It should
-     * only be used by implementors supporting new dom events.
+     * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, HasHandlers)}
+     * method. It should only be used by implementors supporting new dom events.
+     * 
      * <p>
      * Any such dom event type must act as a flyweight around a native event
      * object.
      * </p>
      * 
-     * 
-     * @param eventToSink the integer value used by sink events to set up event
-     *          handling for this dom type
      * @param eventName the raw native event name
      * @param flyweight the instance that will be used as a flyweight to wrap a
      *          native event
      */
-    protected Type(int eventToSink, String eventName, DomEvent<H> flyweight) {
+    public Type(String eventName, DomEvent<H> flyweight) {
       this.flyweight = flyweight;
-      this.eventToSink = eventToSink;
 
       // Until we have eager clinits implemented, we are manually initializing
       // DomEvent here.
@@ -78,26 +64,16 @@
         init();
       }
       registered.unsafePut(eventName, this);
-    }
-
-    Type(int nativeEventTypeInt, String eventName, DomEvent<H> cached,
-        String... auxNames) {
-      this(nativeEventTypeInt, eventName, cached);
-      for (int i = 0; i < auxNames.length; i++) {
-        registered.unsafePut(auxNames[i], this);
-      }
+      name = eventName;
     }
 
     /**
-     * Gets the integer defined by the native {@link Event} type needed to hook
-     * up event handling when the user calls
-     * {@link com.google.gwt.user.client.DOM#sinkEvents(com.google.gwt.user.client.Element, int)}
-     * .
+     * Gets the name associated with this event type.
      * 
-     * @return the native event type
+     * @return the name of this event typ
      */
-    public int getEventToSink() {
-      return eventToSink;
+    public String getName() {
+      return name;
     }
   }
 
@@ -107,19 +83,19 @@
    * Fires the given native event on the specified handlers.
    * 
    * @param nativeEvent the native event
-   * @param handlers the event manager containing the handlers to fire (may be
-   *          null)
+   * @param handlerSource the source of the handlers to fire
    */
-  public static void fireNativeEvent(Event nativeEvent, HasHandlers handlers) {
+  public static void fireNativeEvent(NativeEvent nativeEvent,
+      HasHandlers handlerSource) {
     assert nativeEvent != null : "nativeEvent must not be null";
-    if (registered != null && handlers != null) {
+    if (registered != null) {
       final DomEvent.Type<?> typeKey = registered.unsafeGet(nativeEvent.getType());
       if (typeKey != null) {
         // Store and restore native event just in case we are in recursive
         // loop.
-        Event currentNative = typeKey.flyweight.nativeEvent;
+        NativeEvent currentNative = typeKey.flyweight.nativeEvent;
         typeKey.flyweight.setNativeEvent(nativeEvent);
-        handlers.fireEvent(typeKey.flyweight);
+        handlerSource.fireEvent(typeKey.flyweight);
         typeKey.flyweight.setNativeEvent(currentNative);
       }
     }
@@ -130,12 +106,12 @@
     registered = new PrivateMap<Type<?>>();
   }
 
-  private Event nativeEvent;
+  private NativeEvent nativeEvent;
 
   @Override
   public abstract DomEvent.Type<H> getAssociatedType();
 
-  public final Event getNativeEvent() {
+  public final NativeEvent getNativeEvent() {
     assertLive();
     return nativeEvent;
   }
@@ -154,7 +130,7 @@
    * 
    * @param nativeEvent the native event
    */
-  public final void setNativeEvent(Event nativeEvent) {
+  public final void setNativeEvent(NativeEvent nativeEvent) {
     this.nativeEvent = nativeEvent;
   }
 
@@ -163,6 +139,6 @@
    */
   public void stopPropagation() {
     assertLive();
-    nativeEvent.cancelBubble(true);
+    nativeEvent.stopPropagation();
   }
 }
diff --git a/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java b/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
index 972b645..20cdf8e 100644
--- a/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/DoubleClickEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native double click event.

  */

@@ -27,7 +25,7 @@
    * with this event.

    */

   private static final Type<DoubleClickHandler> TYPE = new Type<DoubleClickHandler>(

-      Event.ONDBLCLICK, "dblclick", new DoubleClickEvent());

+      "dblclick", new DoubleClickEvent());

 

   /**

    * Gets the event type associated with double click events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire double click events.

    */

   protected DoubleClickEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/ErrorEvent.java b/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
index 0c9a007..40a3771 100644
--- a/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ErrorEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native error event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<ErrorHandler> TYPE = new Type<ErrorHandler>(

-      Event.ONERROR, "error", new ErrorEvent());

+      "error", new ErrorEvent());

 

   /**

    * Gets the event type associated with error events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire error events.

    */

   protected ErrorEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/FocusEvent.java b/user/src/com/google/gwt/event/dom/client/FocusEvent.java
index c2ca7bd..16df375 100644
--- a/user/src/com/google/gwt/event/dom/client/FocusEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/FocusEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native focus event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<FocusHandler> TYPE = new Type<FocusHandler>(

-      Event.ONFOCUS, "focus", new FocusEvent());

+      "focus", new FocusEvent());

 

   /**

    * Gets the event type associated with focus events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire focus events.

    */

   protected FocusEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/HasNativeEvent.java b/user/src/com/google/gwt/event/dom/client/HasNativeEvent.java
index 510c273..88aaf36 100644
--- a/user/src/com/google/gwt/event/dom/client/HasNativeEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/HasNativeEvent.java
@@ -16,7 +16,7 @@
 
 package com.google.gwt.event.dom.client;
 
-import com.google.gwt.user.client.Event;
+import com.google.gwt.dom.client.NativeEvent;
 
 /**
  * An object that implements this interface has a native event associated with
@@ -28,5 +28,5 @@
    * 
    * @return the native event
    */
-  Event getNativeEvent();
+  NativeEvent getNativeEvent();
 }
diff --git a/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java b/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
index 1b58b03..d1175a2 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyDownEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native key down event.

  */

@@ -27,7 +25,7 @@
    * this event.

    */

   private static final Type<KeyDownHandler> TYPE = new Type<KeyDownHandler>(

-      Event.ONKEYDOWN, "keydown", new KeyDownEvent());

+      "keydown", new KeyDownEvent());

 

   /**

    * Gets the event type associated with key down events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire key down events.

    */

   protected KeyDownEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/KeyEvent.java b/user/src/com/google/gwt/event/dom/client/KeyEvent.java
index c6367e2..535995f 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyEvent.java
@@ -47,15 +47,6 @@
   }
 
   /**
-   * Gets the key-repeat state of this event.
-   * 
-   * @return <code>true</code> if this key event was an auto-repeat
-   */
-  public boolean isAutoRepeat() {
-    return getNativeEvent().getRepeat();
-  }
-
-  /**
    * Is the <code>control</code> key down?
    * 
    * @return whether the control key is down
diff --git a/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java b/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
index f955e3c..496aa6c 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyPressEvent.java
@@ -15,7 +15,7 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

+import com.google.gwt.dom.client.NativeEvent; 

 

 /**

  * Represents a native key press event.

@@ -27,7 +27,7 @@
    * this event.

    */

   private static final Type<KeyPressHandler> TYPE = new Type<KeyPressHandler>(

-      Event.ONKEYPRESS, "keypress", new KeyPressEvent());

+      "keypress", new KeyPressEvent());

 

   /**

    * Gets the event type associated with key press events.

@@ -40,7 +40,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire key press events.

    */

   protected KeyPressEvent() {

@@ -70,8 +70,8 @@
     handler.onKeyPress(this);

   }

 

-  private native char getCharCode(Event e)/*-{

-        return e.charCode || e.keyCode;

-      }-*/;

+  private native char getCharCode(NativeEvent e)/*-{

+    return e.charCode || e.keyCode;

+  }-*/;

 

 }

diff --git a/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java b/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
index 5a07977..f728468 100644
--- a/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/KeyUpEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native key up event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<KeyUpHandler> TYPE = new Type<KeyUpHandler>(

-      Event.ONKEYUP, "keyup", new KeyUpEvent());

+      "keyup", new KeyUpEvent());

 

   /**

    * Gets the event type associated with key up events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire key up events.

    */

   protected KeyUpEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/LoadEvent.java b/user/src/com/google/gwt/event/dom/client/LoadEvent.java
index 3255c4b..00397fb 100644
--- a/user/src/com/google/gwt/event/dom/client/LoadEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/LoadEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native load event.

  */

@@ -26,8 +24,8 @@
    * Event type for load events. Represents the meta-data associated with this

    * event.

    */

-  private static final Type<LoadHandler> TYPE = new Type<LoadHandler>(

-      Event.ONLOAD, "load", new LoadEvent());

+  private static final Type<LoadHandler> TYPE = new Type<LoadHandler>("load",

+      new LoadEvent());

 

   /**

    * Gets the event type associated with load events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire load events.

    */

   protected LoadEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java b/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
index 857e8d0..eef6843 100644
--- a/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/LoseCaptureEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native lose capture event.

  */

@@ -27,7 +25,7 @@
    * with this event.

    */

   private static final Type<LoseCaptureHandler> TYPE = new Type<LoseCaptureHandler>(

-      Event.ONLOSECAPTURE, "losecapture", new LoseCaptureEvent());

+      "losecapture", new LoseCaptureEvent());

 

   /**

    * Gets the event type associated with lose capture events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire lose capture events.

    */

   protected LoseCaptureEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java b/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
index dd36ec2..5dcfff6 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseDownEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native mouse down event.

  */

@@ -27,7 +25,7 @@
    * this event.

    */

   private static final Type<MouseDownHandler> TYPE = new Type<MouseDownHandler>(

-      Event.ONMOUSEDOWN, "mousedown", new MouseDownEvent());

+      "mousedown", new MouseDownEvent());

 

   /**

    * Gets the event type associated with mouse down events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse down events.

    */

   protected MouseDownEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/MouseEvent.java b/user/src/com/google/gwt/event/dom/client/MouseEvent.java
index 424b138..1357261 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseEvent.java
@@ -15,10 +15,7 @@
  */
 package com.google.gwt.event.dom.client;
 
-import com.google.gwt.dom.client.Element;
 import com.google.gwt.event.shared.EventHandler;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.Window;
 
 /**
  * Abstract class representing mouse events.
@@ -28,30 +25,6 @@
  */
 public abstract class MouseEvent<H extends EventHandler> extends DomEvent<H> {
   /**
-   * Gets the x coordinate relative to the given element.
-   * 
-   * @param nativeEvent the native event
-   * @param relativeTo the relative element
-   * @return the relative x
-   */
-  public static int getRelativeX(Event nativeEvent, Element relativeTo) {
-    return nativeEvent.getClientX() - relativeTo.getAbsoluteLeft()
-        + relativeTo.getScrollLeft() + Window.getScrollLeft();
-  }
-
-  /**
-   * Gets the y coordinate relative to the given element.
-   * 
-   * @param nativeEvent the native event
-   * @param relativeTo the relative element
-   * @return the relative y
-   */
-  public static int getRelativeY(Event nativeEvent, Element relativeTo) {
-    return nativeEvent.getClientY() - relativeTo.getAbsoluteTop()
-        + relativeTo.getScrollTop() + Window.getScrollTop();
-  }
-
-  /**
    * Gets the mouse x-position within the browser window's client area.
    * 
    * @return the mouse x-position
@@ -70,8 +43,10 @@
   }
 
   /**
-   * Gets the button value. Compare it to {@link Event#BUTTON_LEFT},
-   * {@link Event#BUTTON_RIGHT}, {@link Event#BUTTON_MIDDLE}
+   * Gets the button value. Compare it to
+   * {@link com.google.gwt.dom.client.NativeEvent#BUTTON_LEFT},
+   * {@link com.google.gwt.dom.client.NativeEvent#BUTTON_RIGHT},
+   * {@link com.google.gwt.dom.client.NativeEvent#BUTTON_MIDDLE}
    * 
    * @return the button value
    */
@@ -80,27 +55,6 @@
   }
 
   /**
-   * Gets the x coordinate relative to the given element.
-   * 
-   * @param relativeTo the relative element
-   * @return the relative x
-   */
-  public int getRelativeX(Element relativeTo) {
-    return getRelativeX(getNativeEvent(), relativeTo);
-  }
-
-  /**
-   * Gets the y coordinate relative to the given element.
-   * 
-   * 
-   * @param relativeTo the relative element
-   * @return the relative y
-   */
-  public int getRelativeY(Element relativeTo) {
-    return getRelativeY(getNativeEvent(), relativeTo);
-  }
-
-  /**
    * Gets the mouse x-position on the user's display.
    * 
    * @return the mouse x-position
diff --git a/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java b/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
index cafa24c..cefd26c 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseMoveEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native mouse move event.

  */

@@ -27,7 +25,7 @@
    * this event.

    */

   private static final Type<MouseMoveHandler> TYPE = new Type<MouseMoveHandler>(

-      Event.ONMOUSEMOVE, "mousemove", new MouseMoveEvent());

+      "mousemove", new MouseMoveEvent());

 

   /**

    * Gets the event type associated with mouse move events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse move events.

    */

   protected MouseMoveEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java b/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
index 7b1d47e..9b89c91 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseOutEvent.java
@@ -16,7 +16,6 @@
 package com.google.gwt.event.dom.client;

 

 import com.google.gwt.dom.client.Element;

-import com.google.gwt.user.client.Event;

 

 /**

  * Represents a native mouse out event.

@@ -28,7 +27,7 @@
    * this event.

    */

   private static final Type<MouseOutHandler> TYPE = new Type<MouseOutHandler>(

-      Event.ONMOUSEOUT, "mouseout", new MouseOutEvent());

+      "mouseout", new MouseOutEvent());

 

   /**

    * Gets the event type associated with mouse out events.

@@ -41,7 +40,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse out events.

    */

   protected MouseOutEvent() {

@@ -58,8 +57,7 @@
    * @return the element from which the mouse pointer was moved

    */

   public Element getFromElement() {

-    // Use a deferred binding instead of DOMImpl's inefficient switch statement

-    return getNativeEvent().getFromElement();

+    return getNativeEvent().getTarget();

   }

 

   /**

@@ -69,7 +67,7 @@
    */

   public Element getToElement() {

     // Use a deferred binding instead of DOMImpl's inefficient switch statement

-    return getNativeEvent().getToElement();

+    return getNativeEvent().getRelatedTarget();

   }

 

   @Override

diff --git a/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java b/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
index 90a664c..3306151 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseOverEvent.java
@@ -16,7 +16,6 @@
 package com.google.gwt.event.dom.client;

 

 import com.google.gwt.dom.client.Element;

-import com.google.gwt.user.client.Event;

 

 /**

  * Represents a native mouse over event.

@@ -28,7 +27,7 @@
    * this event.

    */

   private static final Type<MouseOverHandler> TYPE = new Type<MouseOverHandler>(

-      Event.ONMOUSEOVER, "mouseover", new MouseOverEvent());

+      "mouseover", new MouseOverEvent());

 

   /**

    * Gets the event type associated with mouse over events.

@@ -41,7 +40,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse over events.

    */

   protected MouseOverEvent() {

@@ -58,8 +57,7 @@
    * @return the element from which the mouse pointer was moved

    */

   public Element getFromElement() {

-    // Use a deferred binding instead of DOMImpl's inefficient switch statement

-    return getNativeEvent().getFromElement();

+    return getNativeEvent().getRelatedTarget();

   }

 

   /**

@@ -68,8 +66,7 @@
    * @return the element to which the mouse pointer was moved

    */

   public Element getToElement() {

-    // Use a deferred binding instead of DOMImpl's inefficient switch statement

-    return getNativeEvent().getToElement();

+    return getNativeEvent().getTarget();

   }

 

   @Override

diff --git a/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java b/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
index 9817f07..a098ff0 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseUpEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native mouse up event.

  */

@@ -27,7 +25,7 @@
    * this event.

    */

   private static final Type<MouseUpHandler> TYPE = new Type<MouseUpHandler>(

-      Event.ONMOUSEUP, "mouseup", new MouseUpEvent());

+      "mouseup", new MouseUpEvent());

 

   /**

    * Gets the event type associated with mouse up events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse up events.

    */

   protected MouseUpEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java b/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
index d8fed04..8120a1b 100644
--- a/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/MouseWheelEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native mouse wheel event.

  */

@@ -27,7 +25,7 @@
    * this event.

    */

   private static final Type<MouseWheelHandler> TYPE = new Type<MouseWheelHandler>(

-      Event.ONMOUSEWHEEL, "mousewheel", new MouseWheelEvent(), "DOMMouseScroll");

+      "mousewheel", new MouseWheelEvent());

 

   /**

    * Gets the event type associated with mouse wheel events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire mouse wheel events.

    */

   protected MouseWheelEvent() {

diff --git a/user/src/com/google/gwt/event/dom/client/PrivateMap.java b/user/src/com/google/gwt/event/dom/client/PrivateMap.java
index 2b136b3..9f264bf 100644
--- a/user/src/com/google/gwt/event/dom/client/PrivateMap.java
+++ b/user/src/com/google/gwt/event/dom/client/PrivateMap.java
@@ -89,12 +89,12 @@
   public final V safeGet(String key) {
     return unsafeGet(":" + key);
   }
- 
+
   // ONLY use this for values that will be accessed with safeGet.
   public final void safePut(String key, V value) {
     unsafePut(":" + key, value);
   }
-  
+
   // ONLY use this for values put with unsafePut.
   public final V unsafeGet(String key) {
     if (GWT.isScript()) {
@@ -103,7 +103,7 @@
       return javaMap.get(key);
     }
   }
-  
+
   // ONLY use this for values that will be accessed with unsafeGet.
   public final void unsafePut(String key, V value) {
     if (GWT.isScript()) {
diff --git a/user/src/com/google/gwt/event/dom/client/ScrollEvent.java b/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
index 21910e9..8451ce9 100644
--- a/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
+++ b/user/src/com/google/gwt/event/dom/client/ScrollEvent.java
@@ -15,8 +15,6 @@
  */

 package com.google.gwt.event.dom.client;

 

-import com.google.gwt.user.client.Event;

-

 /**

  * Represents a native scroll event.

  */

@@ -27,7 +25,7 @@
    * event.

    */

   private static final Type<ScrollHandler> TYPE = new Type<ScrollHandler>(

-      Event.ONSCROLL, "scroll", new ScrollEvent());

+      "scroll", new ScrollEvent());

 

   /**

    * Gets the event type associated with scroll events.

@@ -40,7 +38,7 @@
 

   /**

    * Protected constructor, use

-   * {@link DomEvent#fireNativeEvent(Event, com.google.gwt.event.shared.HandlerManager)}

+   * {@link DomEvent#fireNativeEvent(com.google.gwt.dom.client.NativeEvent, com.google.gwt.event.shared.HasHandlers)}

    * to fire scroll events.

    */

   protected ScrollEvent() {

diff --git a/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java b/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
index a482ae6..3514c6a 100644
--- a/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/SelectionEvent.java
@@ -34,7 +34,6 @@
    * manager.If no such handlers exist, this method will do nothing.

    * 

    * @param <I> the selected item type

-   * @param <S> The event source

    * @param source the source of the handlers

    * @param selectedItem the selected item

    */

diff --git a/user/src/com/google/gwt/event/shared/HandlerManager.java b/user/src/com/google/gwt/event/shared/HandlerManager.java
index 4123dab..f180f96 100644
--- a/user/src/com/google/gwt/event/shared/HandlerManager.java
+++ b/user/src/com/google/gwt/event/shared/HandlerManager.java
@@ -16,7 +16,6 @@
 package com.google.gwt.event.shared;
 
 import com.google.gwt.event.shared.GwtEvent.Type;
-import com.google.gwt.user.client.Command;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,6 +27,14 @@
  * handlers on passed in events.
  */
 public class HandlerManager {
+
+  /**
+   * Interface for queued add/remove operations.
+   */
+  private interface AddOrRemoveCommand {
+    public void execute();
+  }
+
   /**
    * Inner class used to actually contain the handlers.
    */
@@ -77,9 +84,16 @@
       return l == null ? 0 : l.size();
     }
 
+    private boolean isEventHandled(GwtEvent.Type<?> eventKey) {
+      return map.containsKey(eventKey);
+    }
+
     private <H> void removeHandler(GwtEvent.Type<H> eventKey, H handler) {
       ArrayList<H> l = get(eventKey);
       boolean result = l.remove(handler);
+      if (l.size() == 0) {
+        map.remove(eventKey);
+      }
       assert result : "Tried to remove unknown handler: " + handler + " from "
           + eventKey;
     }
@@ -95,7 +109,7 @@
   private final Object source;
 
   // Add and remove operations received during dispatch.
-  private List<Command> deferredDeltas;
+  private List<AddOrRemoveCommand> deferredDeltas;
 
   /**
    * Creates a handler manager with the given source. Handlers will be fired in
@@ -204,6 +218,16 @@
   }
 
   /**
+   * Does this handler manager handle the given event type?
+   * 
+   * @param e the event type
+   * @return whether the given event type is handled
+   */
+  public boolean isEventHandled(Type<?> e) {
+    return registry.isEventHandled(e);
+  }
+
+  /**
    * Removes the given handler from the specified event type. Normally,
    * applications should call {@link HandlerRegistration#removeHandler()}
    * instead.
@@ -236,9 +260,9 @@
     return registry.map;
   }
 
-  private void defer(Command command) {
+  private void defer(AddOrRemoveCommand command) {
     if (deferredDeltas == null) {
-      deferredDeltas = new ArrayList<Command>();
+      deferredDeltas = new ArrayList<AddOrRemoveCommand>();
     }
     deferredDeltas.add(command);
   }
@@ -255,7 +279,7 @@
 
   private <H extends EventHandler> void enqueueAdd(final GwtEvent.Type<H> type,
       final H handler) {
-    defer(new Command() {
+    defer(new AddOrRemoveCommand() {
       public void execute() {
         doAdd(type, handler);
       }
@@ -264,7 +288,7 @@
 
   private <H extends EventHandler> void enqueueRemove(
       final GwtEvent.Type<H> type, final H handler) {
-    defer(new Command() {
+    defer(new AddOrRemoveCommand() {
       public void execute() {
         doRemove(type, handler);
       }
@@ -274,7 +298,7 @@
   private void handleQueuedAddsAndRemoves() {
     if (deferredDeltas != null) {
       try {
-        for (Command c : deferredDeltas) {
+        for (AddOrRemoveCommand c : deferredDeltas) {
           c.execute();
         }
       } finally {
diff --git a/user/src/com/google/gwt/user/client/BaseListenerWrapper.java b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
index 686cf20..a196bb2 100644
--- a/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
@@ -63,7 +63,7 @@
       // The legacy EventHandler should only fire if it is on the top of the

       // stack (ie. the last one added).

       if (event.isFirstHandler()) {

-        if (!listener.onEventPreview(event.getNativeEvent())) {

+        if (!listener.onEventPreview(Event.as(event.getNativeEvent()))) {

           event.cancel();

         }

       }

diff --git a/user/src/com/google/gwt/user/client/DOM.java b/user/src/com/google/gwt/user/client/DOM.java
index 7840ff3..c781bd1 100644
--- a/user/src/com/google/gwt/user/client/DOM.java
+++ b/user/src/com/google/gwt/user/client/DOM.java
@@ -32,7 +32,7 @@
 public class DOM {
   // The current event being fired
   private static Event currentEvent = null;
-  private static final DOMImpl impl = GWT.create(DOMImpl.class);
+  static final DOMImpl impl = GWT.create(DOMImpl.class);
   private static Element sCaptureElem;
 
   /**
@@ -393,7 +393,7 @@
    * @return <code>true</code> if ALT was depressed when the event occurred
    */
   public static boolean eventGetAltKey(Event evt) {
-    return impl.eventGetAltKey(evt);
+    return evt.getAltKey();
   }
 
   /**
@@ -404,7 +404,7 @@
    *         {@link Event#BUTTON_MIDDLE}, and {@link Event#BUTTON_RIGHT}
    */
   public static int eventGetButton(Event evt) {
-    return impl.eventGetButton(evt);
+    return evt.getButton();
   }
 
   /**
@@ -414,7 +414,7 @@
    * @return the mouse x-position
    */
   public static int eventGetClientX(Event evt) {
-    return impl.eventGetClientX(evt);
+    return evt.getClientX();
   }
 
   /**
@@ -424,7 +424,7 @@
    * @return the mouse y-position
    */
   public static int eventGetClientY(Event evt) {
-    return impl.eventGetClientY(evt);
+    return evt.getClientY();
   }
 
   /**
@@ -434,7 +434,7 @@
    * @return <code>true</code> if CTRL was depressed when the event occurred
    */
   public static boolean eventGetCtrlKey(Event evt) {
-    return impl.eventGetCtrlKey(evt);
+    return evt.getCtrlKey();
   }
 
   /**
@@ -467,6 +467,7 @@
    * @param evt the event to be tested
    * @return the element from which the mouse pointer was moved
    */
+
   public static Element eventGetFromElement(Event evt) {
     return impl.eventGetFromElement(evt);
   }
@@ -485,7 +486,7 @@
    * @see com.google.gwt.user.client.ui.KeyboardListener
    */
   public static int eventGetKeyCode(Event evt) {
-    return impl.eventGetKeyCode(evt);
+    return evt.getKeyCode();
   }
 
   /**
@@ -495,7 +496,7 @@
    * @return <code>true</code> if META was depressed when the event occurred
    */
   public static boolean eventGetMetaKey(Event evt) {
-    return impl.eventGetMetaKey(evt);
+    return evt.getMetaKey();
   }
 
   /**
@@ -514,7 +515,7 @@
    * @return The velocity of the mouse wheel.
    */
   public static int eventGetMouseWheelVelocityY(Event evt) {
-    return impl.eventGetMouseWheelVelocityY(evt);
+    return evt.getMouseWheelVelocityY();
   }
 
   /**
@@ -522,7 +523,9 @@
    * 
    * @param evt the event to be tested
    * @return <code>true</code> if this key event was an auto-repeat
+   * @deprecated not supported in any browser but IE
    */
+  @Deprecated
   public static boolean eventGetRepeat(Event evt) {
     return impl.eventGetRepeat(evt);
   }
@@ -534,7 +537,7 @@
    * @return the mouse x-position
    */
   public static int eventGetScreenX(Event evt) {
-    return impl.eventGetScreenX(evt);
+    return evt.getScreenX();
   }
 
   /**
@@ -544,7 +547,7 @@
    * @return the mouse y-position
    */
   public static int eventGetScreenY(Event evt) {
-    return impl.eventGetScreenY(evt);
+    return evt.getScreenY();
   }
 
   /**
@@ -554,7 +557,7 @@
    * @return <code>true</code> if shift was depressed when the event occurred
    */
   public static boolean eventGetShiftKey(Event evt) {
-    return impl.eventGetShiftKey(evt);
+    return evt.getShiftKey();
   }
 
   /**
@@ -564,7 +567,7 @@
    * @return the target element
    */
   public static Element eventGetTarget(Event evt) {
-    return impl.eventGetTarget(evt);
+    return (Element) evt.getTarget();
   }
 
   /**
@@ -574,6 +577,7 @@
    * @param evt the event to be tested
    * @return the element to which the mouse pointer was moved
    */
+
   public static Element eventGetToElement(Event evt) {
     return impl.eventGetToElement(evt);
   }
@@ -595,7 +599,7 @@
    * @return the event's type name
    */
   public static String eventGetTypeString(Event evt) {
-    return impl.eventGetType(evt);
+    return evt.getType();
   }
 
   /**
@@ -604,7 +608,7 @@
    * @param evt the event whose default action is to be prevented
    */
   public static void eventPreventDefault(Event evt) {
-    impl.eventPreventDefault(evt);
+    evt.preventDefault();
   }
 
   /**
@@ -628,7 +632,7 @@
    * @return a string form of the event
    */
   public static String eventToString(Event evt) {
-    return impl.eventToString(evt);
+    return evt.getString();
   }
 
   /**
@@ -1264,7 +1268,6 @@
    * @param evt a handle to the event being previewed
    * @return <code>false</code> to cancel the event
    */
-  @SuppressWarnings("deprecation")
   static boolean previewEvent(Event evt) {
     // Fire a NativePreviewEvent to NativePreviewHandlers
     boolean ret = Event.fireNativePreviewEvent(evt);
diff --git a/user/src/com/google/gwt/user/client/Event.java b/user/src/com/google/gwt/user/client/Event.java
index 2a72281..2872167 100644
--- a/user/src/com/google/gwt/user/client/Event.java
+++ b/user/src/com/google/gwt/user/client/Event.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.user.client;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.HasNativeEvent;
 import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.GwtEvent;
@@ -33,7 +33,8 @@
  * calling methods in the {@link com.google.gwt.user.client.DOM} class.
  * </p>
  */
-public class Event extends JavaScriptObject {
+public class Event extends NativeEvent {
+
   /**
    * Represents a preview of a native {@link Event}.
    */
@@ -69,8 +70,8 @@
      * @param nativeEvent the native event
      * @return true to fire the event normally, false to cancel the event
      */
-    private static boolean fire(HandlerManager handlers, Event nativeEvent) {
-      if (TYPE != null && handlers != null) {
+    private static boolean fire(HandlerManager handlers, NativeEvent nativeEvent) {
+      if (TYPE != null && handlers != null && handlers.isEventHandled(TYPE)) {
         // Revive the event
         singleton.revive();
         singleton.setNativeEvent(nativeEvent);
@@ -102,7 +103,7 @@
     /**
      * The event being previewed.
      */
-    private Event nativeEvent;
+    private NativeEvent nativeEvent;
 
     /**
      * Cancel the native event and prevent it from firing. Note that the event
@@ -130,11 +131,21 @@
       return TYPE;
     }
 
-    public Event getNativeEvent() {
+    public NativeEvent getNativeEvent() {
       return nativeEvent;
     }
 
     /**
+     * Gets the type int corresponding to the native event that triggered this
+     * preview.
+     * 
+     * @return the type int associated with this native event
+     */
+    public final int getTypeInt() {
+      return Event.as(getNativeEvent()).getTypeInt();
+    }
+
+    /**
      * Has the event already been canceled? Note that {@link #isConsumed()} will
      * still return true if the native event has also been consumed.
      * 
@@ -185,7 +196,7 @@
      * 
      * @param nativeEvent the native {@link Event} being previewed.
      */
-    private void setNativeEvent(Event nativeEvent) {
+    private void setNativeEvent(NativeEvent nativeEvent) {
       this.nativeEvent = nativeEvent;
     }
   }
@@ -203,21 +214,6 @@
   }
 
   /**
-   * The left mouse button (used in {@link DOM#eventGetButton(Event)}).
-   */
-  public static final int BUTTON_LEFT = 1;
-
-  /**
-   * The middle mouse button (used in {@link DOM#eventGetButton(Event)}).
-   */
-  public static final int BUTTON_MIDDLE = 4;
-
-  /**
-   * The right mouse button (used in {@link DOM#eventGetButton(Event)}).
-   */
-  public static final int BUTTON_RIGHT = 2;
-
-  /**
    * Fired when an element loses keyboard focus.
    */
   public static final int ONBLUR = 0x01000;
@@ -398,6 +394,25 @@
   }
 
   /**
+   * Converts the {@link NativeEvent} to Event. This is always safe.
+   * 
+   * @param event the event to downcast
+   */
+  public static Event as(NativeEvent event) {
+    return (Event) event;
+  }
+
+  /**
+   * Fire a {@link NativePreviewEvent} for the native event.
+   * 
+   * @param nativeEvent the native event
+   * @return true to fire the event normally, false to cancel the event
+   */
+  public static boolean fireNativePreviewEvent(NativeEvent nativeEvent) {
+    return NativePreviewEvent.fire(handlers, nativeEvent);
+  }
+
+  /**
    * Gets the current event that is being fired. The current event is only
    * available within the lifetime of the onBrowserEvent function. Once the
    * onBrowserEvent method returns, the current event is reset to null.
@@ -420,6 +435,40 @@
   }
 
   /**
+   * Gets the x coordinate relative to the given element.
+   * 
+   * @param nativeEvent the native event
+   * @param relativeTo the relative element
+   * @return the relative x
+   */
+  public static int getRelativeX(NativeEvent nativeEvent, Element relativeTo) {
+    return nativeEvent.getClientX() - relativeTo.getAbsoluteLeft()
+        + relativeTo.getScrollLeft() + Window.getScrollLeft();
+  }
+
+  /**
+   * Gets the y coordinate relative to the given element.
+   * 
+   * @param nativeEvent the native event
+   * @param relativeTo the relative element
+   * @return the relative y
+   */
+  public static int getRelativeY(NativeEvent nativeEvent, Element relativeTo) {
+    return nativeEvent.getClientY() - relativeTo.getAbsoluteTop()
+        + relativeTo.getScrollTop() + Window.getScrollTop();
+  }
+
+  /**
+   * Gets the enumerated type of this event given a valid event type name.
+   * 
+   * @param typeName the typeName to be tested
+   * @return the event's enumerated type
+   */
+  public static int getTypeInt(String typeName) {
+    return DOM.impl.eventGetTypeInt(typeName);
+  }
+
+  /**
    * Releases mouse capture on the given element. Calling this method has no
    * effect if the element does not currently have mouse capture.
    * 
@@ -467,16 +516,6 @@
   }
 
   /**
-   * Fire a {@link NativePreviewEvent} for the native event.
-   * 
-   * @param nativeEvent the native event
-   * @return true to fire the event normally, false to cancel the event
-   */
-  static boolean fireNativePreviewEvent(Event nativeEvent) {
-    return NativePreviewEvent.fire(handlers, nativeEvent);
-  }
-
-  /**
    * Not directly instantiable. Subclasses should also define a protected no-arg
    * constructor to prevent client code from directly instantiating the class.
    */
@@ -494,52 +533,6 @@
   }
 
   /**
-   * Gets whether the ALT key was depressed when the given event occurred.
-   * 
-   * @return <code>true</code> if ALT was depressed when the event occurred
-   */
-  public final boolean getAltKey() {
-    return DOM.eventGetAltKey(this);
-  }
-
-  /**
-   * Gets the mouse buttons that were depressed when the given event occurred.
-   * 
-   * @return a bit-field, defined by {@link Event#BUTTON_LEFT},
-   *         {@link Event#BUTTON_MIDDLE}, and {@link Event#BUTTON_RIGHT}
-   */
-  public final int getButton() {
-    return DOM.eventGetButton(this);
-  }
-
-  /**
-   * Gets the mouse x-position within the browser window's client area.
-   * 
-   * @return the mouse x-position
-   */
-  public final int getClientX() {
-    return DOM.eventGetClientX(this);
-  }
-
-  /**
-   * Gets the mouse y-position within the browser window's client area.
-   * 
-   * @return the mouse y-position
-   */
-  public final int getClientY() {
-    return DOM.eventGetClientY(this);
-  }
-
-  /**
-   * Gets whether the CTRL key was depressed when the given event occurred.
-   * 
-   * @return <code>true</code> if CTRL was depressed when the event occurred
-   */
-  public final boolean getCtrlKey() {
-    return DOM.eventGetCtrlKey(this);
-  }
-
-  /**
    * Gets the current target element of this event. This is the element whose
    * listener fired last, not the element which fired the event initially.
    * 
@@ -553,132 +546,38 @@
    * Gets the element from which the mouse pointer was moved (only valid for
    * {@link Event#ONMOUSEOVER}).
    * 
+   * @deprecated use {@link NativeEvent#getRelatedTarget()} instead
    * @return the element from which the mouse pointer was moved
    */
+  @Deprecated
   public final Element getFromElement() {
     return DOM.eventGetFromElement(this);
   }
 
   /**
-   * Gets the key code associated with this event.
-   * 
-   * <p>
-   * For {@link Event#ONKEYPRESS}, this method returns the Unicode value of the
-   * character generated. For {@link Event#ONKEYDOWN} and {@link Event#ONKEYUP},
-   * it returns the code associated with the physical key.
-   * </p>
-   * 
-   * @return the Unicode character or key code.
-   * @see com.google.gwt.event.dom.client.KeyCodes
-   */
-  public final int getKeyCode() {
-    return DOM.eventGetKeyCode(this);
-  }
-
-  /**
-   * Gets whether the META key was depressed when the given event occurred.
-   * 
-   * @return <code>true</code> if META was depressed when the event occurred
-   */
-  public final boolean getMetaKey() {
-    return DOM.eventGetMetaKey(this);
-  }
-
-  /**
-   * Gets the velocity of the mouse wheel associated with the event along the Y
-   * axis.
-   * <p>
-   * The velocity of the event is an artifical measurement for relative
-   * comparisons of wheel activity. It is affected by some non-browser factors,
-   * including choice of input hardware and mouse acceleration settings. The
-   * sign of the velocity measurement agrees with the screen coordinate system;
-   * negative values are towards the origin and positive values are away from
-   * the origin. Standard scrolling speed is approximately ten units per event.
-   * </p>
-   * 
-   * @return The velocity of the mouse wheel.
-   */
-  public final int getMouseWheelVelocityY() {
-    return DOM.eventGetMouseWheelVelocityY(this);
-  }
-
-  /**
    * Gets the key-repeat state of this event.
    * 
    * @return <code>true</code> if this key event was an auto-repeat
+   * @deprecated not supported on all browsers
    */
+  @Deprecated
   public final boolean getRepeat() {
     return DOM.eventGetRepeat(this);
   }
 
   /**
-   * Gets the mouse x-position on the user's display.
-   * 
-   * @return the mouse x-position
-   */
-  public final int getScreenX() {
-    return DOM.eventGetScreenX(this);
-  }
-
-  /**
-   * Gets the mouse y-position on the user's display.
-   * 
-   * @return the mouse y-position
-   */
-  public final int getScreenY() {
-    return DOM.eventGetScreenY(this);
-  }
-
-  /**
-   * Gets whether the shift key was depressed when the given event occurred.
-   * 
-   * @return <code>true</code> if shift was depressed when the event occurred
-   */
-  public final boolean getShiftKey() {
-    return DOM.eventGetShiftKey(this);
-  }
-
-  /**
-   * Gets a string representation of this event.
-   * 
-   * We do not override {@link #toString()} because it is final in
-   * {@link JavaScriptObject}.
-   * 
-   * @return the string representation of this event
-   */
-  public final String getString() {
-    return DOM.eventToString(this);
-  }
-
-  /**
-   * Returns the element that was the actual target of the given event.
-   * 
-   * @return the target element
-   */
-  public final Element getTarget() {
-    return DOM.eventGetTarget(this);
-  }
-
-  /**
    * Gets the element to which the mouse pointer was moved (only valid for
    * {@link Event#ONMOUSEOUT}).
    * 
+   * @deprecated use {@link NativeEvent#getRelatedTarget()} instead
    * @return the element to which the mouse pointer was moved
    */
+  @Deprecated
   public final Element getToElement() {
     return DOM.eventGetToElement(this);
   }
 
   /**
-   * Gets the enumerated type of this event (as defined in {@link Event}).
-   * 
-   * @return the event's enumerated type
-   */
-  public final String getType() {
-    return DOM.eventGetTypeString(this);
-  }
-
-  /**
    * Gets the enumerated type of this event, as defined by {@link #ONCLICK},
    * {@link #ONMOUSEDOWN}, and so forth.
    * 
@@ -687,11 +586,4 @@
   public final int getTypeInt() {
     return DOM.eventGetType(this);
   }
-
-  /**
-   * Prevents the browser from taking its default action for the given event.
-   */
-  public final void preventDefault() {
-    DOM.eventPreventDefault(this);
-  }
 }
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImpl.java b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
index 09ffb25..93e170f 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImpl.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
@@ -28,8 +28,8 @@
   protected static boolean eventSystemIsInitialized;
 
   /**
-   * Returns <code>true</code>if the object is an instance of EventListener
-   * and the object belongs to this module.
+   * Returns <code>true</code>if the object is an instance of EventListener and
+   * the object belongs to this module.
    */
   protected static boolean isMyListener(Object object) {
     /*
@@ -47,104 +47,54 @@
 
   public native void eventCancelBubble(Event evt, boolean cancel) /*-{
     evt.cancelBubble = cancel;
-   }-*/;
+  }-*/;
 
-  public native boolean eventGetAltKey(Event evt) /*-{
-    return !!evt.altKey;
-   }-*/;
-
-  public native int eventGetButton(Event evt) /*-{
-    return evt.button || 0;
-   }-*/;
-
-  public native int eventGetClientX(Event evt) /*-{
-    return evt.clientX || 0;
-   }-*/;
-
-  public native int eventGetClientY(Event evt) /*-{
-    return evt.clientY || 0;
-   }-*/;
-
-  public native boolean eventGetCtrlKey(Event evt) /*-{
-    return !!evt.ctrlKey;
-   }-*/;
-
+  
   public native Element eventGetCurrentTarget(Event evt) /*-{
     return evt.currentTarget;
-   }-*/;
+  }-*/;
 
   public abstract Element eventGetFromElement(Event evt);
-
-  public native int eventGetKeyCode(Event evt) /*-{
-    // 'which' gives the right key value, except when it doesn't -- in which
-    // case, keyCode gives the right value on all browsers.
-    // If all else fails, return an error code
-    return evt.which || evt.keyCode || 0;
-   }-*/;
-
-  public native boolean eventGetMetaKey(Event evt) /*-{
-    return !!evt.metaKey;
-   }-*/;
-
-  public abstract int eventGetMouseWheelVelocityY(Event evt);
-
+  
   public native boolean eventGetRepeat(Event evt) /*-{
     return !!evt.repeat;
-   }-*/;
-
-  public native int eventGetScreenX(Event evt) /*-{
-    return evt.screenX || 0;
-   }-*/;
-
-  public native int eventGetScreenY(Event evt) /*-{
-    return evt.screenY || 0;
-   }-*/;
-
-  public native boolean eventGetShiftKey(Event evt) /*-{
-    return !!evt.shiftKey;
-   }-*/;
-
-  public abstract Element eventGetTarget(Event evt);
-
+  }-*/; 
+ 
   public abstract Element eventGetToElement(Event evt);
 
-  public native String eventGetType(Event evt) /*-{
-    return evt.type;
-   }-*/;
-
-  public native int eventGetTypeInt(Event evt) /*-{
-      switch (evt.type) {
-        case "blur": return 0x01000;
-        case "change": return 0x00400;
-        case "click": return 0x00001;
-        case "dblclick": return 0x00002;
-        case "focus": return 0x00800;
-        case "keydown": return 0x00080;
-        case "keypress": return 0x00100;
-        case "keyup": return 0x00200;
-        case "load": return 0x08000;
-        case "losecapture": return 0x02000;
-        case "mousedown": return 0x00004;
-        case "mousemove": return 0x00040;
-        case "mouseout": return 0x00020;
-        case "mouseover": return 0x00010;
-        case "mouseup": return 0x00008;
-        case "scroll": return 0x04000;
-        case "error": return 0x10000;
-        case "mousewheel": return 0x20000;
-        case "DOMMouseScroll": return 0x20000;
-        case "contextmenu": return 0x40000;
-      }
-    }-*/;
-
-  public abstract void eventPreventDefault(Event evt);
-
+  public final int eventGetTypeInt(Event evt) {
+    return eventGetTypeInt(evt.getType());
+  }
+  
+  public native int eventGetTypeInt(String eventType) /*-{
+    switch (eventType) {
+    case "blur": return 0x01000;
+    case "change": return 0x00400;
+    case "click": return 0x00001;
+    case "dblclick": return 0x00002;
+    case "focus": return 0x00800;
+    case "keydown": return 0x00080;
+    case "keypress": return 0x00100;
+    case "keyup": return 0x00200;
+    case "load": return 0x08000;
+    case "losecapture": return 0x02000;
+    case "mousedown": return 0x00004;
+    case "mousemove": return 0x00040;
+    case "mouseout": return 0x00020;
+    case "mouseover": return 0x00010;
+    case "mouseup": return 0x00008;
+    case "scroll": return 0x04000;
+    case "error": return 0x10000;
+    case "mousewheel": return 0x20000;
+    case "DOMMouseScroll": return 0x20000;
+    case "contextmenu": return 0x40000;
+    }
+  }-*/; 
+  
   public native void eventSetKeyCode(Event evt, char key) /*-{
-      evt.keyCode = key;
-    }-*/;
-
-  public abstract String eventToString(Event evt);
-
+    evt.keyCode = key;
+  }-*/;
+ 
   public abstract Element getChild(Element elem, int index);
 
   public abstract int getChildCount(Element elem);
@@ -152,8 +102,8 @@
   public abstract int getChildIndex(Element parent, Element child);
 
   public native int getEventsSunk(Element elem) /*-{
-      return elem.__eventBits || 0;
-    }-*/;
+    return elem.__eventBits || 0;
+  }-*/;
 
   public abstract void insertChild(Element parent, Element child, int index);
 
@@ -169,8 +119,8 @@
   public abstract void setCapture(Element elem);
 
   public native void setEventListener(Element elem, EventListener listener) /*-{
-      elem.__listener = listener;
-    }-*/;
+    elem.__listener = listener;
+  }-*/;
 
   public abstract void sinkEvents(Element elem, int eventBits);
 
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
index 8cd05bf..634c74d 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
@@ -44,33 +44,15 @@
     return evt.fromElement;
   }-*/;
 
-  @Override
-  public native int eventGetMouseWheelVelocityY(Event evt) /*-{
-    return Math.round(-evt.wheelDelta / 40) || 0;
-  }-*/;
+  
 
-  @Override
-  public native Element eventGetTarget(Event evt) /*-{
-    return evt.srcElement;
-  }-*/;
-
+  
   @Override
   public native Element eventGetToElement(Event evt) /*-{
     return evt.toElement;
   }-*/;
 
   @Override
-  public native void eventPreventDefault(Event evt) /*-{
-    evt.returnValue = false;
-  }-*/;
-
-  @Override
-  public native String eventToString(Event evt) /*-{
-    if (evt.toString) return evt.toString();
-      return "[object Event]";
-  }-*/;
-
-  @Override
   public native Element getChild(Element elem, int index) /*-{
     return elem.children[index];
   }-*/;
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java b/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
index 20892b7..a647aa1 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
@@ -16,7 +16,6 @@
 package com.google.gwt.user.client.impl;
 
 import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
 
 /**
  * Mozilla implementation of StandardBrowser.
@@ -24,11 +23,6 @@
 class DOMImplMozilla extends DOMImplStandard {
 
   @Override
-  public native int eventGetMouseWheelVelocityY(Event evt) /*-{
-    return evt.detail || 0;
-  }-*/;
-
-  @Override
   public void sinkEvents(Element elem, int bits) {
     super.sinkEvents(elem, bits);
     sinkEventsMozilla(elem, bits);
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java b/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
index d94dbc8..8261d77 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
@@ -16,18 +16,11 @@
 package com.google.gwt.user.client.impl;
 
 import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
 
 /**
  * Opera implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
  */
 public class DOMImplOpera extends DOMImplStandard {
-
-  @Override
-  public native int eventGetMouseWheelVelocityY(Event evt) /*-{
-    return evt.detail * 4 || 0;
-  }-*/;
-
   /**
    * As Opera sinks events very quickly, adding guards to prevent the sinking of
    * events actually slows Opera down.
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
index 1b7e3b55..16ab0ed 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,47 +15,8 @@
  */
 package com.google.gwt.user.client.impl;
 
-import com.google.gwt.user.client.Event;
-
 /**
  * Safari implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
  */
 class DOMImplSafari extends DOMImplStandard {
-
-  @Override
-  public native int eventGetClientX(Event evt) /*-{
-    // In Safari2: clientX is wrong and pageX is returned instead.
-    // $wnd.devicePixelRatio identifies Safari 3 from Safari 2
-    if ($wnd.devicePixelRatio) {
-      return evt.clientX || 0;
-    } else {
-      // Subtract the margin and border of the HTML element in Safari 2 
-      // TODO: Remove this code when we drop Safari 2 support
-      var style = document.defaultView.getComputedStyle($doc.getElementsByTagName('html')[0], '');
-      return evt.pageX - $doc.body.scrollLeft
-          - parseInt(style.getPropertyValue('margin-left'))
-          - parseInt(style.getPropertyValue('border-left-width')) || 0;
-    }
-  }-*/;
-
-  @Override
-  public native int eventGetClientY(Event evt) /*-{
-    // In Safari2: clientY is wrong and pageY is returned instead.
-    // $wnd.devicePixelRatio identifies Safari 3 from Safari 2
-    if ($wnd.devicePixelRatio) {
-      return evt.clientY || 0;
-    } else {
-      // Subtract the margin and border of the HTML element in Safari 2 
-      // TODO: Remove this code when we drop Safari 2 support
-      var style = document.defaultView.getComputedStyle($doc.getElementsByTagName('html')[0], '');
-      return evt.pageY - $doc.body.scrollTop
-          - parseInt(style.getPropertyValue('margin-top'))
-          - parseInt(style.getPropertyValue('border-top-width')) || 0;
-    }
-  }-*/;
-
-  @Override
-  public native int eventGetMouseWheelVelocityY(Event evt) /*-{
-    return Math.round(-evt.wheelDelta / 40) || 0;
-  }-*/;
 }
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
index 5d2be3c..3fa1553 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -39,19 +39,6 @@
   private static JavaScriptObject dispatchEvent;
 
   @Override
-  public native int eventGetButton(Event evt) /*-{
-    // Standard browsers and IE disagree on what the button codes for buttons
-    // should be.  Translating to match IE standard.
-    var button = evt.which;
-    if(button == 2) {
-      return 4;
-    } else if (button == 3) {
-      return 2;
-    }
-    return button || 0;
-  }-*/;
-
-  @Override
   public native Element eventGetFromElement(Event evt) /*-{
     if (evt.type == "mouseover")
       return evt.relatedTarget;
@@ -59,12 +46,7 @@
       return evt.target;
     return null;  
   }-*/;
-
-  @Override
-  public native Element eventGetTarget(Event evt) /*-{
-    return evt.target;
-  }-*/;
-
+ 
   @Override
   public native Element eventGetToElement(Event evt) /*-{
     if (evt.type == "mouseover")
@@ -73,17 +55,7 @@
       return evt.relatedTarget;
     return null;
   }-*/;
-
-  @Override
-  public native void eventPreventDefault(Event evt) /*-{
-    evt.preventDefault();
-  }-*/;
-
-  @Override
-  public native String eventToString(Event evt) /*-{
-    return evt.toString();
-  }-*/;
-
+  
   @Override
   public native Element getChild(Element elem, int index) /*-{
     var count = 0, child = elem.firstChild;
diff --git a/user/src/com/google/gwt/user/client/ui/DialogBox.java b/user/src/com/google/gwt/user/client/ui/DialogBox.java
index e1d3e34..a5bde38 100644
--- a/user/src/com/google/gwt/user/client/ui/DialogBox.java
+++ b/user/src/com/google/gwt/user/client/ui/DialogBox.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.HasAllMouseHandlers;
 import com.google.gwt.event.dom.client.MouseDownEvent;
 import com.google.gwt.event.dom.client.MouseDownHandler;
@@ -45,10 +46,11 @@
  * <img class='gallery' src='DialogBox.png'/>
  * </p>
  * <h3>CSS Style Rules</h3>
- * <ul class='css'>
+ * 
+ * <ul>
  * <li>.gwt-DialogBox { the outside of the dialog }</li>
  * <li>.gwt-DialogBox .Caption { the caption }</li>
- * <li>.gwt-DialogBox .dialogContent { the wrapepr around the content }</li>
+ * <li>.gwt-DialogBox .dialogContent { the wrapper around the content }</li>
  * <li>.gwt-DialogBox .dialogTopLeft { the top left cell }</li>
  * <li>.gwt-DialogBox .dialogTopLeftInner { the inner element of the cell }</li>
  * <li>.gwt-DialogBox .dialogTopCenter { the top center cell, where the caption
@@ -60,15 +62,18 @@
  * <li>.gwt-DialogBox .dialogMiddleLeftInner { the inner element of the cell }</li>
  * <li>.gwt-DialogBox .dialogMiddleCenter { the middle center cell, where the
  * content is located }</li>
- * <li>.gwt-DialogBox .dialogMiddleCenterInner { the inner element of the cell }</li>
+ * <li>.gwt-DialogBox .dialogMiddleCenterInner { the inner element of the cell }
+ * </li>
  * <li>.gwt-DialogBox .dialogMiddleRight { the middle right cell }</li>
  * <li>.gwt-DialogBox .dialogMiddleRightInner { the inner element of the cell }</li>
  * <li>.gwt-DialogBox .dialogBottomLeft { the bottom left cell }</li>
  * <li>.gwt-DialogBox .dialogBottomLeftInner { the inner element of the cell }</li>
  * <li>.gwt-DialogBox .dialogBottomCenter { the bottom center cell }</li>
- * <li>.gwt-DialogBox .dialogBottomCenterInner { the inner element of the cell }</li>
+ * <li>.gwt-DialogBox .dialogBottomCenterInner { the inner element of the cell }
+ * </li>
  * <li>.gwt-DialogBox .dialogBottomRight { the bottom right cell }</li>
  * <li>.gwt-DialogBox .dialogBottomRightInner { the inner element of the cell }</li>
+ * </ul>
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.DialogBoxExample}
@@ -79,7 +84,7 @@
     MouseListener {
   /**
    * Set of characteristic interfaces supported by the {@link DialogBox} caption
-   *
+   * 
    * Note that this set might expand over time, so implement this interface at
    * your own risk.
    */
@@ -141,7 +146,7 @@
    * {@link #add(Widget)}.
    * 
    * @param autoHide <code>true</code> if the dialog should be automatically
-   * hidden when the user clicks outside of it
+   *          hidden when the user clicks outside of it
    */
   public DialogBox(boolean autoHide) {
     this(autoHide, true);
@@ -153,9 +158,9 @@
    * {@link #add(Widget)}.
    * 
    * @param autoHide <code>true</code> if the dialog should be automatically
-   * hidden when the user clicks outside of it
+   *          hidden when the user clicks outside of it
    * @param modal <code>true</code> if keyboard and mouse events for widgets not
-   * contained by the dialog should be ignored
+   *          contained by the dialog should be ignored
    */
   public DialogBox(boolean autoHide, boolean modal) {
     super(autoHide, modal, "dialog");
@@ -184,10 +189,10 @@
 
   /**
    * Provides access to the dialog's caption.
-   *
+   * 
    * This method is final because the Caption interface will expand. Therefore
-   * it is highly likely that subclasses which implemented this method would end up
-   * breaking.
+   * it is highly likely that subclasses which implemented this method would end
+   * up breaking.
    * 
    * @return the logical caption for this dialog box
    */
@@ -232,7 +237,7 @@
 
   /**
    * @deprecated Use {@link #beginDragging} instead and {@link #getCaption}
-   * instead
+   *             instead
    */
   @Deprecated
   public void onMouseDown(Widget sender, int x, int y) {
@@ -324,8 +329,8 @@
    * @param event the mouse down event that triggered dragging
    */
   protected void beginDragging(MouseDownEvent event) {
-    onMouseDown(caption, event.getRelativeX(getElement()),
-        event.getRelativeY(getElement()));
+    onMouseDown(caption, Event.getRelativeX(event.getNativeEvent(),
+        getElement()), Event.getRelativeY(event.getNativeEvent(), getElement()));
   }
 
   /**
@@ -337,8 +342,8 @@
    * @param event the mouse move event that continues dragging
    */
   protected void continueDragging(MouseMoveEvent event) {
-    onMouseMove(caption, event.getRelativeX(getElement()),
-        event.getRelativeY(getElement()));
+    onMouseMove(caption, Event.getRelativeX(event.getNativeEvent(),
+        getElement()), Event.getRelativeY(event.getNativeEvent(), getElement()));
   }
 
   @Override
@@ -363,15 +368,17 @@
   /**
    * Called on mouse up in the caption area, ends dragging by ending event
    * capture.
-   * @param event  the mouse up event that ended dragging
+   * 
+   * @param event the mouse up event that ended dragging
    * 
    * @see DOM#releaseCapture
    * @see #beginDragging
    * @see #endDragging
    */
   protected void endDragging(MouseUpEvent event) {
-    onMouseUp(caption, event.getRelativeX(getElement()),
-        event.getRelativeY(getElement()));
+    onMouseUp(caption,
+        Event.getRelativeX(event.getNativeEvent(), getElement()),
+        Event.getRelativeY(event.getNativeEvent(), getElement()));
   }
 
   /**
@@ -395,8 +402,10 @@
     // We need to preventDefault() on mouseDown events (outside of the
     // DialogBox content) to keep text from being selected when it
     // is dragged.
-    Event nativeEvent = event.getNativeEvent();
-    if (!event.isCanceled() && nativeEvent.getTypeInt() == Event.ONMOUSEDOWN
+    NativeEvent nativeEvent = event.getNativeEvent();
+
+    if (!event.isCanceled()
+        && (event.getTypeInt() == Event.ONMOUSEDOWN)
         && isCaptionEvent(nativeEvent)) {
       nativeEvent.preventDefault();
     }
@@ -404,7 +413,7 @@
     super.onPreviewNativeEvent(event);
   }
 
-  private boolean isCaptionEvent(Event event) {
+  private boolean isCaptionEvent(NativeEvent event) {
     return getCellElement(0, 1).getParentElement().isOrHasChild(
         event.getTarget());
   }
diff --git a/user/src/com/google/gwt/user/client/ui/FlexTable.java b/user/src/com/google/gwt/user/client/ui/FlexTable.java
index b2ecb0a..402bf81 100644
--- a/user/src/com/google/gwt/user/client/ui/FlexTable.java
+++ b/user/src/com/google/gwt/user/client/ui/FlexTable.java
@@ -98,7 +98,7 @@
       var cell = $doc.createElement("td");
       rowElem.appendChild(cell);  
     }
- }-*/;
+  }-*/;
 
   public FlexTable() {
     super();
@@ -172,9 +172,6 @@
     return super.insertRow(beforeRow);
   }
 
-  /**
-   * @see com.google.gwt.user.client.ui.HTMLTable#removeCell(int, int)
-   */
   @Override
   public void removeCell(int row, int col) {
     super.removeCell(row, col);
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLTable.java b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
index 51eb0a3..f5efad3 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -754,7 +754,7 @@
    * @return The appropriate cell, or null
    */
   public Cell getCellForEvent(ClickEvent event) {
-    Element td = getEventTargetCell(event.getNativeEvent());
+    Element td = getEventTargetCell(Event.as(event.getNativeEvent()));
     if (td == null) {
       return null;
     }
diff --git a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
index ed2aff7..2feaea5 100644
--- a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
@@ -80,6 +80,7 @@
 import com.google.gwt.event.shared.HandlerManager;

 import com.google.gwt.event.shared.GwtEvent.Type;

 import com.google.gwt.user.client.BaseListenerWrapper;

+import com.google.gwt.user.client.Event;

 

 import java.util.EventListener;

 

@@ -98,8 +99,8 @@
   /**

    * Wrapper for a {@link LoadListener}.

    */

-  public static class WrappedLoadListener extends ListenerWrapper<LoadListener> implements

-      LoadHandler, ErrorHandler {

+  public static class WrappedLoadListener extends ListenerWrapper<LoadListener>

+      implements LoadHandler, ErrorHandler {

 

     /**

      * Adds the wrapped listener.

@@ -341,14 +342,14 @@
       getListener().onKeyDown(

           getSource(event),

           (char) event.getNativeKeyCode(),

-          KeyboardListenerCollection.getKeyboardModifiers(event.getNativeEvent()));

+          KeyboardListenerCollection.getKeyboardModifiers(Event.as(event.getNativeEvent())));

     }

 

     public void onKeyPress(KeyPressEvent event) {

       getListener().onKeyPress(

           getSource(event),

           (char) event.getNativeEvent().getKeyCode(),

-          KeyboardListenerCollection.getKeyboardModifiers(event.getNativeEvent()));

+          KeyboardListenerCollection.getKeyboardModifiers(Event.as(event.getNativeEvent())));

     }

 

     public void onKeyUp(KeyUpEvent event) {

@@ -356,7 +357,7 @@
       getListener().onKeyUp(

           getSource(event),

           (char) event.getNativeKeyCode(),

-          KeyboardListenerCollection.getKeyboardModifiers(event.getNativeEvent()));

+          KeyboardListenerCollection.getKeyboardModifiers(Event.as(event.getNativeEvent())));

     }

   }

 

@@ -463,15 +464,15 @@
     public void onMouseDown(MouseDownEvent event) {

       Widget source = getSource(event);

       Element elem = source.getElement();

-      getListener().onMouseDown(source, event.getRelativeX(elem),

-          event.getRelativeY(elem));

+      getListener().onMouseDown(source, Event.getRelativeX(event.getNativeEvent(), elem),

+          Event.getRelativeY(event.getNativeEvent(), elem));

     }

 

     public void onMouseMove(MouseMoveEvent event) {

       Widget source = getSource(event);

       Element elem = source.getElement();

-      getListener().onMouseMove(source, event.getRelativeX(elem),

-          event.getRelativeY(elem));

+      getListener().onMouseMove(source, Event.getRelativeX(event.getNativeEvent(), elem),

+          Event.getRelativeY(event.getNativeEvent(), elem));

     }

 

     public void onMouseOut(MouseOutEvent event) {

@@ -485,8 +486,8 @@
     public void onMouseUp(MouseUpEvent event) {

       Widget source = getSource(event);

       Element elem = source.getElement();

-      getListener().onMouseUp(source, event.getRelativeX(elem),

-          event.getRelativeY(elem));

+      getListener().onMouseUp(source, Event.getRelativeX(event.getNativeEvent(), elem),

+          Event.getRelativeY(event.getNativeEvent(), elem));

     }

   }

   /**

@@ -530,7 +531,7 @@
 

     public void onMouseWheel(MouseWheelEvent event) {

       getListener().onMouseWheel(getSource(event),

-          new MouseWheelVelocity(event.getNativeEvent()));

+          new MouseWheelVelocity(Event.as(event.getNativeEvent())));

     }

   }

   /**

diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index 0bf2173..a9fa5b3 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -979,8 +979,7 @@
     // clear the selection; a keyboard user can cursor down to the first item
     selectItem(null);
   }
-
-  @SuppressWarnings("deprecation")
+ 
   private void openPopup(final MenuItem item) {
     // Only the last popup to be opened should preview all event
     if (parentMenu != null && parentMenu.popup != null) {
@@ -1002,12 +1001,12 @@
         // Hook the popup panel's event preview. We use this to keep it from
         // auto-hiding when the parent menu is clicked.
         if (!event.isCanceled()) {
-          Event nativeEvent = event.getNativeEvent();
-          switch (nativeEvent.getTypeInt()) {
+
+          switch (event.getTypeInt()) {
             case Event.ONMOUSEDOWN:
               // If the event target is part of the parent menu, suppress the
               // event altogether.
-              com.google.gwt.dom.client.Element target = nativeEvent.getTarget();
+              com.google.gwt.dom.client.Element target = event.getNativeEvent().getTarget();
               Element parentMenuElement = item.getParentMenu().getElement();
               if (parentMenuElement.isOrHasChild(target)) {
                 event.cancel();
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index 986f45a..640aa87 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.logical.shared.CloseEvent;
 import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.event.logical.shared.HasCloseHandlers;
@@ -822,14 +823,11 @@
   protected com.google.gwt.user.client.Element getStyleElement() {
     return impl.getStyleElement(getPopupImplElement());
   }
-
-  /**
-   * @see NativePreviewHandler#onPreviewNativeEvent(NativePreviewEvent)
-   */
-  @SuppressWarnings("deprecation")
+ 
   protected void onPreviewNativeEvent(NativePreviewEvent event) {
     // Cancel the event based on the deprecated onEventPreview() method
-    if (event.isFirstHandler() && !onEventPreview(event.getNativeEvent())) {
+    if (event.isFirstHandler()
+        && !onEventPreview(Event.as(event.getNativeEvent()))) {
       event.cancel();
     }
   }
@@ -898,7 +896,7 @@
    * @param event the native event
    * @return true if the event targets a partner
    */
-  private boolean eventTargetsPartner(Event event) {
+  private boolean eventTargetsPartner(NativeEvent event) {
     if (autoHidePartners == null) {
       return false;
     }
@@ -918,7 +916,7 @@
    * @param event the native event
    * @return true if the event targets the popup
    */
-  private boolean eventTargetsPopup(Event event) {
+  private boolean eventTargetsPopup(NativeEvent event) {
     return getElement().isOrHasChild(event.getTarget());
   }
 
@@ -1087,7 +1085,7 @@
     }
 
     // If the event targets the popup or the partner, consume it
-    Event nativeEvent = event.getNativeEvent();
+    Event nativeEvent = Event.as(event.getNativeEvent());
     boolean eventTargetsPopupOrPartner = eventTargetsPopup(nativeEvent)
         || eventTargetsPartner(nativeEvent);
     if (eventTargetsPopupOrPartner) {
diff --git a/user/src/com/google/gwt/user/client/ui/SourcesKeyboardEvents.java b/user/src/com/google/gwt/user/client/ui/SourcesKeyboardEvents.java
index 37f0ff2..78e1052 100644
--- a/user/src/com/google/gwt/user/client/ui/SourcesKeyboardEvents.java
+++ b/user/src/com/google/gwt/user/client/ui/SourcesKeyboardEvents.java
@@ -20,7 +20,7 @@
  * {@link com.google.gwt.user.client.ui.KeyboardListener} interface.
  * 
  * @deprecated use
- *             {@link com.google.gwt.com.google.gwt.event.dom.client.HasAllKeyHandlers}
+ *             {@link com.google.gwt.event.dom.client.HasAllKeyHandlers}
  *             instead
  */
 @Deprecated
diff --git a/user/src/com/google/gwt/user/client/ui/Widget.java b/user/src/com/google/gwt/user/client/ui/Widget.java
index 2bcf44a..5933672 100644
--- a/user/src/com/google/gwt/user/client/ui/Widget.java
+++ b/user/src/com/google/gwt/user/client/ui/Widget.java
@@ -77,22 +77,18 @@
       case Event.ONMOUSEOVER:
         // Only fire the mouse over event if it's coming from outside this
         // widget.
-        Element from = event.getFromElement();
-        if (from != null && getElement().isOrHasChild(from)) {
+      case Event.ONMOUSEOUT:
+        // Only fire the mouse out event if it's leaving this
+        // widget.
+        Element related = event.getRelatedTarget();
+        if (related != null && getElement().isOrHasChild(related)) {
           return;
         }
         break;
-      case Event.ONMOUSEOUT:
-        // Only fire the mouse out event if it's actually leaving this
-        // widget.
-        Element to = event.getToElement();
-        if (to != null && getElement().isOrHasChild(to)) {
-          return;
-        }
     }
     DomEvent.fireNativeEvent(event, this);
   }
-
+ 
   /**
    * Removes this widget from its parent widget. If it has no parent, this
    * method does nothing.
@@ -113,7 +109,8 @@
    * Overridden to defer the call to super.sinkEvents until the first time this
    * widget is attached to the dom, as a performance enhancement. Subclasses
    * wishing to customize sinkEvents can preserve this deferred sink behavior by
-   * putting their implementation behind a check of <code>isOrWasAttached()</code>:
+   * putting their implementation behind a check of
+   * <code>isOrWasAttached()</code>:
    * 
    * <pre>
    * {@literal @}Override
@@ -148,7 +145,7 @@
       final H handler, DomEvent.Type<H> type) {
     assert handler != null : "handler must not be null";
     assert type != null : "type must not be null";
-    sinkEvents(type.getEventToSink());
+    sinkEvents(Event.getTypeInt(type.getName()));
     return ensureHandlers().addHandler(type, handler);
   }
 
diff --git a/user/test/com/google/gwt/event/shared/HandlerTestBase.java b/user/test/com/google/gwt/event/shared/HandlerTestBase.java
index 303ff12..80e551b 100644
--- a/user/test/com/google/gwt/event/shared/HandlerTestBase.java
+++ b/user/test/com/google/gwt/event/shared/HandlerTestBase.java
@@ -29,6 +29,7 @@
  */

 public abstract class HandlerTestBase extends GWTTestCase {

 

+  @Override

   public String getModuleName() {

     return "com.google.gwt.event.Event";

   }