From 3a8965e8271fcbb77f9b95793cfd7cd49076d43f Mon Sep 17 00:00:00 2001 From: Dennis Aulenbacher Date: Thu, 29 Jul 2021 17:41:46 +0200 Subject: [PATCH] Fixed AbstractCompetitorLeaderBoardChart rendering of new inputs. --- .../AbstractCompetitorLeaderboardChart.java | 119 ++++-------------- 1 file changed, 27 insertions(+), 92 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java index de5fb46ae3c..7e2e8b6d3cb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java @@ -1,13 +1,11 @@ package com.sap.sailing.gwt.ui.client.shared.charts; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.moxieapps.gwt.highcharts.client.Axis; import org.moxieapps.gwt.highcharts.client.Chart; @@ -41,6 +39,7 @@ import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Triple; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; import com.sap.sse.common.settings.generic.GenericSerializableSettings; @@ -212,11 +211,15 @@ public abstract class AbstractCompetitorLeaderboardChart, List>>>() { + new AsyncCallback, List>>>() { @Override - public void onSuccess(List, List>> result) { - List chartSeries = new ArrayList(Arrays.asList(chart.getSeries())); + public void onSuccess(List, List>> result) { chart.hideLoading(); setWidget(chart); raceColumnNames.clear(); - switch (selectedDetailType) { - case OVERALL_RANK: - case REGATTA_RANK: - fillTotalRanksSeries(result, chartSeries); - break; - case REGATTA_NET_POINTS_SUM: - fillTotalPointsSeries(result, chartSeries); - break; - default: - break; - } + fillSeries(result); // TODO will removing the following line do harm on any usage of this abstract base class? // chart.setSizeToMatchContainer(); - // it's important here to recall the redraw method, otherwise the bug fix for wrong checkbox - // positions (nativeAdjustCheckboxPosition) - // in the BaseChart class would not be called + // positions (nativeAdjustCheckboxPosition) in the BaseChart class would not be called chart.redraw(); chartDataUpdateCallbacks.forEach(Runnable::run); } - @Override public void onFailure(Throwable caught) { chart.hideLoading(); @@ -284,82 +273,22 @@ public abstract class AbstractCompetitorLeaderboardChart, List>> result, List chartSeries) { - Set unusedSeries = new HashSet<>(competitorSeries.values()); - for (Series series : competitorSeries.values()) { - for (Point p : new ArrayList(Arrays.asList(series.getPoints()))) { - series.removePoint(p, /* redraw */false, /* animation */false); - } - } + private void fillSeries(List, List>> result) { int raceColumnNumber = 0; - int maxCompetitorCount = 0; - for (com.sap.sse.common.Util.Triple, List> entry : result) { - List dataValues = entry.getC(); - raceColumnNames.add(entry.getA()); - if(hasValidValues(dataValues)) { - raceColumnNamesWithData.add(entry.getA()); - int index = 0; - maxCompetitorCount = Math.max(maxCompetitorCount, entry.getB().size()); - for (CompetitorDTO competitor : entry.getB()) { - if (isCompetitorVisible(competitor)) { - Series series = getOrCreateSeries(competitor); - Double dataValue = dataValues.get(index); - if (dataValue != null) { - series.addPoint(raceColumnNumber, dataValue, /* redraw */false, /* shift */false, /* animation */ false); - } - - unusedSeries.remove(series); - if (!chartSeries.contains(series)) { - chart.addSeries(series); - chartSeries.add(series); - } - } - index++; - } - raceColumnNumber++; - } - } - setHeight(); - } - - private void setHeight() { - chart.setSize(chart.getOffsetWidth(), Window.getClientHeight()); - } - - private void fillTotalPointsSeries( - List, List>> result, - List chartSeries) { - Double maxTotalPoints = 0.0; - Set unusedSeries = new HashSet(competitorSeries.values()); - for (Series series : competitorSeries.values()) { - for (Point p : new ArrayList(Arrays.asList(series.getPoints()))) { - series.removePoint(p, /* redraw */ false, /* animation */ false); - } - } - int raceColumnNumber = 0; - int maxCompetitorCount = 0; - for (com.sap.sse.common.Util.Triple, List> entry : result) { - List dataValues = entry.getC(); + final Map competitorWithCoordinatePoints = new ConcurrentHashMap<>(); + for (Triple, List> entry : result) { + final List dataValues = entry.getC(); raceColumnNames.add(entry.getA()); if (hasValidValues(dataValues)) { raceColumnNamesWithData.add(entry.getA()); int index = 0; - maxCompetitorCount = Math.max(maxCompetitorCount, entry.getB().size()); for (CompetitorDTO competitor : entry.getB()) { if (isCompetitorVisible(competitor)) { - Series series = getOrCreateSeries(competitor); Double dataValue = dataValues.get(index); if (dataValue != null) { - Double sumTotalPoints = dataValue; - series.addPoint(raceColumnNumber, sumTotalPoints, /* redraw */ false, /* shift */ false, /* animation */ false); - if (sumTotalPoints > maxTotalPoints) { - maxTotalPoints = sumTotalPoints; - } - } - unusedSeries.remove(series); - if (!chartSeries.contains(series)) { - chart.addSeries(series); - chartSeries.add(series); + final Point[] points = competitorWithCoordinatePoints + .computeIfAbsent(competitor, c -> new Point[result.size()]); + points[raceColumnNumber] = new Point(raceColumnNumber, dataValue); } } index++; @@ -367,9 +296,15 @@ public abstract class AbstractCompetitorLeaderboardChart getOrCreateSeries(competitor).setPoints(points, false)); setHeight(); } + private void setHeight() { + chart.setSize(chart.getOffsetWidth(), Window.getClientHeight()); + } + private boolean hasValidValues(List values) { boolean result = false; for(Double value: values) {