revised the RefreshableSelectionModel

This commit is contained in:
Lukas Furmanek committed 2015-11-20 16:27:49 +01:00
1 parent 632364416e
commit dcd2effc05
13 files changed
+59 -69

No files matched your search

@@ -267,7 +267,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
final CellTable<StrippedLeaderboardDTO> leaderboardTable, AdminConsoleTableResources tableResources,
ListHandler<StrippedLeaderboardDTO> leaderboardColumnListHandler) {
SelectionCheckboxColumn<StrippedLeaderboardDTO> selectionCheckboxColumn = new SelectionCheckboxColumn<StrippedLeaderboardDTO>(tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell()) {
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<StrippedLeaderboardDTO> getListDataProvider() {
return leaderboardList;
@@ -104,7 +104,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
protected void createUI() {
AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>(tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell()) {
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<RaceDTO> getListDataProvider() {
return raceList;
@@ -147,12 +147,6 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
@SuppressWarnings("unchecked")
RefreshableMultiSelectionModel<EventDTO> multiSelectionModel = (RefreshableMultiSelectionModel<EventDTO>) eventTable.getSelectionModel();
multiSelectionModel.setHasEqualIdentity(new EntityIdentityComparator<EventDTO>() {
@Override
public boolean representSameEntity(EventDTO dto1, EventDTO dto2) {
return dto1.id.equals(dto2.id) ? true : false;
}
});
eventSelectionModel = multiSelectionModel;
eventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -205,7 +199,13 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
table.setWidth("100%");
SelectionCheckboxColumn<EventDTO> eventSelectionCheckboxColumn = new SelectionCheckboxColumn<EventDTO>(tableRes.cellTableStyle().cellTableCheckboxSelected(),
tableRes.cellTableStyle().cellTableCheckboxDeselected(), tableRes.cellTableStyle().cellTableCheckboxColumnCell()) {
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), new EntityIdentityComparator<EventDTO>() {
@Override
public boolean representSameEntity(EventDTO dto1, EventDTO dto2) {
return dto1.id.equals(dto2.id) ? true : false;
}
} /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<EventDTO> getListDataProvider() {
return eventListDataProvider;
@@ -192,7 +192,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
leaderboardsTable.ensureDebugId("LeaderboardsCellTable");
SelectionCheckboxColumn<StrippedLeaderboardDTO> leaderboardTableSelectionColumn =
new SelectionCheckboxColumn<StrippedLeaderboardDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell()) {
tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<StrippedLeaderboardDTO> getListDataProvider() {
return leaderboardsProvider;
@@ -365,7 +365,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
groupDetailsProvider.addDataDisplay(groupDetailsTable);
SelectionCheckboxColumn<StrippedLeaderboardDTO> groupDetailsTableSelectionColumn =
new SelectionCheckboxColumn<StrippedLeaderboardDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell()) {
tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<StrippedLeaderboardDTO> getListDataProvider() {
return groupDetailsProvider;
@@ -147,7 +147,7 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
table.setWidth("100%");
SelectionCheckboxColumn<RegattaDTO> regattaSelectionCheckboxColumn = new SelectionCheckboxColumn<RegattaDTO>(tableRes.cellTableStyle().cellTableCheckboxSelected(),
tableRes.cellTableStyle().cellTableCheckboxDeselected(), tableRes.cellTableStyle().cellTableCheckboxColumnCell()) {
tableRes.cellTableStyle().cellTableCheckboxDeselected(), tableRes.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<RegattaDTO> getListDataProvider() {
return regattaListDataProvider;
@@ -42,7 +42,7 @@ public class StructureImportListComposite extends RegattaListComposite implement
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RegattaDTO>(tableRes.cellTableStyle()
.cellTableCheckboxSelected(), tableRes.cellTableStyle().cellTableCheckboxDeselected(),
tableRes.cellTableStyle().cellTableCheckboxColumnCell()) {
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<RegattaDTO> getListDataProvider() {
return regattaListDataProvider;
@@ -49,7 +49,7 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
SelectionCheckboxColumn<T> selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
tableRes.cellTableStyle().cellTableCheckboxSelected(),
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
tableRes.cellTableStyle().cellTableCheckboxColumnCell()) {
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
protected ListDataProvider<T> getListDataProvider() {
return dataProvider;
@@ -359,7 +359,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
raceVisibilityColumn.setSortable(true);
SelectionCheckboxColumn<TracTracRaceRecordDTO> selectionCheckboxColumn = new SelectionCheckboxColumn<TracTracRaceRecordDTO>(tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell()) {
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/) {
@Override
public Boolean getValue(TracTracRaceRecordDTO row) {
return racesTable.getSelectionModel().isSelected(row);
@@ -19,6 +19,7 @@ import com.sap.sailing.domain.common.InvertibleComparator;
import com.sap.sailing.domain.common.SortingOrder;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
/**
@@ -56,18 +57,20 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
* CSS class for the <code>&lt;div&gt;</code> element representing a deselected element
* @param checkboxColumnCellCSSClass
* CSS class for the <code>&lt;td&gt;</code> element rendering the cell
* @param entityIdentityComparator
* {@link EntityIdentityComparator} to create a {@link RefreshableMultiSelectionModel}.
*/
protected SelectionCheckboxColumn(String selectedCheckboxCSSClass,
String deselectedCheckboxCSSClass, String checkboxColumnCellCSSClass) {
this(new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass);
String deselectedCheckboxCSSClass, String checkboxColumnCellCSSClass, EntityIdentityComparator<T> entityIdentityComparator) {
this(new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass, entityIdentityComparator);
}
private SelectionCheckboxColumn(BetterCheckboxCell checkboxCell, String checkboxColumnCellCSSClass) {
private SelectionCheckboxColumn(BetterCheckboxCell checkboxCell, String checkboxColumnCellCSSClass, EntityIdentityComparator<T> entityIdentityComparator) {
super(checkboxCell, SortingOrder.DESCENDING);
this.cell = checkboxCell;
this.checkboxColumnCellCSSClass = checkboxColumnCellCSSClass;
this.selectionEventTranslator = createSelectionEventTranslator();
this.selectionModel = createSelectionModel();
this.selectionModel = createSelectionModel(entityIdentityComparator);
}
/**
@@ -96,8 +99,8 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
* Otherwise, clients or subclasses are responsible to issue the necessary calls to {@link #redrawRow(LeaderboardRowDTO, List)}
* after selection changes.
*/
private RefreshableMultiSelectionModel<T> createSelectionModel() {
return new RefreshableMultiSelectionModel<T>() {
private RefreshableMultiSelectionModel<T> createSelectionModel(final EntityIdentityComparator<T> entityIdentityComparator) {
return new RefreshableMultiSelectionModel<T>(entityIdentityComparator) {
@Override
public void clear() {
super.clear();
@@ -1593,7 +1593,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
private class LeaderboardSelectionCheckboxColumn extends com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn<LeaderboardRowDTO>
implements CompetitorSelectionChangeListener {
protected LeaderboardSelectionCheckboxColumn(final CompetitorSelectionProvider competitorSelectionProvider) {
super(tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell());
super(tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(), null /*entityIdentityComparator to create a RefreshableSelectionModel*/);
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
}
@@ -1,5 +1,6 @@
package com.sap.sse.gwt.client.celltable;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.view.client.MultiSelectionModel;
@@ -28,36 +29,20 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> im
return comp;
}
@Override
public void setHasEqualIdentity(EntityIdentityComparator<T> comp) {
this.comp = comp;
}
@Override
public void refreshSelectionModel(Iterable<T> newObjects) {
Set<T> selectedSet = getSelectedSet();
EntityIdentityComparator<T> comp = getEntityIdentityComparator();
final Set<T> selectedSet = new HashSet<>(getSelectedSet());
final boolean isSelected = !selectedSet.isEmpty();
clear();
if (comp != null) {
for (T it : newObjects) {
for (T selected : selectedSet) {
if (comp.representSameEntity(selected, it)) {
setSelected(it, true);
} else {
setSelected(it, false);
}
}
}
} else {
for (T it : newObjects) {
for (T selected : selectedSet) {
if (selected.equals(it)) {
setSelected(it, true);
} else {
setSelected(it, false);
}
for (final T it : newObjects) {
if (isSelected) {
for (final T selected : selectedSet) {
setSelected(it, comp == null ? selected.equals(it) : comp.representSameEntity(selected, it));
}
} else {
setSelected(it, false);
}
}
scheduleSelectionChangeEvent();
}
}
}
@@ -2,6 +2,16 @@ package com.sap.sse.gwt.client.celltable;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SetSelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
/**
* The Interface {@link RefreshableSelectionModel} unify the refresh behavior of SelectionModels e.g. of a
* {@link SingleSelectionModel}. To refresh this SelectionModel you can call the
* {@link RefreshableSelectionModel#refreshSelectionModel(Iterable)} method and this method will refresh the
* SelectionModel.
*
* @author D064976
*/
public interface RefreshableSelectionModel<T> extends SetSelectionModel<T> {
/**
@@ -10,15 +20,6 @@ public interface RefreshableSelectionModel<T> extends SetSelectionModel<T> {
*/
public EntityIdentityComparator<T> getEntityIdentityComparator();
/**
* Sets the {@link EntityIdentityComparator} field, to compare objects from the type <code>&ltT&gt</code>.
*
* @param comp
* When you set <code>null</code>, the <code>T.eqauls()</code> will be used.
*/
// TODO remove this setter and pass the comparator to the constructor of the implementing class(es)
public void setHasEqualIdentity(EntityIdentityComparator<T> comp);
/**
* Refreshes the {@link RefreshableSelectionModel} with the <code>newObjects</code>. All objects from the current
* selection that {@link EntityIdentityComparator#representSameEntity(Object, Object) represent the same entity} as
@@ -26,9 +27,12 @@ public interface RefreshableSelectionModel<T> extends SetSelectionModel<T> {
* has no {@link EntityIdentityComparator} set, this method will use the {@link #equals(Object)} method to compare.
* <p>
*
* TODO what happens with objects that were in the selection but are not in newObjects?
* TODO what about triggering an {@link SelectionChangeEvent.Handler#onSelectionChange(SelectionChangeEvent)}, e.g., using {@link AbstractSelectionModel#scheduleSelectionChangeEvent}
* If an selected object is not in the <code>newObjects</code> the object wouldn't be selected anymore.
* <p>
*
* When the selection is refreshed this method triggers a
* {@link SelectionChangeEvent.Handler#onSelectionChange(SelectionChangeEvent) onSelectionChangedEvent} using
* {@link AbstractSelectionModel#scheduleSelectionChangeEvent}.
*/
public void refreshSelectionModel(Iterable<T> newObjects);
}
@@ -1,5 +1,6 @@
package com.sap.sse.gwt.client.celltable;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.view.client.ProvidesKey;
@@ -28,21 +29,18 @@ public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T>
return comp;
}
@Override
public void setHasEqualIdentity(EntityIdentityComparator<T> comp) {
this.comp = comp;
// TODO remove
}
@Override
public void refreshSelectionModel(Iterable<T> newObjects) {
final Set<T> selectedSet = getSelectedSet();
final EntityIdentityComparator<T> comp = getEntityIdentityComparator();
final Set<T> selectedSet = new HashSet<>(getSelectedSet());
final T selected = selectedSet.isEmpty() ? null : selectedSet.iterator().next();
clear();
for (final T it : newObjects) {
for (final T selected : selectedSet) {
if (selected != null) {
setSelected(it, comp == null ? selected.equals(it) : comp.representSameEntity(selected, it));
} else {
setSelected(it, false);
}
}
scheduleSelectionChangeEvent();
}
}
}