diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 61e51ed6d6b..18548f653c6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -33,7 +33,6 @@ import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SelectionChangeEvent; import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory; -import com.sap.sailing.gwt.ui.client.EventSelectionProvider; import com.sap.sailing.gwt.ui.client.EventsRefresher; import com.sap.sailing.gwt.ui.client.LeaderboardGroupsDisplayer; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; @@ -48,7 +47,6 @@ import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.util.NaturalComparator; import com.sap.sse.gwt.client.ErrorReporter; -import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; @@ -60,12 +58,11 @@ import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; */ public class EventListComposite extends Composite implements EventsRefresher, LeaderboardGroupsDisplayer { private final SailingServiceAsync sailingService; - private final EventSelectionProvider eventSelectionProvider; private final ErrorReporter errorReporter; private final StringMessages stringMessages; private CellTable eventTable; - private RefreshableMultiSelectionModel eventSelectionModel; + private RefreshableMultiSelectionModel refreshableEventSelectionModel; private ListDataProvider eventListDataProvider; private List allEvents; private LabeledAbstractFilterablePanel filterTextbox; @@ -93,10 +90,10 @@ public class EventListComposite extends Composite implements EventsRefresher, Le private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); - public EventListComposite(final SailingServiceAsync sailingService, final EventSelectionProvider eventSelectionProvider, + public EventListComposite(final SailingServiceAsync sailingService, final RefreshableMultiSelectionModel refreshableEventSelectionModel, final ErrorReporter errorReporter, final StringMessages stringMessages) { this.sailingService = sailingService; - this.eventSelectionProvider = eventSelectionProvider; + this.refreshableEventSelectionModel = refreshableEventSelectionModel; this.stringMessages = stringMessages; this.errorReporter = errorReporter; availableLeaderboardGroups = Collections.emptyList(); @@ -134,7 +131,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le @Override public void onClick(ClickEvent event) { if (Window.confirm(stringMessages.doYouReallyWantToRemoveEvents())) { - removeEvents(eventSelectionModel.getSelectedSet()); + removeEvents(refreshableEventSelectionModel.getSelectedSet()); } } }); @@ -145,22 +142,11 @@ public class EventListComposite extends Composite implements EventsRefresher, Le eventTable.ensureDebugId("EventsCellTable"); eventTable.setVisible(false); - @SuppressWarnings("unchecked") - RefreshableMultiSelectionModel multiSelectionModel = (RefreshableMultiSelectionModel) eventTable.getSelectionModel(); - eventSelectionModel = multiSelectionModel; - - eventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + this.refreshableEventSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { - final boolean somethingSelected = !eventSelectionModel.getSelectedSet().isEmpty(); + final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty(); removeEventsButton.setEnabled(somethingSelected); - - List selectedEvents = getSelectedEvents(); - List selectedEventUUIDs = new ArrayList(); - for (EventDTO selectedEvent : selectedEvents) { - selectedEventUUIDs.add(selectedEvent.id); - } - EventListComposite.this.eventSelectionProvider.setSelection(selectedEventUUIDs); } }); @@ -198,14 +184,9 @@ public class EventListComposite extends Composite implements EventsRefresher, Le eventListDataProvider.addDataDisplay(table); table.setWidth("100%"); - SelectionCheckboxColumn eventSelectionCheckboxColumn = new SelectionCheckboxColumn(tableRes.cellTableStyle().cellTableCheckboxSelected(), + SelectionCheckboxColumn eventSelectionCheckboxColumn = new SelectionCheckboxColumn(refreshableEventSelectionModel, tableRes.cellTableStyle().cellTableCheckboxSelected(), tableRes.cellTableStyle().cellTableCheckboxDeselected(), - tableRes.cellTableStyle().cellTableCheckboxColumnCell(), new EntityIdentityComparator() { - @Override - public boolean representSameEntity(EventDTO dto1, EventDTO dto2) { - return dto1.id.equals(dto2.id) ? true : false; - } - } /*entityIdentityComparator to create a RefreshableSelectionModel*/) { + tableRes.cellTableStyle().cellTableCheckboxColumnCell()) { @Override protected ListDataProvider getListDataProvider() { return eventListDataProvider; @@ -607,7 +588,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le eventTable.setVisible(true); noEventsLabel.setVisible(false); } - eventSelectionModel.refreshSelectionModel(events); + refreshableEventSelectionModel.refreshSelectionModel(events); allEvents.clear(); allEvents.addAll(events); filterTextbox.updateAll(allEvents); @@ -618,16 +599,4 @@ public class EventListComposite extends Composite implements EventsRefresher, Le public List getAllEvents() { return allEvents; } - - private List getSelectedEvents() { - List result = new ArrayList(); - if (eventListDataProvider != null) { - for (EventDTO Event : eventListDataProvider.getList()) { - if (eventSelectionModel.isSelected(Event)) { - result.add(Event); - } - } - } - return result; - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventManagementPanel.java index fd6c47395b5..29a92361c82 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventManagementPanel.java @@ -1,14 +1,11 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.List; -import java.util.UUID; - +import java.util.Set; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; -import com.sap.sailing.gwt.ui.client.EventSelectionChangeListener; -import com.sap.sailing.gwt.ui.client.EventSelectionModel; -import com.sap.sailing.gwt.ui.client.EventSelectionProvider; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.sap.sailing.gwt.ui.client.EventsRefresher; import com.sap.sailing.gwt.ui.client.LeaderboardGroupsDisplayer; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; @@ -16,6 +13,8 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; +import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; /** * Allows administrators to manage a sailing event. @@ -23,11 +22,11 @@ import com.sap.sse.gwt.client.ErrorReporter; * @author Frank Mittag (C5163974) * @author Axel Uhl (d043530) */ -public class EventManagementPanel extends SimplePanel implements EventsRefresher, LeaderboardGroupsDisplayer, EventSelectionChangeListener { +public class EventManagementPanel extends SimplePanel implements EventsRefresher, LeaderboardGroupsDisplayer { private EventListComposite eventListComposite; private EventDetailsComposite eventDetailsComposite; private final CaptionPanel eventsPanel; - private EventSelectionProvider eventSelectionProvider; + private final RefreshableMultiSelectionModel refreshableEventSelectionModel; public EventManagementPanel(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, final StringMessages stringMessages) { @@ -40,10 +39,36 @@ public class EventManagementPanel extends SimplePanel implements EventsRefresher VerticalPanel eventsContentPanel = new VerticalPanel(); eventsPanel.setContentWidget(eventsContentPanel); - eventSelectionProvider = new EventSelectionModel(true); - eventSelectionProvider.addEventSelectionChangeListener(this); + refreshableEventSelectionModel = new RefreshableMultiSelectionModel<>(new EntityIdentityComparator() { - eventListComposite = new EventListComposite(sailingService, eventSelectionProvider, errorReporter, stringMessages); + @Override + public boolean representSameEntity(EventDTO dto1, EventDTO dto2) { + return dto1.id.equals(dto2.id); + } + }); + + refreshableEventSelectionModel.addSelectionChangeHandler(new Handler() { + + @Override + public void onSelectionChange(SelectionChangeEvent event) { + final Set selectedEvents = refreshableEventSelectionModel.getSelectedSet(); + if (selectedEvents.size() == 1 && eventListComposite.getAllEvents() != null) { + final EventDTO selectedEvent = selectedEvents.iterator().next(); + for (EventDTO eventDTO : eventListComposite.getAllEvents()) { + if (eventDTO.id.equals(selectedEvent.id)) { + eventDetailsComposite.setEvent(eventDTO); + eventDetailsComposite.setVisible(true); + break; + } + } + } else { + eventDetailsComposite.setEvent(null); + eventDetailsComposite.setVisible(false); + } + } + }); + + eventListComposite = new EventListComposite(sailingService, refreshableEventSelectionModel, errorReporter, stringMessages); eventListComposite.ensureDebugId("EventListComposite"); eventsContentPanel.add(eventListComposite); @@ -62,22 +87,4 @@ public class EventManagementPanel extends SimplePanel implements EventsRefresher public void fillLeaderboardGroups(Iterable leaderboardGroups) { eventListComposite.fillLeaderboardGroups(leaderboardGroups); } - - @Override - public void onEventSelectionChange(List selectedEvents) { - final UUID selectedEventUUID; - if (selectedEvents.size() == 1 && eventListComposite.getAllEvents() != null) { - selectedEventUUID = selectedEvents.get(0); - for (EventDTO eventDTO : eventListComposite.getAllEvents()) { - if (eventDTO.id.equals(selectedEventUUID)) { - eventDetailsComposite.setEvent(eventDTO); - eventDetailsComposite.setVisible(true); - break; - } - } - } else { - eventDetailsComposite.setEvent(null); - eventDetailsComposite.setVisible(false); - } - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionChangeListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionChangeListener.java deleted file mode 100644 index 013b258e080..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionChangeListener.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.sap.sailing.gwt.ui.client; - -import java.util.List; -import java.util.UUID; - - -/** - * Allows UI components to observe a saling event selector, such as a drop-down box showing a list of sailing events - * - * @author Axel Uhl (d043530) - * - */ -public interface EventSelectionChangeListener { - - /** - * The first element is the first one selected - * - * @param selectedEvents a non-null list which is empty if nothing is selected - */ - void onEventSelectionChange(List selectedEvents); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionModel.java deleted file mode 100644 index 56a23c7202d..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionModel.java +++ /dev/null @@ -1,90 +0,0 @@ -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 java.util.UUID; - -public class EventSelectionModel implements EventSelectionProvider { - private final List selection; - private final List allEvents; - private final Set listeners; - private final boolean hasMultiSelection; - - public EventSelectionModel(boolean hasMultiSelection) { - this.hasMultiSelection = hasMultiSelection; - this.selection = new ArrayList(); - this.allEvents = new ArrayList(); - listeners = new HashSet(); - } - - @Override - public List getSelectedEvents() { - return Collections.unmodifiableList(selection); - } - - @Override - public void addEventSelectionChangeListener(EventSelectionChangeListener listener) { - listeners.add(listener); - } - - @Override - public void removeEventSelectionChangeListener(EventSelectionChangeListener listener) { - listeners.remove(listener); - } - - @Override - public void setSelection(List newSelection, EventSelectionChangeListener... listenersNotToNotify) { - boolean notify = !selection.equals(newSelection); - selection.clear(); - selection.addAll(newSelection); - if (notify) { - notifyListeners(listenersNotToNotify); - } - } - - private void notifyListeners(EventSelectionChangeListener[] listenersNotToNotify) { - List selectedEvents = getSelectedEvents(); - for (EventSelectionChangeListener listener : listeners) { - if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) { - listener.onEventSelectionChange(selectedEvents); - } - } - } - - /** - * Sets the universe of all (sailing) events from which this selection model may select. An equal list will subsequently be - * returned by {@link #getallEvents()}. Events from the {@link #getSelectedEvents() selection} not in - * newEvents are removed from the selection. If this happens, the selection listeners are notified. - */ - @Override - public void setAllEvents(List newEvents, EventSelectionChangeListener... listenersNotToNotify) { - allEvents.clear(); - for (UUID r : newEvents) { - allEvents.add(r); - } - for (Iterator i=selection.iterator(); i.hasNext(); ) { - UUID selectedRegatta = i.next(); - if (!allEvents.contains(selectedRegatta)) { - i.remove(); - } - } - // when setting all events, the actual EventDTOs will usually have changed their identity and maybe also their state; - // so notifying the selection listeners is necessary anyhow - notifyListeners(listenersNotToNotify); - } - - @Override - public List getAllEvents() { - return Collections.unmodifiableList(allEvents); - } - - @Override - public boolean hasMultiSelection() { - return hasMultiSelection; - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionProvider.java deleted file mode 100644 index d4b9e197934..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EventSelectionProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.ui.client; - -import java.util.List; -import java.util.UUID; - -public interface EventSelectionProvider { - /** - * @return a non-null list which may be empty - */ - List getSelectedEvents(); - - void addEventSelectionChangeListener(EventSelectionChangeListener listener); - - void removeEventSelectionChangeListener(EventSelectionChangeListener listener); - - void setSelection(List newSelection, EventSelectionChangeListener... listenersNotToNotify); - - boolean hasMultiSelection(); - - /** - * @return a non-null list which may be empty - */ - List getAllEvents(); - - void setAllEvents(List events, EventSelectionChangeListener... listenersNotToNotify); -} diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableMultiSelectionModel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableMultiSelectionModel.java index 08631eaa268..4ee2b99fe18 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableMultiSelectionModel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableMultiSelectionModel.java @@ -44,7 +44,8 @@ public class RefreshableMultiSelectionModel extends MultiSelectionModel im } setSelected(it, isSelected); } - scheduleSelectionChangeEvent(); + setEventScheduled(true); + fireSelectionChangeEvent(); } } } \ No newline at end of file diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableSingleSelectionModel.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableSingleSelectionModel.java index 7c2095d90cc..9907c58c899 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableSingleSelectionModel.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/RefreshableSingleSelectionModel.java @@ -38,6 +38,7 @@ public class RefreshableSingleSelectionModel extends SingleSelectionModel } } } - scheduleSelectionChangeEvent(); + setEventScheduled(true); + fireSelectionChangeEvent(); } } \ No newline at end of file