Hi,

Thanks for your well written post. It appears that your solution works well 
if you construct the CheckboxCell with the right flags:

new CheckboxCell(true, true)

the two booleans are handlesSelection and dependsOnSelection, and they cure 
the weird event ordering issues you were seeing.

Cheers,

Nick

On Tuesday, November 22, 2011 10:19:31 AM UTC-8, Raziel wrote:
>
> This question has been asked and partially responded in a number of
> posts:
>
>
> http://groups.google.com/group/google-web-toolkit/browse_thread/thread/dc3a97cd25deb6e3/392dfcdb35f04c95?lnk=gst&q=DefaultSelectionModel#392dfcdb35f04c95
> http://snipt.net/araujo921/checkbox-in-gwt-celltable-header/
>
> http://groups.google.com/group/google-web-toolkit/browse_thread/thread/56f5513b709cd041
>
> http://groups.google.com/group/google-web-toolkit/browse_thread/thread/b20080056a76276f
>
> http://0-groups.google.com.topcat.switchinc.org/group/google-web-toolkit/browse_thread/thread/6d4e65510855e6f6
>
> However, I still haven't found I clean answer to what seems to me a
> very common feature requested in data presentation (and editing)
> grids.
>
> In summary we want to be able to add a checkbox header to a selection
> column of checkboxes that:
>
> * Checking it will select all visible items in the grid.
> * Unchecking it will deselect all visible items in the grid.
> * Any change in the visible data, caused for example by paging or
> sorting, will result in the checkbox header value to be updated
> according to the rules above: if all visible items are selected then
> check it, otherwise uncheck it.
>
> The straightforward logic would suggest that the following
> implementation should work:
>
>       CheckboxCell headerCheckbox = new CheckboxCell();
>       Header<Boolean> selectPageHeader = new
> Header<Boolean>(headerCheckbox) {
>         @Override
>         public Boolean getValue() {
>           for (T item : grid.getVisibleItems()) {
>             if (!getSelectionModel().isSelected(item)) {
>               return false;
>             }
>           }
>           return grid.getVisibleItems().size() > 0;
>         }
>       };
>       selectPageHeader.setUpdater(new ValueUpdater<Boolean>() {
>         @Override
>         public void update(Boolean value) {
>           for (T item : grid.getVisibleItems()) {
>             getSelectionModel().setSelected(item, value);
>           }
>         }
>       });
>       grid.insertColumn(0, checkColumn, selectPageHeader);
>
> However, the result is not the expected:
>
> * When updating the visible data, lets say by moving to the next page,
> the getValue() method gets called. The first couple of calls,
> getVisibleItems() returns empty, and then it returns the new not-yet-
> selected data. In each case, getValue() returns false. However, this
> produces no change in the checked state of the header. This in itself
> seems like a bug to me.
>
> * When just toggling the checkbox header, this ends up in the opposite
> state than desired. Even though update() gets called with the proper
> value that reflects the checkbox header state, and the last calls made
> to getValue() result in the proper value being returned. The only
> "irregular" logic I see that could cause this, is that when clicking
> on the header, the getValue() method gets called before the update() -
> to obtain the key and create a cell context. That results in
> getValue() returning the wrong value (i.e. the opposite). However,
> after update() gets called and it sets the selection state of the
> visible items, getValue() gets called again, thus returning the proper
> value this time.
>
> I guess there are ways where the header can be created in a way where
> we can control better how its value is set and retrieved. However,
> this being such a common use case, and whose logical implementation
> shown above produces inconsistent results, tells me that either I'm
> completely missing something, or that this is a flaw in the celltable
> widgets.
>
> I would appreciate any input on this regard,
>
> Thanks
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-web-toolkit/-/qXgZTFDnxQcJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to