Splitted the regatta table in RegattaManagementPanel into a smaller regatta overview list and a details view for a selected regatta.

Added sorting and filtering to the overview list.
Improved series editing.
This commit is contained in:
fmittag committed 2013-03-03 01:19:21 +01:00
1 parent 3b0ef2bb01
commit a28d185a71
12 files changed
+832 -306

No files matched your search

@@ -0,0 +1,30 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Arrays;
import com.google.gwt.core.client.GWT;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class EventConfigImagesBarCell extends ImagesBarCell {
static final String ACTION_REMOVE = "ACTION_REMOVE";
static final String ACTION_EDIT = "ACTION_EDIT";
private final StringMessages stringMessages;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
public EventConfigImagesBarCell(StringMessages stringConstants) {
super();
this.stringMessages = stringConstants;
}
public EventConfigImagesBarCell(SafeHtmlRenderer<String> renderer, StringMessages stringMessages) {
super();
this.stringMessages = stringMessages;
}
@Override
protected Iterable<ImageSpec> getImageSpecs() {
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
}
}
@@ -37,7 +37,8 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
private final boolean hasOneSeries;
private Grid raceColumnsGrid;
private VerticalPanel additionalWidgetPanel;
private final SeriesDTO preSelectedSeries;
private static class RaceDialogValidator implements Validator<Pair<SeriesDTO, List<RaceColumnDTO>>> {
private StringMessages stringConstants;
private RegattaDTO regatta;
@@ -54,66 +55,63 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getB();
String errorMessage = null;
if(seriesToValidate == null) {
errorMessage = stringConstants.pleaseSelectASeries();
} else {
for (SeriesDTO seriesDTO: regatta.series) {
if(!seriesDTO.name.equals(seriesToValidate.name)) {
for(RaceColumnDTO raceColumn: seriesDTO.getRaceColumns()) {
raceColumnNamesOfOtherSeries.add(raceColumn.name);
}
for (SeriesDTO seriesDTO: regatta.series) {
if(!seriesDTO.name.equals(seriesToValidate.name)) {
for(RaceColumnDTO raceColumn: seriesDTO.getRaceColumns()) {
raceColumnNamesOfOtherSeries.add(raceColumn.name);
}
}
}
boolean raceColumnNameNotEmpty = true;
RaceColumnDTO wrongRaceColumn = null;
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
raceColumnNameNotEmpty = raceColumn.name != null && raceColumn.name.length() > 0;
if (!raceColumnNameNotEmpty) {
wrongRaceColumn = raceColumn;
break;
}
}
boolean raceColumnUniqueInSeries = true;
boolean raceColumnUniqueInRegatta = true;
HashSet<String> setToFindDuplicates = new HashSet<String>();
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
if (!setToFindDuplicates.add(raceColumn.name)) {
raceColumnUniqueInSeries = false;
wrongRaceColumn = raceColumn;
break;
} else if(raceColumnNamesOfOtherSeries.contains(raceColumn.name)) {
raceColumnUniqueInRegatta = false;
wrongRaceColumn = raceColumn;
break;
}
}
boolean raceColumnNameNotEmpty = true;
RaceColumnDTO wrongRaceColumn = null;
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
raceColumnNameNotEmpty = raceColumn.name != null && raceColumn.name.length() > 0;
if (!raceColumnNameNotEmpty) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.pleaseEnterAName();
} else if (!raceColumnUniqueInSeries) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExists();
} else if (!raceColumnUniqueInRegatta) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExistsInRegatta();
wrongRaceColumn = raceColumn;
break;
}
}
boolean raceColumnUniqueInSeries = true;
boolean raceColumnUniqueInRegatta = true;
HashSet<String> setToFindDuplicates = new HashSet<String>();
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
if (!setToFindDuplicates.add(raceColumn.name)) {
raceColumnUniqueInSeries = false;
wrongRaceColumn = raceColumn;
break;
} else if(raceColumnNamesOfOtherSeries.contains(raceColumn.name)) {
raceColumnUniqueInRegatta = false;
wrongRaceColumn = raceColumn;
break;
}
}
if (!raceColumnNameNotEmpty) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.pleaseEnterAName();
} else if (!raceColumnUniqueInSeries) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExists();
} else if (!raceColumnUniqueInRegatta) {
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
+ stringConstants.raceWithThisNameAlreadyExistsInRegatta();
}
return errorMessage;
}
}
public RaceColumnInRegattaSeriesDialog(RegattaDTO regatta, StringMessages stringConstants,
public RaceColumnInRegattaSeriesDialog(RegattaDTO regatta, SeriesDTO preSelectedSeries, StringMessages stringConstants,
DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>> callback) {
super(stringConstants.actionEditRaces(), null, stringConstants.ok(), stringConstants.cancel(),
new RaceDialogValidator(regatta, stringConstants), callback);
this.regatta = regatta;
this.preSelectedSeries = preSelectedSeries;
this.stringMessages = stringConstants;
this.hasOneSeries = regatta.series.size() == 1;
seriesListBox = createListBox(false);
@@ -206,9 +204,13 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
raceNamePrefixTextBox.setText(seriesName.substring(0, 1).toUpperCase());
}
} else {
seriesListBox.addItem(stringMessages.pleaseSelectASeries());
int i = 0;
for (SeriesDTO series : regatta.series) {
seriesListBox.addItem(series.name);
if(series.name.equals(preSelectedSeries.name)) {
seriesListBox.setSelectedIndex(i);
}
i++;
}
}
@@ -233,7 +235,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
addRacesPanel.setSpacing(3);
addRacesPanel.add(new Label(stringMessages.add()));
addRacesPanel.add(addRacesListBox);
for(int i = 1; i <= 10; i++) {
for(int i = 1; i <= 50; i++) {
addRacesListBox.addItem("" + i);
}
addRacesListBox.setSelectedIndex(0);
@@ -270,9 +272,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
additionalWidgetPanel.add(createHeadlineLabel(stringMessages.races()));
additionalWidgetPanel.add(raceColumnsGrid);
if(hasOneSeries) {
fillExistingRacesOfSeries();
}
fillExistingRacesOfSeries();
return additionalWidgetPanel;
}
@@ -8,7 +8,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
public class RegattaConfigImagesBarCell extends ImagesBarCell {
static final String ACTION_REMOVE = "ACTION_REMOVE";
static final String ACTION_EDIT = "ACTION_EDIT";
private final StringMessages stringMessages;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
@@ -24,7 +23,6 @@ public class RegattaConfigImagesBarCell extends ImagesBarCell {
@Override
protected Iterable<ImageSpec> getImageSpecs() {
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
return Arrays.asList(new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
}
}
@@ -0,0 +1,268 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback;
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
import com.sap.sailing.gwt.ui.shared.FleetDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
public class RegattaDetailsComposite extends Composite {
private RegattaDTO regatta;
private final CaptionPanel mainPanel;
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final StringMessages stringMessages;
private final RegattaRefresher regattaRefresher;
private final Label regattaName;
private final Label boatClassName;
private final Label scoringSystem;
private final SelectionModel<SeriesDTO> seriesSelectionModel;
private final CellTable<SeriesDTO> seriesTable;
private ListDataProvider<SeriesDTO> seriesListDataProvider;
private static AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
public RegattaDetailsComposite(final SailingServiceAsync sailingService, final RegattaRefresher regattaRefresher,
final ErrorReporter errorReporter, final StringMessages stringMessages) {
this.sailingService = sailingService;
this.regattaRefresher = regattaRefresher;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
regatta = null;
mainPanel = new CaptionPanel(stringMessages.regatta());
VerticalPanel vPanel = new VerticalPanel();
mainPanel.add(vPanel);
Grid grid = new Grid(3, 2);
vPanel.add(grid);
regattaName = new Label();
grid.setWidget(0 , 0, new Label(stringMessages.regattaName() + ":"));
grid.setWidget(0 , 1, regattaName);
boatClassName = new Label();
grid.setWidget(1 , 0, new Label(stringMessages.boatClass() + ":"));
grid.setWidget(1 , 1, boatClassName);
scoringSystem = new Label();
grid.setWidget(2 , 0, new Label(stringMessages.scoringSystem() + ":"));
grid.setWidget(2 , 1, scoringSystem);
seriesTable = createRegattaSeriesTable();
seriesSelectionModel = new SingleSelectionModel<SeriesDTO>();
seriesSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
}
});
seriesTable.setSelectionModel(seriesSelectionModel);
seriesListDataProvider = new ListDataProvider<SeriesDTO>();
seriesListDataProvider.addDataDisplay(seriesTable);
vPanel.add(seriesTable);
initWidget(mainPanel);
}
private CellTable<SeriesDTO> createRegattaSeriesTable() {
CellTable<SeriesDTO> table = new CellTable<SeriesDTO>(/* pageSize */10000, tableRes);
table.setWidth("100%");
TextColumn<SeriesDTO> seriesNameColumn = new TextColumn<SeriesDTO>() {
@Override
public String getValue(SeriesDTO series) {
return series.name;
}
};
TextColumn<SeriesDTO> isMedalSeriesColumn = new TextColumn<SeriesDTO>() {
@Override
public String getValue(SeriesDTO series) {
return series.isMedal() ? stringMessages.yes() : stringMessages.no();
}
};
TextColumn<SeriesDTO> racesColumn = new TextColumn<SeriesDTO>() {
@Override
public String getValue(SeriesDTO series) {
String result = "";
if(!series.getRaceColumns().isEmpty()) {
int raceColumnsCount = series.getRaceColumns().size();
int i = 1;
for(RaceColumnDTO raceColumn: series.getRaceColumns()) {
result += raceColumn.getRaceColumnName();
if(i < raceColumnsCount) {
result += ", ";
}
i++;
}
} else {
result = stringMessages.noRacesYet();
}
return result;
}
};
TextColumn<SeriesDTO> fleetsColumn = new TextColumn<SeriesDTO>() {
@Override
public String getValue(SeriesDTO series) {
String result = "";
int fleetsCount = series.getFleets().size();
int i = 1;
for(FleetDTO fleet: series.getFleets()) {
result += fleet.name;
result += "(" + fleet.getOrderNo() + ") ";
if (i < fleetsCount) {
result += ", ";
}
i++;
}
return result;
}
};
ImagesBarColumn<SeriesDTO, SeriesConfigImagesBarCell> seriesActionColumn = new ImagesBarColumn<SeriesDTO, SeriesConfigImagesBarCell>(
new SeriesConfigImagesBarCell(stringMessages));
seriesActionColumn.setFieldUpdater(new FieldUpdater<SeriesDTO, String>() {
@Override
public void update(int index, SeriesDTO series, String value) {
if (SeriesConfigImagesBarCell.ACTION_EDIT.equals(value)) {
editRacesOfRegattaSeries(regatta, series);
}
}
});
table.addColumn(seriesNameColumn, stringMessages.series());
table.addColumn(isMedalSeriesColumn, stringMessages.medalSeries());
table.addColumn(racesColumn, stringMessages.races());
table.addColumn(fleetsColumn, stringMessages.fleets());
table.addColumn(seriesActionColumn, stringMessages.actions());
return table;
}
public RegattaDTO getRegatta() {
return regatta;
}
public void setRegatta(RegattaDTO regatta) {
this.regatta = regatta;
updateRegattaDetails();
}
private void editRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series) {
RaceColumnInRegattaSeriesDialog raceDialog = new RaceColumnInRegattaSeriesDialog(regatta, series, stringMessages,
new DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>>() {
@Override
public void cancel() {
}
@Override
public void ok(final Pair<SeriesDTO, List<RaceColumnDTO>> result) {
updateRacesOfRegattaSeries(regatta, result.getA(), result.getB());
}
});
raceDialog.show();
}
private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series, List<RaceColumnDTO> newRaceColumns) {
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
List<RaceColumnDTO> existingRaceColumns = series.getRaceColumns();
final List<String> raceColumnsToAdd = new ArrayList<String>();
final List<String> raceColumnsToRemove = new ArrayList<String>();
for(RaceColumnDTO newRaceColumn: newRaceColumns) {
if(!existingRaceColumns.contains(newRaceColumn)) {
raceColumnsToAdd.add(newRaceColumn.name);
}
}
for(RaceColumnDTO existingRaceColumn: existingRaceColumns) {
if(!newRaceColumns.contains(existingRaceColumn)) {
raceColumnsToRemove.add(existingRaceColumn.name);
}
}
sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<List<RaceColumnInSeriesDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to add race columns "
+ raceColumnsToAdd + " to series " + series.name
+ ": " + caught.getMessage());
}
@Override
public void onSuccess(List<RaceColumnInSeriesDTO> raceColumns) {
regattaRefresher.fillRegattas();
updateRegattaDetails();
}
});
sailingService.removeRaceColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to remove race columns "
+ raceColumnsToAdd + " from series " + series.name
+ ": " + caught.getMessage());
}
@Override
public void onSuccess(Void v) {
regattaRefresher.fillRegattas();
updateRegattaDetails();
}
});
}
private void updateRegattaDetails() {
if(regatta != null) {
regattaName.setText(regatta.name);
boatClassName.setText(regatta.boatClass != null ? regatta.boatClass.name : "");
ScoringSchemeType scoringScheme = regatta.scoringScheme;
String scoringSystemText = scoringScheme == null ? "" : ScoringSchemeTypeFormatter.format(scoringScheme, stringMessages);
scoringSystem.setText(scoringSystemText);
seriesListDataProvider.getList().clear();
seriesListDataProvider.getList().addAll(regatta.series);
}
}
}
@@ -0,0 +1,255 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.RegattaSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class RegattaListComposite extends SimplePanel implements RegattaDisplayer {
private final SelectionModel<RegattaDTO> regattaSelectionModel;
private final CellTable<RegattaDTO> regattaTable;
private ListDataProvider<RegattaDTO> regattaListDataProvider;
private List<RegattaDTO> allRegattas;
private final VerticalPanel panel;
private final Label noRegattasLabel;
private final SailingServiceAsync sailingService;
private final RegattaSelectionProvider regattaSelectionProvider;
private final ErrorReporter errorReporter;
private final RegattaRefresher regattaRefresher;
private final StringMessages stringMessages;
private final TextBox filterRegattasTextbox;
private static AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
sb.append(safeHtml);
}
}
public RegattaListComposite(final SailingServiceAsync sailingService, final RegattaSelectionProvider regattaSelectionProvider,
RegattaRefresher regattaRefresher, final ErrorReporter errorReporter, final StringMessages stringMessages) {
this.sailingService = sailingService;
this.regattaSelectionProvider = regattaSelectionProvider;
this.regattaRefresher = regattaRefresher;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
panel = new VerticalPanel();
setWidget(panel);
HorizontalPanel filterPanel = new HorizontalPanel();
panel.add(filterPanel);
Label filterRegattasLabel = new Label(stringMessages.filterRacesByName() + ":");
filterRegattasLabel.setWordWrap(false);
filterPanel.setSpacing(5);
filterPanel.add(filterRegattasLabel);
filterPanel.setCellVerticalAlignment(filterRegattasLabel, HasVerticalAlignment.ALIGN_MIDDLE);
filterRegattasTextbox = new TextBox();
filterRegattasTextbox.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
updateFilteredRegattasList();
}
});
filterPanel.add(filterRegattasTextbox);
noRegattasLabel = new Label(stringMessages.noRacesYet());
noRegattasLabel.setWordWrap(false);
panel.add(noRegattasLabel);
regattaListDataProvider = new ListDataProvider<RegattaDTO>();
regattaTable = createRegattaTable();
regattaTable.setVisible(false);
regattaSelectionModel = new SingleSelectionModel<RegattaDTO>();
regattaSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
List<RegattaDTO> selectedRegattas = getSelectedRegattas();
List<RegattaIdentifier> selectedRaceIdentifiers = new ArrayList<RegattaIdentifier>();
for (RegattaDTO selectedRegatta : selectedRegattas) {
selectedRaceIdentifiers.add(selectedRegatta.getRegattaIdentifier());
}
RegattaListComposite.this.regattaSelectionProvider.setSelection(selectedRaceIdentifiers);
}
});
regattaTable.setSelectionModel(regattaSelectionModel);
panel.add(regattaTable);
}
private CellTable<RegattaDTO> createRegattaTable() {
CellTable<RegattaDTO> table = new CellTable<RegattaDTO>(/* pageSize */10000, tableRes);
regattaListDataProvider.addDataDisplay(table);
table.setWidth("100%");
ListHandler<RegattaDTO> columnSortHandler = new ListHandler<RegattaDTO>(regattaListDataProvider.getList());
table.addColumnSortHandler(columnSortHandler);
TextColumn<RegattaDTO> regattaNameColumn = new TextColumn<RegattaDTO>() {
@Override
public String getValue(RegattaDTO regatta) {
return regatta.name;
}
};
regattaNameColumn.setSortable(true);
columnSortHandler.setComparator(regattaNameColumn, new Comparator<RegattaDTO>() {
@Override
public int compare(RegattaDTO r1, RegattaDTO r2) {
return r1.name.compareTo(r2.name);
}
});
TextColumn<RegattaDTO> regattaBoatClassColumn = new TextColumn<RegattaDTO>() {
@Override
public String getValue(RegattaDTO regatta) {
return regatta.boatClass != null ? regatta.boatClass.name : "";
}
};
regattaBoatClassColumn.setSortable(true);
columnSortHandler.setComparator(regattaBoatClassColumn, new Comparator<RegattaDTO>() {
@Override
public int compare(RegattaDTO r1, RegattaDTO r2) {
return r1.boatClass.name.compareTo(r2.boatClass.name);
}
});
ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell> regattaActionColumn = new ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell>(
new RegattaConfigImagesBarCell(stringMessages));
regattaActionColumn.setFieldUpdater(new FieldUpdater<RegattaDTO, String>() {
@Override
public void update(int index, RegattaDTO regatta, String value) {
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(regatta.name))) {
removeRegatta(regatta);
}
}
}
});
table.addColumn(regattaNameColumn, stringMessages.regattaName());
table.addColumn(regattaBoatClassColumn, stringMessages.boatClass());
table.addColumn(regattaActionColumn, stringMessages.actions());
return table;
}
private void updateFilteredRegattasList() {
String text = filterRegattasTextbox.getText();
List<String> wordsToFilter = Arrays.asList(text.split(" "));
regattaListDataProvider.getList().clear();
if (text != null && !text.isEmpty()) {
for (RegattaDTO regattaDTO : allRegattas) {
boolean failed = false;
for (String word : wordsToFilter) {
String textAsUppercase = word.toUpperCase().trim();
if (!regattaDTO.name.toUpperCase().contains(textAsUppercase)
&& !regattaDTO.boatClass.name.toUpperCase().contains(textAsUppercase)
&& !regattaDTO.name.toUpperCase().contains(textAsUppercase)) {
failed = true;
break;
}
}
if (!failed) {
regattaListDataProvider.getList().add(regattaDTO);
}
}
} else {
for (RegattaDTO regatta : allRegattas) {
regattaListDataProvider.getList().add(regatta);
}
}
// now sort again according to selected criterion
ColumnSortEvent.fire(regattaTable, regattaTable.getColumnSortList());
}
private void removeRegatta(final RegattaDTO regatta) {
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
sailingService.removeRegatta(regattaIdentifier, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to remove regatta " + regatta.name + ": " + caught.getMessage());
}
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
}
private List<RegattaDTO> getSelectedRegattas() {
List<RegattaDTO> result = new ArrayList<RegattaDTO>();
if (regattaListDataProvider != null) {
for (RegattaDTO regatta : regattaListDataProvider.getList()) {
if (regattaSelectionModel.isSelected(regatta)) {
result.add(regatta);
}
}
}
return result;
}
@Override
public void fillRegattas(List<RegattaDTO> regattas) {
if (regattas.isEmpty()) {
regattaTable.setVisible(false);
noRegattasLabel.setVisible(true);
} else {
regattaTable.setVisible(true);
noRegattasLabel.setVisible(false);
}
List<RegattaDTO> newAllRegattas = new ArrayList<RegattaDTO>(regattas);
List<RegattaIdentifier> newAllRaceIdentifiers = new ArrayList<RegattaIdentifier>();
for (RegattaDTO regatta : regattas) {
newAllRaceIdentifiers.add(regatta.getRegattaIdentifier());
}
allRegattas = newAllRegattas;
updateFilteredRegattasList();
regattaSelectionProvider.setAllRegattas(newAllRaceIdentifiers);
}
public List<RegattaDTO> getAllRegattas() {
return allRegattas;
}
}
@@ -6,49 +6,37 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
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.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.RegattaSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RegattaSelectionModel;
import com.sap.sailing.gwt.ui.client.RegattaSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.FleetDTO;
import com.sap.sailing.gwt.ui.shared.NamedDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
@@ -59,7 +47,7 @@ import com.sap.sailing.gwt.ui.shared.SeriesDTO;
* @author Frank Mittag (C5163974)
*
*/
public class RegattaStructureManagementPanel extends SimplePanel implements RegattaDisplayer {
public class RegattaStructureManagementPanel extends SimplePanel implements RegattaDisplayer, RegattaSelectionChangeListener {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final StringMessages stringMessages;
@@ -67,18 +55,17 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
private final List<EventDTO> events;
private ListBox eventsComboBox;
private EventDTO selectedEvent;
private CaptionPanel eventDetailsCaptionPanel;
private Label eventVenueLabel;
private CellTable<RegattaDTO> regattaTable;
private SingleSelectionModel<RegattaDTO> regattaSelectionModel;
private ListDataProvider<RegattaDTO> regattaProvider;
private final RegattaRefresher regattaRefresher;
private RegattaSelectionProvider regattaSelectionProvider;
private RegattaListComposite regattaListComposite;
private RegattaDetailsComposite regattaDetailsComposite;
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
private boolean supportEvents = false;
public RegattaStructureManagementPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter,
StringMessages stringMessages, RegattaRefresher regattaRefresher) {
this.sailingService = sailingService;
@@ -155,226 +142,19 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
}
});
// regatta table
TextColumn<RegattaDTO> regattaNameColumn = new TextColumn<RegattaDTO>() {
@Override
public String getValue(RegattaDTO regatta) {
return regatta.name;
}
};
TextColumn<RegattaDTO> regattaBoatClassColumn = new TextColumn<RegattaDTO>() {
@Override
public String getValue(RegattaDTO regatta) {
final NamedDTO boatClass = regatta.boatClass;
return boatClass==null?"(null)":boatClass.name;
}
};
TextColumn<RegattaDTO> regattaScoringSystemColumn = new TextColumn<RegattaDTO>() {
@Override
public String getValue(RegattaDTO regatta) {
ScoringSchemeType scoringScheme = regatta.scoringScheme;
String scoringSystem = scoringScheme == null ? "" : ScoringSchemeTypeFormatter.format(scoringScheme, stringMessages);
return scoringSystem;
}
};
Grid grid = new Grid(1 ,2);
parentPanel.add(grid);
final SafeHtmlCell seriesCell = new SafeHtmlCell();
Column<RegattaDTO, SafeHtml> regattaSeriesColumn = new Column<RegattaDTO, SafeHtml>(seriesCell) {
@Override
public SafeHtml getValue(RegattaDTO regatta) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
int seriesCount = regatta.series.size();
int i = 1;
for (SeriesDTO serie : regatta.series) {
builder.appendEscaped(i + ". " + serie.name);
if (serie.isMedal()) {
builder.appendEscaped(" (" + stringMessages.medalSeries() + ")");
}
if (i < seriesCount) {
builder.appendHtmlConstant("<br>");
}
i++;
}
return builder.toSafeHtml();
}
};
final SafeHtmlCell regattaRacesCell = new SafeHtmlCell();
Column<RegattaDTO, SafeHtml> regattaRacesColumn = new Column<RegattaDTO, SafeHtml>(regattaRacesCell) {
@Override
public SafeHtml getValue(RegattaDTO regatta) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
int seriesCount = regatta.series.size();
int i = 1;
for (SeriesDTO serie : regatta.series) {
int raceColumnsCount = serie.getRaceColumns().size();
int j = 1;
if(!serie.getRaceColumns().isEmpty()) {
for(RaceColumnDTO raceColumn: serie.getRaceColumns()) {
builder.appendEscaped(j + ". " + raceColumn.getRaceColumnName());
if(j < raceColumnsCount) {
builder.appendEscaped(", ");
}
j++;
}
} else {
builder.appendEscaped(stringMessages.noRacesYet());
}
if(i < seriesCount) {
builder.appendHtmlConstant("<br>");
}
i++;
}
return builder.toSafeHtml();
}
};
final SafeHtmlCell fleetsCell = new SafeHtmlCell();
Column<RegattaDTO, SafeHtml> regattaFleetsColumn = new Column<RegattaDTO, SafeHtml>(fleetsCell) {
@Override
public SafeHtml getValue(RegattaDTO regatta) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
int seriesCount = regatta.series.size();
int i = 1;
for (SeriesDTO serie : regatta.series) {
int fleetsCount = serie.getFleets().size();
int j = 1;
for(FleetDTO fleet: serie.getFleets()) {
builder.appendEscaped(j + ". " + fleet.name);
builder.appendEscaped(" (" + fleet.getOrderNo() + ") ");
if (j < fleetsCount) {
builder.appendEscaped(", ");
}
j++;
}
if(i < seriesCount) {
builder.appendHtmlConstant("<br>");
}
i++;
}
return builder.toSafeHtml();
}
};
ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell> regattaActionColumn = new ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell>(
new RegattaConfigImagesBarCell(stringMessages));
regattaActionColumn.setFieldUpdater(new FieldUpdater<RegattaDTO, String>() {
@Override
public void update(int index, RegattaDTO regatta, String value) {
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(regatta.name))) {
removeRegatta(regatta);
}
} else if (RegattaConfigImagesBarCell.ACTION_EDIT.equals(value)) {
editRacesOfRegattaSeries(regatta);
}
}
});
regattaSelectionProvider = new RegattaSelectionModel(false);
regattaSelectionProvider.addRegattaSelectionChangeListener(this);
regattaTable = new CellTable<RegattaDTO>(10000, tableRes);
regattaTable.setWidth("100%");
regattaTable.addColumn(regattaNameColumn, stringMessages.regattaName());
regattaTable.addColumn(regattaBoatClassColumn, stringMessages.boatClass());
regattaTable.addColumn(regattaScoringSystemColumn, stringMessages.scoringSystem());
regattaTable.addColumn(regattaSeriesColumn, stringMessages.series());
regattaTable.addColumn(regattaRacesColumn, stringMessages.races());
regattaTable.addColumn(regattaFleetsColumn, stringMessages.fleets());
regattaTable.addColumn(regattaActionColumn, stringMessages.actions());
regattaSelectionModel = new SingleSelectionModel<RegattaDTO>();
regattaSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
}
});
regattaTable.setSelectionModel(regattaSelectionModel);
regattaProvider = new ListDataProvider<RegattaDTO>();
regattaProvider.addDataDisplay(regattaTable);
parentPanel.add(regattaTable);
}
private void editRacesOfRegattaSeries(final RegattaDTO regatta) {
RaceColumnInRegattaSeriesDialog raceDialog = new RaceColumnInRegattaSeriesDialog(regatta, stringMessages,
new DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>>() {
@Override
public void cancel() {
}
@Override
public void ok(final Pair<SeriesDTO, List<RaceColumnDTO>> result) {
updateRacesOfRegattaSeries(regatta, result.getA(), result.getB());
}
});
raceDialog.show();
}
private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series, List<RaceColumnDTO> newRaceColumns) {
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
List<RaceColumnDTO> existingRaceColumns = series.getRaceColumns();
final List<String> raceColumnsToAdd = new ArrayList<String>();
final List<String> raceColumnsToRemove = new ArrayList<String>();
for(RaceColumnDTO newRaceColumn: newRaceColumns) {
if(!existingRaceColumns.contains(newRaceColumn)) {
raceColumnsToAdd.add(newRaceColumn.name);
}
}
for(RaceColumnDTO existingRaceColumn: existingRaceColumns) {
if(!newRaceColumns.contains(existingRaceColumn)) {
raceColumnsToRemove.add(existingRaceColumn.name);
}
}
sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<List<RaceColumnInSeriesDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to add race columns "
+ raceColumnsToAdd + " to series " + series.name
+ ": " + caught.getMessage());
}
@Override
public void onSuccess(List<RaceColumnInSeriesDTO> raceColumns) {
regattaRefresher.fillRegattas();
}
});
sailingService.removeRaceColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to remove race columns "
+ raceColumnsToAdd + " from series " + series.name
+ ": " + caught.getMessage());
}
@Override
public void onSuccess(Void v) {
regattaRefresher.fillRegattas();
}
});
}
private void removeRegatta(final RegattaDTO regatta) {
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
sailingService.removeRegatta(regattaIdentifier, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to remove regatta " + regatta.name + ": " + caught.getMessage());
}
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
regattaListComposite = new RegattaListComposite(sailingService, regattaSelectionProvider, regattaRefresher, errorReporter, stringMessages);
grid.setWidget(0, 0, regattaListComposite);
grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP);
grid.getColumnFormatter().getElement(1).getStyle().setPaddingTop(2.0, Unit.EM);
regattaDetailsComposite = new RegattaDetailsComposite(sailingService, regattaRefresher, errorReporter, stringMessages);
regattaDetailsComposite.setVisible(false);
grid.setWidget(0, 1, regattaDetailsComposite);
}
private void onEventSelectionChanged() {
@@ -411,7 +191,7 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
if(supportEvents) {
existingRegattas = Collections.unmodifiableCollection(selectedEvent.regattas);
} else {
existingRegattas = Collections.unmodifiableCollection(regattaProvider.getList());
existingRegattas = Collections.unmodifiableCollection(regattaListComposite.getAllRegattas());
}
RegattaWithSeriesAndFleetsCreateDialog dialog = new RegattaWithSeriesAndFleetsCreateDialog(existingRegattas, stringMessages,
@@ -442,8 +222,7 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
@Override
public void onSuccess(List<RegattaDTO> regattas) {
regattaProvider.getList().clear();
regattaProvider.getList().addAll(regattas);
regattaListComposite.fillRegattas(regattas);
}
});
}
@@ -524,7 +303,23 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
@Override
public void fillRegattas(List<RegattaDTO> regattas) {
regattaProvider.getList().clear();
regattaProvider.getList().addAll(regattas);
regattaListComposite.fillRegattas(regattas);
}
@Override
public void onRegattaSelectionChange(List<RegattaIdentifier> selectedRegattas) {
RegattaIdentifier selectedRegatta = selectedRegattas.iterator().next();
if(selectedRegatta != null && regattaListComposite.getAllRegattas() != null) {
for(RegattaDTO regattaDTO: regattaListComposite.getAllRegattas()) {
if(regattaDTO.getRegattaIdentifier().equals(selectedRegatta)) {
regattaDetailsComposite.setRegatta(regattaDTO);
regattaDetailsComposite.setVisible(true);
break;
}
}
} else {
regattaDetailsComposite.setRegatta(null);
regattaDetailsComposite.setVisible(false);
}
}
}
@@ -97,16 +97,16 @@ public class SailingEventManagementPanel extends SimplePanel {
}
};
ImagesBarColumn<EventDTO, RegattaConfigImagesBarCell> eventActionColumn = new ImagesBarColumn<EventDTO, RegattaConfigImagesBarCell>(
new RegattaConfigImagesBarCell(stringMessages));
ImagesBarColumn<EventDTO, EventConfigImagesBarCell> eventActionColumn = new ImagesBarColumn<EventDTO, EventConfigImagesBarCell>(
new EventConfigImagesBarCell(stringMessages));
eventActionColumn.setFieldUpdater(new FieldUpdater<EventDTO, String>() {
@Override
public void update(int index, EventDTO event, String value) {
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
if (EventConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(event.name))) {
removeEvent(event);
}
} else if (RegattaConfigImagesBarCell.ACTION_EDIT.equals(value)) {
} else if (EventConfigImagesBarCell.ACTION_EDIT.equals(value)) {
openEditEventDialog(event);
}
}
@@ -0,0 +1,30 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Arrays;
import com.google.gwt.core.client.GWT;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class SeriesConfigImagesBarCell extends ImagesBarCell {
static final String ACTION_REMOVE = "ACTION_REMOVE";
static final String ACTION_EDIT = "ACTION_EDIT";
private final StringMessages stringMessages;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
public SeriesConfigImagesBarCell(StringMessages stringConstants) {
super();
this.stringMessages = stringConstants;
}
public SeriesConfigImagesBarCell(SafeHtmlRenderer<String> renderer, StringMessages stringMessages) {
super();
this.stringMessages = stringMessages;
}
@Override
protected Iterable<ImageSpec> getImageSpecs() {
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
}
}
@@ -0,0 +1,22 @@
package com.sap.sailing.gwt.ui.client;
import java.util.List;
import com.sap.sailing.domain.common.RegattaIdentifier;
/**
* Allows UI components to observe a regatta selector, such as a drop-down box showing a list of regattas
*
* @author Axel Uhl (d043530)
*
*/
public interface RegattaSelectionChangeListener {
/**
* The first element is the first one selected
*
* @param selectedRegattas a non-<code>null</code> list which is empty if nothing is selected
*/
void onRegattaSelectionChange(List<RegattaIdentifier> selectedRegattas);
}
@@ -0,0 +1,96 @@
package com.sap.sailing.gwt.ui.client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.sap.sailing.domain.common.RegattaIdentifier;
public class RegattaSelectionModel implements RegattaSelectionProvider {
private final List<RegattaIdentifier> selection;
private final List<RegattaIdentifier> allRegattas;
private final Set<RegattaSelectionChangeListener> listeners;
private final boolean hasMultiSelection;
public RegattaSelectionModel(boolean hasMultiSelection) {
this.hasMultiSelection = hasMultiSelection;
this.selection = new ArrayList<RegattaIdentifier>();
this.allRegattas = new ArrayList<RegattaIdentifier>();
listeners = new HashSet<RegattaSelectionChangeListener>();
}
@Override
public List<RegattaIdentifier> getSelectedRegattas() {
return Collections.unmodifiableList(selection);
}
@Override
public void addRegattaSelectionChangeListener(RegattaSelectionChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeRegattaSelectionChangeListener(RegattaSelectionChangeListener listener) {
listeners.remove(listener);
}
@Override
public void setSelection(List<RegattaIdentifier> newSelection, RegattaSelectionChangeListener... listenersNotToNotify) {
boolean notify = !selection.equals(newSelection);
selection.clear();
selection.addAll(newSelection);
if (notify) {
notifyListeners(listenersNotToNotify);
}
}
private void notifyListeners(RegattaSelectionChangeListener[] listenersNotToNotify) {
List<RegattaIdentifier> selectedRaces = getSelectedRegattas();
for (RegattaSelectionChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.onRegattaSelectionChange(selectedRaces);
}
}
}
/**
* Sets the universe of all regattas from which this selection model may select. An equal list will subsequently be
* returned by {@link #getAllRegattas()}. Regattas from the {@link #getSelectedRegattas() selection} not in
* <code>newAllRegattas</code> are removed from the selection. If this happens, the selection listeners are notified.
*/
@Override
public void setAllRegattas(List<RegattaIdentifier> newAllRaces, RegattaSelectionChangeListener... listenersNotToNotify) {
allRegattas.clear();
for (RegattaIdentifier r : newAllRaces) {
allRegattas.add(r);
}
boolean notify = false;
for (Iterator<RegattaIdentifier> i=selection.iterator(); i.hasNext(); ) {
RegattaIdentifier selectedRegatta = i.next();
if (!allRegattas.contains(selectedRegatta)) {
notify = true;
i.remove();
}
}
if (notify) {
notifyListeners(listenersNotToNotify);
}
}
@Override
public List<RegattaIdentifier> getAllRegattas() {
return Collections.unmodifiableList(allRegattas);
}
@Override
public boolean hasMultiSelection() {
return hasMultiSelection;
}
}
@@ -0,0 +1,27 @@
package com.sap.sailing.gwt.ui.client;
import java.util.List;
import com.sap.sailing.domain.common.RegattaIdentifier;
public interface RegattaSelectionProvider {
/**
* @return a non-<code>null</code> list which may be empty
*/
List<RegattaIdentifier> getSelectedRegattas();
void addRegattaSelectionChangeListener(RegattaSelectionChangeListener listener);
void removeRegattaSelectionChangeListener(RegattaSelectionChangeListener listener);
void setSelection(List<RegattaIdentifier> newSelection, RegattaSelectionChangeListener... listenersNotToNotify);
boolean hasMultiSelection();
/**
* @return a non-<code>null</code> list which may be empty
*/
List<RegattaIdentifier> getAllRegattas();
void setAllRegattas(List<RegattaIdentifier> newAllRaces, RegattaSelectionChangeListener... listenersNotToNotify);
}
@@ -4,6 +4,8 @@ import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
public class RegattaDTO extends NamedDTO implements IsSerializable {
@@ -19,10 +21,13 @@ public class RegattaDTO extends NamedDTO implements IsSerializable {
public RegattaDTO(String name, ScoringSchemeType scoringScheme /*, List<CompetitorDTO> competitors*/) {
super(name);
this.name = name;
this.scoringScheme = scoringScheme;
}
public RegattaIdentifier getRegattaIdentifier() {
return new RegattaName(name);
}
/**
* @return The start date of the first {@link #races Race}, or <code>null</code> if the start date isn't set
*/