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