This commit makes listener wrapper public. It also switching the default
conversion of TextBox.addChangeListener from a custom addDomHandler
solution to TextBox.addValueChangeHandler, details can be found at http://gwt-code-reviews.appspot.com/2207
Review by:jlabanca

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4495 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/BaseListenerWrapper.java b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
new file mode 100644
index 0000000..686cf20
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
@@ -0,0 +1,243 @@
+/*

+ * 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

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

+ * the License.

+ */

+

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

+

+import com.google.gwt.event.logical.shared.CloseEvent;

+import com.google.gwt.event.logical.shared.CloseHandler;

+import com.google.gwt.event.logical.shared.ResizeEvent;

+import com.google.gwt.event.logical.shared.ResizeHandler;

+import com.google.gwt.event.logical.shared.ValueChangeEvent;

+import com.google.gwt.event.logical.shared.ValueChangeHandler;

+import com.google.gwt.event.shared.EventHandler;

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

+import com.google.gwt.event.shared.HandlerManager;

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

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

+import com.google.gwt.user.client.ui.Widget;

+

+/**

+ * Legacy listener support hierarchy root.

+ * 

+ * Note, this class and its subtypes all assume that the handlers are stored in

+ * handler managers.

+ * 

+ * This class, and its children are used to gather the bulk of the legacy glue

+ * code in one place, for easy deletion when Listener methods are deleted.

+ * 

+ * @param <T> listener type to be wrapped

+ * @deprecated will be removed in GWT 2.0 with the handler listeners themselves

+ */

+@Deprecated

+public abstract class BaseListenerWrapper<T> implements EventHandler {

+

+  static class NativePreview extends BaseListenerWrapper<EventPreview>

+      implements Event.NativePreviewHandler {

+    @Deprecated

+    public static void add(EventPreview listener) {

+      Event.addNativePreviewHandler(new NativePreview(listener));

+    }

+

+    public static void remove(EventPreview listener) {

+      baseRemove(Event.handlers, listener, NativePreviewEvent.getType());

+    }

+

+    private NativePreview(EventPreview listener) {

+      super(listener);

+    }

+

+    public void onPreviewNativeEvent(NativePreviewEvent event) {

+      // 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())) {

+          event.cancel();

+        }

+      }

+    }

+  }

+

+  static class WrapHistory extends BaseListenerWrapper<HistoryListener>

+      implements ValueChangeHandler<String> {

+    @Deprecated

+    public static void add(HistoryListener listener) {

+      History.addValueChangeHandler(new WrapHistory(listener));

+    }

+

+    public static void remove(HandlerManager manager, HistoryListener listener) {

+      baseRemove(manager, listener, ValueChangeEvent.getType());

+    }

+

+    private WrapHistory(HistoryListener listener) {

+      super(listener);

+    }

+

+    public void onValueChange(ValueChangeEvent<String> event) {

+      listener.onHistoryChanged(event.getValue());

+    }

+  }

+

+  static class WrapWindowClose extends BaseListenerWrapper<WindowCloseListener>

+      implements Window.ClosingHandler, CloseHandler<Window> {

+    @Deprecated

+    public static void add(WindowCloseListener listener) {

+      WrapWindowClose handler = new WrapWindowClose(listener);

+      Window.addWindowClosingHandler(handler);

+      Window.addCloseHandler(handler);

+    }

+

+    public static void remove(HandlerManager manager,

+        WindowCloseListener listener) {

+      baseRemove(manager, listener, Window.ClosingEvent.getType(),

+          CloseEvent.getType());

+    }

+

+    private WrapWindowClose(WindowCloseListener listener) {

+      super(listener);

+    }

+

+    public void onClose(CloseEvent<Window> event) {

+      listener.onWindowClosed();

+    }

+

+    public void onWindowClosing(Window.ClosingEvent event) {

+      String message = listener.onWindowClosing();

+      if (event.getMessage() == null) {

+        event.setMessage(message);

+      }

+    }

+  }

+

+  static class WrapWindowResize extends

+      BaseListenerWrapper<WindowResizeListener> implements ResizeHandler {

+    @Deprecated

+    public static void add(WindowResizeListener listener) {

+      Window.addResizeHandler(new WrapWindowResize(listener));

+    }

+

+    public static void remove(HandlerManager manager,

+        WindowResizeListener listener) {

+      baseRemove(manager, listener, ResizeEvent.getType());

+    }

+

+    private WrapWindowResize(WindowResizeListener listener) {

+      super(listener);

+    }

+

+    public void onResize(ResizeEvent event) {

+      listener.onWindowResized(event.getWidth(), event.getHeight());

+    }

+  }

+

+  static class WrapWindowScroll extends

+      BaseListenerWrapper<WindowScrollListener> implements Window.ScrollHandler {

+    @Deprecated

+    public static void add(WindowScrollListener listener) {

+      Window.addWindowScrollHandler(new WrapWindowScroll(listener));

+    }

+

+    public static void remove(HandlerManager manager,

+        WindowScrollListener listener) {

+      baseRemove(manager, listener, Window.ScrollEvent.getType());

+    }

+

+    private WrapWindowScroll(WindowScrollListener listener) {

+      super(listener);

+    }

+

+    public void onWindowScroll(Window.ScrollEvent event) {

+      listener.onWindowScrolled(event.getScrollLeft(), event.getScrollTop());

+    }

+  }

+

+  /**

+   * Helper method to remove all wrapped listeners from the given event types.

+   * 

+   * @param manager the manager to remove the listener from

+   * @param listener the listener

+   * @param types the event types to remove the listener from

+   * @param <H>

+   */

+  // This is an internal helper method with the current formulation, we have

+  // lost the info needed to make it safe by this point.

+  @SuppressWarnings("unchecked")

+  protected static <H extends EventHandler> void baseRemove(

+      HandlerManager manager, Object listener, Type... types) {

+    if (manager != null) {

+      for (Type<H> key : types) {

+        int handlerCount = manager.getHandlerCount(key);

+        // We are removing things as we traverse, have to go backward

+        for (int i = handlerCount - 1; i >= 0; i--) {

+          H handler = manager.getHandler(key, i);

+          if (handler instanceof BaseListenerWrapper

+              && ((BaseListenerWrapper) handler).listener.equals(listener)) {

+            manager.removeHandler(key, handler);

+          }

+        }

+      }

+    }

+  }

+

+  /**

+   * Listener being wrapped.

+   */

+  final T listener;

+

+  private Widget source;

+

+  /**

+   * Creates a new listener wrapper.

+   * 

+   * @param listener the listener to wrap

+   */

+  protected BaseListenerWrapper(T listener) {

+    this.listener = listener;

+  }

+

+  /**

+   * Sets the widget source to pass to the listeners. Source defaults to

+   * event.getSource() if this method is not used.

+   * 

+   * @param source the source to provide as the listener's source

+   */

+  public void setSource(Widget source) {

+    this.source = source;

+  }

+

+  /**

+   * Gets the listener being wrapped.

+   * 

+   * @return the wrapped listener

+   */

+  protected T getListener() {

+    return listener;

+  }

+

+  /**

+   * Gets the widget source to pass to the listeners. Source defaults to

+   * event.getSource() if not specified by {@link #setSource(Widget)}.

+   * 

+   * @param event the event

+   * @return source the source to provide as the listener's source

+   */

+  protected Widget getSource(GwtEvent<?> event) {

+    if (source == null) {

+      return (Widget) event.getSource();

+    } else {

+      return source;

+    }

+  }

+}

diff --git a/user/src/com/google/gwt/user/client/DOM.java b/user/src/com/google/gwt/user/client/DOM.java
index a51597c..7840ff3 100644
--- a/user/src/com/google/gwt/user/client/DOM.java
+++ b/user/src/com/google/gwt/user/client/DOM.java
@@ -48,7 +48,7 @@
    */
   @Deprecated
   public static void addEventPreview(EventPreview preview) {
-    ListenerWrapper.NativePreview.add(preview);
+    BaseListenerWrapper.NativePreview.add(preview);
   }
 
   /**
@@ -998,7 +998,7 @@
    */
   @Deprecated
   public static void removeEventPreview(EventPreview preview) {
-    ListenerWrapper.NativePreview.remove(preview);
+    BaseListenerWrapper.NativePreview.remove(preview);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/History.java b/user/src/com/google/gwt/user/client/History.java
index 795ed67..e62bf8c 100644
--- a/user/src/com/google/gwt/user/client/History.java
+++ b/user/src/com/google/gwt/user/client/History.java
@@ -81,7 +81,7 @@
    */
   @Deprecated
   public static void addHistoryListener(HistoryListener listener) {
-    ListenerWrapper.HistoryChange.add(listener);
+    BaseListenerWrapper.WrapHistory.add(listener);
   }
 
   /**
@@ -193,6 +193,6 @@
    */
   @Deprecated
   public static void removeHistoryListener(HistoryListener listener) {
-    ListenerWrapper.HistoryChange.remove(impl.getHandlers(), listener);
+    BaseListenerWrapper.WrapHistory.remove(impl.getHandlers(), listener);
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ListenerWrapper.java b/user/src/com/google/gwt/user/client/ListenerWrapper.java
deleted file mode 100644
index 77f51ad..0000000
--- a/user/src/com/google/gwt/user/client/ListenerWrapper.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * 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
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.user.client;
-
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.logical.shared.ResizeEvent;
-import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.event.logical.shared.ValueChangeEvent;
-import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.event.shared.EventHandler;
-import com.google.gwt.event.shared.HandlerManager;
-import com.google.gwt.event.shared.GwtEvent.Type;
-import com.google.gwt.user.client.Event.NativePreviewEvent;
-
-/**
- * Legacy listener support for <code>com.google.gwt.user.client</code>. Gathers
- * the bulk of the legacy glue code in one place, for easy deletion when
- * Listener methods are deleted.
- * 
- * @param <T> listener type
- */
-@Deprecated
-abstract class ListenerWrapper<T> implements EventHandler {
-  public static class HistoryChange extends ListenerWrapper<HistoryListener>
-      implements ValueChangeHandler<String> {
-    @Deprecated
-    public static void add(HistoryListener listener) {
-      History.addValueChangeHandler(new HistoryChange(listener));
-    }
-
-    public static void remove(HandlerManager manager, HistoryListener listener) {
-      baseRemove(manager, listener, ValueChangeEvent.getType());
-    }
-
-    private HistoryChange(HistoryListener listener) {
-      super(listener);
-    }
-
-    public void onValueChange(ValueChangeEvent<String> event) {
-      listener.onHistoryChanged(event.getValue());
-    }
-  }
-
-  public static class NativePreview extends ListenerWrapper<EventPreview>
-      implements Event.NativePreviewHandler {
-    @Deprecated
-    public static void add(EventPreview listener) {
-      Event.addNativePreviewHandler(new NativePreview(listener));
-    }
-
-    public static void remove(EventPreview listener) {
-      baseRemove(Event.handlers, listener, NativePreviewEvent.getType());
-    }
-
-    private NativePreview(EventPreview listener) {
-      super(listener);
-    }
-
-    public void onPreviewNativeEvent(NativePreviewEvent event) {
-      // 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())) {
-          event.cancel();
-        }
-      }
-    }
-  }
-
-  public static class WindowClose extends ListenerWrapper<WindowCloseListener>
-      implements Window.ClosingHandler, CloseHandler<Window> {
-    @Deprecated
-    public static void add(WindowCloseListener listener) {
-      WindowClose handler = new WindowClose(listener);
-      Window.addWindowClosingHandler(handler);
-      Window.addCloseHandler(handler);
-    }
-
-    public static void remove(HandlerManager manager,
-        WindowCloseListener listener) {
-      baseRemove(manager, listener, Window.ClosingEvent.getType(),
-          CloseEvent.getType());
-    }
-
-    private WindowClose(WindowCloseListener listener) {
-      super(listener);
-    }
-
-    public void onClose(CloseEvent<Window> event) {
-      listener.onWindowClosed();
-    }
-
-    public void onWindowClosing(Window.ClosingEvent event) {
-      String message = listener.onWindowClosing();
-      if (event.getMessage() == null) {
-        event.setMessage(message);
-      }
-    }
-  }
-
-  public static class WindowResize extends
-      ListenerWrapper<WindowResizeListener> implements ResizeHandler {
-    @Deprecated
-    public static void add(WindowResizeListener listener) {
-      Window.addResizeHandler(new WindowResize(listener));
-    }
-
-    public static void remove(HandlerManager manager,
-        WindowResizeListener listener) {
-      baseRemove(manager, listener, ResizeEvent.getType());
-    }
-
-    private WindowResize(WindowResizeListener listener) {
-      super(listener);
-    }
-
-    public void onResize(ResizeEvent event) {
-      listener.onWindowResized(event.getWidth(), event.getHeight());
-    }
-  }
-
-  public static class WindowScroll extends
-      ListenerWrapper<WindowScrollListener> implements Window.ScrollHandler {
-    @Deprecated
-    public static void add(WindowScrollListener listener) {
-      Window.addWindowScrollHandler(new WindowScroll(listener));
-    }
-
-    public static void remove(HandlerManager manager,
-        WindowScrollListener listener) {
-      baseRemove(manager, listener, Window.ScrollEvent.getType());
-    }
-
-    private WindowScroll(WindowScrollListener listener) {
-      super(listener);
-    }
-
-    public void onWindowScroll(Window.ScrollEvent event) {
-      listener.onWindowScrolled(event.getScrollLeft(), event.getScrollTop());
-    }
-  }
-
-  // This is an internal helper method with the current formulation, we have
-  // lost the info needed to make it safe by this point.
-  @SuppressWarnings("unchecked")
-  // This is a direct copy of the baseRemove from
-  // com.google.gwt.user.client.ui.ListenerWrapper. Change in parallel.
-  static <H extends EventHandler> void baseRemove(HandlerManager manager,
-      Object listener, Type... keys) {
-    if (manager != null) {
-      for (Type<H> key : keys) {
-        int handlerCount = manager.getHandlerCount(key);
-        // We are removing things as we traverse, have to go backward
-        for (int i = handlerCount - 1; i >= 0; i--) {
-          H handler = manager.getHandler(key, i);
-          if (handler instanceof ListenerWrapper
-              && ((ListenerWrapper) handler).listener.equals(listener)) {
-            manager.removeHandler(key, handler);
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Listener being wrapped.
-   */
-  protected final T listener;
-
-  protected ListenerWrapper(T listener) {
-    this.listener = listener;
-  }
-}
diff --git a/user/src/com/google/gwt/user/client/Window.java b/user/src/com/google/gwt/user/client/Window.java
index 8f966f5..d90ed9b 100644
--- a/user/src/com/google/gwt/user/client/Window.java
+++ b/user/src/com/google/gwt/user/client/Window.java
@@ -431,7 +431,7 @@
    */
   @Deprecated
   public static void addWindowCloseListener(WindowCloseListener listener) {
-    ListenerWrapper.WindowClose.add(listener);
+    BaseListenerWrapper.WrapWindowClose.add(listener);
   }
 
   /**
@@ -454,7 +454,7 @@
    */
   @Deprecated
   public static void addWindowResizeListener(WindowResizeListener listener) {
-    ListenerWrapper.WindowResize.add(listener);
+    BaseListenerWrapper.WrapWindowResize.add(listener);
   }
 
   /**
@@ -478,7 +478,7 @@
    */
   @Deprecated
   public static void addWindowScrollListener(WindowScrollListener listener) {
-    ListenerWrapper.WindowScroll.add(listener);
+    BaseListenerWrapper.WrapWindowScroll.add(listener);
   }
 
   /**
@@ -601,7 +601,7 @@
    */
   @Deprecated
   public static void removeWindowCloseListener(WindowCloseListener listener) {
-    ListenerWrapper.WindowClose.remove(handlers, listener);
+    BaseListenerWrapper.WrapWindowClose.remove(handlers, listener);
   }
 
   /**
@@ -611,7 +611,7 @@
    */
   @Deprecated
   public static void removeWindowResizeListener(WindowResizeListener listener) {
-    ListenerWrapper.WindowResize.remove(handlers, listener);
+    BaseListenerWrapper.WrapWindowResize.remove(handlers, listener);
   }
 
   /**
@@ -621,7 +621,7 @@
    */
   @Deprecated
   public static void removeWindowScrollListener(WindowScrollListener listener) {
-    ListenerWrapper.WindowScroll.remove(handlers, listener);
+    BaseListenerWrapper.WrapWindowScroll.remove(handlers, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/impl/ElementMapperImpl.java b/user/src/com/google/gwt/user/client/impl/ElementMapperImpl.java
index f595008..e5dba7c 100644
--- a/user/src/com/google/gwt/user/client/impl/ElementMapperImpl.java
+++ b/user/src/com/google/gwt/user/client/impl/ElementMapperImpl.java
@@ -70,12 +70,17 @@
     return uiObjectList.get(index);

   }

 

+  /**

+   * Gets the list of ui objects contained in this element mapper.

+   * 

+   * @return the list of ui objects

+   */

   public ArrayList<T> getObjectList() {

     return uiObjectList;

   }

 

   /**

-   * Creates an iterator from the ui objects stored within

+   * Creates an iterator from the ui objects stored within.

    * 

    * @return an iterator of the ui objects indexed by this element mapper.

    */

@@ -116,4 +121,4 @@
     uiObjectList.set(index, null);

     freeList = new FreeNode(index, freeList);

   }

-}
\ No newline at end of file
+}

diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
index 87cbbea..2c1cf74 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
@@ -369,7 +369,7 @@
    */
   @Deprecated
   public void addEventHandler(final DisclosureHandler handler) {
-    ListenerWrapper.Disclosure.add(this, handler);
+    ListenerWrapper.WrappedOldDisclosureHandler.add(this, handler);
   }
 
   public HandlerRegistration addOpenHandler(OpenHandler<DisclosurePanel> handler) {
@@ -443,7 +443,7 @@
    */
   @Deprecated
   public void removeEventHandler(DisclosureHandler handler) {
-    ListenerWrapper.Disclosure.remove(this, handler);
+    ListenerWrapper.WrappedOldDisclosureHandler.remove(this, handler);
   }
 
   public void setAnimationEnabled(boolean enable) {
diff --git a/user/src/com/google/gwt/user/client/ui/FocusPanel.java b/user/src/com/google/gwt/user/client/ui/FocusPanel.java
index a0665f6..37dd2dc 100644
--- a/user/src/com/google/gwt/user/client/ui/FocusPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FocusPanel.java
@@ -77,7 +77,7 @@
 
   @Deprecated
   public void addClickListener(ClickListener listener) {
-    ListenerWrapper.Click.add(this, listener);
+    ListenerWrapper.WrappedClickListener.add(this, listener);
   }
 
   public HandlerRegistration addFocusHandler(FocusHandler handler) {
@@ -86,12 +86,12 @@
 
   @Deprecated
   public void addFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.add(this, listener);
+    ListenerWrapper.WrappedFocusListener.add(this, listener);
   }
 
   @Deprecated
   public void addKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.add(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.add(this, listener);
   }
 
   public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
@@ -112,7 +112,7 @@
 
   @Deprecated
   public void addMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.add(this, listener);
+    ListenerWrapper.WrappedMouseListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
@@ -137,7 +137,7 @@
 
   @Deprecated
   public void addMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.add(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.add(this, listener);
   }
 
   public int getTabIndex() {
@@ -146,27 +146,27 @@
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(this, listener);
+    ListenerWrapper.WrappedClickListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.remove(this, listener);
+    ListenerWrapper.WrappedFocusListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.remove(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.remove(this, listener);
+    ListenerWrapper.WrappedMouseListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.remove(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.remove(this, listener);
   }
 
   public void setAccessKey(char key) {
diff --git a/user/src/com/google/gwt/user/client/ui/FocusWidget.java b/user/src/com/google/gwt/user/client/ui/FocusWidget.java
index 7cdcb13..9ed6c6c 100644
--- a/user/src/com/google/gwt/user/client/ui/FocusWidget.java
+++ b/user/src/com/google/gwt/user/client/ui/FocusWidget.java
@@ -93,7 +93,7 @@
 
   @Deprecated
   public void addClickListener(ClickListener listener) {
-    ListenerWrapper.Click.add(this, listener);
+    ListenerWrapper.WrappedClickListener.add(this, listener);
   }
 
   public HandlerRegistration addFocusHandler(FocusHandler handler) {
@@ -102,12 +102,12 @@
 
   @Deprecated
   public void addFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.add(this, listener);
+    ListenerWrapper.WrappedFocusListener.add(this, listener);
   }
 
   @Deprecated
   public void addKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.add(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.add(this, listener);
   }
 
   public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
@@ -128,7 +128,7 @@
 
   @Deprecated
   public void addMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.add(this, listener);
+    ListenerWrapper.WrappedMouseListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
@@ -153,7 +153,7 @@
 
   @Deprecated
   public void addMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.add(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.add(this, listener);
   }
 
   /**
@@ -176,27 +176,27 @@
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(this, listener);
+    ListenerWrapper.WrappedClickListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.remove(this, listener);
+    ListenerWrapper.WrappedFocusListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.remove(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.remove(this, listener);
+    ListenerWrapper.WrappedMouseListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.remove(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.remove(this, listener);
   }
 
   public void setAccessKey(char key) {
diff --git a/user/src/com/google/gwt/user/client/ui/FormPanel.java b/user/src/com/google/gwt/user/client/ui/FormPanel.java
index d810ef8..c1353c8 100644
--- a/user/src/com/google/gwt/user/client/ui/FormPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FormPanel.java
@@ -404,7 +404,7 @@
 
   @Deprecated
   public void addFormHandler(FormHandler handler) {
-    ListenerWrapper.Form.add(this, handler);
+    ListenerWrapper.WrappedOldFormHandler.add(this, handler);
   }
 
   /**
@@ -494,7 +494,7 @@
 
   @Deprecated
   public void removeFormHandler(FormHandler handler) {
-    ListenerWrapper.Form.remove(this, handler);
+    ListenerWrapper.WrappedOldFormHandler.remove(this, handler);
   }
 
   /**
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 be27082..51eb0a3 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -704,7 +704,7 @@
    */
   @Deprecated
   public void addTableListener(TableListener listener) {
-    ListenerWrapper.Table.add(this, listener);
+    ListenerWrapper.WrappedTableListener.add(this, listener);
   }
 
   /**
@@ -958,7 +958,7 @@
    */
   @Deprecated
   public void removeTableListener(TableListener listener) {
-    ListenerWrapper.Table.remove(this, listener);
+    ListenerWrapper.WrappedTableListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/Hyperlink.java b/user/src/com/google/gwt/user/client/ui/Hyperlink.java
index 7bb6109..ca070a3 100644
--- a/user/src/com/google/gwt/user/client/ui/Hyperlink.java
+++ b/user/src/com/google/gwt/user/client/ui/Hyperlink.java
@@ -115,7 +115,7 @@
 
   @Deprecated
   public void addClickListener(ClickListener listener) {
-    ListenerWrapper.Click.add(this, listener);
+    ListenerWrapper.WrappedClickListener.add(this, listener);
   }
 
   public String getHTML() {
@@ -147,7 +147,7 @@
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(this, listener);
+    ListenerWrapper.WrappedClickListener.remove(this, listener);
   }
 
   public void setHTML(String html) {
diff --git a/user/src/com/google/gwt/user/client/ui/Image.java b/user/src/com/google/gwt/user/client/ui/Image.java
index 7ddfeff..ee62223 100644
--- a/user/src/com/google/gwt/user/client/ui/Image.java
+++ b/user/src/com/google/gwt/user/client/ui/Image.java
@@ -422,7 +422,7 @@
 
   @Deprecated
   public void addClickListener(ClickListener listener) {
-    ListenerWrapper.Click.add(this, listener);
+    ListenerWrapper.WrappedClickListener.add(this, listener);
   }
 
   public HandlerRegistration addErrorHandler(ErrorHandler handler) {
@@ -435,7 +435,7 @@
 
   @Deprecated
   public void addLoadListener(LoadListener listener) {
-    ListenerWrapper.Load.add(this, listener);
+    ListenerWrapper.WrappedLoadListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
@@ -444,7 +444,7 @@
 
   @Deprecated
   public void addMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.add(this, listener);
+    ListenerWrapper.WrappedMouseListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
@@ -469,7 +469,7 @@
 
   @Deprecated
   public void addMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.add(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.add(this, listener);
   }
 
   /**
@@ -533,22 +533,22 @@
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(this, listener);
+    ListenerWrapper.WrappedClickListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeLoadListener(LoadListener listener) {
-    ListenerWrapper.Load.remove(this, listener);
+    ListenerWrapper.WrappedLoadListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.remove(this, listener);
+    ListenerWrapper.WrappedMouseListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.remove(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/Label.java b/user/src/com/google/gwt/user/client/ui/Label.java
index 89a7ef9..9166b7b 100644
--- a/user/src/com/google/gwt/user/client/ui/Label.java
+++ b/user/src/com/google/gwt/user/client/ui/Label.java
@@ -130,7 +130,7 @@
 
   @Deprecated
   public void addClickListener(ClickListener listener) {
-    ListenerWrapper.Click.add(this, listener);
+    ListenerWrapper.WrappedClickListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
@@ -139,7 +139,7 @@
 
   @Deprecated
   public void addMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.add(this, listener);
+    ListenerWrapper.WrappedMouseListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
@@ -164,7 +164,7 @@
 
   @Deprecated
   public void addMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.add(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.add(this, listener);
   }
 
   public Direction getDirection() {
@@ -185,17 +185,17 @@
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(this, listener);
+    ListenerWrapper.WrappedClickListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.remove(this, listener);
+    ListenerWrapper.WrappedMouseListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseWheelListener(MouseWheelListener listener) {
-    ListenerWrapper.MouseWheel.remove(this, listener);
+    ListenerWrapper.WrappedMouseWheelListener.remove(this, listener);
   }
 
   public void setDirection(Direction direction) {
diff --git a/user/src/com/google/gwt/user/client/ui/ListBox.java b/user/src/com/google/gwt/user/client/ui/ListBox.java
index d94c1f3..cd40ef3 100644
--- a/user/src/com/google/gwt/user/client/ui/ListBox.java
+++ b/user/src/com/google/gwt/user/client/ui/ListBox.java
@@ -106,8 +106,8 @@
 
   @Deprecated
   public void addChangeListener(ChangeListener listener) {
-    addChangeHandler(new ListenerWrapper.Change(listener));
-  }
+    ListenerWrapper.WrappedChangeListener.add(this, listener);
+   }
 
   /**
    * Adds an item to the list box. This method has the same effect as
@@ -259,7 +259,7 @@
 
   @Deprecated
   public void removeChangeListener(ChangeListener listener) {
-    ListenerWrapper.Change.remove(this, listener);
+    ListenerWrapper.WrappedChangeListener.remove(this, listener);
   }
 
   /**
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 8e32780..ed2aff7 100644
--- a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
@@ -69,15 +69,17 @@
 import com.google.gwt.event.logical.shared.CloseEvent;

 import com.google.gwt.event.logical.shared.CloseHandler;

 import com.google.gwt.event.logical.shared.HasCloseHandlers;

+import com.google.gwt.event.logical.shared.HasValueChangeHandlers;

 import com.google.gwt.event.logical.shared.OpenEvent;

 import com.google.gwt.event.logical.shared.OpenHandler;

 import com.google.gwt.event.logical.shared.SelectionEvent;

 import com.google.gwt.event.logical.shared.SelectionHandler;

 import com.google.gwt.event.logical.shared.ValueChangeEvent;

+import com.google.gwt.event.logical.shared.ValueChangeHandler;

 import com.google.gwt.event.shared.EventHandler;

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

 import com.google.gwt.event.shared.HandlerManager;

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

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

 

 import java.util.EventListener;

 

@@ -86,59 +88,506 @@
  * <code>com.google.gwt.user.client.ui</code>. Gathers the bulk of the legacy

  * glue code in one place, for easy deletion when Listener methods are deleted.

  * 

- * @see com.google.gwt.user.client.L

+ * 

  * @param <T> listener type

+ * @deprecated will be removed in GWT 2.0 with the handler listeners themselves

  */

 @Deprecated

-abstract class ListenerWrapper<T> implements EventHandler {

+public abstract class ListenerWrapper<T> extends BaseListenerWrapper<T> {

 

-  public static class Change extends ListenerWrapper<ChangeListener> implements

-      ChangeHandler {

+  /**

+   * Wrapper for a {@link LoadListener}.

+   */

+  public static class WrappedLoadListener extends ListenerWrapper<LoadListener> implements

+      LoadHandler, ErrorHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param <S> the source of the events

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

     @Deprecated

-    public static void add(HasChangeHandlers source, ChangeListener listener) {

-      source.addChangeHandler(new Change(listener));

+    public static <S extends HasLoadHandlers & HasErrorHandlers> WrappedLoadListener add(

+        S source, LoadListener listener) {

+      WrappedLoadListener l = new WrappedLoadListener(listener);

+      source.addLoadHandler(l);

+      source.addErrorHandler(l);

+      return l;

     }

 

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, LoadListener listener) {

+      baseRemove(eventSource, listener, LoadEvent.getType(),

+          ErrorEvent.getType());

+    }

+

+    private WrappedLoadListener(LoadListener listener) {

+      super(listener);

+    }

+

+    public void onError(ErrorEvent event) {

+      getListener().onError(getSource(event));

+    }

+

+    public void onLoad(LoadEvent event) {

+      getListener().onLoad(getSource(event));

+    }

+  }

+  /**

+   * Wrapper for a {@link ChangeListener}.

+   * 

+   * @deprecated will be removed in GWT 2.0 along with the listeners being

+   *             wrapped

+   */

+  @Deprecated

+  public static class WrappedChangeListener extends

+      ListenerWrapper<ChangeListener> implements ChangeHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static WrappedChangeListener add(HasChangeHandlers source,

+        ChangeListener listener) {

+      WrappedChangeListener rtn = new WrappedChangeListener(listener);

+      source.addChangeHandler(rtn);

+      return rtn;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

     public static void remove(Widget eventSource, ChangeListener listener) {

       baseRemove(eventSource, listener, ChangeEvent.getType());

     }

 

-    protected Change(ChangeListener listener) {

+    WrappedChangeListener(ChangeListener listener) {

       super(listener);

     }

 

     public void onChange(ChangeEvent event) {

-      listener.onChange(source(event));

+      getListener().onChange(getSource(event));

     }

   }

 

-  public static class Click extends ListenerWrapper<ClickListener> implements

-      ClickHandler {

+  /**

+   * Wrapper for a {@link ClickListener}.

+   * 

+   * @deprecated will be removed in GWT 2.0 along with the listeners being

+   *             wrapped

+   */

+  @Deprecated

+  public static class WrappedClickListener extends

+      ListenerWrapper<ClickListener> implements ClickHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

     @Deprecated

-    public static Click add(HasClickHandlers source, ClickListener listener) {

-      Click rtn = new Click(listener);

+    public static WrappedClickListener add(HasClickHandlers source,

+        ClickListener listener) {

+      WrappedClickListener rtn = new WrappedClickListener(listener);

       source.addClickHandler(rtn);

       return rtn;

     }

 

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

     public static void remove(Widget eventSource, ClickListener listener) {

       baseRemove(eventSource, listener, ClickEvent.getType());

     }

 

-    private Click(ClickListener listener) {

+    private WrappedClickListener(ClickListener listener) {

       super(listener);

     }

 

     public void onClick(ClickEvent event) {

-      listener.onClick(source(event));

+      getListener().onClick(getSource(event));

+    }

+  }

+  /**

+   * Wrapper for a {@link FocusListener}.

+   */

+  public static class WrappedFocusListener extends

+      ListenerWrapper<FocusListener> implements FocusHandler, BlurHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param eventSource the event source

+     * @param listener the listener

+     * 

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static WrappedFocusListener add(HasAllFocusHandlers eventSource,

+        FocusListener listener) {

+      WrappedFocusListener rtn = new WrappedFocusListener(listener);

+      HandlesAllFocusEvents.handle(eventSource, rtn);

+      return rtn;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, FocusListener listener) {

+      baseRemove(eventSource, listener, LoadEvent.getType(),

+          ErrorEvent.getType());

+    }

+

+    private WrappedFocusListener(FocusListener listener) {

+      super(listener);

+    }

+

+    public void onBlur(BlurEvent event) {

+      getListener().onLostFocus(getSource(event));

+    }

+

+    public void onFocus(FocusEvent event) {

+      getListener().onFocus(getSource(event));

     }

   }

 

-  public static class Disclosure extends ListenerWrapper<DisclosureHandler>

-      implements CloseHandler<DisclosurePanel>, OpenHandler<DisclosurePanel> {

+  /**

+   * Wrapper for a {@link KeyboardListener}.

+   */

+  public static class WrappedKeyboardListener extends

+      ListenerWrapper<KeyboardListener> implements KeyDownHandler,

+      KeyUpHandler, KeyPressHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static WrappedKeyboardListener add(HasAllKeyHandlers source,

+        KeyboardListener listener) {

+      WrappedKeyboardListener b = new WrappedKeyboardListener(listener);

+      HandlesAllKeyEvents.addHandlers(source, b);

+      return b;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, KeyboardListener listener) {

+      ListenerWrapper.baseRemove(eventSource, listener, KeyDownEvent.getType(),

+          KeyUpEvent.getType(), KeyPressEvent.getType());

+    }

+

+    private WrappedKeyboardListener(KeyboardListener listener) {

+      super(listener);

+    }

+

+    public void onKeyDown(KeyDownEvent event) {

+      getListener().onKeyDown(

+          getSource(event),

+          (char) event.getNativeKeyCode(),

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

+    }

+

+    public void onKeyPress(KeyPressEvent event) {

+      getListener().onKeyPress(

+          getSource(event),

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

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

+    }

+

+    public void onKeyUp(KeyUpEvent event) {

+      getSource(event);

+      getListener().onKeyUp(

+          getSource(event),

+          (char) event.getNativeKeyCode(),

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

+    }

+  }

+

+  /**

+   * Wrapper for a {@link ChangeListener} being converted to a logical

+   * {@link ValueChangeHandler}.

+   * 

+   * @param <V> the type of the value changed

+   * 

+   * @deprecated will be removed in GWT 2.0 along with the listeners being

+   *             wrapped

+   */

+  @Deprecated

+  public static class WrappedLogicalChangeListener<V> extends

+      ListenerWrapper<ChangeListener> implements ValueChangeHandler<V> {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param <V> the type of value changed

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static <V> WrappedLogicalChangeListener<V> add(

+        HasValueChangeHandlers<V> source, ChangeListener listener) {

+      WrappedLogicalChangeListener<V> rtn = new WrappedLogicalChangeListener<V>(

+          listener);

+      source.addValueChangeHandler(rtn);

+      return rtn;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, ChangeListener listener) {

+      baseRemove(eventSource, listener, ValueChangeEvent.getType());

+    }

+

+    private WrappedLogicalChangeListener(ChangeListener listener) {

+      super(listener);

+    }

+

+    public void onValueChange(ValueChangeEvent<V> event) {

+      getListener().onChange(getSource(event));

+    }

+  }

+  /**

+   * Wrapper for a {@link MouseListener}.

+   */

+  public static class WrappedMouseListener extends

+      ListenerWrapper<MouseListener> implements MouseDownHandler,

+      MouseUpHandler, MouseOutHandler, MouseOverHandler, MouseMoveHandler {

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * @param <E> source of the handlers

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static <E extends HasMouseDownHandlers & HasMouseUpHandlers & HasMouseOutHandlers & HasMouseOverHandlers & HasMouseMoveHandlers> WrappedMouseListener add(

+        E source, MouseListener listener) {

+      WrappedMouseListener handlers = new WrappedMouseListener(listener);

+      source.addMouseDownHandler(handlers);

+      source.addMouseUpHandler(handlers);

+      source.addMouseOutHandler(handlers);

+      source.addMouseOverHandler(handlers);

+      source.addMouseMoveHandler(handlers);

+      return handlers;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, MouseListener listener) {

+      baseRemove(eventSource, listener, MouseDownEvent.getType(),

+          MouseUpEvent.getType(), MouseOverEvent.getType(),

+          MouseOutEvent.getType());

+    }

+

+    private WrappedMouseListener(MouseListener listener) {

+      super(listener);

+    }

+

+    public void onMouseDown(MouseDownEvent event) {

+      Widget source = getSource(event);

+      Element elem = source.getElement();

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

+          event.getRelativeY(elem));

+    }

+

+    public void onMouseMove(MouseMoveEvent event) {

+      Widget source = getSource(event);

+      Element elem = source.getElement();

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

+          event.getRelativeY(elem));

+    }

+

+    public void onMouseOut(MouseOutEvent event) {

+      getListener().onMouseLeave(getSource(event));

+    }

+

+    public void onMouseOver(MouseOverEvent event) {

+      getListener().onMouseEnter(getSource(event));

+    }

+

+    public void onMouseUp(MouseUpEvent event) {

+      Widget source = getSource(event);

+      Element elem = source.getElement();

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

+          event.getRelativeY(elem));

+    }

+  }

+  /**

+   * Wrapper for a {@link MouseWheelListener}.

+   */

+  public static class WrappedMouseWheelListener extends

+      ListenerWrapper<MouseWheelListener> implements MouseWheelHandler {

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static WrappedMouseWheelListener add(HasMouseWheelHandlers source,

+        MouseWheelListener listener) {

+      WrappedMouseWheelListener wrap = new WrappedMouseWheelListener(listener);

+      source.addMouseWheelHandler(new WrappedMouseWheelListener(listener));

+      return wrap;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, MouseWheelListener listener) {

+      baseRemove(eventSource, listener, MouseWheelEvent.getType());

+    }

+

+    private WrappedMouseWheelListener(MouseWheelListener listener) {

+      super(listener);

+    }

+

+    public void onMouseWheel(MouseWheelEvent event) {

+      getListener().onMouseWheel(getSource(event),

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

+    }

+  }

+  /**

+   * Wrapper for a {@link ScrollListener}.

+   */

+  public static class WrappedScrollListener extends

+      ListenerWrapper<ScrollListener> implements ScrollHandler {

+

+    /**

+     * Adds the wrapped listener.

+     * 

+     * @param source the event source

+     * @param listener the listener

+     * @return the wrapped listener

+     * 

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static WrappedScrollListener add(HasScrollHandlers source,

+        ScrollListener listener) {

+      WrappedScrollListener s = new WrappedScrollListener(listener);

+      source.addScrollHandler(s);

+      return s;

+    }

+

+    /**

+     * Removes the wrapped listener.

+     * 

+     * @param eventSource the event source from which to remove the wrapped

+     *          listener

+     * @param listener the listener to remove

+     * @deprecated will be removed in GWT 2.0 along with the listener classes

+     */

+    @Deprecated

+    public static void remove(Widget eventSource, ScrollListener listener) {

+      baseRemove(eventSource, listener, ScrollEvent.getType(),

+          ErrorEvent.getType());

+    }

+

+    private WrappedScrollListener(ScrollListener listener) {

+      super(listener);

+    }

+

+    public void onScroll(ScrollEvent event) {

+      Widget source = getSource(event);

+      Element elem = source.getElement();

+      getListener().onScroll(getSource(event), elem.getScrollLeft(),

+          elem.getScrollTop());

+    }

+  }

+  static class WrappedOldDisclosureHandler extends

+      ListenerWrapper<DisclosureHandler> implements

+      CloseHandler<DisclosurePanel>, OpenHandler<DisclosurePanel> {

 

     public static void add(DisclosurePanel source, DisclosureHandler listener) {

-      Disclosure handlers = new Disclosure(listener);

+      WrappedOldDisclosureHandler handlers = new WrappedOldDisclosureHandler(

+          listener);

       source.addOpenHandler(handlers);

       source.addCloseHandler(handlers);

     }

@@ -148,55 +597,26 @@
           OpenEvent.getType());

     }

 

-    private Disclosure(DisclosureHandler listener) {

+    private WrappedOldDisclosureHandler(DisclosureHandler listener) {

       super(listener);

     }

 

     public void onClose(CloseEvent<DisclosurePanel> event) {

-      listener.onClose(new DisclosureEvent((DisclosurePanel) event.getSource()));

+      getListener().onClose(

+          new DisclosureEvent((DisclosurePanel) event.getSource()));

     }

 

     public void onOpen(OpenEvent<DisclosurePanel> event) {

-      listener.onOpen(new DisclosureEvent((DisclosurePanel) event.getSource()));

+      getListener().onOpen(

+          new DisclosureEvent((DisclosurePanel) event.getSource()));

     }

   }

 

-  /*

-   * Handler wrapper for {@link FocusListener}.

-   */

-  public static class Focus extends ListenerWrapper<FocusListener> implements

-      FocusHandler, BlurHandler {

-

-    public static <EventSourceType extends Widget & HasAllFocusHandlers> Focus add(

-        EventSourceType source, FocusListener listener) {

-      Focus rtn = new Focus(listener);

-      HandlesAllFocusEvents.handle(source, rtn);

-      return rtn;

-    }

-

-    public static void remove(Widget eventSource, FocusListener listener) {

-      baseRemove(eventSource, listener, LoadEvent.getType(),

-          ErrorEvent.getType());

-    }

-

-    private Focus(FocusListener listener) {

-      super(listener);

-    }

-

-    public void onBlur(BlurEvent event) {

-      listener.onLostFocus(source(event));

-    }

-

-    public void onFocus(FocusEvent event) {

-      listener.onFocus(source(event));

-    }

-  }

-

-  public static class Form extends ListenerWrapper<FormHandler> implements

-      FormPanel.SubmitHandler, FormPanel.SubmitCompleteHandler {

+  static class WrappedOldFormHandler extends ListenerWrapper<FormHandler>

+      implements FormPanel.SubmitHandler, FormPanel.SubmitCompleteHandler {

 

     public static void add(FormPanel source, FormHandler listener) {

-      Form handlers = new Form(listener);

+      WrappedOldFormHandler handlers = new WrappedOldFormHandler(listener);

       source.addSubmitHandler(handlers);

       source.addSubmitCompleteHandler(handlers);

     }

@@ -206,203 +626,104 @@
           FormPanel.SubmitCompleteEvent.getType());

     }

 

-    private Form(FormHandler listener) {

+    private WrappedOldFormHandler(FormHandler listener) {

       super(listener);

     }

 

     public void onSubmit(FormPanel.SubmitEvent event) {

       FormSubmitEvent fse = new FormSubmitEvent((FormPanel) event.getSource());

-      listener.onSubmit(fse);

+      getListener().onSubmit(fse);

       if (fse.isSetCancelledCalled()) {

         event.setCanceled(fse.isCancelled());

       }

     }

 

     public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) {

-      listener.onSubmitComplete(new FormSubmitCompleteEvent(

-          (FormPanel) event.getSource(), event.getResults()));

+      getListener().onSubmitComplete(

+          new FormSubmitCompleteEvent((FormPanel) event.getSource(),

+              event.getResults()));

     }

   }

 

-  public static class Load extends ListenerWrapper<LoadListener> implements

-      LoadHandler, ErrorHandler {

-

-    public static <S extends HasLoadHandlers & HasErrorHandlers>void add(S source, LoadListener listener) {

-      Load l = new Load(listener);

-      source.addLoadHandler(l);

-      source.addErrorHandler(l);

-    }

-

-    public static void remove(Widget eventSource, LoadListener listener) {

-      baseRemove(eventSource, listener, LoadEvent.getType(),

-          ErrorEvent.getType());

-    }

-

-    private Load(LoadListener listener) {

-      super(listener);

-    }

-

-    public void onError(ErrorEvent event) {

-      listener.onError(source(event));

-    }

-

-    public void onLoad(LoadEvent event) {

-      listener.onLoad(source(event));

-    }

-  }

-

-  public static class Mouse extends ListenerWrapper<MouseListener> implements

-      MouseDownHandler, MouseUpHandler, MouseOutHandler, MouseOverHandler,

-      MouseMoveHandler {

-

-    public static <EventSourceType extends Widget & HasMouseDownHandlers & HasMouseUpHandlers & HasMouseOutHandlers & HasMouseOverHandlers & HasMouseMoveHandlers> void add(

-        EventSourceType source, MouseListener listener) {

-      Mouse handlers = new Mouse(listener);

-      source.addMouseDownHandler(handlers);

-      source.addMouseUpHandler(handlers);

-      source.addMouseOutHandler(handlers);

-      source.addMouseOverHandler(handlers);

-      source.addMouseMoveHandler(handlers);

-    }

-

-    public static void remove(Widget eventSource, MouseListener listener) {

-      baseRemove(eventSource, listener, MouseDownEvent.getType(),

-          MouseUpEvent.getType(), MouseOverEvent.getType(),

-          MouseOutEvent.getType());

-    }

-

-    private Mouse(MouseListener listener) {

-      super(listener);

-    }

-

-    public void onMouseDown(MouseDownEvent event) {

-      Widget source = source(event);

-      Element elem = source.getElement();

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

-          event.getRelativeY(elem));

-    }

-

-    public void onMouseMove(MouseMoveEvent event) {

-      Widget source = source(event);

-      Element elem = source.getElement();

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

-          event.getRelativeY(elem));

-    }

-

-    public void onMouseOut(MouseOutEvent event) {

-      listener.onMouseLeave(source(event));

-    }

-

-    public void onMouseOver(MouseOverEvent event) {

-      listener.onMouseEnter(source(event));

-    }

-

-    public void onMouseUp(MouseUpEvent event) {

-      Widget source = source(event);

-      Element elem = source.getElement();

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

-          event.getRelativeY(elem));

-    }

-  }

-  public static class MouseWheel extends ListenerWrapper<MouseWheelListener>

-      implements MouseWheelHandler {

-    public static void add(HasMouseWheelHandlers source,

-        MouseWheelListener listener) {

-      source.addMouseWheelHandler(new MouseWheel(listener));

-    }

-

-    public static void remove(Widget eventSource, MouseWheelListener listener) {

-      baseRemove(eventSource, listener, MouseWheelEvent.getType());

-    }

-

-    private MouseWheel(MouseWheelListener listener) {

-      super(listener);

-    }

-

-    public void onMouseWheel(MouseWheelEvent event) {

-      listener.onMouseWheel(source(event), new MouseWheelVelocity(

-          event.getNativeEvent()));

-    }

-  }

-

-  public static class Popup extends ListenerWrapper<PopupListener> implements

-      CloseHandler<PopupPanel> {

-

-    public static void add(HasCloseHandlers<PopupPanel> source,

-        PopupListener listener) {

-      source.addCloseHandler(new Popup(listener));

-    }

-

-    public static void remove(Widget eventSource, PopupListener listener) {

-      baseRemove(eventSource, listener, CloseEvent.getType());

-    }

-

-    private Popup(PopupListener listener) {

-      super(listener);

-    }

-

-    public void onClose(CloseEvent<PopupPanel> event) {

-      listener.onPopupClosed((PopupPanel) event.getSource(),

-          event.isAutoClosed());

-    }

-  }

-

-  public static class Scroll extends ListenerWrapper<ScrollListener> implements

-      ScrollHandler {

-

-    public static void add(HasScrollHandlers source, ScrollListener listener) {

-      source.addScrollHandler(new Scroll(listener));

-    }

-

-    public static void remove(Widget eventSource, ScrollListener listener) {

-      baseRemove(eventSource, listener, ScrollEvent.getType(),

-          ErrorEvent.getType());

-    }

-

-    private Scroll(ScrollListener listener) {

-      super(listener);

-    }

-

-    public void onScroll(ScrollEvent event) {

-      Widget source = source(event);

-      Element elem = source.getElement();

-      listener.onScroll(source(event), elem.getScrollLeft(),

-          elem.getScrollTop());

-    }

-  }

-

-  public static class Suggestion extends ListenerWrapper<SuggestionHandler>

-      implements SelectionHandler<SuggestOracle.Suggestion> {

+  static class WrappedOldSuggestionHandler extends

+      ListenerWrapper<SuggestionHandler> implements

+      SelectionHandler<SuggestOracle.Suggestion> {

     @Deprecated

     public static void add(SuggestBox source, SuggestionHandler listener) {

-      source.addSelectionHandler(new Suggestion(listener));

+      source.addSelectionHandler(new WrappedOldSuggestionHandler(listener));

     }

 

     public static void remove(Widget eventSource, SuggestionHandler listener) {

       baseRemove(eventSource, listener, SelectionEvent.getType());

     }

 

-    private Suggestion(SuggestionHandler listener) {

+    private WrappedOldSuggestionHandler(SuggestionHandler listener) {

       super(listener);

     }

 

     public void onSelection(SelectionEvent<SuggestOracle.Suggestion> event) {

-      listener.onSuggestionSelected(new SuggestionEvent(

-          (SuggestBox) event.getSource(), event.getSelectedItem()));

+      getListener().onSuggestionSelected(

+          new SuggestionEvent((SuggestBox) event.getSource(),

+              event.getSelectedItem()));

     }

   }

 

-  public static class Tab extends ListenerWrapper<TabListener> implements

-      SelectionHandler<Integer>, BeforeSelectionHandler<Integer> {

+  static class WrappedPopupListener extends ListenerWrapper<PopupListener>

+      implements CloseHandler<PopupPanel> {

+

+    public static void add(HasCloseHandlers<PopupPanel> source,

+        PopupListener listener) {

+      source.addCloseHandler(new WrappedPopupListener(listener));

+    }

+

+    public static void remove(Widget eventSource, PopupListener listener) {

+      baseRemove(eventSource, listener, CloseEvent.getType());

+    }

+

+    private WrappedPopupListener(PopupListener listener) {

+      super(listener);

+    }

+

+    public void onClose(CloseEvent<PopupPanel> event) {

+      getListener().onPopupClosed((PopupPanel) event.getSource(),

+          event.isAutoClosed());

+    }

+  }

+

+  static class WrappedTableListener extends ListenerWrapper<TableListener>

+      implements ClickHandler {

+    @Deprecated

+    public static void add(HasClickHandlers source, TableListener listener) {

+      source.addClickHandler(new WrappedTableListener(listener));

+    }

+

+    public static void remove(Widget eventSource, TableListener listener) {

+      baseRemove(eventSource, listener, ClickEvent.getType());

+    }

+

+    private WrappedTableListener(TableListener listener) {

+      super(listener);

+    }

+

+    public void onClick(ClickEvent event) {

+      HTMLTable table = (HTMLTable) event.getSource();

+      HTMLTable.Cell cell = table.getCellForEvent(event);

+      getListener().onCellClicked(table, cell.getRowIndex(),

+          cell.getCellIndex());

+    }

+  }

+

+  static class WrappedTabListener extends ListenerWrapper<TabListener>

+      implements SelectionHandler<Integer>, BeforeSelectionHandler<Integer> {

     @Deprecated

     public static void add(TabBar source, TabListener listener) {

-      Tab t = new Tab(listener);

+      WrappedTabListener t = new WrappedTabListener(listener);

       source.addBeforeSelectionHandler(t);

       source.addSelectionHandler(t);

     }

 

     public static void add(TabPanel source, TabListener listener) {

-      Tab t = new Tab(listener);

+      WrappedTabListener t = new WrappedTabListener(listener);

       source.addBeforeSelectionHandler(t);

       source.addSelectionHandler(t);

     }

@@ -412,51 +733,30 @@
           BeforeSelectionEvent.getType());

     }

 

-    private Tab(TabListener listener) {

+    private WrappedTabListener(TabListener listener) {

       super(listener);

     }

 

     public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {

-      if (!listener.onBeforeTabSelected((SourcesTabEvents) event.getSource(),

-          event.getItem().intValue())) {

+      if (!getListener().onBeforeTabSelected(

+          (SourcesTabEvents) event.getSource(), event.getItem().intValue())) {

         event.cancel();

       }

     }

 

     public void onSelection(SelectionEvent<Integer> event) {

-      listener.onTabSelected((SourcesTabEvents) event.getSource(),

+      getListener().onTabSelected((SourcesTabEvents) event.getSource(),

           event.getSelectedItem().intValue());

     }

   }

 

-  public static class Table extends ListenerWrapper<TableListener> implements

-      ClickHandler {

-    @Deprecated

-    public static void add(HasClickHandlers source, TableListener listener) {

-      source.addClickHandler(new Table(listener));

-    }

-

-    public static void remove(Widget eventSource, TableListener listener) {

-      baseRemove(eventSource, listener, ClickEvent.getType());

-    }

-

-    private Table(TableListener listener) {

-      super(listener);

-    }

-

-    public void onClick(ClickEvent event) {

-      HTMLTable table = (HTMLTable) event.getSource();

-      HTMLTable.Cell cell = table.getCellForEvent(event);

-      listener.onCellClicked(table, cell.getRowIndex(), cell.getCellIndex());

-    }

-  }

-

-  public static class Tree extends ListenerWrapper<TreeListener> implements

-      SelectionHandler<TreeItem>, CloseHandler<TreeItem>, OpenHandler<TreeItem> {

+  static class WrappedTreeListener extends ListenerWrapper<TreeListener>

+      implements SelectionHandler<TreeItem>, CloseHandler<TreeItem>,

+      OpenHandler<TreeItem> {

     @Deprecated

     public static void add(com.google.gwt.user.client.ui.Tree tree,

         TreeListener listener) {

-      Tree t = new Tree(listener);

+      WrappedTreeListener t = new WrappedTreeListener(listener);

       tree.addSelectionHandler(t);

       tree.addCloseHandler(t);

       tree.addOpenHandler(t);

@@ -466,106 +766,44 @@
       baseRemove(eventSource, listener, ValueChangeEvent.getType());

     }

 

-    private Tree(TreeListener listener) {

+    private WrappedTreeListener(TreeListener listener) {

       super(listener);

     }

 

     public void onClose(CloseEvent<TreeItem> event) {

-      listener.onTreeItemStateChanged(event.getTarget());

+      getListener().onTreeItemStateChanged(event.getTarget());

     }

 

     public void onOpen(OpenEvent<TreeItem> event) {

-      listener.onTreeItemStateChanged(event.getTarget());

+      getListener().onTreeItemStateChanged(event.getTarget());

     }

 

     public void onSelection(SelectionEvent<TreeItem> event) {

-      listener.onTreeItemSelected(event.getSelectedItem());

-    }

-  }

-

-  static class Keyboard extends ListenerWrapper<KeyboardListener> implements

-      KeyDownHandler, KeyUpHandler, KeyPressHandler {

-

-    public static <EventSourceType extends Widget & HasAllKeyHandlers> void add(

-        EventSourceType source, KeyboardListener listener) {

-      HandlesAllKeyEvents.addHandlers(source, new Keyboard(listener));

-    }

-

-    public static void remove(Widget eventSource, KeyboardListener listener) {

-      ListenerWrapper.baseRemove(eventSource, listener, KeyDownEvent.getType(),

-          KeyUpEvent.getType(), KeyPressEvent.getType());

-    }

-

-    private Keyboard(KeyboardListener listener) {

-      super(listener);

-    }

-

-    public void onKeyDown(KeyDownEvent event) {

-      listener.onKeyDown(

-          source(event),

-          (char) event.getNativeKeyCode(),

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

-    }

-

-    public void onKeyPress(KeyPressEvent event) {

-      listener.onKeyPress(

-          source(event),

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

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

-    }

-

-    public void onKeyUp(KeyUpEvent event) {

-      source(event);

-      listener.onKeyUp(

-          source(event),

-          (char) event.getNativeKeyCode(),

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

-    }

-  }

-

-  // This is an internal helper method with the current formulation, we have

-  // lost the info needed to make it safe by this point.

-  @SuppressWarnings("unchecked")

-  static <H extends EventHandler> void baseRemove(Widget eventSource,

-      EventListener listener, Type... keys) {

-    HandlerManager manager = eventSource.getHandlerManager();

-    if (manager != null) {

-      // This is a direct copy of the baseRemove from

-      // com.google.gwt.user.client.ListenerWrapper. Change in parallel.

-      for (Type<H> key : keys) {

-        int handlerCount = manager.getHandlerCount(key);

-        // We are removing things as we traverse, have to go backward

-        for (int i = handlerCount - 1; i >= 0; i--) {

-          H handler = manager.getHandler(key, i);

-          if (handler instanceof ListenerWrapper

-              && ((ListenerWrapper) handler).listener.equals(listener)) {

-            manager.removeHandler(key, handler);

-          }

-        }

-      }

+      getListener().onTreeItemSelected(event.getSelectedItem());

     }

   }

 

   /**

-   * Listener being wrapped.

+   * Convenience method to remove wrapped handlers from a widget.

+   * 

+   * @param <H> event handler type

+   * @param eventSource the event source

+   * @param listener the listener to remove

+   * @param types the event types to remove it from

    */

-  protected final T listener;

-

-  private Widget source;

-

-  protected ListenerWrapper(T listener) {

-    this.listener = listener;

-  }

-

-  public void setSource(Widget source) {

-    this.source = source;

-  }

-

-  Widget source(GwtEvent<?> event) {

-    if (source == null) {

-      return (Widget) event.getSource();

-    } else {

-      return source;

+  // This is an internal helper method with the current formulation, we have

+  // lost the info needed to make it safe by this point.

+  @SuppressWarnings("unchecked")

+  protected static <H extends EventHandler> void baseRemove(Widget eventSource,

+      EventListener listener, Type... types) {

+    HandlerManager manager = eventSource.getHandlerManager();

+    if (manager != null) {

+      baseRemove(manager, listener, types);

     }

   }

+

+  protected ListenerWrapper(T listener) {

+    super(listener);

+  }

+

 }

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 981d9cb..986f45a 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -365,7 +365,7 @@
 
   @Deprecated
   public void addPopupListener(final PopupListener listener) {
-    ListenerWrapper.Popup.add(this, listener);
+    ListenerWrapper.WrappedPopupListener.add(this, listener);
   }
 
   /**
@@ -602,7 +602,7 @@
 
   @Deprecated
   public void removePopupListener(PopupListener listener) {
-    ListenerWrapper.Popup.remove(this, listener);
+    ListenerWrapper.WrappedPopupListener.remove(this, listener);
   }
 
   public void setAnimationEnabled(boolean enable) {
diff --git a/user/src/com/google/gwt/user/client/ui/ScrollPanel.java b/user/src/com/google/gwt/user/client/ui/ScrollPanel.java
index 7669844..66a4dd8 100644
--- a/user/src/com/google/gwt/user/client/ui/ScrollPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ScrollPanel.java
@@ -54,7 +54,7 @@
 
   @Deprecated
   public void addScrollListener(ScrollListener listener) {
-    ListenerWrapper.Scroll.add(this, listener);
+    ListenerWrapper.WrappedScrollListener.add(this, listener);
   }
 
   /**
@@ -89,7 +89,7 @@
 
   @Deprecated
   public void removeScrollListener(ScrollListener listener) {
-    ListenerWrapper.Scroll.remove(this, listener);
+    ListenerWrapper.WrappedScrollListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index 90a464e..fcabb5c 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.event.dom.client.HasAllKeyHandlers;
 import com.google.gwt.event.dom.client.KeyCodes;
@@ -308,9 +307,7 @@
    */
   @Deprecated
   public void addChangeListener(final ChangeListener listener) {
-    ListenerWrapper.Change legacy = new ListenerWrapper.Change(listener);
-    legacy.setSource(this);
-    box.addDomHandler(legacy, ChangeEvent.getType());
+    ListenerWrapper.WrappedLogicalChangeListener.add(box, listener).setSource(this);
   }
 
   /**
@@ -322,7 +319,8 @@
    */
   @Deprecated
   public void addClickListener(final ClickListener listener) {
-    ListenerWrapper.Click legacy = ListenerWrapper.Click.add(box, listener);
+    ListenerWrapper.WrappedClickListener legacy = ListenerWrapper.WrappedClickListener.add(box,
+        listener);
     legacy.setSource(this);
   }
 
@@ -333,7 +331,7 @@
    */
   @Deprecated
   public void addEventHandler(final SuggestionHandler handler) {
-    ListenerWrapper.Suggestion.add(this, handler);
+    ListenerWrapper.WrappedOldSuggestionHandler.add(this, handler);
   }
 
   /**
@@ -345,13 +343,14 @@
    */
   @Deprecated
   public void addFocusListener(final FocusListener listener) {
-    ListenerWrapper.Focus focus = ListenerWrapper.Focus.add(box, listener);
+    ListenerWrapper.WrappedFocusListener focus = ListenerWrapper.WrappedFocusListener.add(box,
+        listener);
     focus.setSource(this);
   }
 
   @Deprecated
   public void addKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.add(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.add(this, listener);
   }
 
   public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
@@ -447,27 +446,27 @@
 
   @Deprecated
   public void removeChangeListener(ChangeListener listener) {
-    ListenerWrapper.Change.remove(box, listener);
+    ListenerWrapper.WrappedChangeListener.remove(box, listener);
   }
 
   @Deprecated
   public void removeClickListener(ClickListener listener) {
-    ListenerWrapper.Click.remove(box, listener);
+    ListenerWrapper.WrappedClickListener.remove(box, listener);
   }
 
   @Deprecated
   public void removeEventHandler(SuggestionHandler handler) {
-    ListenerWrapper.Suggestion.remove(this, handler);
+    ListenerWrapper.WrappedOldSuggestionHandler.remove(this, handler);
   }
 
   @Deprecated
   public void removeFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.remove(this, listener);
+    ListenerWrapper.WrappedFocusListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.remove(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.remove(this, listener);
   }
 
   public void setAccessKey(char key) {
diff --git a/user/src/com/google/gwt/user/client/ui/TabBar.java b/user/src/com/google/gwt/user/client/ui/TabBar.java
index 55baec4..218a148 100644
--- a/user/src/com/google/gwt/user/client/ui/TabBar.java
+++ b/user/src/com/google/gwt/user/client/ui/TabBar.java
@@ -250,7 +250,7 @@
 
   @Deprecated
   public void addTabListener(TabListener listener) {
-    ListenerWrapper.Tab.add(this, listener);
+    ListenerWrapper.WrappedTabListener.add(this, listener);
   }
 
   /**
@@ -422,7 +422,7 @@
 
   @Deprecated
   public void removeTabListener(TabListener listener) {
-    ListenerWrapper.Tab.remove(this, listener);
+    ListenerWrapper.WrappedTabListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/TabPanel.java b/user/src/com/google/gwt/user/client/ui/TabPanel.java
index 2a3bf67..5f6b116 100644
--- a/user/src/com/google/gwt/user/client/ui/TabPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/TabPanel.java
@@ -262,7 +262,7 @@
 
   @Deprecated
   public void addTabListener(TabListener listener) {
-    ListenerWrapper.Tab.add(this, listener);
+    ListenerWrapper.WrappedTabListener.add(this, listener);
   }
 
   public void clear() {
@@ -383,7 +383,7 @@
 
   @Deprecated
   public void removeTabListener(TabListener listener) {
-    ListenerWrapper.Tab.remove(this, listener);
+    ListenerWrapper.WrappedTabListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
index ca4d3ae..9fbad0c 100644
--- a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
+++ b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
@@ -90,7 +90,7 @@
 
   @Deprecated
   public void addChangeListener(ChangeListener listener) {
-    addDomHandler(new ListenerWrapper.Change(listener), ChangeEvent.getType());
+    addDomHandler(new ListenerWrapper.WrappedChangeListener(listener), ChangeEvent.getType());
   }
 
   public HandlerRegistration addValueChangeHandler(
@@ -192,7 +192,7 @@
 
   @Deprecated
   public void removeChangeListener(ChangeListener listener) {
-    ListenerWrapper.Change.remove(this, listener);
+    ListenerWrapper.WrappedChangeListener.remove(this, listener);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index f27b247..9dff280 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -303,7 +303,7 @@
 
   @Deprecated
   public void addFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.add(this, listener);
+    ListenerWrapper.WrappedFocusListener.add(this, listener);
   }
 
   /**
@@ -340,7 +340,7 @@
 
   @Deprecated
   public void addKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.add(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.add(this, listener);
   }
 
   public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
@@ -361,7 +361,7 @@
 
   @Deprecated
   public void addMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.add(this, listener);
+    ListenerWrapper.WrappedMouseListener.add(this, listener);
   }
 
   public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
@@ -395,7 +395,7 @@
 
   @Deprecated
   public void addTreeListener(TreeListener listener) {
-    ListenerWrapper.Tree.add(this, listener);
+    ListenerWrapper.WrappedTreeListener.add(this, listener);
   }
 
   /**
@@ -589,7 +589,7 @@
 
   @Deprecated
   public void removeFocusListener(FocusListener listener) {
-    ListenerWrapper.Focus.remove(this, listener);
+    ListenerWrapper.WrappedFocusListener.remove(this, listener);
   }
 
   /**
@@ -612,17 +612,17 @@
 
   @Deprecated
   public void removeKeyboardListener(KeyboardListener listener) {
-    ListenerWrapper.Keyboard.remove(this, listener);
+    ListenerWrapper.WrappedKeyboardListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeMouseListener(MouseListener listener) {
-    ListenerWrapper.Mouse.remove(this, listener);
+    ListenerWrapper.WrappedMouseListener.remove(this, listener);
   }
 
   @Deprecated
   public void removeTreeListener(TreeListener listener) {
-    ListenerWrapper.Tree.remove(this, listener);
+    ListenerWrapper.WrappedTreeListener.remove(this, listener);
   }
 
   public void setAccessKey(char key) {
diff --git a/user/src/com/google/gwt/user/client/ui/TreeItem.java b/user/src/com/google/gwt/user/client/ui/TreeItem.java
index 38c5756..9eb040d 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeItem.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -68,7 +68,7 @@
       if (GWT.isClient()) {
         // Create the base table element that will be cloned.
         BASE_INTERNAL_ELEM = DOM.createTable();
-        Element contentElem = DOM.createSpan();
+        Element contentElem = DOM.createDiv();
         Element tbody = DOM.createTBody(), tr = DOM.createTR();
         Element tdImg = DOM.createTD(), tdContent = DOM.createTD();
         DOM.appendChild(BASE_INTERNAL_ELEM, tbody);
@@ -102,19 +102,6 @@
       super.convertToFullNode(item);
       DOM.setStyleAttribute(item.getElement(), "marginBottom", "0px");
     }
-
-    @Override
-    void initializeClonableElements() {
-      super.initializeClonableElements();
-      if (GWT.isClient()) {
-        // We can't use a 3px padding all around because IE will wrap the
-        // childSpan to the next line, so we need to add a 3px margin on the top
-        // and bottom instead. However, margins overlap, so we need a 6px bottom
-        // margin.
-        DOM.setStyleAttribute(BASE_BARE_ELEM, "margin", "3px 0px 6px 0px");
-        DOM.setStyleAttribute(BASE_BARE_ELEM, "padding", "0px 3px");
-      }
-    }
   }
 
   /**