Avoid implicit inter-dependencies between DOM, History, Window and Widgets
through BaseListenerWrapper by moving things to where they're used.

Change-Id: I44ea5f26c96716879b2a23331cafc26a63644e89
Review-Link: https://gwt-review.googlesource.com/#/c/1241/

Review by: mdempsky@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11586 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/tools/api-checker/config/gwt25_26userApi.conf b/tools/api-checker/config/gwt25_26userApi.conf
index 4528771..ce95c2e 100644
--- a/tools/api-checker/config/gwt25_26userApi.conf
+++ b/tools/api-checker/config/gwt25_26userApi.conf
@@ -150,3 +150,7 @@
 
 # Removed deprecated benchmark infra
 com.google.gwt.benchmarks.client MISSING
+
+# Split BaseListenerWrapper
+com.google.gwt.user.client.BaseListenerWrapper::getSource(Lcom/google/gwt/event/shared/GwtEvent;) MISSING
+com.google.gwt.user.client.BaseListenerWrapper::setSource(Lcom/google/gwt/user/client/ui/Widget;) MISSING
diff --git a/user/src/com/google/gwt/user/client/BaseListenerWrapper.java b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
index 059e3f5..a7032cf 100644
--- a/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/BaseListenerWrapper.java
@@ -20,14 +20,9 @@
 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.
@@ -39,57 +34,11 @@
  * 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 will be removed in GWT 2.7 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.as(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
@@ -196,8 +145,6 @@
    */
   final T listener;
 
-  private Widget source;
-
   /**
    * Creates a new listener wrapper.
    * 
@@ -208,16 +155,6 @@
   }
 
   /**
-   * 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
@@ -225,19 +162,4 @@
   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 80be485..807cd90 100644
--- a/user/src/com/google/gwt/user/client/DOM.java
+++ b/user/src/com/google/gwt/user/client/DOM.java
@@ -20,6 +20,7 @@
 import com.google.gwt.dom.client.ImageElement;
 import com.google.gwt.dom.client.OptionElement;
 import com.google.gwt.dom.client.SelectElement;
+import com.google.gwt.user.client.Event.NativePreviewEvent;
 import com.google.gwt.user.client.impl.DOMImpl;
 import com.google.gwt.user.client.ui.PotentialElement;
 
@@ -30,6 +31,33 @@
  * {@link com.google.gwt.user.client.Event events}.
  */
 public class DOM {
+
+  private 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.as(event.getNativeEvent()))) {
+          event.cancel();
+        }
+      }
+    }
+  }
+
   // The current event being fired
   private static Event currentEvent = null;
   static final DOMImpl impl = GWT.create(DOMImpl.class);
@@ -48,7 +76,7 @@
    */
   @Deprecated
   public static void addEventPreview(EventPreview preview) {
-    BaseListenerWrapper.NativePreview.add(preview);
+    NativePreview.add(preview);
   }
 
   /**
@@ -1044,7 +1072,7 @@
    */
   @Deprecated
   public static void removeEventPreview(EventPreview preview) {
-    BaseListenerWrapper.NativePreview.remove(preview);
+    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 c8f9030..285ffee 100644
--- a/user/src/com/google/gwt/user/client/History.java
+++ b/user/src/com/google/gwt/user/client/History.java
@@ -18,7 +18,9 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.impl.Disposable;
 import com.google.gwt.core.client.impl.Impl;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.HandlerManager;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.impl.HistoryImpl;
 
@@ -58,6 +60,26 @@
  */
 public class History {
 
+  private static class WrapHistory extends BaseListenerWrapper<HistoryListener>
+      implements ValueChangeHandler<String> {
+    @Deprecated
+    public static void add(HistoryListener listener) {
+      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());
+    }
+  }
+
   private static HistoryImpl impl;
 
   static {
@@ -91,7 +113,7 @@
   @Deprecated
   public static void addHistoryListener(HistoryListener listener) {
     if (impl != null) {
-      BaseListenerWrapper.WrapHistory.add(listener);
+      WrapHistory.add(listener);
     }
   }
 
@@ -215,7 +237,7 @@
   @Deprecated
   public static void removeHistoryListener(HistoryListener listener) {
     if (impl != null) {
-      BaseListenerWrapper.WrapHistory.remove(impl.getHandlers(), listener);
+      WrapHistory.remove(impl.getHandlers(), 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 9b4a1b4..732b1d7 100644
--- a/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
+++ b/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
@@ -77,6 +77,7 @@
 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;
@@ -91,7 +92,7 @@
  * 
  * 
  * @param <T> listener type
- * @deprecated will be removed in GWT 2.0 with the handler listeners themselves
+ * @deprecated will be removed in GWT 2.7 with the handler listeners themselves
  */
 @Deprecated
 public abstract class ListenerWrapper<T> extends BaseListenerWrapper<T> {
@@ -811,8 +812,34 @@
     }
   }
 
+  private Widget source;
+
   protected ListenerWrapper(T listener) {
     super(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 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;
+    }
+  }
 }