diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapSettingsDialogComponent.java index c973efd8866..7ee28af5a22 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapSettingsDialogComponent.java @@ -43,7 +43,7 @@ public class RaceMapSettingsDialogComponent implements SettingsDialogComponent dialog) { + public Widget getAdditionalWidget(DataEntryDialog dialog) { VerticalPanel vp = new VerticalPanel(); HorizontalPanel labelAndTailLengthBoxPanel = new HorizontalPanel(); labelAndTailLengthBoxPanel.add(new Label(stringMessages.tailLength())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java index 8d516e86a97..1ab6e48a92e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java @@ -25,7 +25,7 @@ public class WindChartSettingsDialogComponent implements SettingsDialogComponent } @Override - public Widget getAdditionalWidget(DataEntryDialog dialog) { + public Widget getAdditionalWidget(DataEntryDialog dialog) { VerticalPanel vp = new VerticalPanel(); for (WindSourceType windSourceType : WindSourceType.values()) { CheckBox checkbox = dialog.createCheckbox(windSourceType.name()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java index d4630824f11..7633cb31d0b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java @@ -12,7 +12,7 @@ public class RaceTimePanelSettingsDialogComponent extends TimePanelSettingsDialo } @Override - public Widget getAdditionalWidget(DataEntryDialog dialog) { + public Widget getAdditionalWidget(DataEntryDialog dialog) { Widget widget = super.getAdditionalWidget(dialog); HorizontalPanel labelAndTDelayForLiveBoxPanel = new HorizontalPanel(); labelAndTDelayForLiveBoxPanel.setSpacing(5); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java index 806dc5f7795..9858994eb63 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java @@ -27,7 +27,7 @@ public class TimePanelSettingsDialogComponent imple } @Override - public Widget getAdditionalWidget(DataEntryDialog dialog) { + public Widget getAdditionalWidget(DataEntryDialog dialog) { mainContentPanel = new VerticalPanel(); HorizontalPanel labelAndRefreshIntervalBoxPanel = new HorizontalPanel(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartSettingsComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartSettingsComponent.java index 5a0a650d526..608d7f16b99 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartSettingsComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractChartSettingsComponent.java @@ -21,7 +21,7 @@ public abstract class AbstractChartSettingsComponent dialog) { + public VerticalPanel getAdditionalWidget(DataEntryDialog dialog) { VerticalPanel panel = new VerticalPanel(); panel.add(new Label(getStringMessages().stepSizeInSeconds())); stepSizeBox = dialog.createDoubleBox(((double) settings.getStepSize()) / 1000, 5); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsDialogComponent.java index 16e7cff59a0..e6ccf2de6b9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsDialogComponent.java @@ -57,7 +57,7 @@ public class LeaderboardSettingsDialogComponent implements SettingsDialogCompone } @Override - public Widget getAdditionalWidget(DataEntryDialog dialog) { + public Widget getAdditionalWidget(DataEntryDialog dialog) { delayBetweenAutoAdvancesInSecondsBox = dialog.createLongBox(delayBetweenAutoAdvancesInMilliseconds/1000l, 4); delayInSecondsBox = dialog.createLongBox(delayInMilliseconds/1000l, 4); HorizontalPanel hp = new HorizontalPanel(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/MultiChartSettingsComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/MultiChartSettingsComponent.java index 2dccd421636..c3817728ff5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/MultiChartSettingsComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/MultiChartSettingsComponent.java @@ -20,7 +20,7 @@ public class MultiChartSettingsComponent extends AbstractChartSettingsComponent< } @Override - public VerticalPanel getAdditionalWidget(DataEntryDialog dialog) { + public VerticalPanel getAdditionalWidget(DataEntryDialog dialog) { VerticalPanel configPanel = super.getAdditionalWidget(dialog); configPanel.setSpacing(5); Label lblChart = new Label(getStringMessages().chooseChart()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 2a8729bcb58..d9bc29bdc87 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -73,7 +73,6 @@ import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Triple; -import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard.Entry; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -550,7 +549,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS windSourcesToDeliver.addAll(Arrays.asList(windSources)); } else { Util.addAll(trackedRace.getWindSources(), windSourcesToDeliver); - windSourcesToDeliver.add(new WindSourceImpl(WindSourceType.COMBINED)); + // TODO bug #375: add the combined wind; currently, CombinedWindTrackImpl just takes too long to return results... + // windSourcesToDeliver.add(new WindSourceImpl(WindSourceType.COMBINED)); } for (WindSource windSource : windSourcesToDeliver) { WindTrackInfoDTO windTrackInfoDTO = new WindTrackInfoDTO(); @@ -611,7 +611,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS result.windTrackInfoByWindSource = windTrackInfoDTOs; List windSourcesToDeliver = new ArrayList(); Util.addAll(trackedRace.getWindSources(), windSourcesToDeliver); - windSourcesToDeliver.add(new WindSourceImpl(WindSourceType.COMBINED)); + // TODO bug #375: add the combined wind; currently, CombinedWindTrackImpl just takes too long to return results... + // windSourcesToDeliver.add(new WindSourceImpl(WindSourceType.COMBINED)); for (WindSource windSource : windSourcesToDeliver) { if (windSourceTypeNames == null || windSourceTypeNames.contains(windSource.getType().name())) { TimePoint fromTimePoint = new MillisecondsTimePoint(from); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettings.java new file mode 100755 index 00000000000..7907072fe40 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettings.java @@ -0,0 +1,24 @@ +package com.sap.sailing.gwt.ui.shared.components; + +import com.sap.sailing.domain.common.impl.Util.Pair; + +public class CompositeSettings { + public static class ComponentAndSettingsPair extends Pair, SettingsType> { + private static final long serialVersionUID = -569811233041583043L; + + public ComponentAndSettingsPair(Component a, SettingsType b) { + super(a, b); + } + } + + private final Iterable> settingsPerComponent; + + public CompositeSettings(Iterable> settingsPerComponent) { + this.settingsPerComponent = settingsPerComponent; + } + + public Iterable> getSettingsPerComponent() { + return settingsPerComponent; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettingsDialogComponent.java new file mode 100755 index 00000000000..09243c3b785 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeSettingsDialogComponent.java @@ -0,0 +1,45 @@ +package com.sap.sailing.gwt.ui.shared.components; + +import com.google.gwt.user.client.ui.FocusWidget; +import com.google.gwt.user.client.ui.TabPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.DataEntryDialog; +import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator; + +public class CompositeSettingsDialogComponent implements SettingsDialogComponent { + + private final Component[] components; + + public CompositeSettingsDialogComponent(Component... components) { + this.components = components; + } + + @Override + public Widget getAdditionalWidget(DataEntryDialog dialog) { + TabPanel result = new TabPanel(); + for (Component component : components) { + Widget w = component.getSettingsDialogComponent().getAdditionalWidget((DataEntryDialog) dialog); + result.add(w, component.getLocalizedShortName()); + } + return result; + } + + @Override + public CompositeSettings getResult() { + + return null; + } + + @Override + public Validator getValidator() { + // TODO Auto-generated method stub + return null; + } + + @Override + public FocusWidget getFocusWidget() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeTabbedSettingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeTabbedSettingsDialog.java new file mode 100755 index 00000000000..64a42d17bea --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeTabbedSettingsDialog.java @@ -0,0 +1,86 @@ +package com.sap.sailing.gwt.ui.shared.components; + +import java.util.HashMap; +import java.util.Map; + +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.components.CompositeSettings.ComponentAndSettingsPair; + +/** + * A composite settings dialog that combines the settings of several {@link Component}s, providing a tab + * for each component. + * + * @author Axel Uhl (d043530) + * + */ +public class CompositeTabbedSettingsDialog extends SettingsDialog { + private final Map, SettingsDialogComponent> settingsDialogComponents; + + public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Component... components) { + super(new Component() { + @Override + public boolean hasSettings() { + for (Component component : components) { + if (component.hasSettings()) { + return true; + } + } + return false; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return new CompositeSettingsDialogComponent(components); + } + + @Override + public void updateSettings(CompositeSettings newSettings) { + for (CompositeSettings.ComponentAndSettingsPair componentAndSettings : newSettings.getSettingsPerComponent()) { + updateSettings(componentAndSettings); + } + } + + private void updateSettings(ComponentAndSettingsPair componentAndSettings) { + componentAndSettings.getA().updateSettings(componentAndSettings.getB()); + } + + @Override + public String getLocalizedShortName() { + StringBuilder result = new StringBuilder(); + boolean first = true; + for (Component component : components) { + if (first) { + first = false; + } else { + result.append(" / "); + } + result.append(component.getLocalizedShortName()); + } + return result.toString(); + } + + @Override + public Widget getEntryWidget() { + throw new NoSuchMethodError("Virtual composite component doesn't have a widget of its own"); + } + + @Override + public boolean isVisible() { + return false; + } + + @Override + public void setVisible(boolean visibility) { + throw new NoSuchMethodError("Virtual composite component doesn't know how to make itself visible"); + } + }, stringConstants); + settingsDialogComponents = new HashMap, SettingsDialogComponent>(); + for (Component component : components) { + if (component.hasSettings()) { + settingsDialogComponents.put(component, component.getSettingsDialogComponent()); + } + } + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeValidator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeValidator.java new file mode 100755 index 00000000000..4c0c66cbcde --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/CompositeValidator.java @@ -0,0 +1,56 @@ +package com.sap.sailing.gwt.ui.shared.components; + +import java.util.ArrayList; + +import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator; +import com.sap.sailing.gwt.ui.shared.components.CompositeSettings.ComponentAndSettingsPair; + +public class CompositeValidator implements Validator { + private static class ComponentAndValidator extends Pair, Validator> { + private static final long serialVersionUID = -4190322565836849861L; + + public ComponentAndValidator(Component a, Validator b) { + super(a, b); + } + } + + private final Iterable> validators; + + public CompositeValidator(Component[] components) { + ArrayList> v = new ArrayList>(); + for (Component component : components) { + v.add(getComponentAndValidator(component)); + } + validators = v; + } + + private ComponentAndValidator getComponentAndValidator(Component component) { + return new ComponentAndValidator(component, component.getSettingsDialogComponent().getValidator()); + } + + @Override + public String getErrorMessage(CompositeSettings valueToValidate) { + StringBuilder result = new StringBuilder(); + for (ComponentAndSettingsPair componentAndSettings : valueToValidate.getSettingsPerComponent()) { + final String errorMessage = getErrorMessage(componentAndSettings); + if (errorMessage != null) { + result.append(errorMessage); + result.append("; "); + } + } + return result.toString(); + } + + private String getErrorMessage(ComponentAndSettingsPair componentAndSettings) { + for (ComponentAndValidator componentAndValidator : validators) { + if (componentAndValidator.getA() == componentAndSettings.getA()) { + @SuppressWarnings("unchecked") + final Validator validator = (Validator) componentAndValidator.getB(); + return validator.getErrorMessage(componentAndSettings.getB()); + } + } + return null; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/SettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/SettingsDialogComponent.java index 7c0373c065c..68b46a03628 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/SettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/SettingsDialogComponent.java @@ -14,11 +14,12 @@ public interface SettingsDialogComponent { * @param dialog * can be used to {@link DataEntryDialog#createCheckbox(String) produce a checkbox}, a * {@link DataEntryDialog#createTextBox(String)} or other data entry elements that participate in key - * handling for validation triggering and for canceling and confirming the dialog + * handling for validation triggering and for canceling and confirming the dialog. The type argument + * is therefore not propagated. It's not needed to create a simple UI control. * @return null in case this component doesn't make any special contribution to the settings dialog, or * a valid widget that will be displayed in the settings dialog */ - Widget getAdditionalWidget(DataEntryDialog dialog); + Widget getAdditionalWidget(DataEntryDialog dialog); /** * Obtains the result from this settings dialog component; usually, the result object is contructed by reading data