diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java index 22ac65938e3..c5da35f9b07 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java @@ -84,6 +84,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta private LeaderboardDAO leaderboard; private final RankColumn rankColumn; + + private final List selectedManeuverDetails; private final List selectedLegDetails; @@ -126,7 +128,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta @Override public void onClick(ClickEvent event) { - new LeaderboardSettingsPanel(Collections.unmodifiableList(selectedLegDetails), + new LeaderboardSettingsPanel(Collections.unmodifiableList(selectedManeuverDetails), Collections.unmodifiableList(selectedLegDetails), Collections.unmodifiableList(selectedRaceDetails), /* All races to select */ leaderboard.getRaceColumnNameList(), selectedRaceColumns, timer.getDelayBetweenAutoAdvancesInMilliseconds(), stringConstants.leaderboardSettings(), stringConstants.selectLegDetails(), stringConstants.ok(), @@ -158,6 +160,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta } } } + selectedManeuverDetails.clear(); + selectedManeuverDetails.addAll(result.getManeuverDetailsToShow()); selectedLegDetails.clear(); selectedLegDetails.addAll(result.getLegDetailsToShow()); selectedRaceDetails.clear(); @@ -421,7 +425,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta public static DetailType[] getAvailableRaceDetailColumnTypes() { return new DetailType[] { DetailType.RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, - DetailType.RACE_DISTANCE_TRAVELED, DetailType.RACE_GAP_TO_LEADER_IN_SECONDS, DetailType.RACE_MANEUVERS }; + DetailType.RACE_DISTANCE_TRAVELED, DetailType.RACE_GAP_TO_LEADER_IN_SECONDS, DetailType.NUMBER_OF_MANEUVERS }; } private class TextRaceColumn extends RaceColumn implements RaceNameProvider { @@ -480,9 +484,10 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta result.put(DetailType.RACE_GAP_TO_LEADER_IN_SECONDS, new FormattedDoubleLegDetailColumn( stringConstants.gapToLeaderInSeconds(), stringConstants.gapToLeaderInSecondsUnit(), new RaceGapToLeaderInSeconds(), 0, getLeaderboardPanel() .getLeaderboardTable(), LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE)); - result.put(DetailType.RACE_MANEUVERS, new ManeuverCountRaceColumn( + + /*result.put(DetailType.RACE_MANEUVERS, new ManeuverCountRaceColumn( stringConstants.numberOfManeuvers(), getLeaderboardPanel() - .getLeaderboardTable(), this, LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE, stringConstants)); + .getLeaderboardTable(), this, LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE, stringConstants));*/ return result; } @@ -493,6 +498,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta result.add(column); } if (isExpanded()) { + result.add(getManeuverCountRaceColumn()); // it is important to re-use existing LegColumn objects because // removing the columns from the table // is based on column identity @@ -513,6 +519,10 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta } return result; } + + private ManeuverCountRaceColumn getManeuverCountRaceColumn(){ + return new ManeuverCountRaceColumn(getLeaderboardPanel(), getRaceName(), stringConstants, LeaderboardPanel.this.selectedManeuverDetails, LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE); + } private LegColumn getLegColumn(int legNumber) { LegColumn result; @@ -721,6 +731,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta this.selectedLegDetails.add(DetailType.RANK_GAIN); this.selectedRaceDetails = new ArrayList(); this.selectedRaceColumns = new ArrayList(); + this.selectedManeuverDetails = new ArrayList(); delayInMilliseconds = 0l; timer = new Timer(/* delayBetweenAutoAdvancesInMilliseconds */ 3000l); timer.setDelay(getDelayInMilliseconds()); // set time/delay before diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardSettingsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardSettingsPanel.java index 454bf1d0889..44d12683d54 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardSettingsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardSettingsPanel.java @@ -18,9 +18,11 @@ import com.sap.sailing.gwt.ui.shared.DetailType; public class LeaderboardSettingsPanel extends DataEntryDialog { private final List raceColumnSelection; private final List raceAllRaceColumns; + private final List maneuverDetailSelection; private final List legDetailSelection; private final List raceDetailSelection; private final Map raceColumnCheckboxes; + private final Map maneuverDetailCheckboxes; private final Map legDetailCheckboxes; private final Map raceDetailCheckboxes; private final StringConstants stringConstants; @@ -29,17 +31,23 @@ public class LeaderboardSettingsPanel extends DataEntryDialog { public static class Result { private final List raceColumnsToShow; + private final List maneuverDetailsToShow; private final List legDetailsToShow; private final List raceDetailsToShow; private final long delayBetweenAutoAdvancesInMilliseconds; private final long delayInMilliseconds; - public Result(List legDetailsToShow, List raceDetailsToShow, List raceColumnsToShow, long delayBetweenAutoAdvancesInMilliseconds, long delayInMilliseconds) { + public Result(List meneuverDetailsToShow, List legDetailsToShow, List raceDetailsToShow, List raceColumnsToShow, long delayBetweenAutoAdvancesInMilliseconds, long delayInMilliseconds) { this.legDetailsToShow = legDetailsToShow; this.raceDetailsToShow = raceDetailsToShow; this.raceColumnsToShow = raceColumnsToShow; this.delayBetweenAutoAdvancesInMilliseconds = delayBetweenAutoAdvancesInMilliseconds; this.delayInMilliseconds = delayInMilliseconds; + this.maneuverDetailsToShow = meneuverDetailsToShow; + } + + public List getManeuverDetailsToShow() { + return maneuverDetailsToShow; } public List getLegDetailsToShow() { @@ -63,17 +71,19 @@ public class LeaderboardSettingsPanel extends DataEntryDialog { } } - public LeaderboardSettingsPanel(List legDetailSelection, List raceDetailSelection, List raceAllRaceColumns, List raceColumnSelection, + public LeaderboardSettingsPanel(List maneuverDetailSelection, List legDetailSelection, List raceDetailSelection, List raceAllRaceColumns, List raceColumnSelection, long delayBetweenAutoAdvancesInMilliseconds, String title, String message, String okButtonName, String cancelButtonName, com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator validator, AsyncCallback callback, StringConstants stringConstants, long delayInMilliseconds) { super(title, message, okButtonName, cancelButtonName, validator, callback); + this.maneuverDetailSelection = maneuverDetailSelection; this.raceColumnSelection = raceColumnSelection; this.raceAllRaceColumns = raceAllRaceColumns; this.legDetailSelection = legDetailSelection; this.raceDetailSelection = raceDetailSelection; this.stringConstants = stringConstants; raceColumnCheckboxes = new LinkedHashMap(); + maneuverDetailCheckboxes = new LinkedHashMap(); legDetailCheckboxes = new LinkedHashMap(); raceDetailCheckboxes = new LinkedHashMap(); delayBetweenAutoAdvancesInSecondsBox = createIntegerBox((int) delayBetweenAutoAdvancesInMilliseconds/1000, 4); @@ -83,6 +93,17 @@ public class LeaderboardSettingsPanel extends DataEntryDialog { @Override protected Widget getAdditionalWidget() { HorizontalPanel hp = new HorizontalPanel(); + VerticalPanel vpMeneuvers = new VerticalPanel(); + vpMeneuvers.setSpacing(5); + vpMeneuvers.add(new Label(stringConstants.maneuverTypes())); + List currentMeneuverDetailSelection = maneuverDetailSelection; + for (DetailType detailType : ManeuverCountRaceColumn.getAvailableManeuverDetailColumnTypes()) { + CheckBox checkbox = createCheckbox(detailType.toString(stringConstants)); + checkbox.setValue(currentMeneuverDetailSelection.contains(detailType)); + maneuverDetailCheckboxes.put(detailType, checkbox); + vpMeneuvers.add(checkbox); + } + hp.add(vpMeneuvers); VerticalPanel vpLeft = new VerticalPanel(); vpLeft.setSpacing(5); VerticalPanel vpRight = new VerticalPanel(); @@ -126,6 +147,12 @@ public class LeaderboardSettingsPanel extends DataEntryDialog { @Override protected Result getResult() { + List maneuverDetailsToShow = new ArrayList(); + for (Map.Entry entry : maneuverDetailCheckboxes.entrySet()) { + if (entry.getValue().getValue()) { + maneuverDetailsToShow.add(entry.getKey()); + } + } List raceDetailsToShow = new ArrayList(); for (Map.Entry entry : raceDetailCheckboxes.entrySet()) { if (entry.getValue().getValue()) { @@ -146,7 +173,7 @@ public class LeaderboardSettingsPanel extends DataEntryDialog { } Integer delayBetweenAutoAdvancesValue = delayBetweenAutoAdvancesInSecondsBox.getValue(); Integer delayInSecondsValue = delayInSecondsBox.getValue(); - return new Result(legDetailsToShow, raceDetailsToShow, raceColumnsToShow, 1000*(delayBetweenAutoAdvancesValue==null?0:delayBetweenAutoAdvancesValue.longValue()), + return new Result(maneuverDetailsToShow, legDetailsToShow, raceDetailsToShow, raceColumnsToShow, 1000*(delayBetweenAutoAdvancesValue==null?0:delayBetweenAutoAdvancesValue.longValue()), 1000*(delayInSecondsValue==null?0:delayInSecondsValue.longValue())); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ManeuverCountRaceColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ManeuverCountRaceColumn.java index d408b7932f9..b2043aff8dc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ManeuverCountRaceColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ManeuverCountRaceColumn.java @@ -1,50 +1,62 @@ package com.sap.sailing.gwt.ui.client; -import com.google.gwt.user.cellview.client.CellTable; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.soap.Detail; + +import com.google.gwt.cell.client.TextCell; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.user.cellview.client.Header; +import com.sap.sailing.gwt.ui.client.LegDetailColumn.LegDetailField; +import com.sap.sailing.gwt.ui.shared.DetailType; import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO; import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO; import com.sap.sailing.gwt.ui.shared.LegEntryDAO; import com.sap.sailing.gwt.ui.shared.Triple; -public class ManeuverCountRaceColumn extends FormattedDoubleLegDetailColumn { +public class ManeuverCountRaceColumn extends ExpandableSortableColumn { + private final StringConstants stringConstants; - private final RaceNameProvider raceNameProvider; + private final String raceName; + + private final String headerStyle; + private final String columnStyle; - public ManeuverCountRaceColumn(String title, CellTable leaderboardTable, - RaceNameProvider raceNameProvider, String headerStyle, String columnStyle, StringConstants stringConstants) { - super(title, /*unit*/null, /* field */ null, /* decimals */ 0, leaderboardTable, headerStyle, columnStyle); - this.stringConstants = stringConstants; - this.raceNameProvider = raceNameProvider; - } + private abstract class AbstractManeuverDetailField> implements LegDetailField { + public T get(LeaderboardRowDAO row) { + LeaderboardEntryDAO fieldsForRace = row.fieldsByRaceName.get(getRaceName()); + if (fieldsForRace != null && fieldsForRace.legDetails != null) { + for (LegEntryDAO legDetail : fieldsForRace.legDetails) { + if (legDetail != null) { + + } + } + } + + LeaderboardEntryDAO entry = row.fieldsByRaceName.get(raceName); + if(entry == null){ + return null; + }else{ + return getFromNonNullEntry(entry); + } + } - @Override - protected String getTitle(LeaderboardRowDAO row) { - Triple tacksJibesAndPenaltyCircles = getTotalNumberOfTacksJibesAndPenaltyCircles(row); - StringBuilder result = new StringBuilder(); - if (tacksJibesAndPenaltyCircles.getA() != null) { - result.append(tacksJibesAndPenaltyCircles.getA()); - result.append(" "); - result.append(stringConstants.tacks()); - } - if (tacksJibesAndPenaltyCircles.getB() != null) { - if (result.length() > 0) { - result.append(", "); - } - result.append(tacksJibesAndPenaltyCircles.getB()); - result.append(" "); - result.append(stringConstants.jibes()); - } - if (tacksJibesAndPenaltyCircles.getC() != null) { - if (result.length() > 0) { - result.append(", "); - } - result.append(tacksJibesAndPenaltyCircles.getC()); - result.append(" "); - result.append(stringConstants.penaltyCircles()); - } - return result.toString(); + protected abstract T getFromNonNullEntry(LegEntryDAO entry); } + public ManeuverCountRaceColumn(LeaderboardPanel leaderboardPanel, String raceName, StringConstants stringConstants, + List maneuverDetailSelection, String headerStyle, String columnStylee) { + super(leaderboardPanel, /* expandable */true /* all legs have details */, new TextCell(), stringConstants, + headerStyle, columnStylee, maneuverDetailSelection); + this.stringConstants = stringConstants; + this.raceName = raceName; + this.headerStyle = headerStyle; + this.columnStyle = columnStylee; + } + private Triple getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDAO row) { Integer totalNumberOfTacks = null; Integer totalNumberOfJibes = null; @@ -77,13 +89,44 @@ public class ManeuverCountRaceColumn extends FormattedDoubleLegDetailColumn { } } } - return new Triple(totalNumberOfTacks, totalNumberOfJibes, totalNumberOfPenaltyCircles); + return new Triple(totalNumberOfTacks, totalNumberOfJibes, + totalNumberOfPenaltyCircles); + } + + private String getRaceName() { + return raceName; } @Override - protected Double getFieldValue(LeaderboardRowDAO row) { + public Header getHeader() { + SortableExpandableColumnHeader result = new SortableExpandableColumnHeader(/* title */ stringConstants.maneuverTypes(), + /* iconURL */ null, getLeaderboardPanel(), this, stringConstants); + return result; + } + + @Override + public Comparator getComparator() { + return new Comparator() { + @Override + public int compare(LeaderboardRowDAO o1, LeaderboardRowDAO o2) { + boolean ascending = isSortedAscendingForThisColumn(getLeaderboardPanel().getLeaderboardTable()); + if(o1 != null && o2 != null){ + String val1 = getValue(o1); + String val2 = getValue(o2); + if(val1!="" && val1 != null && val2 != "" && val2 != null){ + int diff = Integer.parseInt(val2) - Integer.parseInt(val1); + return ascending ? diff : -diff; + } + } + return 0; + } + }; + } + + @Override + public String getValue(LeaderboardRowDAO object) { Double result = null; - Triple tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(row); + Triple tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(object); Integer totalNumberOfTacks = tacksJibesAndPenalties.getA(); Integer totalNumberOfJibes = tacksJibesAndPenalties.getB(); Integer totalNumberOfPenaltyCircles = tacksJibesAndPenalties.getC(); @@ -104,11 +147,34 @@ public class ManeuverCountRaceColumn extends FormattedDoubleLegDetailColumn { result += (double) totalNumberOfPenaltyCircles; } } + if(result==null){ + return ""; + }else{ + return result.toString(); + } + } + + @Override + protected Map> getDetailColumnMap( + LeaderboardPanel leaderboardPanel, StringConstants stringConstants, String detailHeaderStyle, + String detailColumnStyle) { + Map> result = new HashMap>(); + result.put(DetailType.HEAD_UP, new ) return result; } - - private String getRaceName() { - return raceNameProvider.getRaceName(); + + public static DetailType[] getAvailableManeuverDetailColumnTypes() { + return new DetailType[] { DetailType.TACK, DetailType.JIBE, DetailType.PENALTY_CIRCLE}; + } + + @Override + public String getColumnStyle() { + return columnStyle; + } + + @Override + public String getHeaderStyle() { + return headerStyle; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DetailType.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DetailType.java index 68f1073a0bc..ad9c7b90b0e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DetailType.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DetailType.java @@ -7,7 +7,7 @@ public enum DetailType implements IsSerializable { DISTANCE_TRAVELED(0), AVERAGE_SPEED_OVER_GROUND_IN_KNOTS(2), RANK_GAIN(0), NUMBER_OF_MANEUVERS(0), CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2), ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS(1), VELOCITY_MADE_GOOD_IN_KNOTS(2), GAP_TO_LEADER_IN_SECONDS(0), WINDWARD_DISTANCE_TO_GO_IN_METERS(0), RACE_DISTANCE_TRAVELED(0), RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS(2), RACE_GAP_TO_LEADER_IN_SECONDS(0), - RACE_MANEUVERS(0), WINDWARD_DISTANCE_TO_OVERALL_LEADER(0); + WINDWARD_DISTANCE_TO_OVERALL_LEADER(0), HEAD_UP(0), BEAR_AWAY(0), TACK(0), JIBE(0), PENALTY_CIRCLE(0), MARK_PASSING(0); private int precision; @@ -45,10 +45,20 @@ public enum DetailType implements IsSerializable { return stringConstants.averageSpeedInKnots(); case RACE_GAP_TO_LEADER_IN_SECONDS: return stringConstants.gapToLeaderInSeconds(); - case RACE_MANEUVERS: - return stringConstants.numberOfManeuvers(); case WINDWARD_DISTANCE_TO_OVERALL_LEADER: return stringConstants.windwardDistanceToOverallLeader(); + case HEAD_UP: + return stringConstants.headUp(); + case BEAR_AWAY: + return stringConstants.bearAway(); + case TACK: + return stringConstants.tack(); + case JIBE: + return stringConstants.jibe(); + case PENALTY_CIRCLE: + return stringConstants.penaltyCircle(); + case MARK_PASSING: + return stringConstants.markPassing(); } return null; }