Changed ManeuvercountRaceColumn to ExpandableSortabeColumn

This commit is contained in:
Fabian Schwarz-Fritz committed 2011-12-06 15:47:34 +01:00
1 parent b53a4b42e8
commit 18b2cb83a5
4 files changed
+165 -51

No files matched your search

@@ -84,6 +84,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
private LeaderboardDAO leaderboard;
private final RankColumn rankColumn;
private final List<DetailType> selectedManeuverDetails;
private final List<DetailType> 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<String> 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<DetailType>();
this.selectedRaceColumns = new ArrayList<String>();
this.selectedManeuverDetails = new ArrayList<DetailType>();
delayInMilliseconds = 0l;
timer = new Timer(/* delayBetweenAutoAdvancesInMilliseconds */ 3000l);
timer.setDelay(getDelayInMilliseconds()); // set time/delay before
@@ -18,9 +18,11 @@ import com.sap.sailing.gwt.ui.shared.DetailType;
public class LeaderboardSettingsPanel extends DataEntryDialog<Result> {
private final List<String> raceColumnSelection;
private final List<String> raceAllRaceColumns;
private final List<DetailType> maneuverDetailSelection;
private final List<DetailType> legDetailSelection;
private final List<DetailType> raceDetailSelection;
private final Map<String, CheckBox> raceColumnCheckboxes;
private final Map<DetailType, CheckBox> maneuverDetailCheckboxes;
private final Map<DetailType, CheckBox> legDetailCheckboxes;
private final Map<DetailType, CheckBox> raceDetailCheckboxes;
private final StringConstants stringConstants;
@@ -29,17 +31,23 @@ public class LeaderboardSettingsPanel extends DataEntryDialog<Result> {
public static class Result {
private final List<String> raceColumnsToShow;
private final List<DetailType> maneuverDetailsToShow;
private final List<DetailType> legDetailsToShow;
private final List<DetailType> raceDetailsToShow;
private final long delayBetweenAutoAdvancesInMilliseconds;
private final long delayInMilliseconds;
public Result(List<DetailType> legDetailsToShow, List<DetailType> raceDetailsToShow, List<String> raceColumnsToShow, long delayBetweenAutoAdvancesInMilliseconds, long delayInMilliseconds) {
public Result(List<DetailType> meneuverDetailsToShow, List<DetailType> legDetailsToShow, List<DetailType> raceDetailsToShow, List<String> 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<DetailType> getManeuverDetailsToShow() {
return maneuverDetailsToShow;
}
public List<DetailType> getLegDetailsToShow() {
@@ -63,17 +71,19 @@ public class LeaderboardSettingsPanel extends DataEntryDialog<Result> {
}
}
public LeaderboardSettingsPanel(List<DetailType> legDetailSelection, List<DetailType> raceDetailSelection, List<String> raceAllRaceColumns, List<String> raceColumnSelection,
public LeaderboardSettingsPanel(List<DetailType> maneuverDetailSelection, List<DetailType> legDetailSelection, List<DetailType> raceDetailSelection, List<String> raceAllRaceColumns, List<String> raceColumnSelection,
long delayBetweenAutoAdvancesInMilliseconds, String title, String message,
String okButtonName,
String cancelButtonName, com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator<Result> validator, AsyncCallback<Result> 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<String, CheckBox>();
maneuverDetailCheckboxes = new LinkedHashMap<DetailType, CheckBox>();
legDetailCheckboxes = new LinkedHashMap<DetailType, CheckBox>();
raceDetailCheckboxes = new LinkedHashMap<DetailType, CheckBox>();
delayBetweenAutoAdvancesInSecondsBox = createIntegerBox((int) delayBetweenAutoAdvancesInMilliseconds/1000, 4);
@@ -83,6 +93,17 @@ public class LeaderboardSettingsPanel extends DataEntryDialog<Result> {
@Override
protected Widget getAdditionalWidget() {
HorizontalPanel hp = new HorizontalPanel();
VerticalPanel vpMeneuvers = new VerticalPanel();
vpMeneuvers.setSpacing(5);
vpMeneuvers.add(new Label(stringConstants.maneuverTypes()));
List<DetailType> 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<Result> {
@Override
protected Result getResult() {
List<DetailType> maneuverDetailsToShow = new ArrayList<DetailType>();
for (Map.Entry<DetailType, CheckBox> entry : maneuverDetailCheckboxes.entrySet()) {
if (entry.getValue().getValue()) {
maneuverDetailsToShow.add(entry.getKey());
}
}
List<DetailType> raceDetailsToShow = new ArrayList<DetailType>();
for (Map.Entry<DetailType, CheckBox> entry : raceDetailCheckboxes.entrySet()) {
if (entry.getValue().getValue()) {
@@ -146,7 +173,7 @@ public class LeaderboardSettingsPanel extends DataEntryDialog<Result> {
}
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()));
}
@@ -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<String> {
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<LeaderboardRowDAO> 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<T extends Comparable<?>> implements LegDetailField<T> {
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<Integer, Integer, Integer> 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<DetailType> 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<Integer, Integer, Integer> getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDAO row) {
Integer totalNumberOfTacks = null;
Integer totalNumberOfJibes = null;
@@ -77,13 +89,44 @@ public class ManeuverCountRaceColumn extends FormattedDoubleLegDetailColumn {
}
}
}
return new Triple<Integer, Integer, Integer>(totalNumberOfTacks, totalNumberOfJibes, totalNumberOfPenaltyCircles);
return new Triple<Integer, Integer, Integer>(totalNumberOfTacks, totalNumberOfJibes,
totalNumberOfPenaltyCircles);
}
private String getRaceName() {
return raceName;
}
@Override
protected Double getFieldValue(LeaderboardRowDAO row) {
public Header<SafeHtml> getHeader() {
SortableExpandableColumnHeader result = new SortableExpandableColumnHeader(/* title */ stringConstants.maneuverTypes(),
/* iconURL */ null, getLeaderboardPanel(), this, stringConstants);
return result;
}
@Override
public Comparator<LeaderboardRowDAO> getComparator() {
return new Comparator<LeaderboardRowDAO>() {
@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<Integer, Integer, Integer> tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(row);
Triple<Integer, Integer, Integer> 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<DetailType, SortableColumn<LeaderboardRowDAO, ?>> getDetailColumnMap(
LeaderboardPanel leaderboardPanel, StringConstants stringConstants, String detailHeaderStyle,
String detailColumnStyle) {
Map<DetailType, SortableColumn<LeaderboardRowDAO, ?>> result = new HashMap<DetailType, SortableColumn<LeaderboardRowDAO, ?>>();
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;
}
}
@@ -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;
}