Implemented a stable TabResultsPresenter

This commit is contained in:
Lennart Hensler committed 2015-07-25 00:24:53 +02:00
1 parent 92e79a86a8
commit 5c8331aa5f
8 files changed
+88 -29

No files matched your search

@@ -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();
}
@@ -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
@@ -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
@@ -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
@@ -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();
@@ -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();
}
@@ -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();
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB