GWT: Multi Selection model does not update the celltable status in some cases - gwt

I am using the GWT MultiSelectionModel within a CellTable in which I have a checkbox in one column and a widget in the other column. I have added handlers to update the selection status based on user clicks. If the user clicks on any part of either columns when the cell is selected, the status gets updated correctly and the cell turns white from light blue. Howvever, If the user clicks on the check box and the cell is selected, the check box gets unchecked but the cell is still blue. Even more strange: This issue does not happen if I have a few breakpoints before the status update code is executed.
In all other cases, the cell state and the checkbox state gets updated correctly. Note that I am not using the ProvidesKeys interface since the object do not change.
Can anyone help me with this? Thanks for your help.

Have you tried using a CheckBoxCell for your checkbox column and, specifically, the CheckboxCell(boolean dependsOnSelection, boolean handlesSelection) constructor (by passing true to both params)?

I've got almost the same problem when I use MultiSelectionModel. What's my walkaround is to see the checkbox's column as a special one and then to deal with it manually. Say:
myDataGrid.addCellPreviewHandler(
#Override
public void onCellPreview(final CellPreviewEvent<MyCellData> event){
if("click".equals(event.getNativeEvent().getType()) && 0 != event.getColumn()){
doWhatYouWant();
}
}
)

Related

Cannot click ListViewCell with null value

The tests I am developing access the DataGrid cells the following way:
window.Get<ListView>(gridName).Rows.First().Cells.First()
Then clicking a cell with UIItem.Click() method works fine, unless the cell is bound to a null value. In such a case, I get an exception:
Failed to click on ListViewCell. AutomationId:, Name:, ControlType:text, FrameworkId:WPF, bounds empty
Which makes sense, as apparently, an AutomationElement related to that cell is a TextBlock of 0 boundaries.
Is there some possible workaround to click such a cell so the tests work?
What seems to be a good enough workaround is the following:
this.window.Mouse.Location = Point.Subtract(cellToClick.ClickablePoint, new Vector(12, 6));
this.window.Mouse.Click(this.window.Mouse.Location);
So I just set the mouse location using property TestStack.White.UIItems.Mouse so it is situated right above the cell, then click.

How to add a custom selection Handler to a celltable

I want to add a special selection model to the celltable. Basically the function i want to have is to select a row on the table which is located on left side, a corresponding form will pop up on the right side.
I know so many people will use the singleSelectionModel with SelectionChangeHandler.
But there is problem with this method.
For example, if I select row 1 on the table. the form pop up. I close the form by clicking the close-button. Later then, I select the row 1 again, the event is not fired, because it is SelectionChangeHandler. I have to select other row before doing this. This is no good.
So I think there are a few ways to do this:
Make the row deselected right after I select the row.
Use click handler to fire the event ( to pop up the form)
Use other selection model with other selection handler to do this. (I have no ideas about this though)
So my questions are,
Does anyone know what kind of other selection handler I can use for this.
If I use the click handler on celltable, will there be any problem?
I just want to learn more about this. So any ideas will be welcome.
Thanks a lot.
Best Regards.
Use NoSelectionModel. It won't update the table view after the row is selected. That is, even if the same row is selected, the change event is fired.
//Here 'Contact' is the datatype of the record
final NoSelectionModel<Contact> selModel = new NoSelectionModel<Contact>();
selModel.addSelectionChangeHandler(new Handler() {
#Override
public void onSelectionChange(SelectionChangeEvent event) {
Contact clickedObject = selModel.getLastSelectedObject();
GWT.log("Selected " + clickedObject.name);
}
});
table.setSelectionModel(selModel);
I have using cell table in my each project. The better way to just deselect row manually as u mention. and make change css such as selected cell table's row look not changed after selection.

Why is the selected row partially obscured in GWT 2.4 DataGrid?

When scrolling down on a DataGrid page using the keyboard, the last visible item on the visible range, if it's partially obscured, does not become fully visible when it gets selected. The same seems to happen when selecting the row with the mouse. The row becomes visible enough to fully show the Number column value as can be seen in the screenshot, but the image stays partially obscured. The same thing happens without any footer being visible, so the footer obscuring the row does not seem to be the issue here. Also, the behaviour is identical when selecting the first visible item - only the Number value becomes fully visible.
This is kind of a minor issue but since the DataGrid in my case is mostly browsed using the keyboard, it really has quite a big impact on usability. So - Any ideas what could be done to ensure full row visibility when it is selected?
Many thanks in advance.
Extending DataGrid and overriding setKeyboardSelected(int, boolean, boolean) as follows seems to do the trick, but is of course a hack and not an optimal solution at all.
#Override
protected void setKeyboardSelected(int index, boolean selected, boolean stealFocus) {
if (KeyboardSelectionPolicy.DISABLED == getKeyboardSelectionPolicy() || !isRowWithinBounds(index) || getColumnCount() == 0) {
return;
}
super.setKeyboardSelected(index, selected, stealFocus);
TableRowElement tr = getRowElement(index);
tr.scrollIntoView();
}

GWT 2.4 DataGrid automatic scrolling when selecting an item

I am using GWT 2.4's new DataGrid in a project. I configured the DataGrid with a pagesize of 50.
The available screen is not big enough to display all items and thus a vertical scrollbar is shown (this is actually the main purpose for using a DataGrid in the first place).
I attached a SingleSelectionModel to the DataGrid in order to be able to select items.
This works fine so far.
However I also have another widget with which the user can interact. Based on that user action a item from the DataGrid should be selected.
Sometimes the selected item is not in the visible screen region and the user has to scroll down in the DataGrid to see it.
Is there any way to automatically or manually scroll down, so that the selected item is visible?
I checked the JavaDocs of the DataGrid and found no appropriate method or function for doing that.
Don't know if this works, but you could try to get the row element for the selection and use the scrollIntoView Method.
Example Code:
dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();
The answer above works pretty well, though if the grid is wider than your window and has a horizontal scroll bar, it also scrolls all the way to the right which is pretty annoying. I was able to get it to scroll down and stay scrolled left by getting the first cell in the selected row and then having it scroll that into view.
dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();
Don't have time to try it out, but DataGrid implements the interface HasRows, and HasRows has, among other things, a method called setVisibleRange. You just need to figure out the row number of the item that you want to focus on, and then set the visible range from that number n to n+50. That way the DataGrid will reset to put that item at the top (or near the top if it is in the last 50 elements of the list backing the DataGrid). Don't forget to redraw your DataGrid.
Have you already looked at this? If so, I'd be surprised that it didn't work.
Oh, and since this is one widget talking to another, you probably have some messaging set up and some message handlers so that when the user interacts with that second widget and "selects" the item, the message fires on the EventBus and a handler for that message fixes up the DataGrid along the lines I've described. I think you'll have to do this wiring yourself.
My solution, a little better:
dataGrid.getRow(model).scrollIntoView();
I got a Out of bounds exception doing the above.
I solved it getting the ScrollPanel in the DataGrid and used .scrollToTop() and so on on the ScrollPanel. However, to access the ScrollPanel in the DataGrid I had to use this comment:
http://code.google.com/p/google-web-toolkit/issues/detail?id=6865
As Kem pointed out, it's annoying the "scrollToRight" effect after the scrollIntoView. After me, Kem's solution gives a better behaviour than the base one as usually the first columns in a table are the more meaningful.
I improved a bit his approach, which scrolls horizontally to the first column of the row we want to be visible, by calculating the first visible column on the left before applying the scroll and then scrolling to it.
A final note: Columns absolute left is tested against "51". This is a value I found "experimentally" by looking the JS values in the browser's developer tool, I think it depends on the table's style, you may need to change/calculate it.
Below the code:
public void scrollIntoView(T next) {
int index = datagrid.getVisibleItems().indexOf(next);
NodeList<TableCellElement> cells = datagrid.getRowElement(index).getCells();
int firstVisibleIndex = -1;
for(int i=0; i<cells.getLength() && firstVisibleIndex<0;i++)
if(UIObject.isVisible(cells.getItem(i)) && (cells.getItem(i).getAbsoluteLeft() > 51) && (cells.getItem(i).getAbsoluteTop() > 0))
firstVisibleIndex = i;
cells.getItem(firstVisibleIndex>=0? firstVisibleIndex : 0).scrollIntoView();
}

I want my CheckboxCell to control the selected state of each row

I've got a CellTable with a column rendered with a CheckboxCell. I want to check the boxes to select the rows.
The default behavior with CheckboxCell(false, false) is tantalizingly close to my goal - selecting a row checks the checkbox, and de-selecting a row unchecks the checkbox. However, if I click a checkbox, it unselects any already-selected rows. Even worse, when I uncheck a checkbox, the row is not deselected. Argh!
I'm looking at coding my own cell now (or messing with the SelectionModel?), but this seems like behavior Google might have been trying for. I've tried every permutation of values in the constructor, to no avail. Is there a simple override I can add to finally make my dream... a reality?
You know how you can search for 30 minutes, and then 20 seconds after you post your question you find your answer?
Well, it turns out that to unleash the power of the CheckboxCell, you need to pass a Handler that is equipped to deal with the complexities of the situation. Try
setSelectionModel(selectionModel, DefaultSelectionEventManager.<T> createCheckboxManager());
with your MultiSelectionModel selectionModel - the selectionModel itself is not enough!