[gwt-contrib] Re: HTMLPanel and UiBinder limitations

2009-10-12 Thread Joel Webber
On Sat, Oct 10, 2009 at 4:06 AM, Amir Kashani amirkash...@gmail.com wrote:


 On Fri, Oct 9, 2009 at 8:10 PM, Ray Ryan rj...@google.com wrote:

 But allocating a widget per row isn't a great plan anyway, it won't scale.
 UiBinder is not a renderer--it's for laying out assemblies of widgets, not
 iterating over data to build them. We don't yet have a tool for that. (Or
 were you thinking in terms of pure DOM objects?)

 I certainly don't _want_ a Widget per row. A pure DOM hierarchy works fine
 as long as no events or enhanced functionality is required. More often
 than not, however, when displaying a grid of data, there's need for user
 interaction, meaning at least some widgets. With UiBinder, this mean a
 widget per row. (I suppose it could all be DOM based and the root element
 from any required widget could be attached manually. This is complicated and
 asking for memory-leaks though)

 Anyway, despite the bug in HTMLPanel, I guess the advice is: don't do this
 and use a one of the table/grid widgets to dynamically allocate rows?


When you want to handle events on a large collection of child objects, you
can always aggregate the DOM event handling in the Widget that contains them
all. The tree and table widgets work this way -- it's a bit of extra work,
but it's a *lot* more efficient. Not only can you avoid creating widgets for
all the children, but you don't even have to add event handlers to them in
most cases -- just let the events bubble up to the widget and sort them out
there (if you want focus/blur events, you'll still need to sink them on each
element, because they don't bubble).

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



[gwt-contrib] Re: HTMLPanel and UiBinder limitations

2009-10-10 Thread Amir Kashani
On Fri, Oct 9, 2009 at 8:10 PM, Ray Ryan rj...@google.com wrote:

 HTMLPanel handles this case just fine. (See HTMLPanelTest.) But yes,
 UiBinder probably doesn't. I suppose it could do the same trick HTMLPanel
 does--you mind filing an issue?

HTMLPanelTest only tests the scenario where TABLE is the root tag. In my
example, TR is the root:

HTMLPanel tr = new HTMLPanel(tr, tdhello/td);


This fails because in HTMLPanel, scratchDiv.getFirstChildElement() returns
null. I can definitely file an issue for this, but it seems that the bug (or
limitation) is with HTMLPanel and UiBinder just inherited this behavior by
means of the copied logic.

 But allocating a widget per row isn't a great plan anyway, it won't scale.
 UiBinder is not a renderer--it's for laying out assemblies of widgets, not
 iterating over data to build them. We don't yet have a tool for that. (Or
 were you thinking in terms of pure DOM objects?)

I certainly don't _want_ a Widget per row. A pure DOM hierarchy works fine
as long as no events or enhanced functionality is required. More often
than not, however, when displaying a grid of data, there's need for user
interaction, meaning at least some widgets. With UiBinder, this mean a
widget per row. (I suppose it could all be DOM based and the root element
from any required widget could be attached manually. This is complicated and
asking for memory-leaks though)

Anyway, despite the bug in HTMLPanel, I guess the advice is: don't do this
and use a one of the table/grid widgets to dynamically allocate rows?

 Besides FlexTable you might also look at the incubator's PagingScrollTable.

On Oct 9, 2009 6:23 PM, Amir Kashani amirkash...@gmail.com wrote:

 HTMLPanel's ability to mimic other tags is limited in that it can't become
 a TR or TD. Following the implementation, it's clear why: placing these
 elements without their requried parent tags into a DIV is invalid so the
 browser never creates the DOM element that HTMLPanel requires. UiBinder is
 similarly limited: the top level tag cannot be a TR or TD, since
 UiBinder.attachToDomAndGetChild copies HTMLPanel's logic.

 As a result, it's near impossible to create a TABLE in UiBinder that has a
 dynamic number of rows, a very common use case. The obvious approach is to
 create MyTable.ui.xml that contains a bound TABLE element. Then, in a
 separate file, MyTableRow.ui.xml, define the contents of each row with the
 root element being a TR. This doesn't work for the reason mentioned above. A
 simple workaround is to have MyTableRow.ui.xml have TABLE as it's root
 element, then bind its TR (or retrieve it with getFirstChild) and
 appendChild the row to the TABLE element from MyTable.  This breaks down as
 soon as you want a widget within the rows of a table, however.

 As far as I can tell, the only way around this is to use a FlexTable or
 Grid. These work great, except that you lose the ability to define a row
 with complex markup in an XML file.

 Unless I'm really missing something, I don't see a good solution here. I
 have some rough idea of how this could be solved with a new table widget
 that can define its rows separately from the outer table, but it's not
 hashed out and probably doesn't fall under the good idea category.

 Thoughts?

 - Amir



 


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



[gwt-contrib] Re: HTMLPanel and UiBinder limitations

2009-10-09 Thread Ray Ryan
HTMLPanel handles this case just fine. (See HTMLPanelTest.) But yes,
UiBinder probably doesn't. I suppose it could do the same trick HTMLPanel
does--you mind filing an issue?

But allocating a widget per row isn't a great plan anyway, it won't scale.
UiBinder is not a renderer--it's for laying out assemblies of widgets, not
iterating over data to build them. We don't yet have a tool for that. (Or
were you thinking in terms of pure DOM objects?)

Besides FlexTable you might also look at the incubator's PagingScrollTable.

On Oct 9, 2009 6:23 PM, Amir Kashani amirkash...@gmail.com wrote:

HTMLPanel's ability to mimic other tags is limited in that it can't become a
TR or TD. Following the implementation, it's clear why: placing these
elements without their requried parent tags into a DIV is invalid so the
browser never creates the DOM element that HTMLPanel requires. UiBinder is
similarly limited: the top level tag cannot be a TR or TD, since
UiBinder.attachToDomAndGetChild copies HTMLPanel's logic.

As a result, it's near impossible to create a TABLE in UiBinder that has a
dynamic number of rows, a very common use case. The obvious approach is to
create MyTable.ui.xml that contains a bound TABLE element. Then, in a
separate file, MyTableRow.ui.xml, define the contents of each row with the
root element being a TR. This doesn't work for the reason mentioned above. A
simple workaround is to have MyTableRow.ui.xml have TABLE as it's root
element, then bind its TR (or retrieve it with getFirstChild) and
appendChild the row to the TABLE element from MyTable.  This breaks down as
soon as you want a widget within the rows of a table, however.

As far as I can tell, the only way around this is to use a FlexTable or
Grid. These work great, except that you lose the ability to define a row
with complex markup in an XML file.

Unless I'm really missing something, I don't see a good solution here. I
have some rough idea of how this could be solved with a new table widget
that can define its rows separately from the outer table, but it's not
hashed out and probably doesn't fall under the good idea category.

Thoughts?

- Amir


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