From 6a07cd743871d49cd269ce5b4b6d68a20fca6ae4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 3 Jul 2018 12:35:36 +0200 Subject: [PATCH] bug4614: introduced SortableMinMaxColumn to factor out the commonalities of columns sorted by absolute and real value Change-Id: I10f0efbb1e63e694e4575b1322124cd8041e82db --- .../racemap/maneuver/ManeuverTablePanel.java | 139 +----------------- .../maneuver/SortableMinMaxColumn.java | 94 ++++++++++++ 2 files changed, 96 insertions(+), 137 deletions(-) create mode 100755 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/SortableMinMaxColumn.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/ManeuverTablePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/ManeuverTablePanel.java index ff330995cea..2d233399dbf 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/ManeuverTablePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/ManeuverTablePanel.java @@ -9,11 +9,9 @@ import java.util.function.Function; import java.util.function.Supplier; import com.google.gwt.cell.client.AbstractCell; -import com.google.gwt.cell.client.Cell.Context; import com.google.gwt.cell.client.DateCell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.shared.GWT; -import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.i18n.shared.DateTimeFormat; import com.google.gwt.i18n.shared.DateTimeFormat.PredefinedFormat; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; @@ -42,14 +40,11 @@ import com.sap.sailing.gwt.ui.actions.GetManeuversForCompetitorsAction; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.ManeuverTypeFormatter; -import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.controls.AbstractSortableColumnWithMinMax; import com.sap.sailing.gwt.ui.client.shared.controls.SortableColumn; -import com.sap.sailing.gwt.ui.leaderboard.HasStringAndDoubleValue; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel.LeaderBoardStyle; -import com.sap.sailing.gwt.ui.leaderboard.MinMaxRenderer; import com.sap.sailing.gwt.ui.leaderboard.SortedCellTableWithStylableHeaders; import com.sap.sailing.gwt.ui.shared.ManeuverDTO; import com.sap.sse.common.TimeRange; @@ -82,8 +77,6 @@ public class ManeuverTablePanel extends AbstractCompositeComponent maneuverCellTable; @@ -174,71 +167,7 @@ public class ManeuverTablePanel extends AbstractCompositeComponent createSortableAbsMinMaxColumn( Function extractor, String title, String unit) { - final SortableColumn col = new AbstractSortableColumnWithMinMax( - new TextCell(), SortingOrder.ASCENDING) { - final InvertibleComparator comparatorWithAbs = new InvertibleComparatorAdapter() { - @Override - public int compare(ManeuverTableData o1, ManeuverTableData o2) { - Double o1v = extractor.apply(o1); - Double o2v = extractor.apply(o2); - if (o1v == null && o2v == null) { - return 0; - } - if (o1v == null && o2v != null) { - return -1; - } - if (o1v != null && o2v == null) { - return 1; - } - return Double.compare(Math.abs(o1v), Math.abs(o2v)); - } - }; - final HasStringAndDoubleValue dataProvider = new HasStringAndDoubleValue() { - @Override - public String getStringValueToRender(ManeuverTableData row) { - Double value = extractor.apply(row); - if (value == null) { - return null; - } - return towDigitAccuracy.format(value); - } - - @Override - public Double getDoubleValue(ManeuverTableData row) { - Double value = extractor.apply(row); - return value == null ? null : Math.abs(value); - } - }; - - final MinMaxRenderer renderer = new MinMaxRenderer(dataProvider, comparatorWithAbs); - - @Override - public InvertibleComparator getComparator() { - return comparatorWithAbs; - } - - @Override - public void render(Context context, ManeuverTableData object, SafeHtmlBuilder sb) { - renderer.render(context, object, title, sb); - } - - @Override - public Header getHeader() { - return new TextHeader(title + " [" + unit + "]"); - } - - @Override - public String getValue(ManeuverTableData object) { - return dataProvider.getStringValueToRender(object); - } - - @Override - public void updateMinMax() { - renderer.updateMinMax(maneuverCellTable.getDataProvider().getList()); - } - }; - col.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); - return col; + return new SortableMinMaxColumn(extractor, title, unit, maneuverCellTable.getDataProvider(), /* absolute */ true); } /** @@ -246,71 +175,7 @@ public class ManeuverTablePanel extends AbstractCompositeComponent createSortableMinMaxColumn( Function extractor, String title, String unit) { - final SortableColumn col = new AbstractSortableColumnWithMinMax( - new TextCell(), SortingOrder.ASCENDING) { - final InvertibleComparator comparator = new InvertibleComparatorAdapter() { - @Override - public int compare(ManeuverTableData o1, ManeuverTableData o2) { - Double o1v = extractor.apply(o1); - Double o2v = extractor.apply(o2); - if (o1v == null && o2v == null) { - return 0; - } - if (o1v == null && o2v != null) { - return -1; - } - if (o1v != null && o2v == null) { - return 1; - } - return Double.compare(o1v, o2v); - } - }; - final HasStringAndDoubleValue dataProvider = new HasStringAndDoubleValue() { - @Override - public String getStringValueToRender(ManeuverTableData row) { - Double value = extractor.apply(row); - if (value == null) { - return null; - } - return towDigitAccuracy.format(value); - } - - @Override - public Double getDoubleValue(ManeuverTableData row) { - Double value = extractor.apply(row); - return value == null ? null : value; - } - }; - - final MinMaxRenderer renderer = new MinMaxRenderer(dataProvider, comparator); - - @Override - public InvertibleComparator getComparator() { - return comparator; - } - - @Override - public void render(Context context, ManeuverTableData object, SafeHtmlBuilder sb) { - renderer.render(context, object, title, sb); - } - - @Override - public Header getHeader() { - return new TextHeader(title + " [" + unit + "]"); - } - - @Override - public String getValue(ManeuverTableData object) { - return dataProvider.getStringValueToRender(object); - } - - @Override - public void updateMinMax() { - renderer.updateMinMax(maneuverCellTable.getDataProvider().getList()); - } - }; - col.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); - return col; + return new SortableMinMaxColumn(extractor, title, unit, maneuverCellTable.getDataProvider(), /* absolute */ false); } private SortableColumn createManeuverTypeColumn() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/SortableMinMaxColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/SortableMinMaxColumn.java new file mode 100755 index 00000000000..b6c5d146cff --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/maneuver/SortableMinMaxColumn.java @@ -0,0 +1,94 @@ +package com.sap.sailing.gwt.ui.client.shared.racemap.maneuver; + +import java.util.Comparator; +import java.util.function.Function; + +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.Header; +import com.google.gwt.user.cellview.client.TextHeader; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.view.client.ListDataProvider; +import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.SortingOrder; +import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter; +import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; +import com.sap.sailing.gwt.ui.client.shared.controls.AbstractSortableColumnWithMinMax; +import com.sap.sailing.gwt.ui.leaderboard.HasStringAndDoubleValue; +import com.sap.sailing.gwt.ui.leaderboard.MinMaxRenderer; + +public class SortableMinMaxColumn extends AbstractSortableColumnWithMinMax { + private final static NumberFormat TWO_DIGIT_ACCURACY = NumberFormatterFactory.getDecimalFormat(2); + private final String title; + private final String unit; + + final InvertibleComparator comparator; + + final HasStringAndDoubleValue dataProvider; + + final MinMaxRenderer renderer; + + final ListDataProvider maneuverTableListDataProvider; + + public SortableMinMaxColumn(final Function extractor, String title, String unit, + ListDataProvider maneuverTableListDataProvider, boolean absolute) { + super(new TextCell(), SortingOrder.ASCENDING); + this.title = title; + this.unit = unit; + this.maneuverTableListDataProvider = maneuverTableListDataProvider; + this.comparator = new InvertibleComparatorAdapter() { + @Override + public int compare(ManeuverTableData o1, ManeuverTableData o2) { + Double o1v = extractor.apply(o1); + Double o2v = extractor.apply(o2); + return Comparator.nullsFirst((Double v1, Double v2)->Double.compare(absolute?Math.abs(v1):v1, absolute?Math.abs(v2):v2)).compare(o1v, o2v); + } + }; + this.dataProvider = new HasStringAndDoubleValue() { + @Override + public String getStringValueToRender(ManeuverTableData row) { + Double value = extractor.apply(row); + if (value == null) { + return null; + } + return TWO_DIGIT_ACCURACY.format(value); + } + + @Override + public Double getDoubleValue(ManeuverTableData row) { + Double value = extractor.apply(row); + return value == null ? null : value; + } + }; + + this.renderer = new MinMaxRenderer(dataProvider, comparator); + this.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); + } + + @Override + public InvertibleComparator getComparator() { + return comparator; + } + + @Override + public void render(Context context, ManeuverTableData object, SafeHtmlBuilder sb) { + renderer.render(context, object, title, sb); + } + + @Override + public Header getHeader() { + return new TextHeader(title + " [" + unit + "]"); + } + + @Override + public String getValue(ManeuverTableData object) { + return dataProvider.getStringValueToRender(object); + } + + @Override + public void updateMinMax() { + renderer.updateMinMax(maneuverTableListDataProvider.getList()); + } +} \ No newline at end of file