mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 06:17:27 +00:00
Implemented a stable TabResultsPresenter
This commit is contained in:
1 parent
92e79a86a8
commit
5c8331aa5f
8 files changed
+88
-29
No files matched your search
+2
@@ -1353,4 +1353,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
|
||||
String currentOfTotal(int current, int total);
|
||||
String noFinishedRaces();
|
||||
String racesOverview();
|
||||
String empty();
|
||||
String runAQuery();
|
||||
}
|
||||
+2
@@ -1322,3 +1322,5 @@ miniLeeaderboardLegendText=Shows the points along with the number of races per c
|
||||
currentOfTotal={0,number}/{1,number}
|
||||
noFinishedRaces=There are no finished races yet
|
||||
racesOverview=Races overview
|
||||
empty=Empty
|
||||
runAQuery=Run a Query
|
||||
+2
@@ -1312,3 +1312,5 @@ miniLeeaderboardLegendText=Es werden die Punkte und die Anzahl Rennen je Team an
|
||||
currentOfTotal={0,number}/{1,number}
|
||||
noFinishedRaces=Es wurden noch keine Wettfahrten beendet.
|
||||
racesOverview=Wettfahrtübersicht
|
||||
empty=Leer
|
||||
runAQuery=Führe eine Anfrage aus
|
||||
+2
@@ -1259,3 +1259,5 @@ miniLeeaderboardLegendText=Shows points along with the number of races per compe
|
||||
currentOfTotal={0,number}/{1,number}
|
||||
noFinishedRaces=There are no finished races yet
|
||||
racesOverview=Races overview
|
||||
empty=Empty
|
||||
runAQuery=Run a Query
|
||||
+6
-2
@@ -171,7 +171,7 @@ public class ScrolledTabLayoutPanel extends TabLayoutPanel {
|
||||
return vPanel;
|
||||
}
|
||||
|
||||
private void checkIfScrollButtonsNecessary() {
|
||||
public void checkIfScrollButtonsNecessary() {
|
||||
// Defer size calculations until sizes are available, when calculating immediately after
|
||||
// add(), all size methods return zero
|
||||
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
|
||||
@@ -195,7 +195,7 @@ public class ScrolledTabLayoutPanel extends TabLayoutPanel {
|
||||
|
||||
public void scrollToTab(int tabNumber) {
|
||||
Widget tab = getTab(tabNumber);
|
||||
if (tab == null)
|
||||
if (tab == null || !isScrollingNecessary())
|
||||
return;
|
||||
|
||||
int oldLeft = parsePosition(tabBar.getElement().getStyle().getLeft());
|
||||
@@ -232,6 +232,10 @@ public class ScrolledTabLayoutPanel extends TabLayoutPanel {
|
||||
}
|
||||
}.run(SCROLL_ANIMATION_SPEED);
|
||||
}
|
||||
|
||||
private boolean isScrollingNecessary() {
|
||||
return isScrollingToLeftNecessary() || isScrollingToRightNecessary();
|
||||
}
|
||||
|
||||
private boolean isScrollingToRightNecessary() {
|
||||
Widget lastTab = getLastTab();
|
||||
|
||||
+3
@@ -14,4 +14,7 @@ public interface DataMiningResources extends ClientBundle {
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/arrow_right.png")
|
||||
ImageResource arrowRightIcon();
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/plusicon_small.png")
|
||||
ImageResource plusIcon();
|
||||
|
||||
}
|
||||
+71
-27
@@ -1,12 +1,18 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.presentation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.gwt.core.shared.GWT;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.event.logical.shared.BeforeSelectionEvent;
|
||||
import com.google.gwt.event.logical.shared.BeforeSelectionHandler;
|
||||
import com.google.gwt.user.client.ui.HTML;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Image;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.shared.controls.ScrolledTabLayoutPanel;
|
||||
@@ -21,6 +27,7 @@ public class TabResultsPresenter implements ResultsPresenter<Number> {
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
private final ScrolledTabLayoutPanel tabPanel;
|
||||
private final Map<Widget, ResultsPresenter<Number>> presentersMappedByHeader;
|
||||
|
||||
public TabResultsPresenter(StringMessages stringMessages) {
|
||||
this.stringMessages = stringMessages;
|
||||
@@ -28,6 +35,26 @@ public class TabResultsPresenter implements ResultsPresenter<Number> {
|
||||
tabPanel = new ScrolledTabLayoutPanel(30, Unit.PX, resources.arrowLeftIcon(), resources.arrowRightIcon());
|
||||
tabPanel.setAnimationDuration(0);
|
||||
tabPanel.getElement().getStyle().setMarginTop(10, Unit.PX);
|
||||
presentersMappedByHeader = new HashMap<>();
|
||||
|
||||
addNewTabTab();
|
||||
addTabAndFocus();
|
||||
}
|
||||
|
||||
private void addNewTabTab() {
|
||||
Label widget = new Label("This should never be shown");
|
||||
Image header = new Image(resources.plusIcon());
|
||||
tabPanel.add(widget, header);
|
||||
// This is necessary to stop the selection of this pseudo tab
|
||||
tabPanel.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() {
|
||||
@Override
|
||||
public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {
|
||||
if (event.getItem() == tabPanel.getWidgetCount() - 1) {
|
||||
event.cancel();
|
||||
addTabAndFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,59 +64,76 @@ public class TabResultsPresenter implements ResultsPresenter<Number> {
|
||||
|
||||
@Override
|
||||
public void showResult(QueryResult<Number> result) {
|
||||
ResultsPresenter<Number> tabPresenter = addTabAndFocus(result.getResultSignifier());
|
||||
tabPresenter.showResult(result);
|
||||
getSelectedHeader().setText(result.getResultSignifier());
|
||||
getSelectedPresenter().showResult(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String error) {
|
||||
ResultsPresenter<Number> tabPresenter = addTabAndFocus(stringMessages.error());
|
||||
tabPresenter.showError(error);
|
||||
getSelectedHeader().setText(stringMessages.error());
|
||||
getSelectedPresenter().showError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showError(String mainError, Iterable<String> detailedErrors) {
|
||||
ResultsPresenter<Number> tabPresenter = addTabAndFocus(stringMessages.error());
|
||||
tabPresenter.showError(mainError, detailedErrors);
|
||||
getSelectedHeader().setText(stringMessages.error());
|
||||
getSelectedPresenter().showError(mainError, detailedErrors);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showBusyIndicator() {
|
||||
// Do nothing here. A management of the different tabs is necessary to handle this.
|
||||
}
|
||||
|
||||
private ResultsPresenter<Number> addTabAndFocus(String headerText) {
|
||||
CloseableTabHeader tabHeader = new CloseableTabHeader(headerText);
|
||||
ResultsChart tabPresenter = new ResultsChart(stringMessages);
|
||||
tabPanel.add(tabPresenter.getWidget(), tabHeader.getWidget());
|
||||
tabPanel.selectTab(tabPanel.getWidgetCount() - 1);
|
||||
tabPanel.scrollToTab(tabPanel.getWidgetCount() - 1);
|
||||
return tabPresenter;
|
||||
getSelectedHeader().setText(stringMessages.runningQuery());
|
||||
getSelectedPresenter().showBusyIndicator();
|
||||
}
|
||||
|
||||
private class CloseableTabHeader {
|
||||
private CloseableTabHeader getSelectedHeader() {
|
||||
return (CloseableTabHeader) tabPanel.getTabWidget(tabPanel.getSelectedIndex());
|
||||
}
|
||||
|
||||
private ResultsPresenter<Number> getSelectedPresenter() {
|
||||
return presentersMappedByHeader.get(getSelectedHeader());
|
||||
}
|
||||
|
||||
private void addTabAndFocus() {
|
||||
CloseableTabHeader tabHeader = new CloseableTabHeader();
|
||||
ResultsChart tabPresenter = new ResultsChart(stringMessages);
|
||||
tabPresenter.showError(stringMessages.runAQuery());
|
||||
presentersMappedByHeader.put(tabHeader, tabPresenter);
|
||||
|
||||
private final HorizontalPanel widget;
|
||||
tabPanel.insert(tabPresenter.getWidget(), tabHeader, tabPanel.getWidgetCount() - 1);
|
||||
int presenterIndex = tabPanel.getWidgetIndex(tabPresenter.getWidget());
|
||||
tabPanel.selectTab(presenterIndex);
|
||||
tabPanel.scrollToTab(presenterIndex);
|
||||
}
|
||||
|
||||
private void removeTab(CloseableTabHeader header) {
|
||||
header.removeFromParent();
|
||||
presentersMappedByHeader.remove(header);
|
||||
}
|
||||
|
||||
private class CloseableTabHeader extends HorizontalPanel {
|
||||
|
||||
public CloseableTabHeader(String text) {
|
||||
widget = new HorizontalPanel();
|
||||
HTML label = new HTML(text);
|
||||
private final HTML label;
|
||||
|
||||
public CloseableTabHeader() {
|
||||
label = new HTML(stringMessages.empty());
|
||||
label.getElement().getStyle().setMarginRight(5, Unit.PX);
|
||||
widget.add(label);
|
||||
this.add(label);
|
||||
Image closeImage = new Image(resources.closeIcon());
|
||||
closeImage.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if (tabPanel.getWidgetCount() > 1) {
|
||||
widget.removeFromParent();
|
||||
if (tabPanel.getWidgetCount() > 2) {
|
||||
removeTab(CloseableTabHeader.this);
|
||||
}
|
||||
}
|
||||
});
|
||||
widget.add(closeImage);
|
||||
this.add(closeImage);
|
||||
}
|
||||
|
||||
public HorizontalPanel getWidget() {
|
||||
return widget;
|
||||
public void setText(String text) {
|
||||
label.setText(text);
|
||||
tabPanel.checkIfScrollButtonsNecessary();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
Reference in new issue
Block a user