[gwt-contrib] Re: HTMLPanel and UiBinder limitations
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
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
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 -~--~~~~--~~--~--~---