Filter lists supports shift/ctrl-based multi-/mass-selection

This commit is contained in:
Stsiapan_Tsybulski committed 2016-08-31 10:41:04 +03:00
1 parent 8220714d14
commit 71bb4cb591
2 files changed
+52 -12

No files matched your search

@@ -8,8 +8,6 @@ import java.util.Set;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;
import com.google.gwt.view.client.SetSelectionModel;
/**
* A multi selection model, that allows to block the selection change notifications.<br>
@@ -17,8 +15,7 @@ import com.google.gwt.view.client.SetSelectionModel;
* wasn't open enough.
* @author Lennart Hensler (D054527)
*/
public class ControllableMultiSelectionModel<T> extends AbstractSelectionModel<T>
implements SetSelectionModel<T> {
public class ControllableMultiSelectionModel<T> extends MultiSelectionModel<T> {
// Ensure one value per key
private final Map<Object, T> selectedSet;
@@ -6,11 +6,18 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.DefaultSelectionEventManager;
import com.google.gwt.view.client.DefaultSelectionEventManager.SelectAction;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
@@ -48,16 +55,15 @@ public class FilterableSelectionTable<ContentType extends Serializable> {
}
};
contentColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
table.addColumn(contentColumn);
selectionModel = new ControllableMultiSelectionModel<ContentType>();
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
selectionModel = new ControllableMultiSelectionModel<>();
final Column<ContentType, Boolean> checkColumn = new Column<ContentType, Boolean>(
new CheckboxCell(true, false)) {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
notifyListeners();
public Boolean getValue(ContentType object) {
return selectionModel.isSelected(object);
}
});
table.setSelectionModel(selectionModel);
};
dataProvider = new ListDataProvider<ContentType>(new ProvidesKey<ContentType>() {
@Override
@@ -66,6 +72,43 @@ public class FilterableSelectionTable<ContentType extends Serializable> {
}
});
dataProvider.addDataDisplay(table);
table.addColumn(checkColumn);
table.addColumn(contentColumn);
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
notifyListeners();
}
});
table.setSelectionModel(selectionModel, DefaultSelectionEventManager.<ContentType> createCustomManager(
new DefaultSelectionEventManager.CheckboxEventTranslator<ContentType>() {
@Override
public boolean clearCurrentSelection(CellPreviewEvent<ContentType> event) {
return !isCheckboxColumn(event.getColumn());
}
@Override
public SelectAction translateSelectionEvent(CellPreviewEvent<ContentType> event) {
NativeEvent nativeEvent = event.getNativeEvent();
if (BrowserEvents.CLICK.equals(nativeEvent.getType())) {
if (nativeEvent.getCtrlKey()) {
ContentType value = event.getValue();
selectionModel.setSelected(value, !selectionModel.isSelected(value));
return SelectAction.IGNORE;
}
if (!selectionModel.getSelectedSet().isEmpty() && !isCheckboxColumn(event.getColumn())) {
return SelectAction.DEFAULT;
}
}
return SelectAction.TOGGLE;
}
private boolean isCheckboxColumn(int columnIndex) {
return columnIndex == table.getColumnIndex(checkColumn);
}
}));
filterPanel = new AbstractFilterablePanel<ContentType>(allData, table, dataProvider) {
@Override