1
votes

Using GWT 2.6.1, UiBinder, DataGrid.
Also using SingleSelectionModel to select a single row:

final SingleSelectionModel<User> selectionModel = new SingleSelectionModel<>(keyProvider);

Checkboxes column:

// checkboxes
    Column<User, Boolean> checkBoxColumn = new Column<User, Boolean>(
            new CheckboxCell(false, false)) {
        @Override
        public Boolean getValue(User user) {
            return user.isChecked();
        }
    };

    checkBoxColumn.setFieldUpdater(new FieldUpdater<User, Boolean>() {
        @Override
        public void update(int index, User user, Boolean value) {
            user.setChecked(value);
        }
    });

So i store "checked" user state as a boolean field in the User entity class, without using a SelectionModel at all.

Now I need to implement custom header checkbox to select/deselect all checkboxes in the column.

public class CheckboxHeader extends Header<Boolean> {

    public CheckboxHeader(CheckboxCell cell) {
        super(cell);
    }

    @Override
    public Boolean getValue() {
        return null;
    }
}

Have no ideas how to implement properly this header class to add column in the DataGrid:

dataGrid.addColumn(checkBoxColumn, new CheckboxHeader(new CheckboxCell(false, false)));

Another trouble is to enable/disable all those checkboxes by checking other checkbox that isn't in the DataGrid.
How can i retrieve all checkboxes from the column/selectionmodel/etc and enable/disable them one by one? Appreciate any suggestions.

1

1 Answers

1
votes

Mixing the data model (User entity) and the state of user interface (isSelected) is never a good idea.

This is how you can do it (replace T with your object, or create a column object that you can re-use):

Column<T, Boolean> checkColumn = new Column<T, Boolean>(new CheckboxCell()) {
    @Override
        public Boolean getValue(T object) {
            return getSelectionModel().isSelected(object);
        }
    };
    checkColumn.setFieldUpdater(new FieldUpdater<T, Boolean>() {
        @Override
        public void update(int index, T object, Boolean value) {
            getSelectionModel().setSelected(object, value);
            dataProvider.refresh();
        }
    });

myDataGrid.setSelectionModel(getSelectionModel(), DefaultSelectionEventManager.<T> createCheckboxManager(0));

Header<Boolean> selectAllHeader = new Header<Boolean>(new HeaderCheckbox()) {

    @Override
    public Boolean getValue() {
        for (T item : getVisibleItems()) {
            if (!getSelectionModel().isSelected(item)) {
                return false;
            }
        }
        return getVisibleItems().size() > 0;
    }
};
selectAllHeader.setUpdater(new ValueUpdater<Boolean>() {

    @Override
    public void update(Boolean value) {
        for (T object : getVisibleItems()) {
            getSelectionModel().setSelected(object, value);
        }
    }
});
myDataGrid.addColumn(checkColumn, selectAllHeader);