Refactoring out a SimpleLogger for use by code museum.

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4453 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml b/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
index 21d12fd..cee0aa1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
+++ b/reference/code-museum/src/com/google/gwt/museum/DefaultMuseum.gwt.xml
@@ -3,5 +3,6 @@
     <!-- Inherit the core Web Toolkit stuff.                  -->
     <inherits name='com.google.gwt.museum.Museum'/>
     <source path="client/defaultmuseum"/>
-    <entry-point class="com.google.gwt.museum.client.defaultmuseum.DefaultMuseum"/>
-</module>
+      <!-- Specify the app entry point class.                   -->
+    <entry-point class='com.google.gwt.museum.client.defaultmuseum.Issue3190'/>
+ </module>
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java b/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
index c7e674a..9790aad 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/common/EventReporter.java
@@ -16,7 +16,6 @@
 
 package com.google.gwt.museum.client.common;
 
-import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.event.dom.client.BlurEvent;
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ChangeEvent;
@@ -26,15 +25,17 @@
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
 import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
 import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
 import com.google.gwt.event.dom.client.KeyUpEvent;
+import com.google.gwt.event.dom.client.KeyUpHandler;
 import com.google.gwt.event.logical.shared.CloseEvent;
 import com.google.gwt.event.logical.shared.CloseHandler;
 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.GwtEvent;
 import com.google.gwt.user.client.ui.ChangeListener;
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.ClickListener;
@@ -42,13 +43,11 @@
 import com.google.gwt.user.client.ui.HasHTML;
 import com.google.gwt.user.client.ui.HasText;
 import com.google.gwt.user.client.ui.KeyboardListener;
-import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.MouseListener;
 import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.SuggestionEvent;
 import com.google.gwt.user.client.ui.SuggestionHandler;
 import com.google.gwt.user.client.ui.UIObject;
-import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 
@@ -59,11 +58,12 @@
  * @param <T> target type
  */
 @SuppressWarnings("deprecation")
-public class EventReporter<V, T> extends HandlesAllKeyEvents implements
+public class EventReporter<V, T> extends SimpleLogger implements
     ChangeListener, FocusListener, ValueChangeHandler<V>,
     SelectionHandler<Suggestion>, SuggestionHandler, KeyboardListener,
     ChangeHandler, BlurHandler, FocusHandler, ClickHandler, ClickListener,
-    CloseHandler<T>, MouseListener {
+    CloseHandler<T>, MouseListener, KeyDownHandler, KeyUpHandler,
+    KeyPressHandler {
 
   /**
    * Add/remove handlers via check box.
@@ -96,10 +96,8 @@
     public abstract void removeHandler();
   }
 
-  private VerticalPanel panel = new VerticalPanel();
-
   public EventReporter(Panel parent) {
-    parent.add(this.panel);
+    parent.add(this);
   }
 
   public String getInfo(Object sender) {
@@ -211,17 +209,4 @@
   public void onValueChange(ValueChangeEvent<V> event) {
     report(event);
   }
-
-  // will be replaced by logging
-  public void report(String s) {
-    panel.insert(new Label(s), 0);
-    if (panel.getWidgetCount() == 10) {
-      panel.remove(9);
-    }
-  }
-
-  private void report(GwtEvent<?> event) {
-    report(getInfo(event.getSource()) + " fired " + event.toDebugString());
-  }
-
 }
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
new file mode 100644
index 0000000..eeba505
--- /dev/null
+++ b/reference/code-museum/src/com/google/gwt/museum/client/common/SimpleLogger.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.museum.client.common;
+
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HasHTML;
+import com.google.gwt.user.client.ui.HasText;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.UIObject;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+/**
+ * Helper class to create visual tests.
+ * 
+ * @param <V> value type
+ * @param <T> target type
+ */
+@SuppressWarnings("deprecation")
+public class SimpleLogger<V, T> extends Composite {
+
+  private VerticalPanel panel = new VerticalPanel();
+
+  public SimpleLogger() {
+    initWidget(panel);
+  }
+
+  public String getInfo(Object sender) {
+    if (sender instanceof HasText) {
+      return ((HasText) sender).getText();
+    } else if (sender instanceof UIObject
+        && ((UIObject) sender).getTitle() != null) {
+      return ((UIObject) sender).getTitle();
+    } else if (sender instanceof HasHTML) {
+      return ((HasHTML) sender).getHTML();
+    } else {
+      return sender.toString();
+    }
+  }
+
+  public void report(String s) {
+    panel.insert(new Label(s), 0);
+    if (panel.getWidgetCount() == 10) {
+      panel.remove(9);
+    }
+  }
+
+  public void report(GwtEvent<?> event) {
+    report(getInfo(event.getSource()) + " fired " + event.toDebugString());
+  }
+
+}
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
index 468b95a..1afbee1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForCheckBoxAndRadioButtonEvents.java
@@ -18,6 +18,7 @@
 
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.museum.client.common.EventReporter;
 import com.google.gwt.user.client.ui.Button;
@@ -49,8 +50,7 @@
       }
     }));
     b.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(b);
-
+    HandlesAllKeyEvents.addHandlers(b, handler);
     b.addFocusHandler(handler);
     b.addBlurHandler(handler);
     b.addFocusListener(handler);
@@ -65,7 +65,8 @@
     p.add(radio);
     handler = new EventReporter<Boolean, Object>(p);
     radio.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(radio);
+
+    HandlesAllKeyEvents.addHandlers(radio, handler);
     radio.addBlurHandler(handler);
     radio.addFocusHandler(handler);
     radio.addClickHandler(handler);
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
index 704f83a..76cfe4a 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTextEvents.java
@@ -18,6 +18,7 @@
 
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HandlesAllKeyEvents;
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.museum.client.common.EventReporter;
 import com.google.gwt.user.client.ui.Button;
@@ -48,7 +49,7 @@
       }
     }));
     b.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(b);
+    HandlesAllKeyEvents.addHandlers(b, handler);
     b.addChangeListener(handler);
     b.addFocusHandler(handler);
     b.addBlurHandler(handler);
@@ -61,7 +62,8 @@
     p.add(rich);
     handler = new EventReporter<String, Object>(p);
     rich.addKeyboardListener(handler);
-    handler.addKeyHandlersTo(rich);
+    HandlesAllKeyEvents.addHandlers(rich,handler);
+
     rich.addBlurHandler(handler);
     rich.addFocusHandler(handler);
     rich.addClickHandler(handler);
diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
index ca8e319..8a280c1 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForTree.java
@@ -18,8 +18,11 @@
 
 import com.google.gwt.museum.client.common.AbstractIssue;
 import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.Focusable;
+import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.SimpleCheckBox;
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Tree;
 import com.google.gwt.user.client.ui.TreeItem;
@@ -30,8 +33,38 @@
  * A simple tree used to quickly exercise tree behavior.
  */
 public class VisualsForTree extends AbstractIssue {
+
+  static class DelegatingFocusPanel extends HorizontalPanel implements
+      Focusable {
+
+    public int getTabIndex() {
+      return getFocusable().getTabIndex();
+    }
+
+    public void setAccessKey(char key) {
+      getFocusable().setAccessKey(key);
+    }
+
+    public void setFocus(boolean focused) {
+      getFocusable().setFocus(focused);
+    }
+
+    public void setTabIndex(int index) {
+      getFocusable().setTabIndex(index);
+    }
+
+    private Focusable getFocusable() {
+      for (Widget widget : this.getChildren()) {
+        if (widget instanceof Focusable) {
+          return (Focusable) widget;
+        }
+      }
+      throw new IllegalArgumentException("No focusable children to focus on");
+    }
+  }
+
   public static Tree createTree() {
-    Tree t = new Tree();
+    Tree tree = new Tree();
     TreeItem a = new TreeItem("a");
     TreeItem b = new TreeItem(
         "b, though this is a very, very long text field in order to trigger text wrapping bugs, if there are any such bugs currently in the tree.");
@@ -47,18 +80,38 @@
     panel.setWidget(new Label("There should not be any space above me"));
     TreeItem f = new TreeItem(panel);
 
-    t.setSelectedItem(b);
-    t.addItem(a);
-    t.addItem(b);
-    t.addItem(c);
-    t.addItem(d);
-    t.addItem(e);
-    t.addItem(f);
+    tree.setSelectedItem(b);
+    tree.addItem(a);
+    tree.addItem(b);
+    tree.addItem(c);
+    tree.addItem(d);
+    tree.addItem(e);
+    tree.addItem(f);
     b.addItem(ba);
     b.addItem(bb);
     bb.addItem(bba);
     b.addItem(bc);
-    return t;
+
+    // Focus checks
+    DelegatingFocusPanel focus = new DelegatingFocusPanel();
+    focus.add(new Label("first check box should have focus "));
+    focus.add(new SimpleCheckBox());
+    focus.add(new SimpleCheckBox());
+
+    final DelegatingFocusPanel focus2 = new DelegatingFocusPanel();
+    focus2.add(new Label("second check box should have focus "));
+    focus2.add(new SimpleCheckBox());
+    focus2.add(new SimpleCheckBox());
+
+    TreeItem customFocus = new TreeItem(focus2) {
+      @Override
+      public Focusable getFocusable() {
+        return (Focusable) focus2.getWidget(2);
+      }
+    };
+    tree.addItem(focus);
+    tree.addItem(customFocus);
+    return tree;
   }
 
   @Override