Corrected sort of ManeuvercountRaceColumn when more than one race is

loaded, and these races contain different competitors.
Corrected display of numbers in maneuverCountRaceColumn.
This commit is contained in:
Fabian Schwarz-Fritz committed 2011-12-07 13:53:10 +01:00
1 parent 020eed6eb5
commit 03e4903a53
2 files changed
+74 -157

No files matched your search

@@ -1,75 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTable;
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
public class FormattedIntegerLegDetailColumn extends LegDetailColumn<Integer, String> {
private final NumberFormat formatter;
public FormattedIntegerLegDetailColumn(String title, String unit,
com.sap.sailing.gwt.ui.client.LegDetailColumn.LegDetailField<Integer> field, int decimals,
CellTable<LeaderboardRowDAO> leaderboardTable, String headerStyle, String columnStyle) {
super(title, unit, field, new TextCell(), leaderboardTable, headerStyle, columnStyle);
StringBuilder patternBuilder = new StringBuilder("0");
if (decimals > 0) {
patternBuilder.append('.');
}
for (int i=0; i<decimals; i++) {
patternBuilder.append('0');
}
formatter = NumberFormat.getFormat(patternBuilder.toString());
}
protected NumberFormat getFormatter() {
return formatter;
}
/**
* Computes the string representation of the value to be displayed in the table. Note that it's not the
* resulting string used for comparisons with the {@link #getComparator() comparator} but the sortable
* value extracted using {@link #getFieldValue(LeaderboardRowDAO)}.
*/
@Override
public String getValue(LeaderboardRowDAO row) {
Integer fieldValue = getFieldValue(row);
String result = "";
if (fieldValue != null) {
result = getFormatter().format(fieldValue);
}
return result;
}
@Override
public void render(Context context, LeaderboardRowDAO row, SafeHtmlBuilder sb) {
int percent = getPercentage(row);
String title = getTitle(row);
sb.appendHtmlConstant("<div "+(title==null?"":"title=\""+title+"\" ")+"style=\"left: 0px; background-image: url(/images/greyBar.png); "+
" background-position: left; background-repeat: no-repeat; background-size: "+
percent+"% 25px; \">").
appendEscaped(getValue(row)).appendHtmlConstant("</div>");
}
/**
* Computes a tool-tip text to add to the table cell's content as rendered by {@link #render(Context, LeaderboardRowDAO, SafeHtmlBuilder)}.
*
* @return This default implementation returns <code>null</code> for no tool tip / title
*/
protected String getTitle(LeaderboardRowDAO row) {
return null;
}
private int getPercentage(LeaderboardRowDAO row) {
Integer value = getFieldValue(row);
int percentage = 0;
if (value != null && getMinimum() != null && getMaximum() != null) {
int minBarLength = Math.abs(getMinimum()) < 0.01 ? 0 : 10;
percentage = (int) (minBarLength+(100.-minBarLength)*(value-getMinimum())/(getMaximum()-getMinimum()));
}
return percentage;
}
}
@@ -19,7 +19,7 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
private final StringConstants stringConstants;
private final RaceNameProvider raceNameProvider;
private final String headerStyle;
private final String columnStyle;
@@ -29,59 +29,62 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
if (fieldsForRace == null) {
return null;
} else {
return getFromNonNullEntry(fieldsForRace);
T value = getFromNonNullEntry(fieldsForRace);
return value;
}
}
protected abstract T getFromNonNullEntry(LeaderboardEntryDAO entry);
}
private class NumberOfTacks extends AbstractManeuverDetailField<Integer> {
private class NumberOfTacks extends AbstractManeuverDetailField<Double> {
@Override
protected Integer getFromNonNullEntry(LeaderboardEntryDAO entry) {
protected Double getFromNonNullEntry(LeaderboardEntryDAO entry) {
return ManeuverCountRaceColumn.this.getTotalNumberOfTacks(entry);
}
}
private class NumberOfJibes extends AbstractManeuverDetailField<Integer> {
private class NumberOfJibes extends AbstractManeuverDetailField<Double> {
@Override
protected Integer getFromNonNullEntry(LeaderboardEntryDAO entry) {
protected Double getFromNonNullEntry(LeaderboardEntryDAO entry) {
// TODO get lerderboard double like in get number of
return ManeuverCountRaceColumn.this.getTotalNumberOfJibes(entry);
}
}
private class NumberOfPenaltyCircles extends AbstractManeuverDetailField<Integer> {
private class NumberOfPenaltyCircles extends AbstractManeuverDetailField<Double> {
@Override
protected Integer getFromNonNullEntry(LeaderboardEntryDAO entry) {
protected Double getFromNonNullEntry(LeaderboardEntryDAO entry) {
// TODO get lerderboard double like in get number of
return ManeuverCountRaceColumn.this.getTotalNumberOfPenaltyCircles(entry);
}
}
public ManeuverCountRaceColumn(LeaderboardPanel leaderboardPanel, RaceNameProvider raceNameProvider, StringConstants stringConstants,
List<DetailType> maneuverDetailSelection, String headerStyle, String columnStylee, String detailHeaderStyle, String detailColumnStyle) {
public ManeuverCountRaceColumn(LeaderboardPanel leaderboardPanel, RaceNameProvider raceNameProvider,
StringConstants stringConstants, List<DetailType> maneuverDetailSelection, String headerStyle,
String columnStylee, String detailHeaderStyle, String detailColumnStyle) {
super(leaderboardPanel, /* expandable */true /* all legs have details */, new TextCell(), stringConstants,
detailHeaderStyle, detailColumnStyle, maneuverDetailSelection);
setHorizontalAlignment(ALIGN_CENTER);
this.stringConstants = stringConstants;
this.raceNameProvider = raceNameProvider;
this.headerStyle = headerStyle;
this.columnStyle = columnStylee;
}
private Integer getTotalNumberOfTacks(LeaderboardEntryDAO row) {
Integer totalNumberOfTacks = null;
private Double getTotalNumberOfTacks(LeaderboardEntryDAO row) {
Double totalNumberOfTacks = null;
if (row != null && row.legDetails != null) {
for (LegEntryDAO legDetail : row.legDetails) {
if (legDetail != null) {
if (legDetail.numberOfTacks != null) {
if (totalNumberOfTacks == null) {
totalNumberOfTacks = legDetail.numberOfTacks;
totalNumberOfTacks = (double) legDetail.numberOfTacks;
} else {
totalNumberOfTacks += legDetail.numberOfTacks;
totalNumberOfTacks += (double) legDetail.numberOfTacks;
}
}
}
@@ -90,16 +93,16 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
return totalNumberOfTacks;
}
private Integer getTotalNumberOfJibes(LeaderboardEntryDAO row) {
Integer totalNumberOfJibes = null;
private Double getTotalNumberOfJibes(LeaderboardEntryDAO row) {
Double totalNumberOfJibes = null;
if (row != null && row.legDetails != null) {
for (LegEntryDAO legDetail : row.legDetails) {
if (legDetail != null) {
if (legDetail.numberOfJibes != null) {
if (totalNumberOfJibes == null) {
totalNumberOfJibes = legDetail.numberOfJibes;
totalNumberOfJibes = (double) legDetail.numberOfJibes;
} else {
totalNumberOfJibes += legDetail.numberOfJibes;
totalNumberOfJibes += (double) legDetail.numberOfJibes;
}
}
}
@@ -108,16 +111,16 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
return totalNumberOfJibes;
}
private Integer getTotalNumberOfPenaltyCircles(LeaderboardEntryDAO row) {
Integer totalNumberOfPnaltyCicles = null;
private Double getTotalNumberOfPenaltyCircles(LeaderboardEntryDAO row) {
Double totalNumberOfPnaltyCicles = null;
if (row != null && row.legDetails != null) {
for (LegEntryDAO legDetail : row.legDetails) {
if (legDetail != null) {
if (legDetail.numberOfPenaltyCircles != null) {
if (totalNumberOfPnaltyCicles == null) {
totalNumberOfPnaltyCicles = legDetail.numberOfPenaltyCircles;
totalNumberOfPnaltyCicles = (double) legDetail.numberOfPenaltyCircles;
} else {
totalNumberOfPnaltyCicles += legDetail.numberOfPenaltyCircles;
totalNumberOfPnaltyCicles += (double) legDetail.numberOfPenaltyCircles;
}
}
}
@@ -126,40 +129,39 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
return totalNumberOfPnaltyCicles;
}
private Triple<Integer, Integer, Integer> getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDAO row) {
Integer totalNumberOfTacks = null;
Integer totalNumberOfJibes = null;
Integer totalNumberOfPenaltyCircles = null;
private Triple<Double, Double, Double> getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDAO row) {
Double totalNumberOfTacks = null;
Double totalNumberOfJibes = null;
Double totalNumberOfPenaltyCircles = null;
LeaderboardEntryDAO fieldsForRace = row.fieldsByRaceName.get(getRaceName());
if (fieldsForRace != null && fieldsForRace.legDetails != null) {
for (LegEntryDAO legDetail : fieldsForRace.legDetails) {
if (legDetail != null) {
if (legDetail.numberOfTacks != null) {
if (totalNumberOfTacks == null) {
totalNumberOfTacks = legDetail.numberOfTacks;
totalNumberOfTacks = (double) legDetail.numberOfTacks;
} else {
totalNumberOfTacks += legDetail.numberOfTacks;
}
}
if (legDetail.numberOfJibes != null) {
if (totalNumberOfJibes == null) {
totalNumberOfJibes = legDetail.numberOfJibes;
totalNumberOfJibes = (double) legDetail.numberOfJibes;
} else {
totalNumberOfJibes += legDetail.numberOfJibes;
totalNumberOfJibes += (double) legDetail.numberOfJibes;
}
}
if (legDetail.numberOfPenaltyCircles != null) {
if (totalNumberOfPenaltyCircles == null) {
totalNumberOfPenaltyCircles = legDetail.numberOfPenaltyCircles;
totalNumberOfPenaltyCircles = (double) legDetail.numberOfPenaltyCircles;
} else {
totalNumberOfPenaltyCircles += legDetail.numberOfPenaltyCircles;
totalNumberOfPenaltyCircles += (double) legDetail.numberOfPenaltyCircles;
}
}
}
}
}
return new Triple<Integer, Integer, Integer>(totalNumberOfTacks, totalNumberOfJibes,
totalNumberOfPenaltyCircles);
return new Triple<Double, Double, Double>(totalNumberOfTacks, totalNumberOfJibes, totalNumberOfPenaltyCircles);
}
private String getRaceName() {
@@ -168,8 +170,9 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
@Override
public Header<SafeHtml> getHeader() {
SortableExpandableColumnHeader result = new SortableExpandableColumnHeader(/* title */ stringConstants.maneuverTypes(),
/* iconURL */ null, getLeaderboardPanel(), this, stringConstants);
SortableExpandableColumnHeader result = new SortableExpandableColumnHeader(
/* title */stringConstants.maneuverTypes(),
/* iconURL */null, getLeaderboardPanel(), this, stringConstants);
return result;
}
@@ -178,87 +181,76 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn<String> {
return new Comparator<LeaderboardRowDAO>() {
@Override
public int compare(LeaderboardRowDAO o1, LeaderboardRowDAO o2) {
LeaderboardEntryDAO fieldsForRace = o1.fieldsByRaceName.get(getRaceName());
LeaderboardEntryDAO fieldsForRace = o2.fieldsByRaceName.get(getRaceName());
boolean ascending = isSortedAscendingForThisColumn(getLeaderboardPanel().getLeaderboardTable());
if(o1 != null && o2 != null){
Integer val1 = getIntegerValue(o1);
Integer val2 = getIntegerValue(o2);
if(val1 != null && val2 != null){
int result = val1 - val2;
return result;
}
}
return ascending? -1:1;
Double val1 = getDoubleValue(o1);
Double val2 = getDoubleValue(o2);
return val1 == null ? val2 == null ? 0 : ascending ? 1 : -1
: val2 == null ? ascending ? -1:1 : val1.compareTo(val2);
}
};
}
@Override
public String getValue(LeaderboardRowDAO object) {
Integer result = getIntegerValue(object);
if(result==null){
Double result = getDoubleValue(object);
if (result == null) {
return "";
}else{
return result.toString();
} else {
Integer intResult = ((int) (double) result);
return intResult.toString();
}
}
public Integer getIntegerValue(LeaderboardRowDAO object){
Integer result = null;
Triple<Integer, Integer, Integer> tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(object);
Integer totalNumberOfTacks = tacksJibesAndPenalties.getA();
Integer totalNumberOfJibes = tacksJibesAndPenalties.getB();
Integer totalNumberOfPenaltyCircles = tacksJibesAndPenalties.getC();
public Double getDoubleValue(LeaderboardRowDAO object) {
Double result = null;
Triple<Double, Double, Double> tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(object);
Double totalNumberOfTacks = tacksJibesAndPenalties.getA();
Double totalNumberOfJibes = tacksJibesAndPenalties.getB();
Double totalNumberOfPenaltyCircles = tacksJibesAndPenalties.getC();
if (totalNumberOfTacks != null) {
result = totalNumberOfTacks;
result = (double) totalNumberOfTacks;
}
if (totalNumberOfJibes != null) {
if (result == null) {
result = totalNumberOfJibes;
result = (double) totalNumberOfJibes;
} else {
result += totalNumberOfJibes;
result += (double) totalNumberOfJibes;
}
}
if (totalNumberOfPenaltyCircles != null) {
if (result == null) {
result = totalNumberOfPenaltyCircles;
result = (double) totalNumberOfPenaltyCircles;
} else {
result += totalNumberOfPenaltyCircles;
result += (double) totalNumberOfPenaltyCircles;
}
}
return result;
}
@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.TACK,
new FormattedIntegerLegDetailColumn(stringConstants.tack(), "",
new NumberOfTacks(), 0, getLeaderboardPanel().getLeaderboardTable(),
detailHeaderStyle, detailColumnStyle));
result.put(DetailType.JIBE,
new FormattedIntegerLegDetailColumn(stringConstants.jibe(), "",
new NumberOfJibes(), 0, getLeaderboardPanel().getLeaderboardTable(),
detailHeaderStyle, detailColumnStyle));
result.put(DetailType.PENALTY_CIRCLE,
new FormattedIntegerLegDetailColumn(stringConstants.penaltyCircle(), "",
new NumberOfPenaltyCircles(), 0, getLeaderboardPanel().getLeaderboardTable(),
detailHeaderStyle, detailColumnStyle));
result.put(DetailType.TACK, new FormattedDoubleLegDetailColumn(stringConstants.tack(), "", new NumberOfTacks(),
0, getLeaderboardPanel().getLeaderboardTable(), detailHeaderStyle, detailColumnStyle));
result.put(DetailType.JIBE, new FormattedDoubleLegDetailColumn(stringConstants.jibe(), "", new NumberOfJibes(),
0, getLeaderboardPanel().getLeaderboardTable(), detailHeaderStyle, detailColumnStyle));
result.put(DetailType.PENALTY_CIRCLE, new FormattedDoubleLegDetailColumn(stringConstants.penaltyCircle(), "",
new NumberOfPenaltyCircles(), 0, getLeaderboardPanel().getLeaderboardTable(), detailHeaderStyle,
detailColumnStyle));
return result;
}
public static DetailType[] getAvailableManeuverDetailColumnTypes() {
return new DetailType[] { DetailType.TACK, DetailType.JIBE, DetailType.PENALTY_CIRCLE};
return new DetailType[] { DetailType.TACK, DetailType.JIBE, DetailType.PENALTY_CIRCLE };
}
@Override
public String getColumnStyle() {
return columnStyle;
}
@Override
public String getHeaderStyle() {
return headerStyle;