Add the ability to change the default HandlerManager of a Widget.
http://gwt-code-reviews.appspot.com/138801

Patch by: sven.brunken
Review by: jlabanca


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7589 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/Widget.java b/user/src/com/google/gwt/user/client/ui/Widget.java
index 147c8be..735bbd5 100644
--- a/user/src/com/google/gwt/user/client/ui/Widget.java
+++ b/user/src/com/google/gwt/user/client/ui/Widget.java
@@ -43,9 +43,9 @@
    */
   int eventsToSink;
   private boolean attached;
+  private HandlerManager handlerManager;
   private Object layoutData;
   private Widget parent;
-  private HandlerManager handlerManager;
 
   public void fireEvent(GwtEvent<?> event) {
     if (handlerManager != null) {
@@ -199,6 +199,16 @@
   }
 
   /**
+   * Creates the {@link HandlerManager} used by this Widget. You can overwrite
+   * this method to create a custom {@link HandlerManager}.
+   * 
+   * @return the {@link HandlerManager} you want to use
+   */
+  protected HandlerManager createHandlerManager() {
+    return new HandlerManager(this);
+  }
+
+  /**
    * Fires an event on a child widget. Used to delegate the handling of an event
    * from one widget to another.
    * 
@@ -359,7 +369,7 @@
    * @return the handler manager
    * */
   HandlerManager ensureHandlers() {
-    return handlerManager == null ? handlerManager = new HandlerManager(this)
+    return handlerManager == null ? handlerManager = createHandlerManager()
         : handlerManager;
   }
 
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetTest.java b/user/test/com/google/gwt/user/client/ui/WidgetTest.java
index 4231ba3..63c1db6 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetTest.java
@@ -18,6 +18,7 @@
 import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.shared.HandlerManager;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.junit.client.GWTTestCase;
 
@@ -44,6 +45,18 @@
     return "com.google.gwt.user.User";
   }
 
+  public void testCreateHandlerManager() {
+    final HandlerManager manager = new HandlerManager(null);
+    Widget w = new Widget() {
+      @Override
+      protected HandlerManager createHandlerManager() {
+        return manager;
+      }
+    };
+    w.ensureHandlers();
+    assertEquals(manager, w.getHandlerManager());
+  }
+
   public void testHandlerCount() {
     Widget a = new Widget();
     assertEquals(0, a.getHandlerCount(ClickEvent.getType()));