Revision: 8465
Author: rj...@google.com
Date: Mon Aug  2 18:45:49 2010
Log: Fixes UiBinder MenuBar parser to allow MenuItemSeparator, and custom
subclasses of MenuItem.

Patch by konstantin.scheg...@gmail.com
Review by rj...@google.com
http://gwt-code-reviews.appspot.com/702803

Fixes gwt issue
http://code.google.com/p/google-web-toolkit/issues/detail?id=4550

Review by: robertvaw...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=8465

Added:
/trunk/user/test/com/google/gwt/uibinder/elementparsers/MenuBarParserTest.java /trunk/user/test/com/google/gwt/uibinder/elementparsers/MenuItemParserTest.java
Modified:
 /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java
 /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java
 /trunk/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
 /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java

=======================================
--- /dev/null
+++ /trunk/user/test/com/google/gwt/uibinder/elementparsers/MenuBarParserTest.java Mon Aug 2 18:45:49 2010
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2010 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.uibinder.elementparsers;
+
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.javac.impl.MockJavaResource;
+import com.google.gwt.uibinder.rebind.FieldWriter;
+import com.google.gwt.user.client.ui.MenuItem;
+import com.google.gwt.user.client.ui.MenuItemSeparator;
+
+import junit.framework.TestCase;
+
+import java.util.Iterator;
+
+/**
+ * Test for {...@link MenuBarParser}.
+ */
+public class MenuBarParserTest extends TestCase {
+
+ private static final String PARSED_TYPE = "com.google.gwt.user.client.ui.MenuBar";
+
+  private MenuBarParser parser;
+  private ElementParserTester tester;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    parser = new MenuBarParser();
+    tester = new ElementParserTester(PARSED_TYPE, parser);
+  }
+
+  public void testBadChild_namespace() throws Exception {
+    checkBadLine("<ui:blah/>", MenuBarParser.BAD_CHILD);
+  }
+
+  public void testBadChild_name() throws Exception {
+    checkBadLine("<g:Button/>", MenuBarParser.BAD_CHILD);
+  }
+
+  private void checkBadLine(String badLine, String expectedDied)
+      throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar>");
+    b.append("  " + badLine);
+    b.append("</g:MenuBar>");
+    // parse failed
+    try {
+      tester.parse(b.toString());
+      fail();
+    } catch (UnableToCompleteException e) {
+      String died = tester.logger.died;
+      assertTrue(died, died.contains(expectedDied));
+    }
+  }
+
+  public void test_verticalMenuBar() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar vertical='true'>");
+    b.append("  <g:MenuItem/>");
+    b.append("</g:MenuBar>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    // special initializer for MenuBar
+    assertEquals("new com.google.gwt.user.client.ui.MenuBar(true)",
+        w.getInitializer());
+    // usual statement
+    assertStatements("fieldName.addItem(<g:MenuItem>);");
+  }
+
+  public void test_MenuItem() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar>");
+    b.append("  <g:MenuItem text='1'/>");
+    b.append("  <g:MenuItem text='2'/>");
+    b.append("</g:MenuBar>");
+    // parse
+    tester.parse(b.toString());
+    // has items
+    assertStatements("fieldName.addItem(<g:MenuItem text='1'>);",
+        "fieldName.addItem(<g:MenuItem text='2'>);");
+  }
+
+  public void test_MenuItemSeparator() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar>");
+    b.append("  <g:MenuItemSeparator title='1'/>");
+    b.append("  <g:MenuItemSeparator title='2'/>");
+    b.append("</g:MenuBar>");
+    // parse
+    tester.parse(b.toString());
+    // has separators
+    assertStatements(
+        "fieldName.addSeparator(<g:MenuItemSeparator title='1'>);",
+        "fieldName.addSeparator(<g:MenuItemSeparator title='2'>);");
+  }
+
+  /**
+   * Test for using subclass of {...@link MenuItem}.
+   * <p>
+   * See http://code.google.com/p/google-web-toolkit/issues/detail?id=4550
+   */
+  public void test_customMenuItem() throws Exception {
+    MockJavaResource itemSubclass = new MockJavaResource(
+        "com.google.gwt.user.client.ui.MyItem") {
+      @Override
+      protected CharSequence getContent() {
+        String superName = MenuItem.class.getCanonicalName();
+        StringBuffer code = new StringBuffer();
+        code.append("package com.google.gwt.user.client.ui;\n");
+        code.append("import com.google.gwt.user.client.Command;\n");
+        code.append("public class MyItem extends " + superName + " {\n");
+        code.append("  public MyItem() {\n");
+        code.append("    super(\"\", (Command) null);\n");
+        code.append("  }\n");
+        code.append("}\n");
+        return code;
+      }
+    };
+    tester = new ElementParserTester(PARSED_TYPE, parser, itemSubclass);
+    // prepare source
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar>");
+    b.append("  <g:MyItem/>");
+    b.append("</g:MenuBar>");
+    // parse
+    tester.parse(b.toString());
+    // success
+    assertStatements("fieldName.addItem(<g:MyItem>);");
+  }
+
+  /**
+   * Test for using subclass of {...@link MenuItemSeparator}.
+   * <p>
+   * See http://code.google.com/p/google-web-toolkit/issues/detail?id=4550
+   */
+  public void test_customMenuItemSeparator() throws Exception {
+    MockJavaResource itemSubclass = new MockJavaResource(
+        "com.google.gwt.user.client.ui.MySeparator") {
+      @Override
+      protected CharSequence getContent() {
+        String superName = MenuItemSeparator.class.getCanonicalName();
+        StringBuffer code = new StringBuffer();
+        code.append("package com.google.gwt.user.client.ui;\n");
+ code.append("public class MySeparator extends " + superName + " {\n");
+        code.append("}\n");
+        return code;
+      }
+    };
+    tester = new ElementParserTester(PARSED_TYPE, parser, itemSubclass);
+    // prepare source
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuBar>");
+    b.append("  <g:MySeparator/>");
+    b.append("</g:MenuBar>");
+    // parse
+    tester.parse(b.toString());
+    // success
+    assertStatements("fieldName.addSeparator(<g:MySeparator>);");
+  }
+
+  private void assertStatements(String... expected) {
+    Iterator<String> i = tester.writer.statements.iterator();
+    for (String e : expected) {
+      assertEquals(e, i.next());
+    }
+    assertFalse(i.hasNext());
+    assertNull(tester.logger.died);
+  }
+}
=======================================
--- /dev/null
+++ /trunk/user/test/com/google/gwt/uibinder/elementparsers/MenuItemParserTest.java Mon Aug 2 18:45:49 2010
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2010 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.uibinder.elementparsers;
+
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.javac.impl.MockJavaResource;
+import com.google.gwt.uibinder.rebind.FieldWriter;
+import com.google.gwt.uibinder.rebind.XMLElement;
+import com.google.gwt.user.client.ui.MenuBar;
+import com.google.gwt.user.client.ui.MenuItem;
+
+import junit.framework.TestCase;
+
+import java.util.Iterator;
+
+/**
+ * Test for {...@link MenuItemParser}.
+ */
+public class MenuItemParserTest extends TestCase {
+
+ private static final String PARSED_TYPE = "com.google.gwt.user.client.ui.MenuItem"; + private static final String STD_ITEM = "new com.google.gwt.user.client.ui.MenuItem(\"\","
+      + " (com.google.gwt.user.client.Command) null)";
+
+  private ElementParser parser;
+  private ElementParserTester tester;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    parser = new MenuItemParser();
+    tester = new ElementParserTester(PARSED_TYPE, parser);
+  }
+
+  public void test_empty() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuItem text='My Item'/>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    assertEquals(STD_ITEM, w.getInitializer());
+    // no statements
+    assertStatements();
+  }
+
+  /**
+   * Test for case when child {...@link XMLElement} is not {...@link MenuBar}.
+   */
+  public void test_notMenuBar() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuItem>");
+    b.append("  <div/>");
+    b.append("</g:MenuItem>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    assertEquals(STD_ITEM, w.getInitializer());
+    // no statements
+    assertStatements();
+  }
+
+  public void test_hasMenuBar() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuItem>");
+    b.append("  <g:MenuBar id='1'/>");
+    b.append("</g:MenuItem>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    assertEquals(STD_ITEM, w.getInitializer());
+    // usual statement
+    assertStatements("fieldName.setSubMenu(<g:MenuBar id='1'>);");
+  }
+
+  public void test_twoMenuBar() throws Exception {
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuItem text='My Item'>");
+    b.append("  <g:MenuBar id='1'/>");
+    b.append("  <g:MenuBar id='2'/>");
+    b.append("</g:MenuItem>");
+    // parse failed
+    try {
+      tester.parse(b.toString());
+    } catch (UnableToCompleteException e) {
+      String died = tester.logger.died;
+ assertTrue(died.contains("Only one MenuBar may be contained in a MenuItem"));
+    }
+  }
+
+  /**
+   * Test for using subclass of {...@link MenuItem}.
+   * <p>
+   * Custom {...@link MenuItem} should have default constructor.
+   * <p>
+   * See http://code.google.com/p/google-web-toolkit/issues/detail?id=4550
+   */
+  public void test_customMenuItem() throws Exception {
+    MockJavaResource itemSubclass = new MockJavaResource(
+        "com.google.gwt.user.client.ui.MyItem") {
+      @Override
+      protected CharSequence getContent() {
+        String superName = MenuItem.class.getCanonicalName();
+        StringBuffer code = new StringBuffer();
+        code.append("package com.google.gwt.user.client.ui;\n");
+        code.append("import com.google.gwt.user.client.Command;\n");
+        code.append("public class MyItem extends " + superName + " {\n");
+        code.append("  public MyItem() {\n");
+        code.append("    super(\"\", (Command) null);\n");
+        code.append("  }\n");
+        code.append("}\n");
+        return code;
+      }
+    };
+ tester = new ElementParserTester("com.google.gwt.user.client.ui.MyItem",
+        parser, itemSubclass);
+    // prepare source
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MyItem text='My Item'/>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    assertEquals(null, w.getInitializer());
+    // no statements
+    assertStatements();
+  }
+
+  public void test_customMenuBar() throws Exception {
+    MockJavaResource barSubclass = new MockJavaResource(
+        "com.google.gwt.user.client.ui.MyMenuBar") {
+      @Override
+      protected CharSequence getContent() {
+        String superName = MenuBar.class.getCanonicalName();
+        StringBuffer code = new StringBuffer();
+        code.append("package com.google.gwt.user.client.ui;\n");
+ code.append("public class MyMenuBar extends " + superName + " {\n");
+        code.append("}\n");
+        return code;
+      }
+    };
+    tester = new ElementParserTester(PARSED_TYPE, parser, barSubclass);
+    // prepare source
+    StringBuffer b = new StringBuffer();
+    b.append("<g:MenuItem>");
+    b.append("  <g:MyMenuBar id='1'/>");
+    b.append("</g:MenuItem>");
+    // parse
+    FieldWriter w = tester.parse(b.toString());
+    assertEquals(STD_ITEM, w.getInitializer());
+    // usual statement
+    assertStatements("fieldName.setSubMenu(<g:MyMenuBar id='1'>);");
+  }
+
+  private void assertStatements(String... expected) {
+    Iterator<String> i = tester.writer.statements.iterator();
+    for (String e : expected) {
+      assertEquals(e, i.next());
+    }
+    assertFalse(i.hasNext());
+    assertNull(tester.logger.died);
+  }
+
+  /**
+ * Containers method to reference types referenced only from JavaDoc, used to
+   * prevent CheckStyle errors.
+   */
+  public void unusedReferences(XMLElement p1, MenuBar p2) {
+    p1.hashCode();
+    p2.hashCode();
+  }
+}
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java Mon Jun 7 12:20:31 2010 +++ /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java Mon Aug 2 18:45:49 2010
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 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
@@ -20,38 +20,53 @@
 import com.google.gwt.uibinder.rebind.UiBinderWriter;
 import com.google.gwt.uibinder.rebind.XMLElement;
 import com.google.gwt.user.client.ui.MenuBar;
+import com.google.gwt.user.client.ui.MenuItem;
+import com.google.gwt.user.client.ui.MenuItemSeparator;

 /**
  * Parses {...@link com.google.gwt.user.client.ui.MenuBar} widgets.
  */
 public class MenuBarParser implements ElementParser {
-  private static final String TAG_MENUITEM = "MenuItem";
+
+ static final String BAD_CHILD = "Only MenuItem or MenuItemSeparator subclasses are valid children";

   public void parse(XMLElement elem, String fieldName, JClassType type,
       UiBinderWriter writer) throws UnableToCompleteException {
     // Generate instantiation (Vertical MenuBars require a ctor param).
-    if (elem.hasAttribute("vertical")) {
-      String vertical = elem.consumeBooleanAttribute("vertical");
-      writer.setFieldInitializerAsConstructor(fieldName,
-          writer.getOracle().findType(MenuBar.class.getName()), vertical);
-    }
+    if (MenuBar.class.getName().equals(type.getQualifiedSourceName())) {
+      if (elem.hasAttribute("vertical")) {
+        String vertical = elem.consumeBooleanAttribute("vertical");
+        writer.setFieldInitializerAsConstructor(fieldName,
+ writer.getOracle().findType(MenuBar.class.getName()), vertical);
+      }
+    }
+
+    // Prepare base types.
+ JClassType itemType = writer.getOracle().findType(MenuItem.class.getName());
+    JClassType separatorType = writer.getOracle().findType(
+        MenuItemSeparator.class.getName());

     // Parse children.
     for (XMLElement child : elem.consumeChildElements()) {
-      // MenuBar can only contain MenuItem elements.
-      {
-        String ns = child.getNamespaceUri();
-        String tagName = child.getLocalName();
-
- if (!elem.getNamespaceUri().equals(ns) | | !tagName.equals(TAG_MENUITEM)) {
-          writer.die(child, "Only <%s:%s> are valid children",
-              elem.getPrefix(), TAG_MENUITEM);
-        }
+      JClassType childType = writer.findFieldType(child);
+
+      // MenuItem+
+      if (itemType.isAssignableFrom(childType)) {
+        String childFieldName = writer.parseElementToField(child);
+ writer.addStatement("%1$s.addItem(%2$s);", fieldName, childFieldName);
+        continue;
       }

-      String itemFieldName = writer.parseElementToField(child);
-
-      writer.addStatement("%1$s.addItem(%2$s);", fieldName, itemFieldName);
+      // MenuItemSeparator+
+      if (separatorType.isAssignableFrom(childType)) {
+        String childFieldName = writer.parseElementToField(child);
+        writer.addStatement("%1$s.addSeparator(%2$s);", fieldName,
+            childFieldName);
+        continue;
+      }
+
+      // Fail
+      writer.die(child, BAD_CHILD);
     }
   }
 }
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java Mon Jun 7 12:20:31 2010 +++ /trunk/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java Mon Aug 2 18:45:49 2010
@@ -30,9 +30,14 @@

public void parse(final XMLElement elem, String fieldName, JClassType type,
       final UiBinderWriter writer) throws UnableToCompleteException {
-    writer.setFieldInitializerAsConstructor(fieldName,
-        writer.getOracle().findType(MenuItem.class.getName()), "\"\"",
-        "(com.google.gwt.user.client.Command) null");
+
+    // Use special initializer for standard MenuItem,
+    // custom subclass should have default constructor.
+    if (MenuItem.class.getName().equals(type.getQualifiedSourceName())) {
+      writer.setFieldInitializerAsConstructor(fieldName,
+          writer.getOracle().findType(MenuItem.class.getName()), "\"\"",
+          "(com.google.gwt.user.client.Command) null");
+    }

     final JClassType menuBarType = writer.getOracle().findType(
         MenuBar.class.getCanonicalName());
@@ -55,7 +60,7 @@
       }

boolean isMenuBar(XMLElement child) throws UnableToCompleteException {
-        return menuBarType.equals(writer.findFieldType(child));
+        return menuBarType.isAssignableFrom(writer.findFieldType(child));
       }
     }

=======================================
--- /trunk/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java Thu Jul 29 11:09:15 2010 +++ /trunk/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java Mon Aug 2 18:45:49 2010
@@ -33,6 +33,8 @@
 import com.google.gwt.uibinder.elementparsers.IsEmptyParserTest;
 import com.google.gwt.uibinder.elementparsers.LayoutPanelParserTest;
 import com.google.gwt.uibinder.elementparsers.ListBoxParserTest;
+import com.google.gwt.uibinder.elementparsers.MenuBarParserTest;
+import com.google.gwt.uibinder.elementparsers.MenuItemParserTest;
 import com.google.gwt.uibinder.elementparsers.StackLayoutPanelParserTest;
 import com.google.gwt.uibinder.elementparsers.TabLayoutPanelParserTest;
 import com.google.gwt.uibinder.elementparsers.UIObjectParserTest;
@@ -90,6 +92,8 @@
     suite.addTestSuite(IsEmptyParserTest.class);
     suite.addTestSuite(LayoutPanelParserTest.class);
     suite.addTestSuite(ListBoxParserTest.class);
+    suite.addTestSuite(MenuBarParserTest.class);
+    suite.addTestSuite(MenuItemParserTest.class);
     suite.addTestSuite(StackLayoutPanelParserTest.class);
     suite.addTestSuite(TabLayoutPanelParserTest.class);
     suite.addTestSuite(UIObjectParserTest.class);
=======================================
--- /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Thu Jul 29 11:09:15 2010 +++ /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Mon Aug 2 18:45:49 2010
@@ -82,6 +82,18 @@
       code.append("}\n");
       return code;
     }
+  };
+  public static final MockJavaResource COMMAND = new MockJavaResource(
+      "com.google.gwt.user.client.Command") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client;\n");
+      code.append("public interface Command {\n");
+      code.append("  void execute();\n");
+      code.append("}\n");
+      return code;
+    }
   };
   public static final MockJavaResource DIALOG_BOX = new MockJavaResource(
       "com.google.gwt.user.client.ui.DialogBox") {
@@ -105,6 +117,17 @@
       code.append("}\n");
       return code;
     }
+  };
+  public static final MockJavaResource ELEMENT = new MockJavaResource(
+      "com.google.gwt.dom.client.Element") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.dom.client;\n");
+      code.append("public class Element {\n");
+      code.append("}\n");
+      return code;
+    }
   };
public static final MockJavaResource EVENT_HANDLER = new MockJavaResource(
       "com.google.gwt.event.shared.EventHandler") {
@@ -255,6 +278,43 @@
       code.append("}\n");
       return code;
     }
+  };
+  public static final MockJavaResource MENU_BAR = new MockJavaResource(
+      "com.google.gwt.user.client.ui.MenuBar") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.ui;\n");
+      code.append("public class MenuBar extends Widget {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource MENU_ITEM = new MockJavaResource(
+      "com.google.gwt.user.client.ui.MenuItem") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.ui;\n");
+      code.append("import com.google.gwt.user.client.Command;\n");
+      code.append("public class MenuItem extends UIObject {\n");
+      code.append("  public MenuItem(String text, Command command) {\n");
+      code.append("  }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+ public static final MockJavaResource MENU_ITEM_SEPARATOR = new MockJavaResource(
+      "com.google.gwt.user.client.ui.MenuItemSeparator") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.ui;\n");
+      code.append("import com.google.gwt.user.client.Command;\n");
+      code.append("public class MenuItemSeparator extends UIObject {\n");
+      code.append("}\n");
+      return code;
+    }
   };
public static final MockJavaResource MOUSE_OVER_EVENT = new MockJavaResource(
       "com.google.gwt.event.dom.client.MouseOverEvent") {
@@ -397,8 +457,10 @@
     rtn.add(BUTTON);
     rtn.add(CLICK_EVENT);
     rtn.add(CLICK_HANDLER);
+    rtn.add(COMMAND);
     rtn.add(DIALOG_BOX);
     rtn.add(DOCK_LAYOUT_PANEL);
+    rtn.add(ELEMENT);
     rtn.add(EVENT_HANDLER);
     rtn.add(GRID);
     rtn.add(GWT_EVENT);
@@ -411,6 +473,9 @@
     rtn.add(LABEL);
     rtn.add(LAYOUT_PANEL);
     rtn.add(LIST_BOX);
+    rtn.add(MENU_BAR);
+    rtn.add(MENU_ITEM);
+    rtn.add(MENU_ITEM_SEPARATOR);
     rtn.add(MOUSE_OVER_EVENT);
     rtn.add(MOUSE_OVER_HANDLER);
     rtn.add(SPLIT_LAYOUT_PANEL);

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to