mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-14 16:20:57 +00:00
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:
1 parent
020eed6eb5
commit
03e4903a53
2 files changed
+74
-157
No files matched your search
-75
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+74
-82
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user