diff --git a/java/com.sap.sailing.gwt.ui/.settings/com.google.gdt.eclipse.core.prefs b/java/com.sap.sailing.gwt.ui/.settings/com.google.gdt.eclipse.core.prefs index 79813ff6252..f791445520c 100644 --- a/java/com.sap.sailing.gwt.ui/.settings/com.google.gdt.eclipse.core.prefs +++ b/java/com.sap.sailing.gwt.ui/.settings/com.google.gdt.eclipse.core.prefs @@ -1,7 +1,7 @@ -#Thu Dec 08 15:04:04 CET 2011 +#Mon Dec 12 17:44:33 CET 2011 eclipse.preferences.version=1 jarsExcludedFromWebInfLib= -lastWarOutDir=C\:/Users/d056995/git/git/java/com.sap.sailing.gwt.ui/war +lastWarOutDir=C\:/Users/d056866/git/git/java/com.sap.sailing.gwt.ui/war launchConfigExternalUrlPrefix= warSrcDir=war warSrcDirIsOutput=false diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ChartsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ChartsPanel.java index 3c0104c8a51..c4d91941aba 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ChartsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ChartsPanel.java @@ -1,8 +1,10 @@ package com.sap.sailing.gwt.ui.client; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map.Entry; import ca.nanometrics.gflot.client.Axis; import ca.nanometrics.gflot.client.DataPoint; @@ -58,7 +60,7 @@ import com.sap.sailing.server.api.DetailType; import com.sap.sailing.server.api.RaceIdentifier; public class ChartsPanel extends FormPanel { - private CompetitorInRaceDAO chartData = null; + private CompetitorInRaceDAO chartData; private CompetitorsAndTimePointsDAO competitorsAndTimePointsDAO = null; private final SailingServiceAsync sailingService; private DateTimeFormat dateFormat; @@ -69,19 +71,21 @@ public class ChartsPanel extends FormPanel { private DeckPanel chart; private final RaceIdentifier[] races; private int colorCounter = 0; - private HashMap competitorColor; + private HashMap idColor; private int selectedRace = 0; private int stepsToLoad = 100; private final StringConstants stringConstants; - private HashMap competitorVisible = new HashMap(); + private HashMap competitorVisible; private VerticalPanel selectCompetitors; private PlotWithOverview plot; private PlotWithOverviewModel model; private PlotOptions plotOptions; - private HashMap competitorSeries; - private HashMap competitorMarkPassingSeries; + private HashMap seriesID; + private HashMap competitorID; + private HashMap markSeriesID; private HashMap competitorLabels; private int width = 800, height = 600; + private int competitorNr = 0; private DetailType dataToShow = DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER; private AbsolutePanel loadingPanel; @@ -90,9 +94,12 @@ public class ChartsPanel extends FormPanel { RaceIdentifier[] races, StringConstants stringConstants, int chartWidth, int chartHeight) { width = chartWidth; height = chartHeight; - competitorSeries = new HashMap(); - competitorMarkPassingSeries = new HashMap(); - competitorColor = new HashMap(); + chartData = new CompetitorInRaceDAO(); + seriesID = new HashMap(); + competitorID = new HashMap(); + markSeriesID = new HashMap(); + idColor = new HashMap(); + competitorVisible = new HashMap(); competitorLabels = new HashMap(); this.sailingService = sailingService; this.races = races; @@ -188,7 +195,8 @@ public class ChartsPanel extends FormPanel { dataToShow = dt; } } - + competitorID.clear(); + competitorNr = 0; loadData(); } }); @@ -205,8 +213,6 @@ public class ChartsPanel extends FormPanel { stepsToLoad = Integer.parseInt(txtbSteps.getText()); competitorsAndTimePointsDAO = null; loadData(); - updateTableData(); - plot.redraw(); } }); configPanel.add(bttSteps); @@ -218,7 +224,21 @@ public class ChartsPanel extends FormPanel { final Runnable loadData = new Runnable() { @Override public void run() { - ChartsPanel.this.sailingService.getCompetitorRaceData(races[selectedRace], competitorsAndTimePointsDAO, + final List competitorsToLoad = new ArrayList(); + for (CompetitorDAO competitor : competitorsAndTimePointsDAO.getCompetitor()){ + if (isCompetitorVisible(competitor) && competitorID.get(competitor) == null){ + competitorsToLoad.add(competitor); + + } + } + final CompetitorsAndTimePointsDAO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDAO(stepsToLoad); + competitorsAndTimePointsToLoad.setStartTime(competitorsAndTimePointsDAO.getStartTime()); + competitorsAndTimePointsToLoad.setTimePointOfNewestEvent(competitorsAndTimePointsDAO.getTimePointOfNewestEvent()); + for (CompetitorDAO competitor : competitorsToLoad){ + competitorsAndTimePointsToLoad.setMarkPassings(competitor, competitorsAndTimePointsDAO.getMarkPassings(competitor)); + } + competitorsAndTimePointsToLoad.setCompetitor(competitorsToLoad.toArray(new CompetitorDAO[0])); + ChartsPanel.this.sailingService.getCompetitorRaceData(races[selectedRace], competitorsAndTimePointsToLoad, dataToShow, new AsyncCallback() { @Override public void onFailure(Throwable caught) { @@ -228,17 +248,15 @@ public class ChartsPanel extends FormPanel { @Override public void onSuccess(CompetitorInRaceDAO result) { fireEvent(new DataLoadedEvent()); - chartData = result; - while (chart.getWidgetCount() > 1){ - chart.remove(chart.getWidgetCount()-1); + for (CompetitorDAO competitor : competitorsToLoad){ + chartData.setRaceData(competitor, result.getRaceData(competitor)); + chartData.setMarkPassingData(competitor, result.getMarkPassings(competitor)); } - chart.add(createChart()); - chart.showWidget(1); + updateTableData(competitorsAndTimePointsToLoad.getCompetitor()); } }); } }; - chart.showWidget(0); if (competitorsAndTimePointsDAO != null) { loadData.run(); } else { @@ -265,53 +283,74 @@ public class ChartsPanel extends FormPanel { @Override public void onClick(ClickEvent event) { - setCompetitorVisible(c, cb.getValue()); - setLegendVisible(c,isCompetitorVisible(c)); - getCompetitorSeries(c).setVisible(cb.getValue()); - getCompetitorMarkPassingSeries(c).setVisible(cb.getValue()); - plot.redraw(); + if (cb.getValue() == true && chartData.getRaceData(c) == null){ + setCompetitorVisible(c, cb.getValue()); + loadData(); + } + else { + setCompetitorVisible(c, cb.getValue()); + if (competitorID.get(c) != null){ + setLegendVisible(c,cb.getValue()); + getCompetitorSeries(c).setVisible(cb.getValue()); + getCompetitorMarkPassingSeries(c).setVisible(cb.getValue()); + } + plot.redraw(); + } } }); selectCompetitors.add(cb); } + if (chart.getWidgetCount() == 1){ + chart.add(createChart()); + } + chart.showWidget(1); loadData.run(); } }); } } - private void updateTableData() { - if (model == null || plotOptions == null) { - return; - } + private synchronized void updateTableData(CompetitorDAO[] competitorDAOs) { if (competitorsAndTimePointsDAO != null && chartData != null) { - model.clear(); - for (int i = 0; i < competitorsAndTimePointsDAO.getCompetitor().length; i++) { - CompetitorDAO competitor = competitorsAndTimePointsDAO.getCompetitor()[i]; + for (CompetitorDAO competitor : competitorDAOs) { + competitorID.put(competitor, competitorNr++); SeriesHandler compSeries = getCompetitorSeries(competitor); + SeriesHandler markSeries = getCompetitorMarkPassingSeries(competitor); + compSeries.clear(); + markSeries.clear(); + if (isCompetitorVisible(competitor) && chartData.getRaceData(competitor) != null){ + long[] markPassingTimes = competitorsAndTimePointsDAO.getMarkPassings(competitor); + Double[] markPassingValues = chartData.getMarkPassings(competitor); + for (int j = 0; j < markPassingTimes.length; j++){ + if (markPassingValues[j] != null && markPassingTimes != null) { + markSeries.add(new DataPoint(markPassingTimes[j],markPassingValues[j])); + } + } + for (int j = 0; j < stepsToLoad; j++) { + long time = competitorsAndTimePointsDAO.getTimePoints()[j]; + if (chartData.getRaceData(competitor)[j] != null) { + compSeries.add(new DataPoint(time, chartData.getRaceData(competitor)[j])); + } + } + } + else { + compSeries.add(new DataPoint(0,0)); + markSeries.add(new DataPoint(0,0)); + } setLegendVisible(competitor,isCompetitorVisible(competitor)); compSeries.setVisible(isCompetitorVisible(competitor)); - SeriesHandler markSeries = getCompetitorMarkPassingSeries(competitor); markSeries.setVisible(isCompetitorVisible(competitor)); - long[] markPassingTimes = competitorsAndTimePointsDAO.getMarkPassings(competitor); - Double[] markPassingValues = chartData.getMarkPassings(competitor); - for (int j = 0; j < markPassingTimes.length; j++){ - if (markPassingValues[j] != null) { - markSeries.add(new DataPoint(markPassingTimes[j],markPassingValues[j])); - } - } - for (int j = 0; j < stepsToLoad; j++) { - long time = competitorsAndTimePointsDAO.getTimePoints()[j]; - if (chartData.getRaceData(competitor)[j] != null) { - compSeries.add(new DataPoint(time, chartData.getRaceData(competitor)[j])); - } - } - } - if (plot != null && plot.isAttached()){ - plot.redraw(); } } - + if (plot != null && plot.isAttached()){ + try { + plot.setLinearSelection(1, 2); + plot.redraw(); + } + catch (Exception e){ + + } + } return; } @@ -344,15 +383,11 @@ public class ChartsPanel extends FormPanel { } private void setCompetitorVisible(CompetitorDAO competitor, boolean isVisible) { - //boolean changed = isCompetitorVisible(competitor) != isVisible; - competitorVisible.put(competitor.id, isVisible); - /* - * if (changed && chart != null){ chart.draw(prepareTableData(), getOptions()); } - */ + competitorVisible.put(competitor, isVisible); } private boolean isCompetitorVisible(CompetitorDAO competitor) { - Boolean isVisible = competitorVisible.get(competitor.id); + Boolean isVisible = competitorVisible.get(competitor); return (isVisible != null) ? isVisible : false; } @@ -378,47 +413,64 @@ public class ChartsPanel extends FormPanel { plotOptions.setGridOptions(new GridOptions().setHoverable(true).setMouseActiveRadius(5).setAutoHighlight(true)); plotOptions.setSelectionOptions(new SelectionOptions().setDragging(true).setMode("x")); - for (CompetitorDAO competitor : competitorsAndTimePointsDAO.getCompetitor()){ - SeriesHandler series = model.addSeries(competitor.name, getColorForCempetitor(competitor)); + for (int i = 0; i < competitorsAndTimePointsDAO.getCompetitor().length; i++){ + SeriesHandler series = model.addSeries(""+i, getColorByID(i)); series.setOptions(SeriesType.LINES, new LineSeriesOptions().setLineWidth(2.5).setShow(true)); series.setOptions(SeriesType.POINTS, new PointsSeriesOptions().setLineWidth(0).setShow(false)); - competitorSeries.put(competitor, series); - series = model.addSeries(competitor.name + " passed mark", getColorForCempetitor(competitor)); + series.setVisible(false); + seriesID.put(i, series); + series = model.addSeries(i + " passed mark", getColorByID(i)); series.setOptions(SeriesType.LINES, new LineSeriesOptions().setLineWidth(0).setShow(false)); series.setOptions(SeriesType.POINTS, new PointsSeriesOptions().setLineWidth(3).setShow(true)); - competitorMarkPassingSeries.put(competitor, series); + series.setVisible(false); + markSeriesID.put(i, series); } - updateTableData(); plot = new PlotWithOverview(model, plotOptions); // add hover listener plot.addHoverListener(new PlotHoverListener() { public void onPlotHover(Plot plot, PlotPosition position, PlotItem item) { - if (item != null) { + CompetitorDAO competitor = null; + for (Entry competitorWithID : competitorID.entrySet()) { + if (item != null && item.getSeries().getLabel().contains(""+competitorWithID.getValue())){ + competitor = competitorWithID.getKey(); + } + } + if (item != null && competitor != null) { if (item.getSeries().getLabel().toLowerCase().contains("mark")){ - selectedPointLabel.setText(item.getSeries().getLabel() + " at " + dateFormat.format(new Date((long) item.getDataPoint().getX()))); + selectedPointLabel.setText(competitor.name + " passed mark at " + dateFormat.format(new Date((long) item.getDataPoint().getX()))); } else { - selectedPointLabel.setText(item.getSeries().getLabel() + " at " + dateFormat.format(new Date((long) item.getDataPoint().getX())) + selectedPointLabel.setText(competitor.name + " at " + dateFormat.format(new Date((long) item.getDataPoint().getX())) + ": " + item.getDataPoint().getY() + "[Unit]"); } } else { selectedPointLabel.setText("No selection!"); } } - }, false); + }, true); plot.addSelectionListener(new SelectionListener() { public void selected(double x1, double y1, double x2, double y2) { + /* + for (CompetitorDAO competitor : competitorsAndTimePointsDAO.getCompetitor()){ + long[] markPassingTimes = competitorsAndTimePointsDAO.getMarkPassings(competitor); + Double[] markPassingValues = chartData.getMarkPassings(competitor); + SeriesHandler markSeries = getCompetitorMarkPassingSeries(competitor); + markSeries.clear(); + int visibleMarkPassings = 0; + for (int j = 0; j < markPassingTimes.length; j++){ + if (markPassingValues[j] != null && markPassingTimes[j] > x1 && markPassingTimes[j] < x2) { + markSeries.add(new DataPoint(markPassingTimes[j],markPassingValues[j])); + visibleMarkPassings++; + } + } + if (visibleMarkPassings == 0){ + markSeries.setVisible(false); + } + }*/ plot.setLinearSelection(x1, x2); } }); - plot.addHoverListener(new PlotHoverListener() { - - @Override - public void onPlotHover(Plot plot, PlotPosition position, PlotItem item) { - - } - }, false); plot.setHeight(height- 60); plot.setWidth(width); plot.setOverviewHeight(60); @@ -426,7 +478,6 @@ public class ChartsPanel extends FormPanel { @Override protected void onLoad() { super.onLoad(); - plot.setLinearSelection(0, stepsToLoad); plot.redraw(); } }; @@ -435,11 +486,11 @@ public class ChartsPanel extends FormPanel { return panel; } - private String getColorForCempetitor(CompetitorDAO competitor){ - String color = competitorColor.get(competitor); + private String getColorByID(int id){ + String color = idColor.get(id); if (color == null || color.isEmpty()){ color = createHexColor(colorCounter++); - competitorColor.put(competitor, color); + idColor.put(id, color); } return color; } @@ -473,17 +524,17 @@ public class ChartsPanel extends FormPanel { } private SeriesHandler getCompetitorSeries(CompetitorDAO competitor){ - return competitorSeries.get(competitor); + return seriesID.get(competitorID.get(competitor)); } private SeriesHandler getCompetitorMarkPassingSeries(CompetitorDAO competitor){ - return competitorMarkPassingSeries.get(competitor); + return markSeriesID.get(competitorID.get(competitor)); } private void setLegendVisible(CompetitorDAO competitor, Boolean visible){ Widget label = competitorLabels.get(competitor); if (label == null){ - label = createCompetitorLabel(competitor.name, getColorForCempetitor(competitor)); + label = createCompetitorLabel(competitor.name, getColorByID(competitorID.get(competitor))); competitorLabels.put(competitor, label); legendPanel.add(label); } @@ -504,4 +555,10 @@ public class ChartsPanel extends FormPanel { competitorLabel.add(legendLabel); return competitorLabel; } + + public void resize(int width, int height){ + this.width = width; + this.height = height; + this.setSize(width + "px", height + "px"); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompareCompetitorsChartDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompareCompetitorsChartDialog.java index 57af72b28e9..6347df4d739 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompareCompetitorsChartDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompareCompetitorsChartDialog.java @@ -5,6 +5,8 @@ import java.util.List; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; @@ -22,7 +24,7 @@ public class CompareCompetitorsChartDialog extends DialogBox { public CompareCompetitorsChartDialog(SailingServiceAsync sailingService, List competitors, RaceIdentifier[] races, StringConstants stringConstants){ super(false); - ChartsPanel ccp = new ChartsPanel(sailingService, competitors, races, stringConstants, (int) (Window.getClientWidth()-300), (int) (Window.getClientHeight()-200)); + final ChartsPanel ccp = new ChartsPanel(sailingService, competitors, races, stringConstants, (int) (Window.getClientWidth()-250), (int) (Window.getClientHeight()-90)); ccp.addDataLoadedHandler(new DataLoadedHandler() { @Override @@ -64,7 +66,13 @@ public class CompareCompetitorsChartDialog extends DialogBox { hide(); } }); - + Window.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + ccp.resize((int) (Window.getClientWidth()-250), (int) (Window.getClientHeight()-90)); + } + }); } public void addCloseHandler(ClickHandler handler) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 0afc1772cc4..4830775541d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -206,6 +206,21 @@ public interface SailingServiceAsync { void getCountryCodes(AsyncCallback callback); + /** + * This method computes the in {@code dataType} selected data for the in {@code race} specified race + * for all competitors returned by {@link CompetitorsAndTimePointsDAO#getCompetitor()} at the timepoints + * returned by {@link CompetitorsAndTimePointsDAO#getTimePoints()}. + * The returned {@link CompetitorInRaceDAO} contains the values for the timepoints as well as the values for the markpassings. + * + * @see DetailType + * + * @throws NullPointerException Thrown if any of the parameters is null. + * + * @param race + * @param competitorsAndTimePointsDAO An object that contains the competitors and timepoints. + * @param dataType The type of data that should be computed (eg {@link DetailType#WINDWARD_DISTANCE_TO_OVERALL_LEADER}). + * @param callback An AsyncCallback that returns the computed data as a parameter in the {@link AsyncCallback#onSuccess(Object)} method. + */ void getCompetitorRaceData(RaceIdentifier race, CompetitorsAndTimePointsDAO competitorsAndTimePointsDAO, DetailType dataType, AsyncCallback callback);