Merge remote-tracking branch 'origin/master' into raceboardmodes

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorRaceChart.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
This commit is contained in:
Benjamin Barth committed 2016-07-14 09:09:39 +02:00
commit 8af77a9671
32 files changed
+320 -156

No files matched your search

Binary file not shown.
@@ -62,7 +62,7 @@ public class WebSocketConnectionManager implements LiveDataConnection {
private static final long CONNECTION_TIMEOUT_IN_MILLIS = 5000;
public WebSocketConnectionManager(IgtimiConnectionFactoryImpl connectionFactory, Iterable<String> deviceSerialNumbers, Account account) throws Exception {
this.timer = new Timer("Timer for WebSocketConnectionManager for units "+deviceSerialNumbers+" and account "+account);
this.timer = new Timer("Timer for WebSocketConnectionManager for units "+deviceSerialNumbers+" and account "+account, /* isDaemon */ true);
this.deviceIds = deviceSerialNumbers;
this.account = account;
this.fixFactory = new FixFactory();
@@ -36,7 +36,7 @@ public class Simulator {
private final WindStore windStore;
private boolean stopped;
private Duration advanceInMillis = Duration.NULL.minus(1);
private Timer timer = new Timer("Timer for TracTrac Simulator");
private Timer timer = new Timer("Timer for TracTrac Simulator", /* isDaemon */ true);
private final Duration offsetToStart;
public Simulator(WindStore windStore, Duration offsetToStart) {
@@ -339,7 +339,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
private void initTransientFields() {
this.raceDetailsAtEndOfTrackingCache = new HashMap<com.sap.sse.common.Util.Pair<TrackedRace,Competitor>, RunnableFuture<RaceDetails>>();
this.raceDetailsExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
this.raceDetailsExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
this.cacheInvalidationListeners = new HashSet<CacheInvalidationListener>();
// When many updates are triggered in a short period of time by a single thread, ensure that the single thread
// providing the updates is not outperformed by all the re-calculations happening here. Leave at least one
@@ -505,7 +505,7 @@ public class TrackBasedEstimationWindTrackImpl extends VirtualWindTrackImpl {
invalidateCache();
} else {
final Timer cacheInvalidationTimer = new Timer(
"TrackBasedEstimationWindTrackImpl cache invalidation timer for race " + getTrackedRace().getRace());
"TrackBasedEstimationWindTrackImpl cache invalidation timer for race " + getTrackedRace().getRace(), /* isDaemon */ true);
cacheInvalidationTimer.schedule(new TimerTask() {
@Override
public void run() {
@@ -1982,7 +1982,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
synchronized (cacheInvalidationTimerLock) {
if (cacheInvalidationTimer == null) {
cacheInvalidationTimer = new Timer("Cache invalidation timer for TrackedRaceImpl "
+ getRace().getName());
+ getRace().getName(), /* isDaemon */ true);
cacheInvalidationTimer.schedule(new TimerTask() {
@Override
public void run() {
@@ -90,11 +90,19 @@ public class BoatClassImageResolver {
boatClassIconsMap.put(BoatClassMasterdata.PIRATE.getDisplayName(), imageResources.PiratIcon());
boatClassIconsMap.put(BoatClassMasterdata.PLATU_25.getDisplayName(), imageResources.Platu25Icon());
boatClassIconsMap.put(BoatClassMasterdata.PWA.getDisplayName(), imageResources.PWAIcon());
boatClassIconsMap.put(BoatClassMasterdata.RS100.getDisplayName(), imageResources.RS100Icon());
boatClassIconsMap.put(BoatClassMasterdata.RS200.getDisplayName(), imageResources.RS200Icon());
boatClassIconsMap.put(BoatClassMasterdata.RS400.getDisplayName(), imageResources.RS400Icon());
boatClassIconsMap.put(BoatClassMasterdata.RS500.getDisplayName(), imageResources.RS500Icon());
boatClassIconsMap.put(BoatClassMasterdata.RS800.getDisplayName(), imageResources.RS800Icon());
boatClassIconsMap.put(BoatClassMasterdata.RS_AERO.getDisplayName(), imageResources.RSAEROIcon());
boatClassIconsMap.put(BoatClassMasterdata.RS_X.getDisplayName(), imageResources.RSXIcon());
boatClassIconsMap.put(BoatClassMasterdata.RS_FEVA.getDisplayName(), imageResources.RSFevaIcon());
boatClassIconsMap.put(BoatClassMasterdata.SONAR.getDisplayName(), imageResources.SonarIcon());
boatClassIconsMap.put(BoatClassMasterdata.SOLING.getDisplayName(), imageResources.SolingIcon());
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_BLUE.getDisplayName(), imageResources.SplashBlueIcon());
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_RED.getDisplayName(), imageResources.SplashRedIcon());
boatClassIconsMap.put(BoatClassMasterdata.SPLASH_GREEN.getDisplayName(), imageResources.SplashGreenIcon());
boatClassIconsMap.put(BoatClassMasterdata.STAR.getDisplayName(), imageResources.StarIcon());
boatClassIconsMap.put(BoatClassMasterdata.STREAMLINE.getDisplayName(), imageResources.StreamlineIcon());
boatClassIconsMap.put(BoatClassMasterdata.SUNBEAM_22.getDisplayName(), imageResources.Sunbeam22Icon());
@@ -178,9 +178,11 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
leaderboardsPanel.add(filterLeaderboardPanel);
leaderboardTable.ensureDebugId("AvailableLeaderboardsTable");
addColumnsToLeaderboardTableAndSetSelectionModel(leaderboardTable, tableRes, leaderboardList);
addColumnsToLeaderboardTableAndSetSelectionModel(leaderboardTable, tableRes,
filterLeaderboardPanel.getAllListDataProvider());
@SuppressWarnings("unchecked")
RefreshableMultiSelectionModel<StrippedLeaderboardDTO> multiSelectionModel = (RefreshableMultiSelectionModel<StrippedLeaderboardDTO>) leaderboardTable.getSelectionModel();
RefreshableMultiSelectionModel<StrippedLeaderboardDTO> multiSelectionModel = (RefreshableMultiSelectionModel<StrippedLeaderboardDTO>) leaderboardTable
.getSelectionModel();
leaderboardSelectionModel = multiSelectionModel;
leaderboardTable.setWidth("100%");
leaderboardSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -98,7 +98,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
protected void createUI() {
AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
raceList = new ListDataProvider<RaceDTO>();
raceList = new ListDataProvider<>();
settings = new TrackedRacesSettings();
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
VerticalPanel panel = new VerticalPanel();
@@ -116,6 +116,22 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
raceTable = new FlushableCellTable<RaceDTO>(/* pageSize */10000, tableRes);
raceTable.ensureDebugId("TrackedRacesCellTable");
filterablePanelRaces = new LabeledAbstractFilterablePanel<RaceDTO>(lblFilterRaces, allRaces, raceTable,
raceList) {
@Override
public List<String> getSearchableStrings(RaceDTO t) {
List<String> strings = new ArrayList<String>();
strings.add(t.getName());
strings.add(t.boatClass);
strings.add(t.getRegattaName());
strings.add(t.toString());
return strings;
}
};
filterablePanelRaces.getTextBox().ensureDebugId("TrackedRacesFilterTextBox");
filterPanel.add(filterablePanelRaces);
final EntityIdentityComparator<RaceDTO> entityIdentityComparator = new EntityIdentityComparator<RaceDTO>() {
@Override
public boolean representSameEntity(RaceDTO dto1, RaceDTO dto2) {
@@ -130,12 +146,13 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(),
tableResources.cellTableStyle().cellTableCheckboxColumnCell(),
entityIdentityComparator, raceList, raceTable);
tableResources.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator,
filterablePanelRaces.getAllListDataProvider(), raceTable);
refreshableSelectionModel = selectionCheckboxColumn.getSelectionModel();
raceTable.setSelectionModel(refreshableSelectionModel, this.selectionCheckboxColumn.getSelectionManager());
} else {
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator, raceList);
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator,
filterablePanelRaces.getAllListDataProvider());
raceTable.setSelectionModel(refreshableSelectionModel);
}
@@ -153,19 +170,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
makeControlsReactToSelectionChange(selectedRaces);
}
});
filterablePanelRaces = new LabeledAbstractFilterablePanel<RaceDTO>(lblFilterRaces, allRaces, raceTable, raceList) {
@Override
public List<String> getSearchableStrings(RaceDTO t) {
List<String> strings = new ArrayList<String>();
strings.add(t.getName());
strings.add(t.boatClass);
strings.add(t.getRegattaName());
strings.add(t.toString());
return strings;
}
};
filterablePanelRaces.getTextBox().ensureDebugId("TrackedRacesFilterTextBox");
filterPanel.add(filterablePanelRaces);
HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel();
trackedRacesButtonPanel.setSpacing(10);
panel.add(trackedRacesButtonPanel);
@@ -230,6 +230,7 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
return string;
}
};
registerSelectionModelOnNewDataProvider(filterField.getAllListDataProvider());
//CompetitorTableEditFeatures
ImagesBarColumn<CompetitorDTO, CompetitorConfigImagesBarCell> competitorActionColumn = new ImagesBarColumn<CompetitorDTO, CompetitorConfigImagesBarCell>(
@@ -152,21 +152,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
eventControlsPanel.add(removeEventsButton);
eventListDataProvider = new ListDataProvider<EventDTO>();
eventTable = createEventTable();
eventTable.ensureDebugId("EventsCellTable");
refreshableEventSelectionModel = (RefreshableMultiSelectionModel<EventDTO>) eventTable.getSelectionModel();
eventTable.setVisible(false);
this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty();
removeEventsButton.setEnabled(somethingSelected);
}
});
filterTextbox = new LabeledAbstractFilterablePanel<EventDTO>(new Label(stringMessages.filterEventsByName()), allEvents,
eventTable, eventListDataProvider) {
new CellTable<EventDTO>(), eventListDataProvider) {
@Override
public Iterable<String> getSearchableStrings(EventDTO t) {
List<String> result = new ArrayList<String>();
@@ -181,6 +168,20 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
return result;
}
};
eventTable = createEventTable();
eventTable.ensureDebugId("EventsCellTable");
filterTextbox.setTable(eventTable);
refreshableEventSelectionModel = (RefreshableMultiSelectionModel<EventDTO>) eventTable.getSelectionModel();
eventTable.setVisible(false);
this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty();
removeEventsButton.setEnabled(somethingSelected);
}
});
panel.add(filterTextbox);
panel.add(eventTable);
@@ -211,7 +212,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
public int hashCode(EventDTO t) {
return t.id.hashCode();
}
},eventListDataProvider,table);
},filterTextbox.getAllListDataProvider(),table);
AnchorCell anchorCell = new AnchorCell();
Column<EventDTO, SafeHtml> eventNameColumn = new Column<EventDTO, SafeHtml>(anchorCell) {
@@ -80,18 +80,20 @@ public class IgtimiAccountsPanel extends FlowPanel {
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
allAccounts = new BaseCelltable<String>(/* pageSize */10000, tableRes);
final ListDataProvider<String> filteredAccounts = new ListDataProvider<String>();
refreshableAccountsSelectionModel = new RefreshableSingleSelectionModel<String>(null, filteredAccounts);
allAccounts.setSelectionModel(refreshableAccountsSelectionModel);
ListHandler<String> accountColumnListHandler = new ListHandler<String>(filteredAccounts.getList());
filteredAccounts.addDataDisplay(allAccounts);
final List<String> emptyList = Collections.emptyList();
filterAccountsPanel = new LabeledAbstractFilterablePanel<String>(new Label(stringMessages.igtimiAccounts()), emptyList, allAccounts, filteredAccounts) {
filterAccountsPanel = new LabeledAbstractFilterablePanel<String>(new Label(stringMessages.igtimiAccounts()),
emptyList, allAccounts, filteredAccounts) {
@Override
public Iterable<String> getSearchableStrings(String t) {
Set<String> strings = Collections.singleton(t);
return strings;
}
};
refreshableAccountsSelectionModel = new RefreshableSingleSelectionModel<String>(null,
filterAccountsPanel.getAllListDataProvider());
allAccounts.setSelectionModel(refreshableAccountsSelectionModel);
final Panel controlsPanel = new HorizontalPanel();
final Button removeAccountButton = new Button(stringMessages.remove());
removeAccountButton.setEnabled(false);
@@ -191,6 +191,16 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
ListHandler<StrippedLeaderboardDTO> leaderboardsListHandler = new ListHandler<StrippedLeaderboardDTO>(leaderboardsProvider.getList());
leaderboardsTable = new FlushableCellTable<StrippedLeaderboardDTO>(10000, tableRes);
leaderboardsTable.ensureDebugId("LeaderboardsCellTable");
leaderboardsFilterablePanel = new LabeledAbstractFilterablePanel<StrippedLeaderboardDTO>(
filterLeaderboardsLabel, availableLeaderboards, leaderboardsTable, leaderboardsProvider) {
@Override
public Iterable<String> getSearchableStrings(StrippedLeaderboardDTO t) {
List<String> strings = new ArrayList<String>();
strings.add(t.name);
strings.add(t.displayName);
return strings;
}
};
SelectionCheckboxColumn<StrippedLeaderboardDTO> leaderboardTableSelectionColumn =
new SelectionCheckboxColumn<StrippedLeaderboardDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(),
@@ -205,18 +215,9 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
public int hashCode(StrippedLeaderboardDTO t) {
return t.name.hashCode();
}
}, leaderboardsProvider, leaderboardsTable);
}, leaderboardsFilterablePanel.getAllListDataProvider(), leaderboardsTable);
refreshableLeaderboardsSelectionModel = leaderboardTableSelectionColumn.getSelectionModel();
leaderboardsTable.setSelectionModel(refreshableLeaderboardsSelectionModel, leaderboardTableSelectionColumn.getSelectionManager());
leaderboardsFilterablePanel = new LabeledAbstractFilterablePanel<StrippedLeaderboardDTO>(filterLeaderboardsLabel, availableLeaderboards, leaderboardsTable, leaderboardsProvider) {
@Override
public Iterable<String> getSearchableStrings(StrippedLeaderboardDTO t) {
List<String> strings = new ArrayList<String>();
strings.add(t.name);
strings.add(t.displayName);
return strings;
}
};
leaderboardsFilterablePanel.getTextBox().ensureDebugId("LeaderboardsFilterTextBox");
leaderboardsFunctionPanel.add(leaderboardsFilterablePanel);
@@ -588,7 +589,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
public int hashCode(LeaderboardGroupDTO t) {
return t.getId().hashCode();
}
}, groupsProvider);
}, groupsFilterablePanel.getAllListDataProvider());
refreshableGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
@@ -36,6 +36,8 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.gwt.client.celltable.BaseCelltable;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
public class LeaderboardGroupSelectorComposite extends Composite implements HasValueChangeHandlers<Iterable<LeaderboardGroupDTO>> {
@@ -47,7 +49,7 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
private LabeledAbstractFilterablePanel<LeaderboardGroupDTO> availableLeaderboardGroupsFilterablePanel;
private CellTable<LeaderboardGroupDTO> availableLeaderboardGroupsTable;
private MultiSelectionModel<LeaderboardGroupDTO> availableLeaderboardGroupsSelectionModel;
private RefreshableMultiSelectionModel<LeaderboardGroupDTO> availableLeaderboardGroupsSelectionModel;
private ListDataProvider<LeaderboardGroupDTO> availableLeaderboardGroupsProvider;
private List<LeaderboardGroupDTO> availableLeaderboardGroups;
@@ -136,14 +138,6 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
private Widget createAvailableLeaderboardGroupsPanel() {
availableLeaderboardGroupsTable = new BaseCelltable<LeaderboardGroupDTO>(10000000, tableRes);
CaptionPanel result = new CaptionPanel(stringMessages.availableLeaderboardGroups());
availableLeaderboardGroupsSelectionModel = new MultiSelectionModel<>();
availableLeaderboardGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
addToEventButton.setEnabled(!availableLeaderboardGroupsSelectionModel.getSelectedSet().isEmpty());
}
});
availableLeaderboardGroupsTable.setSelectionModel(availableLeaderboardGroupsSelectionModel);
availableLeaderboardGroupsProvider = new ListDataProvider<>();
availableLeaderboardGroupsProvider.setList(availableLeaderboardGroups);
availableLeaderboardGroupsProvider.addDataDisplay(availableLeaderboardGroupsTable);
@@ -157,6 +151,26 @@ public class LeaderboardGroupSelectorComposite extends Composite implements HasV
return result;
}
};
availableLeaderboardGroupsSelectionModel = new RefreshableMultiSelectionModel<>(
new EntityIdentityComparator<LeaderboardGroupDTO>() {
@Override
public boolean representSameEntity(LeaderboardGroupDTO dto1, LeaderboardGroupDTO dto2) {
return dto1.getName().equals(dto2.getName());
}
@Override
public int hashCode(LeaderboardGroupDTO t) {
return t.getName().hashCode();
}
}, availableLeaderboardGroupsFilterablePanel.getAllListDataProvider());
availableLeaderboardGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
addToEventButton.setEnabled(!availableLeaderboardGroupsSelectionModel.getSelectedSet().isEmpty());
}
});
availableLeaderboardGroupsTable.setSelectionModel(availableLeaderboardGroupsSelectionModel);
VerticalPanel vp = new VerticalPanel();
vp.add(availableLeaderboardGroupsFilterablePanel);
vp.add(availableLeaderboardGroupsTable);
@@ -112,13 +112,14 @@ public class MediaPanel extends FlowPanel {
});
buttonAndFilterPanel.add(addUrlButton);
add(buttonAndFilterPanel);
createMediaTracksTable();
Label lblFilterRaces = new Label(stringMessages.filterMediaByName() + ":");
lblFilterRaces.setWordWrap(false);
buttonAndFilterPanel.setSpacing(5);
buttonAndFilterPanel.add(lblFilterRaces);
buttonAndFilterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE);
this.filterableMediaTracks = new LabeledAbstractFilterablePanel<MediaTrack>(lblFilterRaces, allMediaTracks, mediaTracksTable, mediaTrackListDataProvider) {
this.filterableMediaTracks = new LabeledAbstractFilterablePanel<MediaTrack>(lblFilterRaces, allMediaTracks,
new CellTable<MediaTrack>(), mediaTrackListDataProvider) {
@Override
public List<String> getSearchableStrings(MediaTrack t) {
List<String> strings = new ArrayList<String>();
@@ -131,6 +132,8 @@ public class MediaPanel extends FlowPanel {
return strings;
}
};
createMediaTracksTable();
filterableMediaTracks.setTable(mediaTracksTable);
filterableMediaTracks.getTextBox().ensureDebugId("MediaTracksFilterTextBox");
buttonAndFilterPanel.add(filterableMediaTracks);
}
@@ -178,7 +181,7 @@ public class MediaPanel extends FlowPanel {
public int hashCode(MediaTrack t) {
return t.dbId.hashCode();
}
}, mediaTrackListDataProvider);
}, filterableMediaTracks.getAllListDataProvider());
mediaTracksTable.setSelectionModel(refreshableSelectionModel,
DefaultSelectionEventManager.<MediaTrack> createDefaultManager());
@@ -97,13 +97,9 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
panel.add(noRegattasLabel);
regattaListDataProvider = new ListDataProvider<RegattaDTO>();
regattaTable = createRegattaTable();
regattaTable.ensureDebugId("RegattasCellTable");
refreshableRegattaMultiSelectionModel = (RefreshableMultiSelectionModel<RegattaDTO>) regattaTable.getSelectionModel();
regattaTable.setVisible(false);
filterablePanelRegattas = new LabeledAbstractFilterablePanel<RegattaDTO>(filterRegattasLabel, allRegattas,
regattaTable, regattaListDataProvider) {
new CellTable<RegattaDTO>(), regattaListDataProvider) {
@Override
public Iterable<String> getSearchableStrings(RegattaDTO t) {
List<String> string = new ArrayList<String>();
@@ -115,6 +111,11 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
}
};
filterablePanelRegattas.getTextBox().ensureDebugId("RegattasFilterTextBox");
regattaTable = createRegattaTable();
regattaTable.ensureDebugId("RegattasCellTable");
filterablePanelRegattas.setTable(regattaTable);
refreshableRegattaMultiSelectionModel = (RefreshableMultiSelectionModel<RegattaDTO>) regattaTable.getSelectionModel();
regattaTable.setVisible(false);
panel.add(filterablePanelRegattas);
panel.add(regattaTable);
@@ -142,7 +143,7 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
public int hashCode(RegattaDTO t) {
return t.getRegattaIdentifier().hashCode();
}
},regattaListDataProvider, table);
}, filterablePanelRegattas.getAllListDataProvider(), table);
ListHandler<RegattaDTO> columnSortHandler = new ListHandler<RegattaDTO>(regattaListDataProvider.getList());
table.addColumnSortHandler(columnSortHandler);
@@ -64,11 +64,9 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
remoteServersPanel.setContentWidget(remoteServersContentPanel);
serverDataProvider = new ListDataProvider<RemoteSailingServerReferenceDTO>();
CellTable<RemoteSailingServerReferenceDTO> remoteServersTable = createRemoteServersTable();
serverDataProvider.addDataDisplay(remoteServersTable);
filteredServerTablePanel = new LabeledAbstractFilterablePanel<RemoteSailingServerReferenceDTO>(
new Label(stringMessages.filterBy() + ":"), Collections.<RemoteSailingServerReferenceDTO>emptyList(), remoteServersTable, serverDataProvider) {
new Label(stringMessages.filterBy() + ":"), Collections.<RemoteSailingServerReferenceDTO> emptyList(),
new CellTable<RemoteSailingServerReferenceDTO>(), serverDataProvider) {
@Override
public List<String> getSearchableStrings(RemoteSailingServerReferenceDTO t) {
List<String> strings = new ArrayList<String>();
@@ -82,6 +80,9 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
return strings;
}
};
CellTable<RemoteSailingServerReferenceDTO> remoteServersTable = createRemoteServersTable();
filteredServerTablePanel.setTable(remoteServersTable);
serverDataProvider.addDataDisplay(remoteServersTable);
remoteServersContentPanel.add(filteredServerTablePanel);
remoteServersContentPanel.add(remoteServersTable);
@@ -173,7 +174,7 @@ public class RemoteServerInstancesManagementPanel extends SimplePanel {
public int hashCode(RemoteSailingServerReferenceDTO t) {
return t.getUrl().hashCode();
}
}, serverDataProvider);
}, filteredServerTablePanel.getAllListDataProvider());
serverTable.setSelectionModel(refreshableServerSelectionModel);
return serverTable;
@@ -264,27 +264,6 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
raceTable.addColumn(raceStartTimeColumn, stringConstants.startTime());
raceTable.setWidth("300px");
raceList = new ListDataProvider<SwissTimingRaceRecordDTO>();
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingRaceRecordDTO>(
new EntityIdentityComparator<SwissTimingRaceRecordDTO>() {
@Override
public boolean representSameEntity(SwissTimingRaceRecordDTO dto1, SwissTimingRaceRecordDTO dto2) {
return dto1.raceId.equals(dto2.raceId);
}
@Override
public int hashCode(SwissTimingRaceRecordDTO t) {
return t.raceId.hashCode();
}
}, raceList) {
});
trackableRacesPanel.add(raceTable);
raceList.addDataDisplay(raceTable);
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), regattaNameColumn, seriesNameColumn,
raceNameColumn, raceStartTimeColumn, raceIdColumn, boatClassColumn, genderColumn, raceStatusColumn);
raceTable.addColumnSortHandler(columnSortHandler);
trackedRacesPanel.add(trackedRacesListComposite);
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingRaceRecordDTO>(lblFilterEvents,
availableSwissTimingRaces, raceTable, raceList) {
@Override
@@ -302,6 +281,26 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
return strings;
}
};
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingRaceRecordDTO>(
new EntityIdentityComparator<SwissTimingRaceRecordDTO>() {
@Override
public boolean representSameEntity(SwissTimingRaceRecordDTO dto1, SwissTimingRaceRecordDTO dto2) {
return dto1.raceId.equals(dto2.raceId);
}
@Override
public int hashCode(SwissTimingRaceRecordDTO t) {
return t.raceId.hashCode();
}
}, filterablePanelEvents.getAllListDataProvider()) {
});
trackableRacesPanel.add(raceTable);
raceList.addDataDisplay(raceTable);
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), regattaNameColumn, seriesNameColumn,
raceNameColumn, raceStartTimeColumn, raceIdColumn, boatClassColumn, genderColumn, raceStatusColumn);
raceTable.addColumnSortHandler(columnSortHandler);
trackedRacesPanel.add(trackedRacesListComposite);
filterPanel.add(filterablePanelEvents);
HorizontalPanel racesButtonPanel = new HorizontalPanel();
trackableRacesPanel.add(racesButtonPanel);
@@ -192,6 +192,14 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
raceTable.addColumn(raceStartTrackingColumn, stringMessages.startTime());
raceTable.setWidth("300px");
raceList = new ListDataProvider<SwissTimingReplayRaceDTO>();
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingReplayRaceDTO>(lblFilterEvents, availableSwissTimingRaces, raceTable, raceList) {
@Override
public List<String> getSearchableStrings(SwissTimingReplayRaceDTO t) {
List<String> strings = new ArrayList<String>();
strings.addAll(Arrays.asList(t.boat_class, t.flight_number, t.getName(), t.race_id, t.rsc));
return strings;
}
};
raceTable.setSelectionModel(new RefreshableMultiSelectionModel<SwissTimingReplayRaceDTO>(
new EntityIdentityComparator<SwissTimingReplayRaceDTO>() {
@Override
@@ -202,7 +210,7 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
public int hashCode(SwissTimingReplayRaceDTO t) {
return t.race_id.hashCode();
}
}, raceList) {
}, filterablePanelEvents.getAllListDataProvider()) {
});
racesHorizontalPanel.add(raceTable);
@@ -210,16 +218,6 @@ public class SwissTimingReplayConnectorPanel extends AbstractEventManagementPane
raceList.addDataDisplay(raceTable);
Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), raceNameColumn, boatClassNamesColumn, raceStartTrackingColumn);
raceTable.addColumnSortHandler(columnSortHandler);
filterablePanelEvents = new LabeledAbstractFilterablePanel<SwissTimingReplayRaceDTO>(lblFilterEvents, availableSwissTimingRaces, raceTable, raceList) {
@Override
public List<String> getSearchableStrings(SwissTimingReplayRaceDTO t) {
List<String> strings = new ArrayList<String>();
strings.addAll(Arrays.asList(t.boat_class, t.flight_number, t.getName(), t.race_id, t.rsc));
return strings;
}
};
filterPanel.add(filterablePanelEvents);
Label lblTrackSettings = new Label(stringMessages.trackNewEvent());
@@ -27,12 +27,15 @@ import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
*/
public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> implements IsWidget {
protected final FlushableCellTable<T> table;
private final S selectionModel;
protected final ListDataProvider<T> dataProvider;
private S selectionModel;
protected ListDataProvider<T> dataProvider;
protected VerticalPanel mainPanel;
protected final SailingServiceAsync sailingService;
protected final ErrorReporter errorReporter;
protected final StringMessages stringMessages;
private final boolean multiSelection;
private SelectionCheckboxColumn<T> selectionCheckboxColumn;
private final EntityIdentityComparator<T> entityIdentityComparator;
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
private final ListHandler<T> columnSortHandler;
@@ -49,6 +52,8 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
public TableWrapper(SailingServiceAsync sailingService, final StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, EntityIdentityComparator<T> entityIdentityComparator) {
this.entityIdentityComparator = entityIdentityComparator;
this.multiSelection = multiSelection;
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
@@ -57,23 +62,7 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
this.dataProvider = new ListDataProvider<T>();
this.columnSortHandler = new ListHandler<T>(dataProvider.getList());
table.addColumnSortHandler(this.columnSortHandler);
if (multiSelection) {
SelectionCheckboxColumn<T> selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
tableRes.cellTableStyle().cellTableCheckboxSelected(),
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator, dataProvider, table);
columnSortHandler.setComparator(selectionCheckboxColumn, selectionCheckboxColumn.getComparator());
@SuppressWarnings("unchecked")
S typedSelectionModel = (S) selectionCheckboxColumn.getSelectionModel();
selectionModel = typedSelectionModel;
table.setSelectionModel(selectionModel, selectionCheckboxColumn.getSelectionManager());
table.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
} else {
@SuppressWarnings("unchecked")
S typedSelectionModel = (S) new RefreshableSingleSelectionModel<T>(entityIdentityComparator, dataProvider);
selectionModel = typedSelectionModel;
table.setSelectionModel(selectionModel);
}
registerSelectionModelOnNewDataProvider(dataProvider);
mainPanel = new VerticalPanel();
dataProvider.addDataDisplay(table);
mainPanel.add(table);
@@ -118,4 +107,36 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> im
Util.addAll(newItems, dataProvider.getList());
dataProvider.flush();
}
/**
* This method allows you to change the data base for the {@link RefreshableSelectionModel}. Therefore a new
* {@link ListDataProvider} is needed.
*
* @param dataProvider
* {@link ListDataProvider} as data base for the {@link RefreshableSelectionModel}.
*/
public void registerSelectionModelOnNewDataProvider(ListDataProvider<T> dataProvider) {
this.dataProvider = dataProvider;
if (multiSelection) {
if (selectionCheckboxColumn != null) {
table.removeColumn(selectionCheckboxColumn);
}
selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
tableRes.cellTableStyle().cellTableCheckboxSelected(),
tableRes.cellTableStyle().cellTableCheckboxDeselected(),
tableRes.cellTableStyle().cellTableCheckboxColumnCell(), entityIdentityComparator, dataProvider,
table);
columnSortHandler.setComparator(selectionCheckboxColumn, selectionCheckboxColumn.getComparator());
@SuppressWarnings("unchecked")
S typedSelectionModel = (S) selectionCheckboxColumn.getSelectionModel();
selectionModel = typedSelectionModel;
table.setSelectionModel(selectionModel, selectionCheckboxColumn.getSelectionManager());
table.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
} else {
@SuppressWarnings("unchecked")
S typedSelectionModel = (S) new RefreshableSingleSelectionModel<T>(entityIdentityComparator, dataProvider);
selectionModel = typedSelectionModel;
table.setSelectionModel(selectionModel);
}
}
}
@@ -392,7 +392,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
public int hashCode(TracTracRaceRecordDTO t) {
return t.id.hashCode();
}
}, raceList, racesTable);
}, racesFilterablePanel.getAllListDataProvider(), racesTable);
racesTable.addColumn(selectionCheckboxColumn, selectionCheckboxColumn.getHeader());
racesTable.addColumn(regattaNameColumn, stringMessages.event());
racesTable.addColumn(raceNameColumn, stringMessages.race());
@@ -253,9 +253,8 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
private void doLoadDataForCompetitorsAndDataType(final Date from, final Date to, final boolean append,
ArrayList<CompetitorDTO> competitorsToLoad, final DetailType selectedDataTypeToRetrieve) {
long stepSize = (from==null||to==null) ?
getStepSizeInMillis() :
Math.max(getStepSizeInMillis(), Math.abs(to.getTime()-from.getTime())/SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY);
long stepSize = Math.max(getStepSizeInMillis(),
from==null||to==null ? 0 : Math.abs(to.getTime()-from.getTime())/SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY);
GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService,
selectedRaceIdentifier, competitorsToLoad, from, to, stepSize, selectedDataTypeToRetrieve,
leaderboardGroupName, leaderboardName);
@@ -91,6 +91,9 @@ public class LeaderboardDetailsPanelPO extends PageArea {
@FindBy(how = BySeleniumId.class, using = "TrackedRacesListComposite")
private WebElement trackedRacesListComposite;
@FindBy(how = BySeleniumId.class, using = "TrackedRacesFilterTextBox")
private WebElement trackedRacesFilterTextBox;
public LeaderboardDetailsPanelPO(WebDriver driver, WebElement element) {
super(driver, element);
}
@@ -214,6 +217,10 @@ public class LeaderboardDetailsPanelPO extends PageArea {
return new LeaderboardRacesTablePO(driver, this.racesCellTable);
}
public void filter(String s) {
trackedRacesFilterTextBox.sendKeys(s);
}
private CellTablePO<DataEntryPO> getTrackedRacesTable() {
WebElement table = findElementBySeleniumId(this.trackedRacesListComposite, "TrackedRacesCellTable");
@@ -18,6 +18,7 @@ import com.sap.sailing.selenium.core.WindowManager;
import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage;
import com.sap.sailing.selenium.pages.adminconsole.connectors.SmartphoneTrackingEventManagementPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardConfigurationPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO.RaceDescriptor;
import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaDetailsCompositePO;
import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaStructureManagementPanelPO;
@@ -28,6 +29,7 @@ import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetit
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorsPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorTablePO.CompetitorEntry;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesListPO.TrackedRaceDescriptor;
import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO.TrackableRaceDescriptor;
import com.sap.sailing.selenium.pages.gwt.CellTablePO;
import com.sap.sailing.selenium.pages.gwt.DataEntryPO;
@@ -50,6 +52,9 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
private static final String EVENT = "IDM 5O5 2013"; //$NON-NLS-1$
private static final String BOAT_CLASS = "5O5"; //$NON-NLS-1$
private static final String RACE = "Race %d"; //$NON-NLS-1$
private static final String IDM_5O5_2013_JSON_URL =
"http://traclive.dk/events/event_20130917_IDMO/jsonservice.php"; //$NON-NLS-1$
private RegattaDescriptor regatta;
@@ -171,7 +176,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
TrackableRaceDescriptor trackableRace = new TrackableRaceDescriptor(EVENT, raceName, BOAT_CLASS);
TrackedRaceDescriptor trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS,
raceName);
RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("R%s", i), "Default", false, false, 0);
RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("D%s", i), "Default", false, false, 0);
this.trackableRaces.add(trackableRace);
this.trackedRaces.add(trackedRace);
@@ -198,6 +203,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
leaderboardConfiguration.createRegattaLeaderboard(this.regatta);
}
@Test
public void testRefreshOfDependingUIElements() {
windowForSelection.switchToWindow();
@@ -252,4 +258,34 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest {
final int newAnzRaceColumns = raceColumnTable.getEntries().size();
assertEquals(7, newAnzRaceColumns);
}
@Test
public void testMaintenanceOfSelectionAfterFilteringTrackedracesOnLeaderboardConfigPanel() {
windowForSelection.switchToWindow();
setUpTestRefreshOfDependingUIElements();
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
leaderboardConfiguration.getLeaderboardDetails(LEADERBOARD);
// Start the tracking for the races and wait until they are ready to use
TracTracEventManagementPanelPO tracTracEvents = adminConsole.goToTracTracEvents();
tracTracEvents.listTrackableRaces(IDM_5O5_2013_JSON_URL);
tracTracEvents.setReggataForTracking(this.regatta);
tracTracEvents.setTrackSettings(false, false, false);
// TODO: There exists a bug in Selenium with key modifiers (Issue 3734 and 6817), so we can't use multi
// selection (Firefox on Windows)
//tracTracEvents.startTrackingForRaces(this.trackableRaces);
for(int i =0; i<2;i++) {
tracTracEvents.startTrackingForRace(trackableRaces.get(i));
}
leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
LeaderboardDetailsPanelPO leaderboardDetails = leaderboardConfiguration.getLeaderboardDetails(this.regatta.toString());
leaderboardDetails.linkRace(this.leaderboardRaces.get(0), this.trackedRaces.get(0));
assertEquals("Yes", leaderboardDetails.getRacesTable().getEntries().get(0).getColumnContent(3));
leaderboardDetails.filter("sgfoganafen");
assertEquals("Yes", leaderboardDetails.getRacesTable().getEntries().get(0).getColumnContent(3));
}
}
@@ -27,7 +27,6 @@ import com.google.gwt.view.client.SingleSelectionModel;
public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T> implements RefreshableSelectionModel<T> {
private final EntityIdentityComparator<T> comp;
private boolean dontcheckSelectionState = false;
private final ListDataProvider<T> listDataProvider;
/**
* @param comp
@@ -44,8 +43,7 @@ public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T>
}
});
this.comp = comp;
this.listDataProvider = listDataProvider;
this.listDataProvider.addDataDisplay(new HasDataAdapter<T>(this, listDataProvider));
listDataProvider.addDataDisplay(new HasDataAdapter<T>(this, listDataProvider));
}
/**
@@ -1,8 +1,6 @@
package com.sap.sse.gwt.client.panels;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
@@ -15,6 +13,10 @@ import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.view.client.ListDataProvider;
import com.sap.sse.common.Util;
import com.sap.sse.common.filter.AbstractListFilter;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
/**
* This Panel contains a text box. Text entered into the text box filters the {@link CellTable} passed to
@@ -35,8 +37,8 @@ import com.sap.sse.common.filter.AbstractListFilter;
*
*/
public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
protected List<T> all;
protected final AbstractCellTable<T> display;
protected ListDataProvider<T> all;
protected AbstractCellTable<T> display;
protected final ListDataProvider<T> filtered;
protected final TextBox textBox;
@@ -55,6 +57,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
*/
public AbstractFilterablePanel(Iterable<T> all, AbstractCellTable<T> display, final ListDataProvider<T> filtered) {
setSpacing(5);
this.all = new ListDataProvider<>();
this.display = display;
this.filtered = filtered;
this.textBox = new TextBox();
@@ -71,10 +74,10 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
}
private void setAll(Iterable<T> all) {
this.all = new ArrayList<T>();
this.all.getList().clear();
if (all != null) {
for (T t : all) {
this.all.add(t);
this.all.getList().add(t);
}
}
}
@@ -102,7 +105,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
* Adds an object and applies the search filter.
*/
public void add(T object) {
all.add(object);
all.getList().add(object);
filter();
}
@@ -110,7 +113,7 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
* Adds an object at a certain position and applies the search filter.
*/
public void add(int index, T object) {
all.add(index, object);
all.getList().add(index, object);
filter();
}
@@ -118,19 +121,19 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
* Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
*/
public int indexOf(T object) {
return all.indexOf(object);
return all.getList().indexOf(object);
}
/**
* Removes an object and applies the search filter.
*/
public void remove(T object) {
all.remove(object);
all.getList().remove(object);
filter();
}
public void addAll(Iterable<T> objects) {
Util.addAll(objects, all);
Util.addAll(objects, all.getList());
filter();
}
@@ -140,24 +143,27 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
* <code>removeAll(all)</code> with <code>all</code> being a copy of what you get when calling {@link #getAll()}.
*/
public void removeAll() {
all.clear();
all.getList().clear();
filter();
}
public void removeAll(Iterable<T> objects) {
Util.removeAll(objects, all);
Util.removeAll(objects, all.getList());
filter();
}
public void filter() {
filtered.getList().clear();
Util.addAll(filterer.applyFilter(Arrays.asList(getTextBox().getText().split(" ")), all), filtered.getList());
Util.addAll(filterer.applyFilter(Arrays.asList(getTextBox().getText().split(" ")), all.getList()),
filtered.getList());
filtered.refresh();
sort();
}
private void sort(){
ColumnSortEvent.fire(display, display.getColumnSortList());
private void sort() {
if (display != null) {
ColumnSortEvent.fire(display, display.getColumnSortList());
}
}
public TextBox getTextBox() {
@@ -165,6 +171,50 @@ public abstract class AbstractFilterablePanel<T> extends HorizontalPanel {
}
public Iterable<T> getAll() {
return all.getList();
}
/**
* Registers a {@link RefreshableSelectionModel} on the all data structure. So the selection can be maintained when
* the {@link CellTable} is filtered. You can use the {@link RefreshableSelectionModel} returned by this method
* e.g. for a {@link CellTable} using {@link CellTable#setSelectionModel(com.google.gwt.view.client.SelectionModel)}
*
* @param comp
* {@link EntityIdentityComparator Comperator} to create the {@link RefreshableSelectionModel selection
* model}
* @param multiselection
* set <code>true</code> when the {@link RefreshableSelectionModel selection model} should be a
* {@link RefreshableMultiSelectionModel}. When it´s set <code>false</code> the
* {@link RefreshableSelectionModel selection model} will be a {@link RefreshableSingleSelectionModel}.
*/
public RefreshableSelectionModel<T> registerSelectionModelOnAllElements(EntityIdentityComparator<T> comp,
boolean multiselection) {
if (multiselection) {
return new RefreshableMultiSelectionModel<>(comp, all);
} else {
return new RefreshableSingleSelectionModel<>(comp, all);
}
}
/**
* You can use this method to get the {@link ListDataProvider} that represents the all data structure. On this
* {@link ListDataProvider} a {@link RefreshableSelectionModel} can be registered. So the selection can also be
* maintained when the data is filtered.
*
* @return The original all data structure. It's no copy.
*/
public ListDataProvider<T> getAllListDataProvider() {
return all;
}
/**
* This method can be used to set the CellTable, when the {@link CellTable} on which this Panel should work is
* created after this Panel. When the table isn't set correctly the order of elements, could be wrong after
* filtering the data.
*
* @param table {@link AbstractCellTable} on which this panel works.
*/
public void setTable(AbstractCellTable<T> table) {
display = table;
}
}
@@ -276,7 +276,7 @@ public class ReplicationServiceImpl implements ReplicationService {
public ReplicationServiceImpl(String exchangeName, String exchangeHost, int exchangePort,
final ReplicationInstancesManager replicationInstancesManager, ReplicablesProvider replicablesProvider)
throws IOException {
timer = new Timer("ReplicationServiceImpl timer for delayed task sending");
timer = new Timer("ReplicationServiceImpl timer for delayed task sending", /* isDaemon */ true);
executionListenersByReplicableIdAsString = new HashMap<>();
initialLoadChannels = new ConcurrentHashMap<>();
this.replicationInstancesManager = replicationInstancesManager;
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TracTrac Client module
Bundle-SymbolicName: com.tractrac.clientmodule
Bundle-Version: 3.2.0
Bundle-Version: 3.2.1
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: .,
lib/TracAPI.jar
+19 -2
View File
@@ -16,6 +16,20 @@ It contains also some files:
- test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example.
- Manifest.txt -> manifest used to create the test.jar file
********************************************
************* TracAPI 3.2.1 ****************
********************************************
This is a final version. Only fixes bugs in the implementation
Release date: 13/07/2016
Build number: 12627
1) Bugs:
- If the Internet connection goes down, some threads can be hung despite of
the consumer application calls the ISubscriber.stop method (Reported by
Axel Uhl, 13/07/2016)
********************************************
************* TracAPI 3.2.0 ****************
********************************************
@@ -24,13 +38,16 @@ This is a final version. New functionality added:
Release date: 05/06/2016
Build number: 12293
1) New functionality:
1) Features:
- IRace adds the new property, status, returning a value of the enum RaceStatusType.
- IRace property visibility has changed to return a value of the enum RaceVisibilityType.
- IRaceCompetitor adds a new property: status of type RaceCompetitorStatusType.
- Competitor updates during a race will be propagated to all subscriptors.
********************************************
************* TracAPI 3.1.6 ****************
********************************************
BIN
View File
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -8,6 +8,6 @@
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>com.tractrac.clientmodule</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<packaging>eclipse-plugin</packaging>
</project>