http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java File user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java (right):
http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java#newcode27 user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java:27: public abstract class AbstractUiRenderer implements UiRenderer { On 2011/09/02 00:01:48, rjrjr wrote:
This should be in an impl package. I've long regretted not doing that
with
UiBinderUtil (and bonus points if you move it there too).
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java#newcode34 user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java:34: public abstract static class UiRendererDispatcher<T> implements HasHandlers { On 2011/09/02 00:01:48, rjrjr wrote:
Can this be protected?
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java#newcode43 user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java:43: private int methodIndex; On 2011/09/02 00:01:48, rjrjr wrote:
Are these going to get clobbered on recursive calls?
Yes, but that is fine. After the UiHandle'd mehtod is called these values are not used again. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java#newcode72 user/src/com/google/gwt/uibinder/client/AbstractUiRenderer.java:72: table = UiRendererUtilsImpl.buildDispatchMap(keys, values); On 2011/09/02 00:01:48, rjrjr wrote:
Are you rebuilding this table for each event dispatch? If so, sounds
slow. Or
does the dom hold on to a pointer to this thing?
Each UiRenderer object holds a reference(s) to its dispatcher(s). Oh! I forgot to make dispatcher refs static, I see. Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java File user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java (right): http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java#newcode29 user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java:29: public class UiRendererUtilsImpl { On 2011/09/02 00:01:48, rjrjr wrote:
Can all these public static things instead be protected members on AbstractUiRenderer?
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java#newcode31 user/src/com/google/gwt/uibinder/client/UiRendererUtilsImpl.java:31: public static final int NO_HANDLER_FOUND = -1; On 2011/09/02 00:01:48, rjrjr wrote:
do these constants really need to be public?
Done. This one can be private. The other two are needed for generation and at run time so they need to be accessible. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java File user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java (right): http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode192 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:192: List<JMethod> methods = new ArrayList<JMethod>(Arrays.asList(type.getMethods())); On 2011/09/02 00:01:48, rjrjr wrote:
this won't work with superclasses. use
JClassType.getInheritableMethods(), and
should add a unit test for that case.
Ah, that pesky Java feature, inheritance. :D Done. It also affected render()'ing. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode244 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:244: JMethod[] allMethods = type.getMethods(); On 2011/09/02 00:01:48, rjrjr wrote:
ditto. Should do a general search for getMethods
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode414 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:414: throw new RuntimeException("UiRenderer is not a parametrizable type in " + binderType); On 2011/09/02 00:01:48, rjrjr wrote:
parameterizable
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode1215 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:1215: formatMethodError(targetType, jMethod), e.getMessage()); On 2011/09/06 16:44:11, rjrjr wrote:
Could you consolidate all these identical die calls into a single
private
method?
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode1465 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:1465: * Validates each {@code eventMethod} (e.g. {@code onBrowserEvent()}). On 2011/09/02 00:01:48, rjrjr wrote:
(e.g. {@code void onBrowserEvent(HandlerType o, NativeEvent e, Element
parent, A
a, B b, ...);})
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode1470 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:1470: * (if it has any methods annotated with {@code @UiHandler}) On 2011/09/02 00:01:48, rjrjr wrote:
d/if it has/
Done. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode1515 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:1515: * <li> The second parameter must be of type {@link com.google.gwt.dom.client.Element Element} On 2011/09/02 00:01:48, rjrjr wrote:
What do you think about making the element type optional too? I'd be
okay with
requiring it to be in place if they want to use other optional
parameters. SGTM. Done. Now handler params after the first one are optional. http://gwt-code-reviews.appspot.com/1534806/diff/1/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java#newcode2140 user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java:2140: // ClickEvent.getType(); On 2011/09/02 00:01:48, rjrjr wrote:
Should this happen lazily the first time, say, computeDispatchEvent is
called?
AbstractUiRenderer could have an abstract initEventTypes() method.
Made it happen right after the dispatch table is initialized. This happens lazily upon a call to onBrowserEvent http://gwt-code-reviews.appspot.com/1534806/diff/1/user/test/com/google/gwt/uibinder/test/UiJavaResources.java File user/test/com/google/gwt/uibinder/test/UiJavaResources.java (right): http://gwt-code-reviews.appspot.com/1534806/diff/1/user/test/com/google/gwt/uibinder/test/UiJavaResources.java#newcode69 user/test/com/google/gwt/uibinder/test/UiJavaResources.java:69: code.append("public class ClickEvent extends DomEvent<ClickHandler> {\n"); On 2011/09/02 00:01:48, rjrjr wrote:
Oops. Bet that was fun to track down.
Yes! But not as fun as realizing the need to call XEvent#getType() to initialize type names. :) http://gwt-code-reviews.appspot.com/1534806/diff/1/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java File user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java (right): http://gwt-code-reviews.appspot.com/1534806/diff/1/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java#newcode233 user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java:233: private native NativeEvent createMockNativeEvent(Element target, String type) /*-{ On 2011/09/02 00:01:48, rjrjr wrote:
Have you tested manually, really clicking something in a real browser?
Yes. But I could not figure out how to implement that from a GwtTestCase. http://gwt-code-reviews.appspot.com/1534806/ -- http://groups.google.com/group/Google-Web-Toolkit-Contributors